# Copyright 2009, 2010 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
	}
    }
}
