* alpha-tdep.h (gdbarch_tdep): Add sigcontext_addr member.
authorJason Thorpe <thorpej@netbsd.org>
Fri, 26 Apr 2002 07:05:35 +0000 (07:05 +0000)
committerJason Thorpe <thorpej@netbsd.org>
Fri, 26 Apr 2002 07:05:35 +0000 (07:05 +0000)
* alpha-tdep.c (alpha_sigcontext_addr): New function.
(alpha_find_saved_regs): Use alpha_sigcontext_addr.
(alpha_gdbarch_init): Initialize tdep->sigcontext_addr.
* alpha-linux-tdep.c: Include frame.h.
(alpha_linux_sigcontext_addr): New function.
(alpha_linux_init_abi): Set tdep->sigcontext_addr to
alpha_linux_sigcontext_addr.
* alpha-osf1-tdep.c: Include gdbcore.h.
(alpha_osf1_sigcontext_addr): New function.
(alpha_osf1_init_abi): Set tdep->sigcontext_addr to
alpha_osf1_sigcontext_addr.
* config/alpha/tm-alpha.h (SIGCONTEXT_ADDR): Remove.
* config/alpha/tm-alphalinux.h (SIGCONTEXT_ADDR): Remove.

gdb/ChangeLog
gdb/alpha-linux-tdep.c
gdb/alpha-osf1-tdep.c
gdb/alpha-tdep.c
gdb/alpha-tdep.h
gdb/config/alpha/tm-alpha.h
gdb/config/alpha/tm-alphalinux.h

index 362b366..6084d5e 100644 (file)
@@ -1,3 +1,20 @@
+2002-04-26  Jason Thorpe  <thorpej@wasabisystems.com>
+
+       * alpha-tdep.h (gdbarch_tdep): Add sigcontext_addr member.
+       * alpha-tdep.c (alpha_sigcontext_addr): New function.
+       (alpha_find_saved_regs): Use alpha_sigcontext_addr.
+       (alpha_gdbarch_init): Initialize tdep->sigcontext_addr.
+       * alpha-linux-tdep.c: Include frame.h.
+       (alpha_linux_sigcontext_addr): New function.
+       (alpha_linux_init_abi): Set tdep->sigcontext_addr to
+       alpha_linux_sigcontext_addr.
+       * alpha-osf1-tdep.c: Include gdbcore.h.
+       (alpha_osf1_sigcontext_addr): New function.
+       (alpha_osf1_init_abi): Set tdep->sigcontext_addr to
+       alpha_osf1_sigcontext_addr.
+       * config/alpha/tm-alpha.h (SIGCONTEXT_ADDR): Remove.
+       * config/alpha/tm-alphalinux.h (SIGCONTEXT_ADDR): Remove.
+
 2002-04-26  Andrew Cagney  <ac131313@redhat.com>
 
        * stack.c (selected_frame_level): 
index 05a9544..d467840 100644 (file)
@@ -19,6 +19,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
+#include "frame.h"
 #include "gdbcore.h"
 #include "value.h"
 
@@ -91,6 +92,12 @@ alpha_linux_pc_in_sigtramp (CORE_ADDR pc, char *func_name)
   return (alpha_linux_sigtramp_offset (pc) >= 0);
 }
 
+static CORE_ADDR
+alpha_linux_sigcontext_addr (struct frame_info *frame)
+{
+  return (frame->frame - 0x298); /* sizeof(struct sigcontext) */
+}
+
 static void
 alpha_linux_init_abi (struct gdbarch_info info,
                       struct gdbarch *gdbarch)
@@ -100,6 +107,7 @@ alpha_linux_init_abi (struct gdbarch_info info,
   set_gdbarch_pc_in_sigtramp (gdbarch, alpha_linux_pc_in_sigtramp);
 
   tdep->dynamic_sigtramp_offset = alpha_linux_sigtramp_offset;
+  tdep->sigcontext_addr = alpha_linux_sigcontext_addr;
 
   tdep->jb_pc = 2;
   tdep->jb_elt_size = 8;
index be8f704..67c56cf 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "defs.h"
 #include "frame.h"
+#include "gdbcore.h"
 #include "value.h"
 
 #include "alpha-tdep.h"
@@ -43,6 +44,13 @@ alpha_osf1_pc_in_sigtramp (CORE_ADDR pc, char *func_name)
   return (func_name != NULL && STREQ ("__sigtramp", func_name));
 }
 
+static CORE_ADDR
+alpha_osf1_sigcontext_addr (struct frame_info *frame)
+{
+  return (read_memory_integer (frame->next ? frame->next->frame
+                                          : frame->frame, 8));
+}
+
 static void
 alpha_osf1_init_abi (struct gdbarch_info info,
                      struct gdbarch *gdbarch)
@@ -52,6 +60,7 @@ alpha_osf1_init_abi (struct gdbarch_info info,
   set_gdbarch_pc_in_sigtramp (gdbarch, alpha_osf1_pc_in_sigtramp);
 
   tdep->skip_sigtramp_frame = alpha_osf1_skip_sigtramp_frame;
+  tdep->sigcontext_addr = alpha_osf1_sigcontext_addr;
 
   tdep->jb_pc = 2;
   tdep->jb_elt_size = 8;
index 6145e91..6f52097 100644 (file)
@@ -344,6 +344,17 @@ alpha_register_virtual_size (int regno)
 }
 \f
 
+static CORE_ADDR
+alpha_sigcontext_addr (struct frame_info *fi)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+
+  if (tdep->sigcontext_addr)
+    return (tdep->sigcontext_addr (fi));
+
+  return (0);
+}
+
 /* Guaranteed to set frame->saved_regs to some values (it never leaves it
    NULL).  */
 
@@ -372,7 +383,12 @@ alpha_find_saved_regs (struct frame_info *frame)
     {
       CORE_ADDR sigcontext_addr;
 
-      sigcontext_addr = SIGCONTEXT_ADDR (frame);
+      sigcontext_addr = alpha_sigcontext_addr (frame);
+      if (sigcontext_addr == 0)
+       {
+         /* Don't know where the sigcontext is; just bail.  */
+         return;
+       }
       for (ireg = 0; ireg < 32; ireg++)
        {
          reg_position = sigcontext_addr + SIGFRAME_REGSAVE_OFF + ireg * 8;
@@ -1997,6 +2013,7 @@ alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   tdep->dynamic_sigtramp_offset = NULL;
   tdep->skip_sigtramp_frame = NULL;
+  tdep->sigcontext_addr = NULL;
 
   tdep->jb_pc = -1;    /* longjmp support not enabled by default  */
 
index 8b1cf3e..c3ee007 100644 (file)
@@ -106,6 +106,10 @@ struct gdbarch_tdep
      frame.  */
   CORE_ADDR (*skip_sigtramp_frame) (struct frame_info *, CORE_ADDR);
 
+  /* Translate a signal handler frame into the address of the sigcontext
+     structure for that signal handler.  */
+  CORE_ADDR (*sigcontext_addr) (struct frame_info *);
+
   int jb_pc;                   /* Offset to PC value in jump buffer.
                                   If htis is negative, longjmp support
                                   will be disabled.  */
index b8bcb39..feb752a 100644 (file)
@@ -83,10 +83,4 @@ extern void alpha_print_extra_frame_info (struct frame_info *);
   alpha_setup_arbitrary_frame (argc, argv)
 extern struct frame_info *alpha_setup_arbitrary_frame (int, CORE_ADDR *);
 
-/* Translate a signal handler frame into the address of the sigcontext
-   structure.  */
-
-#define SIGCONTEXT_ADDR(frame) \
-  (read_memory_integer ((frame)->next ? frame->next->frame : frame->frame, 8))
-
 #endif /* TM_ALPHA_H */
index fae1743..27ff457 100644 (file)
@@ -40,12 +40,6 @@ extern LONGEST alpha_linux_sigtramp_offset (CORE_ADDR);
 #undef START_INFERIOR_TRAPS_EXPECTED
 #define START_INFERIOR_TRAPS_EXPECTED 2
 
-/* Translate a signal handler frame into the address of the sigcontext
-   structure.  */
-
-#undef SIGCONTEXT_ADDR
-#define SIGCONTEXT_ADDR(frame)                 ((frame)->frame - 0x298)
-
 #include "tm-linux.h"
 
 #endif /* TM_LINUXALPHA_H */