aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/breakpoint.c14
-rw-r--r--gdb/testsuite/ChangeLog10
-rw-r--r--gdb/testsuite/gdb.base/hbreak-in-shr-unsupported-shr.c22
-rw-r--r--gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.c28
-rw-r--r--gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.exp120
-rw-r--r--gdb/testsuite/gdb.base/hbreak-unmapped.c22
-rw-r--r--gdb/testsuite/gdb.base/hbreak-unmapped.exp72
-rw-r--r--gdb/testsuite/gdb.trace/qtro.exp16
-rw-r--r--gdb/testsuite/lib/gdb.exp19
10 files changed, 307 insertions, 22 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 6de9f69..4066217 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2014-04-23 Pedro Alves <palves@redhat.com>
+
+ * breakpoint.c (insert_bp_location, remove_breakpoint_1): If
+ the breakpoint is set in a shared library, only suppress
+ errors for software breakpoints, not hardware breakpoints.
+
2014-04-22 Pedro Alves <palves@redhat.com>
* infrun.c (schedlock_applies): New function, factored out from
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index f777a4a..19a7376 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -2642,12 +2642,12 @@ insert_bp_location (struct bp_location *bl,
breakpoint in a shared library that has already been
removed, but we have not yet processed the shlib unload
event. Unfortunately, some targets that implement
- breakpoint insertion themselves (necessary if this is a
- HW breakpoint, but SW breakpoints likewise) can't tell
- why the breakpoint insertion failed (e.g., the remote
- target doesn't define error codes), so we must treat
- generic errors as memory errors. */
+ breakpoint insertion themselves can't tell why the
+ breakpoint insertion failed (e.g., the remote target
+ doesn't define error codes), so we must treat generic
+ errors as memory errors. */
if ((bp_err == GENERIC_ERROR || bp_err == MEMORY_ERROR)
+ && bl->loc_type == bp_loc_software_breakpoint
&& solib_name_from_address (bl->pspace, bl->address))
{
/* See also: disable_breakpoints_in_shlibs. */
@@ -3826,7 +3826,9 @@ remove_breakpoint_1 (struct bp_location *bl, insertion_state_t is)
/* In some cases, we might not be able to remove a breakpoint
in a shared library that has already been removed, but we
have not yet processed the shlib unload event. */
- if (val && solib_name_from_address (bl->pspace, bl->address))
+ if (val
+ && bl->loc_type == bp_loc_software_breakpoint
+ && solib_name_from_address (bl->pspace, bl->address))
val = 0;
if (val)
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 2f42ad1..5502a08 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,13 @@
+2014-04-23 Pedro Alves <palves@redhat.com>
+
+ * gdb.base/hbreak-in-shr-unsupported-shr.c: New file.
+ * gdb.base/hbreak-in-shr-unsupported.c: New file.
+ * gdb.base/hbreak-in-shr-unsupported.exp: New file.
+ * gdb.base/hbreak-unmapped.c: New file.
+ * gdb.base/hbreak-unmapped.exp: New file.
+ * gdb.trace/qtro.exp (gdb_is_target_remote): Move ...
+ * lib/gdb.exp (gdb_is_target_remote): ... here.
+
2014-04-22 Pedro Alves <palves@redhat.com>
* gdb.base/consecutive-step-over.c: New file.
diff --git a/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported-shr.c b/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported-shr.c
new file mode 100644
index 0000000..c48260e
--- /dev/null
+++ b/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported-shr.c
@@ -0,0 +1,22 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2004-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/>. */
+
+int
+shrfunc (int x)
+{
+ return x * 10;
+}
diff --git a/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.c b/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.c
new file mode 100644
index 0000000..edf0687
--- /dev/null
+++ b/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.c
@@ -0,0 +1,28 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2004-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/>. */
+
+extern int shrfunc (int x);
+
+int
+main (void)
+{
+ int y;
+
+ y = shrfunc (1);
+
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.exp b/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.exp
new file mode 100644
index 0000000..8623d13
--- /dev/null
+++ b/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.exp
@@ -0,0 +1,120 @@
+# 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"
diff --git a/gdb/testsuite/gdb.base/hbreak-unmapped.c b/gdb/testsuite/gdb.base/hbreak-unmapped.c
new file mode 100644
index 0000000..4b94803
--- /dev/null
+++ b/gdb/testsuite/gdb.base/hbreak-unmapped.c
@@ -0,0 +1,22 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ 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/>. */
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.base/hbreak-unmapped.exp b/gdb/testsuite/gdb.base/hbreak-unmapped.exp
new file mode 100644
index 0000000..5cb655c
--- /dev/null
+++ b/gdb/testsuite/gdb.base/hbreak-unmapped.exp
@@ -0,0 +1,72 @@
+# 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/>.
+
+if {[skip_hw_breakpoint_tests]} {
+ return 0
+}
+
+standard_testfile
+
+if {[prepare_for_testing "failed to prepare" ${testfile} ${srcfile}]} {
+ return -1
+}
+
+if ![runto_main] {
+ fail "Can't run to main"
+ return -1
+}
+
+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 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"
diff --git a/gdb/testsuite/gdb.trace/qtro.exp b/gdb/testsuite/gdb.trace/qtro.exp
index 8470a0f..22b5051 100644
--- a/gdb/testsuite/gdb.trace/qtro.exp
+++ b/gdb/testsuite/gdb.trace/qtro.exp
@@ -35,22 +35,6 @@ if ![runto_main] {
# Check whether we're testing with the remote or extended-remote
# targets, and whether the target supports tracepoints.
-proc gdb_is_target_remote { } {
- global gdb_prompt
-
- set test "probe for target remote"
- gdb_test_multiple "maint print target-stack" $test {
- -re ".*emote serial target in gdb-specific protocol.*$gdb_prompt $" {
- pass $test
- return 1
- }
- -re "$gdb_prompt $" {
- pass $test
- }
- }
- return 0
-}
-
if ![gdb_is_target_remote] {
return -1
}
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index d904b81..a9fdc99 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -2454,6 +2454,25 @@ proc skip_libstdcxx_probe_tests {} {
return $ok
}
+# Check whether we're testing with the remote or extended-remote
+# targets.
+
+proc gdb_is_target_remote {} {
+ global gdb_prompt
+
+ set test "probe for target remote"
+ gdb_test_multiple "maint print target-stack" $test {
+ -re ".*emote serial target in gdb-specific protocol.*$gdb_prompt $" {
+ pass $test
+ return 1
+ }
+ -re "$gdb_prompt $" {
+ pass $test
+ }
+ }
+ return 0
+}
+
set compiler_info "unknown"
set gcc_compiled 0
set hp_cc_compiler 0