On 07/24/2011 06:47 AM, Mark Kettenis wrote:
From: Pedro Alves<pedro@codesourcery.com>
Date: Wed, 20 Jul 2011 16:05:43 +0100
Other archs !x86, and other kernels/stubs/servers !Linux that
can do hardware stepping. If we're going to have a list, invert
the logic of the check, defaulting to running the test, and leaving
out archs were we know software stepping is used. Some targets,
like x86/OpenBSD and MacOS, although can hardware step, can't step
into a handler.
Just FYI, it's putting breakpoints into the signal trampoline that is
the issue, at least on OpenBSD. Single-stepping should work fine on
OpenBSD/i386 and OpenBSD/amd64 and all other architectures where it's
done in hardware.
This is the 2nd version of the patch. A new predicate,
single_step_to_signal_handler_p, is added in lib/gdb.exp. In default,
it returns true, and return false on target "arm*-*-* and "mips*-*-*".
I don't find any other tests using "stepi" to step into signal handler,
so I only changed kill-after-signal.exp.
OK for mainline?
single_step_to_signal_handler_p.patch
gdb/testsuite/
* lib/gdb.exp (single_step_to_signal_handler_p): New.
* gdb.base/kill-after-signal.exp: Skip if target supports single step
to signal handler.
diff --git a/gdb/testsuite/gdb.base/kill-after-signal.exp b/gdb/testsuite/gdb.base/kill-after-signal.exp
index eecad2e..f7086fc 100644
--- a/gdb/testsuite/gdb.base/kill-after-signal.exp
+++ b/gdb/testsuite/gdb.base/kill-after-signal.exp
@@ -14,6 +14,12 @@
# along with this program. If not, see<http://www.gnu.org/licenses/>.
set testfile "kill-after-signal"
+
+if { ![single_step_to_signal_handler_p] } {
+ untested ${testfile}.exp
+ return
+}
+
if [prepare_for_testing ${testfile}.exp ${testfile}] {
return -1
}
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index ef5ad5c..b967a97 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -1527,6 +1527,21 @@ proc support_complex_tests {} {
return $support_complex_tests_saved
}
+# Return 1 if target hardware or OS supports single stepping to single handler,
+# otherwise, return 0.
+
+proc single_step_to_signal_handler_p {} {
+
+ # Targets don't have hardware single step. On these targets, when a signal
+ # is delivered during software single step, gdb is unable to determine the
+ # next instruction addresses, because start of signal handler is one of them.
+ if { [istarget "arm*-*-*"] || [istarget "mips*-*-*"] } {
+ return 0
+ }
+
+ return 1
+}
+