# Copyright 2009-2021 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 "failed to compile"
    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] {
    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
	}
    }
}
