# 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 ${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
