# This test script is part of GDB, the GNU debugger. # Copyright 1998-1999, 2001, 2004, 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 . */ # Tests of wide register displays for GDB on HPPA 2.0 machines # use this to debug: #log_user 1 if { [skip_hp_tests] } then { continue } set testfile "reg" if [istarget "hppa64-hp-hpux*"] { verbose "reg.exp is not for PA2.0W." return 0 } set srcfile ${testfile}.s set binfile ${objdir}/${subdir}/${testfile} # To build a pa 2.0 executable # # as -o reg reg.s # or # cc -g -o reg reg.s # # The +DA2.0N flag doesn't seem to be needed. # # Don't reject if there are warnings, as we expect this warning: # # (Warning) At least one PA 2.0 object file (pa2.0_test2.o) was detected. # The linked output may not run on a PA 1.x system. # if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { untested reg.exp return -1 } gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} # test machine--there's no 2.0n architecture, so we have # to try to run the app. # send_gdb "break main\n" gdb_expect { -re "Breakpoint.*$gdb_prompt $" { pass "initial set-up" } -re ".*$gdb_prompt $" { fail "initial set-up" } timeout { fail "initial set-up (timeout)" } } send_gdb "run\n" gdb_expect { -re ".*Executable file incompatible with hardware.*$gdb_prompt $" { # Not hppa2.0 machine # return 0 } -re "Cannot exec.*$gdb_prompt $" { # Not hppa2.0 machine # return 0 } -re ".*Starting program:.*$gdb_prompt $" { pass "Ready to start test" } timeout { fail "initial set-up, part 2 (timeout)" return 0 } } # Let the program set known values. This secretly deletes # the breakpoint at main and re-runs to mainend. # runto mainend # Look for known values # # The output format changed between gdb 6.1.1 and gdb HEAD 2004-06-01. # # gdb 6.1.1: # (gdb) info reg r1 # r1 1 # # gdb HEAD 2004-06-01: # (gdb) info reg r1 # r1 0x1 1 # # For now, I accept both formats. In the future, you can remove # the old gdb 6.1.1 format. # # -- chastain 2004-06-26 set ws "\[\r\n\t \]+" proc hp_integer_reg {regname vhex vdec} { global ws set value_611 "$regname${ws}$vhex" set value_new "$regname${ws}0x$vhex${ws}$vdec" gdb_test "info reg $regname" "$value_611|$value_new" } hp_integer_reg "r1" "1" "1" hp_integer_reg "r4" "2" "2" hp_integer_reg "r5" "4" "4" hp_integer_reg "r6" "8" "8" hp_integer_reg "r7" "10" "16" hp_integer_reg "r8" "20" "32" hp_integer_reg "r9" "40" "64" hp_integer_reg "r10" "80" "128" hp_integer_reg "r11" "100" "256" hp_integer_reg "r12" "200" "512" hp_integer_reg "r13" "400" "1024" hp_integer_reg "r14" "800" "2048" hp_integer_reg "r15" "1000" "4096" hp_integer_reg "r16" "2000" "8192" # Two odd variants that GDB supports are: # "1" means "r1", and # "$1" means "r1" hp_integer_reg "1" "1" "1" hp_integer_reg "4" "2" "2" set name "info reg \$1" gdb_test_multiple "info reg \$1" "$name" { -re "r1${ws}1\r\n$gdb_prompt $" { pass "$name" } -re "r1${ws}0x1${ws}1\r\n$gdb_prompt $" { pass "$name" } } # Verify that GDB responds gracefully to a register ID number that # is out of range. gdb_test "info reg 999" "Invalid register.*999.*" # Make sure the floating point status and error registers # don't show up as floating point numbers! hp_integer_reg "fpsr" "0" "0" hp_integer_reg "fpe1" "0" "0" hp_integer_reg "fpe2" "0" "0" hp_integer_reg "fpe3" "0" "0" hp_integer_reg "fpe4" "0" "0" hp_integer_reg "fpe5" "0" "0" hp_integer_reg "fpe6" "0" "0" hp_integer_reg "fpe7" "0" "0" # Floating point registers. # TODO: these are old format only. gdb_test "info reg fr4" ".*fr4.*(double precision).* 1" gdb_test "info reg fr5" ".*fr5.*(double precision).* 2" gdb_test "info reg fr6" ".*fr6.*(double precision).* 2" gdb_test "info reg fr7" ".*fr7.*(double precision).* 4" gdb_test "info reg fr8" ".*fr8.*(double precision).* 8" gdb_test "info reg fr9" ".*fr9.*(double precision).* 32" gdb_test "info reg fr10" ".*fr10.*(double precision).* 256" # An integer register with a 64-bit value. set name "info reg r19" gdb_test_multiple "info reg r19" "$name" { -re "r19${ws}deadbeefbadcadee\r\n$gdb_prompt $" { # old gdb 6.1.1 format, good result pass "$name" } -re "r19${ws}badcadee\r\n$gdb_prompt $" { # old gdb 6.1.1 format, bad result fail "$name (32-bit truncation)" } -re "r19${ws}0xdeadbeefbadcadee${ws}16045690984232431086\r\n$gdb_prompt $" { # new gdb HEAD 2004-06-01 format, good result pass "$name" } -re "r19${ws}0xbadcadee${ws}3135024622\r\n$gdb_prompt $" { # new gdb HEAD 2004-06-01 format, 32 bit truncation fail "$name (32-bit truncation)" } } set name "print /x \$r19" gdb_test_multiple "print /x \$r19" "$name" { -re "= 0xdeadbeefbadcadee\r\n$gdb_prompt $" { pass "$name" } -re "= 0xbadcadee\r\n$gdb_prompt $" { # this was a PASS in the last version so keep it PASS for now # -- chastain 2004-06-26 pass "$name (32-bit truncation)" } } # Need to add tests of setting wide regs too. E.g. # # set $r4 = 0x1234567890123456 # p/x $r4 # # done # gdb_exit return 0