From David S. Miller <davem@redhat.com>:
authorMark Kettenis <kettenis@gnu.org>
Sun, 9 Nov 2003 12:07:16 +0000 (12:07 +0000)
committerMark Kettenis <kettenis@gnu.org>
Sun, 9 Nov 2003 12:07:16 +0000 (12:07 +0000)
* gdbarch.sh (SKIP_SOLIB_RESOLVER): New method.
* gdbarch.c, gdbarch.h: Regenerated.
* arch-utils.c (generic_skip_solib_resolver): New function.
* arch-utils.h (generic_skip_solib_resolver): New prototype.
* infrun.c (SKIP_SOLIB_RESOLVER): Don't define.

gdb/ChangeLog
gdb/arch-utils.c
gdb/arch-utils.h
gdb/gdbarch.c
gdb/gdbarch.h
gdb/gdbarch.sh
gdb/infrun.c

index d636126990e790bea208abad9ddc31fd97e1a64c..b40dee9f386ecb74d4551b70ba83c69da20eefde 100644 (file)
@@ -1,3 +1,12 @@
+2003-11-09  Mark Kettenis  <kettenis@gnu.org>
+
+       From David S. Miller  <davem@redhat.com>:
+       * gdbarch.sh (SKIP_SOLIB_RESOLVER): New method.
+       * gdbarch.c, gdbarch.h: Regenerated.
+       * arch-utils.c (generic_skip_solib_resolver): New function.
+       * arch-utils.h (generic_skip_solib_resolver): New prototype.
+       * infrun.c (SKIP_SOLIB_RESOLVER): Don't define.
+
 2003-11-07  Andrew Cagney  <cagney@redhat.com>
 
        * top.c (print_gdb_version): Replace STREQ with strcmp.
index 21c56823e760ccd1442eecd99ca9514d156baf20..2c564e741f76879ee792a1925f3eac94c426bc79 100644 (file)
@@ -100,6 +100,12 @@ generic_skip_trampoline_code (CORE_ADDR pc)
   return 0;
 }
 
+CORE_ADDR
+generic_skip_solib_resolver (CORE_ADDR pc)
+{
+  return 0;
+}
+
 int
 generic_in_solib_call_trampoline (CORE_ADDR pc, char *name)
 {
index 27df54dd1f749b937add78d889d5b4795f4919c9..a180fda885c8855e363e72d3b237e473a2f581b6 100644 (file)
@@ -110,6 +110,8 @@ extern gdbarch_virtual_frame_pointer_ftype legacy_virtual_frame_pointer;
 
 extern CORE_ADDR generic_skip_trampoline_code (CORE_ADDR pc);
 
+extern CORE_ADDR generic_skip_solib_resolver (CORE_ADDR pc);
+
 extern int generic_in_solib_call_trampoline (CORE_ADDR pc, char *name);
 
 extern int generic_in_solib_return_trampoline (CORE_ADDR pc, char *name);
index 8198bb0d6c28a4bfc891b8bd1db0b8400e3843a9..75652a88eb199e095c69d526c198d6d44e3fcd51 100644 (file)
@@ -252,6 +252,7 @@ struct gdbarch
   gdbarch_software_single_step_ftype *software_single_step;
   gdbarch_print_insn_ftype *print_insn;
   gdbarch_skip_trampoline_code_ftype *skip_trampoline_code;
+  gdbarch_skip_solib_resolver_ftype *skip_solib_resolver;
   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;
@@ -424,6 +425,7 @@ struct gdbarch startup_gdbarch =
   0,  /* software_single_step */
   0,  /* print_insn */
   0,  /* skip_trampoline_code */
+  0,  /* skip_solib_resolver */
   0,  /* in_solib_call_trampoline */
   0,  /* in_solib_return_trampoline */
   0,  /* pc_in_sigtramp */
@@ -553,6 +555,7 @@ gdbarch_alloc (const struct gdbarch_info *info,
   current_gdbarch->addr_bits_remove = core_addr_identity;
   current_gdbarch->smash_text_address = core_addr_identity;
   current_gdbarch->skip_trampoline_code = generic_skip_trampoline_code;
+  current_gdbarch->skip_solib_resolver = generic_skip_solib_resolver;
   current_gdbarch->in_solib_call_trampoline = generic_in_solib_call_trampoline;
   current_gdbarch->in_solib_return_trampoline = generic_in_solib_return_trampoline;
   current_gdbarch->pc_in_sigtramp = legacy_pc_in_sigtramp;
@@ -756,6 +759,7 @@ verify_gdbarch (struct gdbarch *gdbarch)
       && (gdbarch->print_insn == 0))
     fprintf_unfiltered (log, "\n\tprint_insn");
   /* Skip verify of skip_trampoline_code, invalid_p == 0 */
+  /* Skip verify of skip_solib_resolver, invalid_p == 0 */
   /* 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 */
@@ -2225,6 +2229,16 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
                       (long) current_gdbarch->skip_prologue
                       /*SKIP_PROLOGUE ()*/);
 #endif
+#ifdef SKIP_SOLIB_RESOLVER
+  fprintf_unfiltered (file,
+                      "gdbarch_dump: %s # %s\n",
+                      "SKIP_SOLIB_RESOLVER(pc)",
+                      XSTRING (SKIP_SOLIB_RESOLVER (pc)));
+  fprintf_unfiltered (file,
+                      "gdbarch_dump: SKIP_SOLIB_RESOLVER = <0x%08lx>\n",
+                      (long) current_gdbarch->skip_solib_resolver
+                      /*SKIP_SOLIB_RESOLVER ()*/);
+#endif
 #ifdef SKIP_TRAMPOLINE_CODE
   fprintf_unfiltered (file,
                       "gdbarch_dump: %s # %s\n",
@@ -5211,6 +5225,23 @@ set_gdbarch_skip_trampoline_code (struct gdbarch *gdbarch,
   gdbarch->skip_trampoline_code = skip_trampoline_code;
 }
 
+CORE_ADDR
+gdbarch_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
+{
+  gdb_assert (gdbarch != NULL);
+  gdb_assert (gdbarch->skip_solib_resolver != NULL);
+  if (gdbarch_debug >= 2)
+    fprintf_unfiltered (gdb_stdlog, "gdbarch_skip_solib_resolver called\n");
+  return gdbarch->skip_solib_resolver (pc);
+}
+
+void
+set_gdbarch_skip_solib_resolver (struct gdbarch *gdbarch,
+                                 gdbarch_skip_solib_resolver_ftype skip_solib_resolver)
+{
+  gdbarch->skip_solib_resolver = skip_solib_resolver;
+}
+
 int
 gdbarch_in_solib_call_trampoline (struct gdbarch *gdbarch, CORE_ADDR pc, char *name)
 {
index 36e0e7a590f32788e15ff1ac8b990284c82b31e1..021ab36363984041d115a98698745c36dabc3bfb 100644 (file)
@@ -2134,6 +2134,20 @@ extern void set_gdbarch_skip_trampoline_code (struct gdbarch *gdbarch, gdbarch_s
 #define SKIP_TRAMPOLINE_CODE(pc) (gdbarch_skip_trampoline_code (current_gdbarch, pc))
 #endif
 
+/* If IN_SOLIB_DYNSYM_RESOLVE_CODE returns true, and SKIP_SOLIB_RESOLVER
+   evaluates non-zero, this is the address where the debugger will place
+   a step-resume breakpoint to get us past the dynamic linker. */
+
+typedef CORE_ADDR (gdbarch_skip_solib_resolver_ftype) (CORE_ADDR pc);
+extern CORE_ADDR gdbarch_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc);
+extern void set_gdbarch_skip_solib_resolver (struct gdbarch *gdbarch, gdbarch_skip_solib_resolver_ftype *skip_solib_resolver);
+#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) && defined (SKIP_SOLIB_RESOLVER)
+#error "Non multi-arch definition of SKIP_SOLIB_RESOLVER"
+#endif
+#if !defined (SKIP_SOLIB_RESOLVER)
+#define SKIP_SOLIB_RESOLVER(pc) (gdbarch_skip_solib_resolver (current_gdbarch, pc))
+#endif
+
 /* For SVR4 shared libraries, each call goes through a small piece of
    trampoline code in the ".plt" section.  IN_SOLIB_CALL_TRAMPOLINE evaluates
    to nonzero if we are currently stopped in one of these. */
index d11e2fa11eec3df503b6b7605ea771f80020ecef..c1c39f687dd6ccba758512e414ca9c7e33bce94d 100755 (executable)
@@ -700,6 +700,10 @@ f::TARGET_PRINT_INSN:int:print_insn:bfd_vma vma, struct disassemble_info *info:v
 f:2:SKIP_TRAMPOLINE_CODE:CORE_ADDR:skip_trampoline_code:CORE_ADDR pc:pc:::generic_skip_trampoline_code::0
 
 
+# If IN_SOLIB_DYNSYM_RESOLVE_CODE returns true, and SKIP_SOLIB_RESOLVER
+# evaluates non-zero, this is the address where the debugger will place
+# a step-resume breakpoint to get us past the dynamic linker.
+f:2:SKIP_SOLIB_RESOLVER:CORE_ADDR:skip_solib_resolver:CORE_ADDR pc:pc:::generic_skip_solib_resolver::0
 # For SVR4 shared libraries, each call goes through a small piece of
 # trampoline code in the ".plt" section.  IN_SOLIB_CALL_TRAMPOLINE evaluates
 # to nonzero if we are currently stopped in one of these.
index 3a8e1216321639119c21524efbfbb29baf846836..6bc22a6531bc022dfaf73082aef01f7971ea4ea6 100644 (file)
@@ -153,10 +153,6 @@ static int may_follow_exec = MAY_FOLLOW_EXEC;
 #define IN_SOLIB_DYNSYM_RESOLVE_CODE(pc) 0
 #endif
 
-#ifndef SKIP_SOLIB_RESOLVER
-#define SKIP_SOLIB_RESOLVER(pc) 0
-#endif
-
 /* This function returns TRUE if pc is the address of an instruction
    that lies within the dynamic linker (such as the event hook, or the
    dld itself).
This page took 0.035101 seconds and 4 git commands to generate.