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

# Test that removing a single-step breakpoint that is placed at the
# same address as another regular breakpoint leaves the regular
# breakpoint inserted.

standard_testfile
set executable ${testfile}

if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
    return -1
}

if ![runto_main] then {
    fail "can't run to main"
    return 0
}

gdb_breakpoint [gdb_get_line_number "set foo break here"]
gdb_continue_to_breakpoint "first breakpoint" ".* set foo break here .*"

# Get the address of the next instruction and set a breakpoint there.
set next_insn_addr ""
set test "disassemble main"
gdb_test_multiple $test $test {
    -re ".*=> $hex <\\+$decimal>:\[^\r\n\]+\r\n   ($hex) .*$gdb_prompt $" {
	set next_insn_addr $expect_out(1,string)
	pass $test
    }
}

if { $next_insn_addr == "" } {
    return -1
}

gdb_test "b *$next_insn_addr" "Breakpoint .*"

# So that GDB doesn't try to remove the regular breakpoint when the
# step finishes.
gdb_test_no_output "set breakpoint always-inserted on"

# On software single-step targets, this step will want to momentarily
# place a single-step breakpoint over the bar breakpoint, and then
# remove it.  But, a regular breakpoint is planted there already, and
# with always-inserted on, should remain planted when the step
# finishes.
gdb_test "si" "Breakpoint .*"

# If the breakpoint is still correctly inserted, then this jump should
# re-trigger it.  Otherwise, GDB will lose control and the program
# will exit.  See PR breakpoints/17000.
gdb_test "jump *\$pc" "Breakpoint .*"
