# Copyright 2008, 2009, 2010, 2011 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/>.

set testfile breakpoint-shadow
set srcfile ${testfile}.c
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_no_output "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
    }
}

gdb_test "b [gdb_get_line_number "break-first"]" "Breakpoint \[0-9\] at .*" "First breakpoint placed"
gdb_test "b [gdb_get_line_number "break-second"]" "Breakpoint \[0-9\] at .*" "Second breakpoint placed"

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
	}
    }
}
