This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[rfc/rfa:doc] PC_IN_SIGTRAMP; Was: [RFA] Multi-arch IN_SIGTRAMP


[Eli, note the doco update]

Try the attached.

It introduces a new macro PC_IN_SIGTRAMP that falls back to the existing
IN_SIGTRAMP behavour.  This avoids the need to modify all the tm.h files.

Andrew
2002-04-21  Andrew Cagney  <ac131313@redhat.com>

	* arch-utils.h: Update copyright.

	* gdbarch.sh (PC_IN_SIGTRAMP): Add.
	* gdbarch.h, gdbarch.c: Re-generate.

	* inferior.h (IN_SIGTRAMP): Delete definition.
	* arch-utils.c (legacy_pc_in_sigtramp): New function.
	* arch-utils.h (legacy_pc_in_sigtramp): Declare.

	* mips-tdep.c (mips_init_extra_frame_info): Use PC_IN_SIGTRAMP.
	(mips_dump_tdep): Do not print value of IN_SIGTRAMP.
	* hppa-tdep.c (pc_in_interrupt_handler):  Use PC_IN_SIGTRAMP.
	(find_proc_framesize): Ditto.
	* alpha-tdep.c (alpha_osf_skip_sigtramp_frame): Ditto.
	(alpha_init_extra_frame_info): Ditto.
	* infrun.c (handle_inferior_event): Ditto.
	(handle_inferior_event): Ditto.
	(check_sigtramp2): Ditto.
	* blockframe.c (create_new_frame): Ditto.
	(get_prev_frame): Ditto.
	* ppc-linux-tdep.c: Update comments.
	* i386-linux-tdep.c: Update comments.
	* breakpoint.c (bpstat_what): Update comment.

Index: doc/ChangeLog
2002-04-21  Andrew Cagney  <ac131313@redhat.com>

	* gdbint.texinfo (Target Architecture Definition): Replace
	IN_SIGTRAMP with PC_IN_SIGTRAMP.

Index: alpha-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/alpha-tdep.c,v
retrieving revision 1.20
diff -u -r1.20 alpha-tdep.c
--- alpha-tdep.c	19 Apr 2002 05:11:52 -0000	1.20
+++ alpha-tdep.c	21 Apr 2002 17:18:34 -0000
@@ -236,7 +236,7 @@
 {
   char *name;
   find_pc_partial_function (pc, &name, (CORE_ADDR *) NULL, (CORE_ADDR *) NULL);
-  if (IN_SIGTRAMP (pc, name))
+  if (PC_IN_SIGTRAMP (pc, name))
     return frame->frame;
   else
     return 0;
@@ -968,7 +968,7 @@
 	     We can't use frame->signal_handler_caller, it is not yet set.  */
 	  find_pc_partial_function (frame->pc, &name,
 				    (CORE_ADDR *) NULL, (CORE_ADDR *) NULL);
-	  if (!IN_SIGTRAMP (frame->pc, name))
+	  if (!PC_IN_SIGTRAMP (frame->pc, name))
 	    {
 	      frame->saved_regs = (CORE_ADDR *)
 		frame_obstack_alloc (SIZEOF_FRAME_SAVED_REGS);
Index: arch-utils.c
===================================================================
RCS file: /cvs/src/src/gdb/arch-utils.c,v
retrieving revision 1.52
diff -u -r1.52 arch-utils.c
--- arch-utils.c	18 Apr 2002 18:08:58 -0000	1.52
+++ arch-utils.c	21 Apr 2002 17:18:35 -0000
@@ -423,6 +423,24 @@
   return TYPE_LENGTH (REGISTER_VIRTUAL_TYPE (regnum));
 }
 
+#if !defined (IN_SIGTRAMP)
+#if defined (SIGTRAMP_START)
+#define IN_SIGTRAMP(pc, name) \
+       ((pc) >= SIGTRAMP_START(pc)   \
+        && (pc) < SIGTRAMP_END(pc) \
+        )
+#else
+#define IN_SIGTRAMP(pc, name) \
+       (name && STREQ ("_sigtramp", name))
+#endif
+#endif
+
+int
+legacy_pc_in_sigtramp (CORE_ADDR pc, char *name)
+{
+  return IN_SIGTRAMP(pc, name);
+}
+
 
 /* Functions to manipulate the endianness of the target.  */
 
Index: arch-utils.h
===================================================================
RCS file: /cvs/src/src/gdb/arch-utils.h,v
retrieving revision 1.29
diff -u -r1.29 arch-utils.h
--- arch-utils.h	6 Feb 2002 13:00:44 -0000	1.29
+++ arch-utils.h	21 Apr 2002 17:18:35 -0000
@@ -1,5 +1,6 @@
 /* Dynamic architecture support for GDB, the GNU debugger.
-   Copyright 1998, 1999, 2000 Free Software Foundation, Inc.
+
+   Copyright 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -155,6 +156,9 @@
 /* Assume the virtual size of registers corresponds to the virtual type.  */
 
 extern int generic_register_virtual_size (int regnum);
+
+/* Prop up old targets that use various IN_SIGTRAMP() macros.  */
+extern int legacy_pc_in_sigtramp (CORE_ADDR pc, char *name);
 
 /* Initialize a ``struct info''.  Can't use memset(0) since some
    default values are not zero.  */
Index: arm-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/arm-tdep.c,v
retrieving revision 1.49
diff -u -r1.49 arm-tdep.c
--- arm-tdep.c	21 Apr 2002 03:46:44 -0000	1.49
+++ arm-tdep.c	21 Apr 2002 17:18:46 -0000
@@ -1075,20 +1075,20 @@
     sp = (fi->next->frame - fi->next->extra_info->frameoffset
 	  + fi->next->extra_info->framesize);
 
-  /* Determine whether or not we're in a sigtramp frame. 
+  /* Determine whether or not we're in a sigtramp frame.
      Unfortunately, it isn't sufficient to test
      fi->signal_handler_caller because this value is sometimes set
      after invoking INIT_EXTRA_FRAME_INFO.  So we test *both*
-     fi->signal_handler_caller and IN_SIGTRAMP to determine if we need
-     to use the sigcontext addresses for the saved registers.
+     fi->signal_handler_caller and PC_IN_SIGTRAMP to determine if we
+     need to use the sigcontext addresses for the saved registers.
 
-     Note: If an ARM IN_SIGTRAMP method ever needs to compare against
-     the name of the function, the code below will have to be changed
-     to first fetch the name of the function and then pass this name
-     to IN_SIGTRAMP.  */
+     Note: If an ARM PC_IN_SIGTRAMP method ever needs to compare
+     against the name of the function, the code below will have to be
+     changed to first fetch the name of the function and then pass
+     this name to PC_IN_SIGTRAMP.  */
 
   if (SIGCONTEXT_REGISTER_ADDRESS_P () 
-      && (fi->signal_handler_caller || IN_SIGTRAMP (fi->pc, (char *)0)))
+      && (fi->signal_handler_caller || PC_IN_SIGTRAMP (fi->pc, (char *)0)))
     {
       for (reg = 0; reg < NUM_REGS; reg++)
 	fi->saved_regs[reg] = SIGCONTEXT_REGISTER_ADDRESS (sp, fi->pc, reg);
Index: blockframe.c
===================================================================
RCS file: /cvs/src/src/gdb/blockframe.c,v
retrieving revision 1.24
diff -u -r1.24 blockframe.c
--- blockframe.c	14 Apr 2002 13:38:06 -0000	1.24
+++ blockframe.c	21 Apr 2002 17:18:58 -0000
@@ -227,7 +227,7 @@
   fi->frame = addr;
   fi->pc = pc;
   find_pc_partial_function (pc, &name, (CORE_ADDR *) NULL, (CORE_ADDR *) NULL);
-  fi->signal_handler_caller = IN_SIGTRAMP (fi->pc, name);
+  fi->signal_handler_caller = PC_IN_SIGTRAMP (fi->pc, name);
 
   if (INIT_EXTRA_FRAME_INFO_P ())
     INIT_EXTRA_FRAME_INFO (0, fi);
@@ -458,7 +458,7 @@
 
   find_pc_partial_function (prev->pc, &name,
 			    (CORE_ADDR *) NULL, (CORE_ADDR *) NULL);
-  if (IN_SIGTRAMP (prev->pc, name))
+  if (PC_IN_SIGTRAMP (prev->pc, name))
     prev->signal_handler_caller = 1;
 
   return prev;
@@ -747,7 +747,7 @@
   /* If sigtramp is in the u area, it counts as a function (especially
      important for step_1).  */
 #if defined SIGTRAMP_START
-  if (IN_SIGTRAMP (mapped_pc, (char *) NULL))
+  if (PC_IN_SIGTRAMP (mapped_pc, (char *) NULL))
     {
       cache_pc_function_low = SIGTRAMP_START (mapped_pc);
       cache_pc_function_high = SIGTRAMP_END (mapped_pc);
Index: breakpoint.c
===================================================================
RCS file: /cvs/src/src/gdb/breakpoint.c,v
retrieving revision 1.72
diff -u -r1.72 breakpoint.c
--- breakpoint.c	9 Apr 2002 22:33:25 -0000	1.72
+++ breakpoint.c	21 Apr 2002 17:19:16 -0000
@@ -2850,7 +2850,7 @@
 
   /* step_resume entries: a step resume breakpoint overrides another
      breakpoint of signal handling (see comment in wait_for_inferior
-     at first IN_SIGTRAMP where we set the step_resume breakpoint).  */
+     at first PC_IN_SIGTRAMP where we set the step_resume breakpoint).  */
   /* We handle the through_sigtramp_breakpoint the same way; having both
      one of those and a step_resume_breakpoint is probably very rare (?).  */
 
Index: gdbarch.sh
===================================================================
RCS file: /cvs/src/src/gdb/gdbarch.sh,v
retrieving revision 1.128
diff -u -r1.128 gdbarch.sh
--- gdbarch.sh	20 Apr 2002 17:41:18 -0000	1.128
+++ gdbarch.sh	21 Apr 2002 17:19:34 -0000
@@ -608,6 +608,27 @@
 # trampoline code in the ".plt" section.  IN_SOLIB_CALL_TRAMPOLINE evaluates
 # to nonzero if we are current stopped in one of these.
 f:2:IN_SOLIB_CALL_TRAMPOLINE:int:in_solib_call_trampoline:CORE_ADDR pc, char *name:pc, name:::generic_in_solib_call_trampoline::0
+# Sigtramp is a routine that the kernel calls (which then calls the
+# signal handler).  On most machines it is a library routine that is
+# linked into the executable.
+#
+# This macro, given a program counter value and the name of the
+# function in which that PC resides (which can be null if the name is
+# not known), returns nonzero if the PC and name show that we are in
+# sigtramp.
+#
+# On most machines just see if the name is sigtramp (and if we have
+# no name, assume we are not in sigtramp).
+#
+# FIXME: cagney/2002-04-21: The function find_pc_partial_function
+# calls find_pc_sect_partial_function() which calls PC_IN_SIGTRAMP.
+# This means PC_IN_SIGTRAMP function can't be implemented by doing its
+# own local NAME lookup.
+#
+# FIXME: cagney/2002-04-21: PC_IN_SIGTRAMP is something of a mess.
+# Some code also depends on SIGTRAMP_START and SIGTRAMP_END but other
+# does not.
+f:2:PC_IN_SIGTRAMP:int:pc_in_sigtramp:CORE_ADDR pc, char *name:pc, name:::legacy_pc_in_sigtramp::0
 # A target might have problems with watchpoints as soon as the stack
 # frame of the current function has been destroyed.  This mostly happens
 # as the first action in a funtion's epilogue.  in_function_epilogue_p()
Index: hppa-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/hppa-tdep.c,v
retrieving revision 1.25
diff -u -r1.25 hppa-tdep.c
--- hppa-tdep.c	12 Apr 2002 18:18:57 -0000	1.25
+++ hppa-tdep.c	21 Apr 2002 17:19:49 -0000
@@ -633,7 +633,8 @@
      its frame isn't a pure interrupt frame.  Deal with this.  */
   msym_us = lookup_minimal_symbol_by_pc (pc);
 
-  return u->HP_UX_interrupt_marker && !IN_SIGTRAMP (pc, SYMBOL_NAME (msym_us));
+  return (u->HP_UX_interrupt_marker
+	  && !PC_IN_SIGTRAMP (pc, SYMBOL_NAME (msym_us)));
 }
 
 /* Called when no unwind descriptor was found for PC.  Returns 1 if it
@@ -751,7 +752,7 @@
   if (u->Save_SP
       && !pc_in_interrupt_handler (pc)
       && msym_us
-      && !IN_SIGTRAMP (pc, SYMBOL_NAME (msym_us)))
+      && !PC_IN_SIGTRAMP (pc, SYMBOL_NAME (msym_us)))
     return -1;
 
   return u->Total_frame_size << 3;
Index: i386-linux-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-linux-tdep.c,v
retrieving revision 1.11
diff -u -r1.11 i386-linux-tdep.c
--- i386-linux-tdep.c	24 Feb 2002 22:31:19 -0000	1.11
+++ i386-linux-tdep.c	21 Apr 2002 17:19:49 -0000
@@ -92,7 +92,7 @@
 
    It kind of sucks that we have to read memory from the process in
    order to identify a signal trampoline, but there doesn't seem to be
-   any other way.  The IN_SIGTRAMP macro in tm-linux.h arranges to
+   any other way.  The PC_IN_SIGTRAMP macro in tm-linux.h arranges to
    only call us if no function name could be identified, which should
    be the case since the code is on the stack.
 
@@ -317,7 +317,7 @@
    in progress when the signal trampoline was entered.  GDB mostly
    treats this frame pointer value as a magic cookie.  We detect the
    case of a signal trampoline by looking at the SIGNAL_HANDLER_CALLER
-   field, which is set based on IN_SIGTRAMP.
+   field, which is set based on PC_IN_SIGTRAMP.
 
    When a signal trampoline is invoked from a frameless function, we
    essentially have two frameless functions in a row.  In this case,
Index: inferior.h
===================================================================
RCS file: /cvs/src/src/gdb/inferior.h,v
retrieving revision 1.26
diff -u -r1.26 inferior.h
--- inferior.h	10 Apr 2002 22:00:20 -0000	1.26
+++ inferior.h	21 Apr 2002 17:19:52 -0000
@@ -403,29 +403,6 @@
 
 extern int attach_flag;
 
-/* Sigtramp is a routine that the kernel calls (which then calls the
-   signal handler).  On most machines it is a library routine that
-   is linked into the executable.
-
-   This macro, given a program counter value and the name of the
-   function in which that PC resides (which can be null if the
-   name is not known), returns nonzero if the PC and name show
-   that we are in sigtramp.
-
-   On most machines just see if the name is sigtramp (and if we have
-   no name, assume we are not in sigtramp).  */
-#if !defined (IN_SIGTRAMP)
-#if defined (SIGTRAMP_START)
-#define IN_SIGTRAMP(pc, name) \
-       ((pc) >= SIGTRAMP_START(pc)   \
-        && (pc) < SIGTRAMP_END(pc) \
-        )
-#else
-#define IN_SIGTRAMP(pc, name) \
-       (name && STREQ ("_sigtramp", name))
-#endif
-#endif
-
 /* Possible values for CALL_DUMMY_LOCATION.  */
 #define ON_STACK 1
 #define BEFORE_TEXT_END 2
Index: infrun.c
===================================================================
RCS file: /cvs/src/src/gdb/infrun.c,v
retrieving revision 1.56
diff -u -r1.56 infrun.c
--- infrun.c	18 Mar 2002 02:26:31 -0000	1.56
+++ infrun.c	21 Apr 2002 17:20:24 -0000
@@ -2640,8 +2640,8 @@
     ecs->update_step_sp = 1;
 
     /* Did we just take a signal?  */
-    if (IN_SIGTRAMP (stop_pc, ecs->stop_func_name)
-	&& !IN_SIGTRAMP (prev_pc, prev_func_name)
+    if (PC_IN_SIGTRAMP (stop_pc, ecs->stop_func_name)
+	&& !PC_IN_SIGTRAMP (prev_pc, prev_func_name)
 	&& INNER_THAN (read_sp (), step_sp))
       {
 	/* We've just taken a signal; go until we are back to
@@ -2752,7 +2752,7 @@
 	  {
 	    /* We're doing a "next".  */
 
-	    if (IN_SIGTRAMP (stop_pc, ecs->stop_func_name)
+	    if (PC_IN_SIGTRAMP (stop_pc, ecs->stop_func_name)
 		&& INNER_THAN (step_frame_address, read_sp()))
 	      /* We stepped out of a signal handler, and into its
                  calling trampoline.  This is misdetected as a
@@ -2961,8 +2961,8 @@
 check_sigtramp2 (struct execution_control_state *ecs)
 {
   if (trap_expected
-      && IN_SIGTRAMP (stop_pc, ecs->stop_func_name)
-      && !IN_SIGTRAMP (prev_pc, prev_func_name)
+      && PC_IN_SIGTRAMP (stop_pc, ecs->stop_func_name)
+      && !PC_IN_SIGTRAMP (prev_pc, prev_func_name)
       && INNER_THAN (read_sp (), step_sp))
     {
       /* What has happened here is that we have just stepped the
Index: mips-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/mips-tdep.c,v
retrieving revision 1.70
diff -u -r1.70 mips-tdep.c
--- mips-tdep.c	18 Apr 2002 18:09:02 -0000	1.70
+++ mips-tdep.c	21 Apr 2002 17:20:29 -0000
@@ -2108,7 +2108,7 @@
 	     We can't use fci->signal_handler_caller, it is not yet set.  */
 	  find_pc_partial_function (fci->pc, &name,
 				    (CORE_ADDR *) NULL, (CORE_ADDR *) NULL);
-	  if (!IN_SIGTRAMP (fci->pc, name))
+	  if (!PC_IN_SIGTRAMP (fci->pc, name))
 	    {
 	      frame_saved_regs_zalloc (fci);
 	      memcpy (fci->saved_regs, temp_saved_regs, SIZEOF_FRAME_SAVED_REGS);
@@ -4576,9 +4576,6 @@
   fprintf_unfiltered (file,
 		      "mips_dump_tdep: IGNORE_HELPER_CALL # %s\n",
 		      XSTRING (IGNORE_HELPER_CALL (PC)));
-  fprintf_unfiltered (file,
-		      "mips_dump_tdep: IN_SIGTRAMP # %s\n",
-		      XSTRING (IN_SIGTRAMP (PC, NAME)));
   fprintf_unfiltered (file,
 		      "mips_dump_tdep: IN_SOLIB_CALL_TRAMPOLINE # %s\n",
 		      XSTRING (IN_SOLIB_CALL_TRAMPOLINE (PC, NAME)));
Index: ppc-linux-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/ppc-linux-tdep.c,v
retrieving revision 1.15
diff -u -r1.15 ppc-linux-tdep.c
--- ppc-linux-tdep.c	18 Apr 2002 18:09:06 -0000	1.15
+++ ppc-linux-tdep.c	21 Apr 2002 17:20:29 -0000
@@ -106,10 +106,11 @@
 /* Determine if pc is in a signal trampoline...
 
    Ha!  That's not what this does at all.  wait_for_inferior in
-   infrun.c calls IN_SIGTRAMP in order to detect entry into a signal
-   trampoline just after delivery of a signal.  But on GNU/Linux,
-   signal trampolines are used for the return path only.  The kernel
-   sets things up so that the signal handler is called directly.
+   infrun.c calls PC_IN_SIGTRAMP in order to detect entry into a
+   signal trampoline just after delivery of a signal.  But on
+   GNU/Linux, signal trampolines are used for the return path only.
+   The kernel sets things up so that the signal handler is called
+   directly.
 
    If we use in_sigtramp2() in place of in_sigtramp() (see below)
    we'll (often) end up with stop_pc in the trampoline and prev_pc in
@@ -141,11 +142,11 @@
    first instruction long after the fact, just in case the observed
    behavior is ever fixed.)
 
-   IN_SIGTRAMP is called from blockframe.c as well in order to set
+   PC_IN_SIGTRAMP is called from blockframe.c as well in order to set
    the signal_handler_caller flag.  Because of our strange definition
-   of in_sigtramp below, we can't rely on signal_handler_caller getting
-   set correctly from within blockframe.c.  This is why we take pains
-   to set it in init_extra_frame_info().  */
+   of in_sigtramp below, we can't rely on signal_handler_caller
+   getting set correctly from within blockframe.c.  This is why we
+   take pains to set it in init_extra_frame_info().  */
 
 int
 ppc_linux_in_sigtramp (CORE_ADDR pc, char *func_name)
Index: doc/gdbint.texinfo
===================================================================
RCS file: /cvs/src/src/gdb/doc/gdbint.texinfo,v
retrieving revision 1.77
diff -u -r1.77 gdbint.texinfo
--- doc/gdbint.texinfo	21 Apr 2002 15:52:35 -0000	1.77
+++ doc/gdbint.texinfo	21 Apr 2002 17:21:26 -0000
@@ -3095,11 +3095,6 @@
 the stack frame of the function already has been destroyed up to the
 final `return from function call' instruction.
 
-@item IN_SIGTRAMP (@var{pc}, @var{name})
-@findex IN_SIGTRAMP
-Define this to return non-zero if the given @var{pc} and/or @var{name}
-indicates that the current function is a @code{sigtramp}.
-
 @item SIGTRAMP_START (@var{pc})
 @findex SIGTRAMP_START
 @itemx SIGTRAMP_END (@var{pc})
@@ -3297,6 +3292,16 @@
 @item PC_IN_CALL_DUMMY
 @findex PC_IN_CALL_DUMMY
 See @file{inferior.h}.
+
+@item PC_IN_SIGTRAMP (@var{pc}, @var{name})
+@findex PC_IN_SIGTRAMP
+Sigtramp is a routine that the kernel calls (which then calls the signal
+handler).  On most machines it is a library routine that is linked into
+the executable.
+
+This function, given a program counter value and the (possibly NULL)
+name of the function in which that @var{pc} resides, returns nonzero if
+the @var{pc} and/or @var{name} show that we are in sigtramp.
 
 @item PC_LOAD_SEGMENT
 @findex PC_LOAD_SEGMENT


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]