# This test script is part of GDB, the GNU debugger.

# Copyright 1998-2013 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/>.  */

# 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
