* gdbarch.sh (SIGTRAMP_START, SIGTRAMP_END): New methods.
authorMark Kettenis <kettenis@gnu.org>
Fri, 6 Sep 2002 20:17:40 +0000 (20:17 +0000)
committerMark Kettenis <kettenis@gnu.org>
Fri, 6 Sep 2002 20:17:40 +0000 (20:17 +0000)
* gdbarch.h, gdbarch.c: Re-generate.
* blockframe.c (find_pc_sect_partial_function): Convert to use
SIGTRAMP_START_P predicate.

gdb/ChangeLog
gdb/blockframe.c
gdb/gdbarch.c
gdb/gdbarch.h
gdb/gdbarch.sh

index 59b2c24466e87b746b1058d01eefa7846230103d..fb418c92253c8a4c2ecefe9168b546966576643b 100644 (file)
@@ -1,3 +1,10 @@
+2002-09-06  Mark Kettenis  <kettenis@gnu.org>
+
+       * gdbarch.sh (SIGTRAMP_START, SIGTRAMP_END): New methods.
+       * gdbarch.h, gdbarch.c: Re-generate.
+       * blockframe.c (find_pc_sect_partial_function): Convert to use
+       SIGTRAMP_START_P predicate.
+
 2002-09-05  Michael Snyder  <msnyder@redhat.com>
 
        * arm-tdep.c (arm_init_extra_frame_info): Distinguish between
index b2c5d0eabe9837df85395fe33142404164f4c79d..3ff725b72686b79a937aa6fdcc5ef6c589ab313c 100644 (file)
@@ -816,8 +816,7 @@ find_pc_sect_partial_function (CORE_ADDR pc, asection *section, char **name,
 
   /* If sigtramp is in the u area, it counts as a function (especially
      important for step_1).  */
-#if defined SIGTRAMP_START
-  if (PC_IN_SIGTRAMP (mapped_pc, (char *) NULL))
+  if (SIGTRAMP_START_P () && PC_IN_SIGTRAMP (mapped_pc, (char *) NULL))
     {
       cache_pc_function_low = SIGTRAMP_START (mapped_pc);
       cache_pc_function_high = SIGTRAMP_END (mapped_pc);
@@ -825,7 +824,6 @@ find_pc_sect_partial_function (CORE_ADDR pc, asection *section, char **name,
       cache_pc_function_section = section;
       goto return_cached_value;
     }
-#endif
 
   msymbol = lookup_minimal_symbol_by_pc_section (mapped_pc, section);
   pst = find_pc_sect_psymtab (mapped_pc, section);
index e930642f15f39bef737647b107db9cade7c46ffe..49c1152a00724411c76185ae637252fdcbc173ce 100644 (file)
@@ -260,6 +260,8 @@ struct gdbarch
   gdbarch_in_solib_call_trampoline_ftype *in_solib_call_trampoline;
   gdbarch_in_solib_return_trampoline_ftype *in_solib_return_trampoline;
   gdbarch_pc_in_sigtramp_ftype *pc_in_sigtramp;
+  gdbarch_sigtramp_start_ftype *sigtramp_start;
+  gdbarch_sigtramp_end_ftype *sigtramp_end;
   gdbarch_in_function_epilogue_p_ftype *in_function_epilogue_p;
   gdbarch_construct_inferior_arguments_ftype *construct_inferior_arguments;
   gdbarch_dwarf2_build_frame_info_ftype *dwarf2_build_frame_info;
@@ -414,6 +416,8 @@ struct gdbarch startup_gdbarch =
   0,
   0,
   0,
+  0,
+  0,
   generic_in_function_epilogue_p,
   construct_inferior_arguments,
   0,
@@ -786,6 +790,8 @@ verify_gdbarch (struct gdbarch *gdbarch)
   /* Skip verify of in_solib_call_trampoline, invalid_p == 0 */
   /* Skip verify of in_solib_return_trampoline, invalid_p == 0 */
   /* Skip verify of pc_in_sigtramp, invalid_p == 0 */
+  /* Skip verify of sigtramp_start, has predicate */
+  /* Skip verify of sigtramp_end, invalid_p == 0 */
   /* Skip verify of in_function_epilogue_p, invalid_p == 0 */
   /* Skip verify of construct_inferior_arguments, invalid_p == 0 */
   /* Skip verify of dwarf2_build_frame_info, has predicate */
@@ -1862,6 +1868,28 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
                         (long) current_gdbarch->sdb_reg_to_regnum
                         /*SDB_REG_TO_REGNUM ()*/);
 #endif
+#ifdef SIGTRAMP_END
+  fprintf_unfiltered (file,
+                      "gdbarch_dump: %s # %s\n",
+                      "SIGTRAMP_END(pc)",
+                      XSTRING (SIGTRAMP_END (pc)));
+  if (GDB_MULTI_ARCH)
+    fprintf_unfiltered (file,
+                        "gdbarch_dump: SIGTRAMP_END = 0x%08lx\n",
+                        (long) current_gdbarch->sigtramp_end
+                        /*SIGTRAMP_END ()*/);
+#endif
+#ifdef SIGTRAMP_START
+  fprintf_unfiltered (file,
+                      "gdbarch_dump: %s # %s\n",
+                      "SIGTRAMP_START(pc)",
+                      XSTRING (SIGTRAMP_START (pc)));
+  if (GDB_MULTI_ARCH)
+    fprintf_unfiltered (file,
+                        "gdbarch_dump: SIGTRAMP_START = 0x%08lx\n",
+                        (long) current_gdbarch->sigtramp_start
+                        /*SIGTRAMP_START ()*/);
+#endif
 #ifdef SIZEOF_CALL_DUMMY_WORDS
   fprintf_unfiltered (file,
                       "gdbarch_dump: SIZEOF_CALL_DUMMY_WORDS # %s\n",
@@ -4780,6 +4808,51 @@ set_gdbarch_pc_in_sigtramp (struct gdbarch *gdbarch,
   gdbarch->pc_in_sigtramp = pc_in_sigtramp;
 }
 
+int
+gdbarch_sigtramp_start_p (struct gdbarch *gdbarch)
+{
+  gdb_assert (gdbarch != NULL);
+  return gdbarch->sigtramp_start != 0;
+}
+
+CORE_ADDR
+gdbarch_sigtramp_start (struct gdbarch *gdbarch, CORE_ADDR pc)
+{
+  gdb_assert (gdbarch != NULL);
+  if (gdbarch->sigtramp_start == 0)
+    internal_error (__FILE__, __LINE__,
+                    "gdbarch: gdbarch_sigtramp_start invalid");
+  if (gdbarch_debug >= 2)
+    fprintf_unfiltered (gdb_stdlog, "gdbarch_sigtramp_start called\n");
+  return gdbarch->sigtramp_start (pc);
+}
+
+void
+set_gdbarch_sigtramp_start (struct gdbarch *gdbarch,
+                            gdbarch_sigtramp_start_ftype sigtramp_start)
+{
+  gdbarch->sigtramp_start = sigtramp_start;
+}
+
+CORE_ADDR
+gdbarch_sigtramp_end (struct gdbarch *gdbarch, CORE_ADDR pc)
+{
+  gdb_assert (gdbarch != NULL);
+  if (gdbarch->sigtramp_end == 0)
+    internal_error (__FILE__, __LINE__,
+                    "gdbarch: gdbarch_sigtramp_end invalid");
+  if (gdbarch_debug >= 2)
+    fprintf_unfiltered (gdb_stdlog, "gdbarch_sigtramp_end called\n");
+  return gdbarch->sigtramp_end (pc);
+}
+
+void
+set_gdbarch_sigtramp_end (struct gdbarch *gdbarch,
+                          gdbarch_sigtramp_end_ftype sigtramp_end)
+{
+  gdbarch->sigtramp_end = sigtramp_end;
+}
+
 int
 gdbarch_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR addr)
 {
index b76bf4abfa0b6039fd0f35917dde547a67f03667..5976f469ec42ffc3e262f0b47fad6944e037e815 100644 (file)
@@ -2207,7 +2207,7 @@ extern void set_gdbarch_addr_bits_remove (struct gdbarch *gdbarch, gdbarch_addr_
 #endif
 #endif
 
-/* It is not at all clear why SMASH_TEXT_ADDRESS is not folded into
+/* It is not at all clear why SMASH_TEXT_ADDRESS is not folded into 
    ADDR_BITS_REMOVE. */
 
 /* Default (function) for non- multi-arch platforms. */
@@ -2385,6 +2385,55 @@ extern void set_gdbarch_pc_in_sigtramp (struct gdbarch *gdbarch, gdbarch_pc_in_s
 #endif
 #endif
 
+#if defined (SIGTRAMP_START)
+/* Legacy for systems yet to multi-arch SIGTRAMP_START */
+#if !defined (SIGTRAMP_START_P)
+#define SIGTRAMP_START_P() (1)
+#endif
+#endif
+
+/* Default predicate for non- multi-arch targets. */
+#if (!GDB_MULTI_ARCH) && !defined (SIGTRAMP_START_P)
+#define SIGTRAMP_START_P() (0)
+#endif
+
+extern int gdbarch_sigtramp_start_p (struct gdbarch *gdbarch);
+#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) && defined (SIGTRAMP_START_P)
+#error "Non multi-arch definition of SIGTRAMP_START"
+#endif
+#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) || !defined (SIGTRAMP_START_P)
+#define SIGTRAMP_START_P() (gdbarch_sigtramp_start_p (current_gdbarch))
+#endif
+
+/* Default (function) for non- multi-arch platforms. */
+#if (!GDB_MULTI_ARCH) && !defined (SIGTRAMP_START)
+#define SIGTRAMP_START(pc) (internal_error (__FILE__, __LINE__, "SIGTRAMP_START"), 0)
+#endif
+
+typedef CORE_ADDR (gdbarch_sigtramp_start_ftype) (CORE_ADDR pc);
+extern CORE_ADDR gdbarch_sigtramp_start (struct gdbarch *gdbarch, CORE_ADDR pc);
+extern void set_gdbarch_sigtramp_start (struct gdbarch *gdbarch, gdbarch_sigtramp_start_ftype *sigtramp_start);
+#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) && defined (SIGTRAMP_START)
+#error "Non multi-arch definition of SIGTRAMP_START"
+#endif
+#if GDB_MULTI_ARCH
+#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) || !defined (SIGTRAMP_START)
+#define SIGTRAMP_START(pc) (gdbarch_sigtramp_start (current_gdbarch, pc))
+#endif
+#endif
+
+typedef CORE_ADDR (gdbarch_sigtramp_end_ftype) (CORE_ADDR pc);
+extern CORE_ADDR gdbarch_sigtramp_end (struct gdbarch *gdbarch, CORE_ADDR pc);
+extern void set_gdbarch_sigtramp_end (struct gdbarch *gdbarch, gdbarch_sigtramp_end_ftype *sigtramp_end);
+#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) && defined (SIGTRAMP_END)
+#error "Non multi-arch definition of SIGTRAMP_END"
+#endif
+#if GDB_MULTI_ARCH
+#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) || !defined (SIGTRAMP_END)
+#define SIGTRAMP_END(pc) (gdbarch_sigtramp_end (current_gdbarch, pc))
+#endif
+#endif
+
 /* 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 1ce71afa7c130343ad915dfe253ece0f5c62688d..ff1d6ed1de60ca20af36eca5f6997b68fb721d39 100755 (executable)
@@ -636,6 +636,8 @@ f:2:IN_SOLIB_RETURN_TRAMPOLINE:int:in_solib_return_trampoline:CORE_ADDR pc, char
 # 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
+F:2:SIGTRAMP_START:CORE_ADDR:sigtramp_start:CORE_ADDR pc:pc
+f:2:SIGTRAMP_END:CORE_ADDR:sigtramp_end:CORE_ADDR pc:pc:::::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()