# Copyright 2009, 2011-2012 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] {
  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
