* blockframe.c (get_prev_frame_info): If pc in sigtramp, set
authorJim Kingdon <jkingdon@engr.sgi.com>
Wed, 19 May 1993 00:57:48 +0000 (00:57 +0000)
committerJim Kingdon <jkingdon@engr.sgi.com>
Wed, 19 May 1993 00:57:48 +0000 (00:57 +0000)
signal_handler_caller.
* tm-68k.h (FRAME_{CHAIN,SAVED_PC}): Deal with sigtramp.
* tm-hp300bsd.h: Define SIGTRAMP_{START,END} not IN_SIGTRAMP.
* inferior.h (IN_SIGTRAMP): Definition moved from infrun.c.
Use SIGTRAMP_START if defined.
* infcmd.c (step_1): Use SIGTRAMP_{START,END} if needed.
* infrun.c (wait_for_inferior): Check IN_SIGTRAMP before SKIP_PROLOGUE.

gdb/ChangeLog
gdb/config/m68k/tm-hp300bsd.h
gdb/config/m68k/tm-m68k.h
gdb/infcmd.c

index ee850d29ac0aeabfada80cf3c49c34a838f79ce0..68461f3824cef888a605f2c4c9f0353bab87a7c1 100644 (file)
@@ -1,5 +1,14 @@
 Tue May 18 14:08:50 1993  Jim Kingdon  (kingdon@lioth.cygnus.com)
 
+       * blockframe.c (get_prev_frame_info): If pc in sigtramp, set
+       signal_handler_caller.
+       * tm-68k.h (FRAME_{CHAIN,SAVED_PC}): Deal with sigtramp.
+       * tm-hp300bsd.h: Define SIGTRAMP_{START,END} not IN_SIGTRAMP.
+       * inferior.h (IN_SIGTRAMP): Definition moved from infrun.c.
+       Use SIGTRAMP_START if defined.
+       * infcmd.c (step_1): Use SIGTRAMP_{START,END} if needed.
+       * infrun.c (wait_for_inferior): Check IN_SIGTRAMP before SKIP_PROLOGUE.
+
        * infptrace.c: Remove unused KERNEL_U_ADDR_HPUX code.
 
        * infcmd.c (step_1): Fix poorly worded error message.
index 6a1906975d03a94a42342f8b4f23afe970c23fb9..9184725d78819559ddf3e3d2d8a352722ce9efce 100644 (file)
@@ -38,10 +38,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
    (hence STACK_END_ADDR as opposed to KERNEL_U_ADDR).  This tests
    for the whole u area, since we don't necessarily have hp300bsd
    include files around.  */
-#define IN_SIGTRAMP(pc, name) \
-  ((pc) >= STACK_END_ADDR   \
-   && (pc) < STACK_END_ADDR + TARGET_UPAGES * TARGET_NBPG \
-   )
+#define SIGTRAMP_START STACK_END_ADDR
+#define SIGTRAMP_END (STACK_END_ADDR + TARGET_UPAGES * TARGET_NBPG)
 
 /* Address of end of stack space.  */
 
index 96d71dec713899cc41bb2b34be6dbfe93dc69c36..062445b49310567f1f8a9460aea543e9964e13ac 100644 (file)
@@ -293,10 +293,15 @@ extern const struct ext_format ext_format_68881;
    In the case of the 68000, the frame's nominal address
    is the address of a 4-byte word containing the calling frame's address.  */
 
+/* If we are chaining from sigtramp, then manufacture a sigtramp frame
+   (which isn't really on the stack.  I'm not sure this is right for anything
+   but BSD4.3 on an hp300.  */
 #define FRAME_CHAIN(thisframe)  \
-  (!inside_entry_file ((thisframe)->pc) ? \
-   read_memory_integer ((thisframe)->frame, 4) :\
-   0)
+  (thisframe->signal_handler_caller \
+   ? thisframe->frame \
+   : (!inside_entry_file ((thisframe)->pc) ? \
+      read_memory_integer ((thisframe)->frame, 4) :\
+      0)
 
 /* Define other aspects of the stack frame.  */
 
@@ -304,9 +309,31 @@ extern const struct ext_format ext_format_68881;
    by FI does not have a frame on the stack associated with it.  If it
    does not, FRAMELESS is set to 1, else 0.  */
 #define FRAMELESS_FUNCTION_INVOCATION(FI, FRAMELESS) \
-  (FRAMELESS) = frameless_look_for_prologue(FI)
-
-#define FRAME_SAVED_PC(FRAME) (read_memory_integer ((FRAME)->frame + 4, 4))
+  do { \
+    if ((FI)->signal_handler_caller) \
+      (FRAMELESS) = 0; \
+    else \
+      (FRAMELESS) = frameless_look_for_prologue(FI); \
+  } while (0)
+
+/* This was determined by experimentation on hp300 BSD 4.3.  Perhaps
+   it corresponds to some offset in /usr/include/sys/user.h or
+   something like that.  Using some system include file would
+   have the advantage of probably being more robust in the face
+   of OS upgrades, but the disadvantage of being wrong for
+   cross-debugging.  */
+
+#define SIG_PC_FP_OFFSET 530
+
+#define FRAME_SAVED_PC(FRAME) \
+  (((FRAME)->signal_handler_caller \
+    ? ((FRAME)->next \
+       ? read_memory_integer ((FRAME)->next->frame + SIG_PC_FP_OFFSET, 4) \
+       : read_memory_integer (read_register (SP_REGNUM) \
+                             + SIG_PC_FP_OFFSET - 8, 4) \
+       ) \
+    : read_memory_integer ((FRAME)->frame + 4, 4)) \
+   )
 
 #define FRAME_ARGS_ADDRESS(fi) ((fi)->frame)
 
index 974658308c56e8ac474ffd30720e8d81de780b8a..666be8eecb369284bb63bbabdda19d546c30be97 100644 (file)
@@ -365,23 +365,36 @@ step_1 (skip_subroutines, single_inst, count_string)
            {
              struct minimal_symbol *msymbol;
 
-             /* FIXME: we should be using containing_function_bounds or
-                a cleaned up version thereof.  */
+             /* FIXME: This should be using containing_function_bounds or a
+                cleaned-up version thereof, to deal with things like the
+                end of the text segment.  */
 
              msymbol = lookup_minimal_symbol_by_pc (stop_pc);
              target_terminal_ours ();
              printf_filtered ("Current function has no line number information.\n");
              fflush (stdout);
 
-             /* No info or after _etext ("Can't happen") */
              if (msymbol == NULL || SYMBOL_NAME (msymbol + 1) == NULL)
-               error ("Cannot find bounds of current function.");
+               {
+                 /* If sigtramp is in the u area, check for it.  */
+#if defined SIGTRAMP_START
+                 if (IN_SIGTRAMP (stop_pc, (char *)NULL))
+                   {
+                     step_range_start = SIGTRAMP_START;
+                     step_range_end = SIGTRAMP_END;
+                   }
+                 else
+#endif
+                   error ("Cannot find bounds of current function.");
+               }
+             else
+               {
+                 step_range_start = SYMBOL_VALUE_ADDRESS (msymbol);
+                 step_range_end = SYMBOL_VALUE_ADDRESS (msymbol + 1);
+               }
 
              printf_filtered ("Single stepping until function exit.\n");
              fflush (stdout);
-
-             step_range_start = SYMBOL_VALUE_ADDRESS (msymbol);
-             step_range_end = SYMBOL_VALUE_ADDRESS (msymbol + 1);
            }
        }
       else