# 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 trying to inserting a hw breakpoint in a shared library
# when the target doesn't support hw breakpoints doesn't silently
# error out without informing the user.

if {[skip_shlib_tests]} {
    return -1
}

set main_src hbreak-in-shr-unsupported.c
set lib_src hbreak-in-shr-unsupported-shr.c
standard_testfile ${main_src} ${lib_src}
set lib_basename hbreak-in-shr-unsupported-shr.so
set lib_so [standard_output_file ${lib_basename}]

set lib_opts "debug"
set exec_opts [list debug shlib=${lib_so}]

if [get_compiler_info] {
    return -1
}

if { [gdb_compile_shlib ${srcdir}/${subdir}/${lib_src} ${lib_so} $lib_opts] != ""
     || [gdb_compile ${srcdir}/${subdir}/${main_src} ${binfile} executable $exec_opts] != ""} {
    untested "failed to compile"
    return -1
}

clean_restart $binfile
gdb_load_shlib $lib_so

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

set is_target_remote [gdb_is_target_remote]

# Get main breakpoint out of the way.
delete_breakpoints

# Easier to test if GDB inserts breakpoints immediately.
gdb_test_no_output "set breakpoint always-inserted on"

# Force-disable Z1 packets, in case the target actually supports
# these.
if {$is_target_remote} {
    gdb_test_no_output "set remote Z-packet off"
}

# Probe for hw breakpoints support.  With Z packets disabled, this
# should always fail with remote targets.  For other targets, with no
# way to force-disable hw breakpoints support, best we can do is skip
# the remainder of the test if hardware breakpoint insertion in a
# function in the main executable succeeds.
set cant_insert_hbreak 0
set supports_hbreak 0
set test "probe hbreak support"
gdb_test_multiple "hbreak 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 "Cannot insert hardware breakpoint.*$gdb_prompt $" {
	set cant_insert_hbreak 1
	set supports_hbreak 1
	pass $test
    }
    -re "Hardware assisted breakpoint.*at.* file .*$srcfile, line.*$gdb_prompt $" {
	set supports_hbreak 1
	if {$is_target_remote} {
	    # Z-packets have been force-disabled, so this shouldn't
	    # happen.
	    fail $test
	} else {
	    pass $test
	}
    }
}

if {!$supports_hbreak} {
    unsupported "no hbreak support"
    return
}

if {!$cant_insert_hbreak} {
    unsupported "can't disable hw breakpoint support"
    return
}

# Get previous hw breakpoint out of the way.
delete_breakpoints

# Without target support, this should always complain.  GDB used to
# suppress the error if the breakpoint was set in a shared library.
# While that makes sense for software breakpoints (the memory might be
# unmapped), it doesn't for hardware breakpoints, as those by
# definition are implemented using a mechanism that is not dependent
# on being able to modify the target's memory.
gdb_test "hbreak shrfunc" "Cannot insert hardware breakpoint.*" \
    "hbreak shrfunc complains"

gdb_test "info break" "hw breakpoint.*y.*$hex.*in shrfunc at.*" \
    "breakpoint not pending"
