#   Copyright 2002, 2004, 2007, 2008, 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/>.

# The doco makes reference to built-in registers -- $pc and $fp.  If
# the ISA contains registers by that name then they should be
# displayed.  If the ISA contains registers identified as being
# equivalent, but have different names, then GDB will provide these as
# aliases.  If the ISA doesn't provide any equivalent registers, then
# GDB will provide registers that map onto the frame's PC and FP.

if $tracelevel then {
    strace $tracelevel
}

#
# test running programs
#
set prms_id 0
set bug_id 0

set testfile "pc-fp"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } {
    untested pc-fp.exp
    return -1
}

if [get_compiler_info ${binfile}] {
    return -1
}

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

if ![runto_main] then {
    perror "couldn't run to breakpoint"
    continue
}


# Get the value of PC and FP

set valueof_pc [get_hexadecimal_valueof "\$pc" "0"]
set valueof_fp [get_hexadecimal_valueof "\$fp" "0"]

# Check that the sequence $REGNAME -> REGNUM -> $REGNAME works.  Use
# display since that encodes and then decodes the expression parameter
# (and hence uses the mechanisms we're trying to test).

gdb_test "display/i \$pc" "1: x/i +\\\$pc( +|\r\n)${valueof_pc}.*"
gdb_test "display/w \$fp" "2: x/xw +\\\$fp +${valueof_fp}.*"

# FIXME: cagney/2002-09-04: Should also check that ``info registers
# $pc'' et.al.'' come back with the same value as the above displays
# and a print --- assuming that is that people agree to such behavour.
# Need to re-write default_print_registers_info() for it to work (and
# such a rewrite is on the reggroups branch).

# gdb_test "info registers \$pc" "${valueof_pc}"
# gdb_test "info registers \$fp" "${valueof_fp}"
