# Copyright 2014 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 "Could not compile ${subdir}/$lib_src or ${subdir}/$srcfile."
    return -1
}

clean_restart $binfile
gdb_load_shlibs $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"
