* infrun.c (handle_inferior_event): Allow for breakpoint
authorMark Kettenis <kettenis@gnu.org>
Thu, 5 Feb 2004 19:56:33 +0000 (19:56 +0000)
committerMark Kettenis <kettenis@gnu.org>
Thu, 5 Feb 2004 19:56:33 +0000 (19:56 +0000)
instructions to generate a SIGSEGV in addition to SIGTRAP, SIGILL
and SIGEMT.  Update comments.
* NEWS (Revised SPARC target): Mention support for non-executable
stack.

gdb/ChangeLog
gdb/NEWS
gdb/infrun.c

index 73fa3efc24772c9d6a1c67a8f59fff3f613b6875..7af44168371d98fddb56a065f6d5bf6657368c02 100644 (file)
@@ -1,3 +1,11 @@
+2004-02-05  Mark Kettenis  <kettenis@gnu.org>
+
+       * infrun.c (handle_inferior_event): Allow for breakpoint
+       instructions to generate a SIGSEGV in addition to SIGTRAP, SIGILL
+       and SIGEMT.  Update comments.
+       * NEWS (Revised SPARC target): Mention support for non-executable
+       stack.
+
 2004-02-04  Mark Kettenis  <kettenis@gnu.org>
 
        * target.h (target_object): Add TARGET_OBJECT_WCOOKIE.
index f24f592db510aef9c99786152c3b1d11d391bc35..9ee0cec92279fdc31d301e3a5e58d2084268e9d6 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -19,7 +19,9 @@ you should upgrade gdbserver on the remote side.
 
 The SPARC target has been completely revised, incorporating the
 FreeBSD/sparc64 support that was added for GDB 6.0.  As a result
-support for LynxOS and SunOS 4 has been dropped.
+support for LynxOS and SunOS 4 has been dropped.  Calling functions
+from within GDB on operating systems with a non-executable stack
+(Solaris, OpenBSD) now works.
 
 * New C++ demangler
 
index f16f42395fe00315e192844eb9f6771cd0cb3bf6..ea83f13f1dee444e6b23a2216bbabd17b00f4f1a 100644 (file)
@@ -1975,15 +1975,20 @@ handle_inferior_event (struct execution_control_state *ecs)
      will be made according to the signal handling tables.  */
 
   /* First, distinguish signals caused by the debugger from signals
-     that have to do with the program's own actions.
-     Note that breakpoint insns may cause SIGTRAP or SIGILL
-     or SIGEMT, depending on the operating system version.
-     Here we detect when a SIGILL or SIGEMT is really a breakpoint
-     and change it to SIGTRAP.  */
+     that have to do with the program's own actions.  Note that
+     breakpoint insns may cause SIGTRAP or SIGILL or SIGEMT, depending
+     on the operating system version.  Here we detect when a SIGILL or
+     SIGEMT is really a breakpoint and change it to SIGTRAP.  We do
+     something similar for SIGSEGV, since a SIGSEGV will be generated
+     when we're trying to execute a breakpoint instruction on a
+     non-executable stack.  This happens for call dummy breakpoints
+     for architectures like SPARC that place call dummies on the
+     stack.  */
 
   if (stop_signal == TARGET_SIGNAL_TRAP
       || (breakpoints_inserted &&
          (stop_signal == TARGET_SIGNAL_ILL
+          || stop_signal == TARGET_SIGNAL_SEGV
           || stop_signal == TARGET_SIGNAL_EMT))
       || stop_soon == STOP_QUIETLY
       || stop_soon == STOP_QUIETLY_NO_SIGSTOP)
@@ -2046,10 +2051,14 @@ handle_inferior_event (struct execution_control_state *ecs)
 
          If someone ever tries to get get call dummys on a
          non-executable stack to work (where the target would stop
-         with something like a SIGSEG), then those tests might need to
-         be re-instated.  Given, however, that the tests were only
+         with something like a SIGSEGV), then those tests might need
+         to be re-instated.  Given, however, that the tests were only
          enabled when momentary breakpoints were not being used, I
-         suspect that it won't be the case.  */
+         suspect that it won't be the case.
+
+        NOTE: kettenis/2004-02-05: Indeed such checks don't seem to
+        be necessary for call dummies on a non-executable stack on
+        SPARC.  */
 
       if (stop_signal == TARGET_SIGNAL_TRAP)
        ecs->random_signal