# Copyright 2009, 2011 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 tries to read variables of each kind both on PPU and SPU.

load_lib cell.exp

set testfile "data"
set ppu_file "data"
set ppu_src ${srcdir}/${subdir}/${ppu_file}.c
set ppu_bin ${objdir}/${subdir}/${ppu_file}
set spu_file "data-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
}

proc check_var { name value } {
  gdb_test "print $name" \
	   ".*=.*$value" \
	   "check_var $name = $value"
}

proc set_var { name value } {
  gdb_test "set var $name = $value" \
	   "" \
	   "set var $name = $value"
}

proc dotest { name value } {
  set_var $name $value
  check_var $name $value
}

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
}

# Set values.
dotest var_char 'z'
dotest var_short 8
dotest var_int 321
dotest var_long 523442
dotest var_longlong 235354533
xfail "dotest var_float 33.2113"
xfail "dotest var_double 2.3456"
xfail "dotest var_longdouble 3.456789"

gdb_test "break 55" \
	 "Breakpoint.*at.*file.*$testfile.c, line 55.*" \
	 "set breakpoint"
gdb_test "continue" \
	 "Breakpoint.*at.*$testfile.c.*55.*" \
	 "continue to bp at line 55"

# Lookup variables.
check_var var_char 'c'
check_var var_short 7
check_var var_int 1337
check_var var_long 123456
check_var var_longlong 123456789
xfail "check_var var_float 1.23"
xfail "check_var var_double 2.3456"
xfail "check_var var_longdouble 3.456789"

cont_spu_main
c_to "Marker SPU End" $spu_file.c

# In SPU Thread, arch should now be spu:256K.
check_spu_arch ""

# Lookup variables.
check_var var_char 'c'
check_var var_short 7
check_var var_int 1337
check_var var_long 123456
check_var var_longlong 123456789
xfail "check_var var_float 1.23"
xfail "check_var var_double 2.3456"
xfail "check_var var_longdouble 3.456789"

gdb_exit
return 0
