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

# 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 {
    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 .*"
