# 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
# Testcase for __ea pointer

load_lib cell.exp

set testfile "ea-test"
set source ${srcdir}/${subdir}/${testfile}.c
set binary ${objdir}/${subdir}/${testfile}

if {[skip_cell_tests]} {
    return 0
}

# Compile SPU binary.
if { [gdb_compile_cell_spu $source $binary executable {debug}]  != "" } {
  unsupported "Compile spu binary failed, so all tests in this file will automatically fail."
  return -1
}

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

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

# p
gdb_test "p ppe_pointer" \
	 "(int.*@__ea).*0x0.*" \
	 "p ppe_pointer"

gdb_test "p normal_pointer" \
	 "(int.*).*0x0.*" \
	 "p normal_pointer"

gdb_test "p local_ppe_pointer" \
	 "(int.*@__ea).*0x0.*" \
	 "p local_ppe_pointer"

gdb_test "p local_normal_pointer" \
	 "(int.*).*0x0.*" \
	 "p local_normal_pointer"

# ptype
gdb_test "ptype ppe_pointer" \
	 "type = int.*@__ea" \
	 "ptype ppe_pointer"

gdb_test "ptype normal_pointer" \
	 "type = int.*" \
	 "ptype normal_pointer"

gdb_test "ptype local_ppe_pointer" \
	 "type = int.*@__ea" \
	 "ptype local_ppe_pointer"

gdb_test "ptype local_normal_pointer" \
	 "type = int.*" \
	 "ptype local_normal_pointer"

# info locals
gdb_test "info locals" \
	 ".*local_ppe_pointer =.*0x0.*local_normal_pointer =.*0x0.*" \
	 "info locals"

# p &
gdb_test "p &ppe_pointer" \
	 ".*=.*(int.*@__ea.*).*0x.*" \
	 "p &ppe_pointer"

gdb_test "p &normal_pointer" \
	 ".*=.*(int.*).*0x.*" \
	 "p &normal_pointer"

gdb_test "p &local_ppe_pointer" \
	 ".*=.*(int.*@__ea.*).*0x.*" \
	 "p &local_ppe_pointer"

gdb_test "p &local_normal_pointer" \
	 ".*=.*(int.*).*0x.*" \
	 "p &local_normal_pointer"

# ptype *
gdb_test "ptype *ppe_pointer" \
	 "type = int" \
	 "ptype *ppe_pointer"

gdb_test "ptype *normal_pointer" \
	 "type = int" \
	 "ptype *normal_pointer"

gdb_test "ptype *local_ppe_pointer" \
	 "type = int" \
	 "ptype *local_ppe_pointer"

gdb_test "ptype *local_normal_pointer" \
	 "type = int" \
	 "ptype *local_normal_pointer"

gdb_exit

return 0


