# Copyright 2009 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Contributed by Markus Deuling <deuling@de.ibm.com>.
#
# Testsuite for Cell Broadband Engine combined debugger
# This testcases tests on PPU and SPU if variables and registers are accessible
# via print and set by using names and adresses.

load_lib cell.exp

set ppu_file "mem-access"
set ppu_src ${srcdir}/${subdir}/${ppu_file}.c
set ppu_bin ${objdir}/${subdir}/${ppu_file}
set spu_file "mem-access-spu"
set spu_src ${srcdir}/${subdir}/${spu_file}.c
set spu_bin ${objdir}/${subdir}/${spu_file}

if {[skip_cell_tests]} {
    return 0
}

# Compile SPU binary.
if { [gdb_compile_cell_spu $spu_src $spu_bin executable {debug}]  != "" } {
  unsupported "Compiling spu binary failed."
  return -1
}
# Compile PPU binary.
if { [gdb_cell_embedspu $spu_bin $spu_bin-embed.o {debug}]  != "" } {
  unsupported "Embedding spu binary failed."
  return -1
}
if { [gdb_compile_cell_ppu [list $ppu_src $spu_bin-embed.o] $ppu_bin executable {debug}] != "" } {
  unsupported "Compiling ppu binary failed."
  return -1
}

if [get_compiler_info ${ppu_bin}] {
  return -1
}

# Get the adress to symbol name. If $reg
# is set to 1, get address from a register.
proc get_adress_from_name { name reg } {
  global gdb_prompt
  set adr ""

  if { $reg == 1 } {
    set q "x/x $name"
  } else {
    set q "x/x &$name"
  }

  gdb_test_multiple $q "get address from $name" {
    -re "(0x.....):.*$gdb_prompt $" { # Registers.
      set adr $expect_out(1,string)
      pass "get adress from $name = $adr"
    }
    -re "(0x........) <.*$gdb_prompt $" { # PPU address.
      set adr $expect_out(1,string)
      pass "get adress from $name = $adr"
    }
    -re "(0x....) <.*$gdb_prompt $" { # SPU address.
      set adr $expect_out(1,string)
      pass "get adress from $name = $adr"
    }
    -re "(0x...) <.*$gdb_prompt $" { # SPU address.
      set adr $expect_out(1,string)
      pass "get adress from $name = $adr"
    }
  }

  return ${adr}
}

# Try to set a $value at adress $adr.
proc set_adr_content { adr value } {
  gdb_test "set *$adr=$value" \
	   "" \
	   "set *$adr=$value"
}

# Try to set a $value for $symbol.
proc set_symbol_content { symbol value } {
  gdb_test "set $symbol=$value" \
	   "" \
	   "set *$symbol=$value"
}

# Check if $value is at *adr
proc test_adr_content { adr value } {
  gdb_test "p *$adr" \
           ".*=.*$value.*" \
           "(ptr) *$adr==$value"
}

proc test_symbol_content { symbol value } {
  gdb_test "p $symbol" \
	   ".*=.*$value.*" \
	   "(symbol) $symbol==$value"
}

# Check VARNAME. Check if it has the inital
# value INITIALVALUE. Set it to NEWVALUE.
# Check if set properly. Do it via symbols and
# pointers.
proc check_var { varname initalvalue newvalue } {

  # Initial value should be $initalvalue.
  test_symbol_content $varname $initalvalue

  # Get pointer to symbol and check if the
  # initial value is found.
  set adr [get_adress_from_name $varname 0]
  test_adr_content $adr $initalvalue

  # Re-set value using the pointer.
  set_adr_content $adr $newvalue

  # Test values by pointer and by symbol.
  test_adr_content $adr $newvalue
  test_symbol_content $varname $newvalue

  # Set value back to initalvalue using symbol
  # name and check it.
  set_symbol_content $varname $initalvalue
  test_adr_content $adr $initalvalue
  test_symbol_content $varname $initalvalue
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${ppu_bin}

if ![runto_main] then {
  fail "Can't run to main"
  return 0
}

# Check in PPU thread.
c_to "Marker PPUEA" $ppu_file.c
check_var "test_var" 5 7

# Go to SPU thread.
cont_spu_main
c_to "Marker SPUEA" $spu_file.c
check_spu_arch ""

# Check in SPU thread.
check_var "test_var" 5 7
# Check $sp register.
set adr [get_adress_from_name "\$sp" 1]
set_adr_content $adr 8
test_adr_content $adr 8

gdb_exit
return 0
