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

if {[skip_hw_breakpoint_tests]} {
    return 0
}

standard_testfile

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

if ![runto_main] {
    return -1
}

# If we can read the memory at address 0, skip the test.
if { [is_address_zero_readable] } {
    untested "memory at address 0 is readable"
    return
}

delete_breakpoints

# Test whether the target supports hardware breakpoints at all.

set supports_hbreak 0
set test "probe hardware breakpoint support"
gdb_test_multiple "hbreak -q main" $test {
    -re "No hardware breakpoint support in the target.*$gdb_prompt $" {
	pass $test
    }
    -re "Hardware breakpoints used exceeds limit.*$gdb_prompt $" {
	pass $test
    }
    -re "Hardware assisted breakpoint.*at.* file .*$srcfile, line.*$gdb_prompt $" {
	set supports_hbreak 1
	pass $test
    }
}

if {!$supports_hbreak} {
    unsupported "hardware breakpoints"
    return
}

delete_breakpoints

# Force immediate breakpoint insertion.
gdb_test_no_output "set breakpoint always-inserted on"

# Hardware breakpoints are implemented using a mechanism that is not
# dependent on being able to modify the target's memory, we should be
# able to set them even in unmapped memory areas.
gdb_test "hbreak *0" "Hardware assisted breakpoint \[0-9\]+ at 0x0"

gdb_test "info break" "hw breakpoint.*y.*0x0\+\[ \t\]\+" \
    "info break shows hw breakpoint"

gdb_test_no_output "delete \$bpnum" "" "delete" \
    "delete hw breakpoint"

gdb_test "info break" "No breakpoints or watchpoints\." \
    "info break shows no breakpoints"
