# Copyright 2010-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/>.
#
# This file is part of the gdb testsuite.
#
# Contributed by Ulrich Weigand  <uweigand@de.ibm.com>.
# Tests for SPU addresses resulting from complex DWARF expressions.

load_lib cell.exp

set testfile "dwarfaddr"
set srcfile ${srcdir}/${subdir}/${testfile}.S
set binary ${objdir}/${subdir}/${testfile}

if {[skip_cell_tests]} {
    return 0
}

# Compile SPU binary.
if { [gdb_compile_cell_spu $srcfile $binary executable {debug}]  != "" } {
  unsupported "Compiling spu binary failed."
  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
}

gdb_test "print x" " = \\{0 <repeats 16 times>\\}" "print x"
gdb_test "print &x" " = \\(int \\(\\*\\)\\\[16\\\]\\) 0x\[0-9a-f\]*" "print &x"
gdb_test "info address x" "Symbol \"x\" is a complex DWARF expression.*DW_OP_and\[\r\n\]+\." "info address x"

gdb_exit

return 0
