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