# Copyright 2009-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/>.

if ![istarget "ia64-*-*"] {
    verbose "Skipping ia64-breakpoint-shadow test."
    return
}

set testfile ia64-breakpoint-shadow
set srcfile ${testfile}.S
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested "Couldn't compile test program"
    return -1
}

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

# We need to start the inferior to place the breakpoints in the memory at all.
if ![runto_main] {
    untested start
    return -1
}

# The default "auto" mode removes all the breakpoints when we stop (and not
# running the nonstop mode).  We would not be able to test the shadow.
gdb_test "set breakpoint always-inserted on"
gdb_test "show breakpoint always-inserted" "Always inserted breakpoint mode is on."

set match "\nDump of assembler code for function main:\r\n(.*)End of assembler dump.\r\n$gdb_prompt $"

set test "disassembly without breakpoints"
gdb_test_multiple "disass main" $test {
    -re $match {
    	set orig $expect_out(1,string)
	pass $test
    }
}

set test "slot 0 breakpoint placed"
gdb_test_multiple "b bundle" $test {
    -re "Breakpoint \[0-9\] at (0x\[0-9a-f\]*0):.*$gdb_prompt $" {
	pass $test
	set bpt2address $expect_out(1,string)
    }
}

if ![info exists bpt2address] {
    return -1
}

gdb_test "b *($bpt2address + 1)" "Breakpoint \[0-9\] at .*" "slot 1 breakpoint placed"
gdb_test "b *($bpt2address + 2)" "Can't insert breakpoint for non-existing slot X" "slot 2 (slot X) breakpoint refusal"

set test "disassembly with breakpoints"
gdb_test_multiple "disass main" $test {
    -re $match {
    	set got $expect_out(1,string)
	if [string equal -nocase $orig $got] {
	    pass $test
	} else {
	    fail $test
	}
    }
}
