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

# 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.

#
# test running programs
#

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] {
    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}.*"

gdb_test "info register \$pc" "${valueof_pc}.*"
gdb_test "info register \$fp" "${valueof_fp}.*"

# Regression test for
# http://sourceware.org/bugzilla/show_bug.cgi?id=12659
gdb_test "info register pc fp" \
    "pc(:)?( |\t)+${valueof_pc}(( |\t)+${valueof_pc} <.*>)?\[\r\n\]+fp(:)?( |\t)+${valueof_fp}(( |\t)+${valueof_fp})?\[\r\n\]+"
