# Copyright 2020-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 inserting a hardware and a software breakpoint at the same
# address behaves as expected.  GDB used to consider hw and sw
# breakpoint locations as duplicate locations, which would lead to bad
# behavior.  See PR gdb/25741.

if {[skip_hw_breakpoint_tests]} {
    return 0
}

set test hbreak
set srcfile ${test}.c
if { [prepare_for_testing "failed to prepare" ${test} ${srcfile}] } {
    return -1
}

if ![runto_main] {
    return -1
}

delete_breakpoints

gdb_test_no_output "set breakpoint always-inserted on"
gdb_test_no_output "set breakpoint condition-evaluation host"
gdb_test_no_output "set confirm off"

# Test inserting a hw breakpoint first, then a sw breakpoint at the
# same address.
with_test_prefix "hw-sw" {
    gdb_test "hbreak -q main" \
	"Hardware assisted breakpoint .* at .*" \
	"hbreak"

    gdb_test "break -q main" \
	"Note: breakpoint .* also set at .*\r\nBreakpoint .* at .*" \
	"break"

    # A bad GDB debugging against GDBserver would output a warning
    # here:
    #  delete breakpoints
    #  warning: Error removing breakpoint 3
    #  (gdb) FAIL: gdb.base/hw-sw-break-same-address.exp: hw-sw: delete breakpoints
    gdb_test_no_output "delete breakpoints"
}

# Now the opposite: test inserting a sw breakpoint first, then a hw
# breakpoint at the same address.
with_test_prefix "sw-hw" {
    gdb_test "break -q main" \
	"Breakpoint .* at .*" \
	"break"

    gdb_test "hbreak -q main" \
	"Note: breakpoint .* also set at .*\r\nHardware assisted breakpoint .* at .*" \
	"hbreak"

    gdb_test_no_output "delete breakpoints"
}
