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]

[RFA] Multi-arch SKIP_SOLIB_RESOLVER



The default is what currently the target gets if this
macro is not defined, which evalutates to '0'.

ARM and SPARC linux are fixed up, as they were ready to
multi-arch this already.

Ok to install?

2002-04-21  David S. Miller  <davem@redhat.com>

	* arch-utils.c, arch-utils.h (generic_skip_solib_resolver): New.
	* gdbarch.sh (SKIP_SOLIB_RESOLVER): Add, document, default to
	generic_skip_solib_resolver.
	* gdbarch.c, gdbarch.h: Regenerate.
	* infrun.c (SKIP_SOLIB_RESOLVER): Kill define.
	* sparc-linux-tdep.c (sparc_linux_skip_solib_resolver): Make it
	static.
	(sparc_linux_gdbarch_os_init): Pass it to
	set_gdbarch_skip_solib_resolver.
	* config/sparc/tm-linux.h, config/sparc/tm-sp64linux.h
	(SKIP_SOLIB_RESOLVER, sparc_linux_skip_solib_resovler): Kill.
	* arm-linux-tdep.c (arm_linux_skip_solib_resolver): Make it
	static.
	(arm_linux_init_abi): Pass it to set_gdbarch_skip_solib_resolver.
	* config/arm/tm-linux.h	(SKIP_SOLIB_RESOLVER,
	arm_linux_skip_solib_resovler): Kill.
	
--- ./config/arm/tm-linux.h.~1~	Sat Feb 23 14:17:12 2002
+++ ./config/arm/tm-linux.h	Sun Apr 21 01:33:06 2002
@@ -52,14 +52,6 @@ extern struct link_map_offsets *arm_linu
    need to skip over the dynamic linker call.  This function decides
    when to skip, and where to skip to.  See the comments for
    SKIP_SOLIB_RESOLVER at the top of infrun.c.  */
-extern CORE_ADDR arm_linux_skip_solib_resolver (CORE_ADDR pc);
-#define SKIP_SOLIB_RESOLVER arm_linux_skip_solib_resolver
-
-/* When we call a function in a shared library, and the PLT sends us
-   into the dynamic linker to find the function's real address, we
-   need to skip over the dynamic linker call.  This function decides
-   when to skip, and where to skip to.  See the comments for
-   SKIP_SOLIB_RESOLVER at the top of infrun.c.  */
 #if 0   
 #undef IN_SOLIB_DYNSYM_RESOLVE_CODE
 extern CORE_ADDR arm_in_solib_dynsym_resolve_code (CORE_ADDR pc, char *name);
--- ./config/sparc/tm-linux.h.~1~	Sun Apr 21 00:55:00 2002
+++ ./config/sparc/tm-linux.h	Sun Apr 21 01:30:19 2002
@@ -29,14 +29,6 @@
 
 #include "tm-linux.h"
 
-/* When we call a function in a shared library, and the PLT sends us
-   into the dynamic linker to find the function's real address, we
-   need to skip over the dynamic linker call.  This function decides
-   when to skip, and where to skip to.  See the comments for
-   SKIP_SOLIB_RESOLVER at the top of infrun.c.  */
-#define SKIP_SOLIB_RESOLVER sparc_linux_skip_solib_resolver
-extern CORE_ADDR sparc_linux_skip_solib_resolver (CORE_ADDR pc);
-
 #undef SKIP_PROLOGUE_FRAMELESS_P
 #define SKIP_PROLOGUE_FRAMELESS_P(PC) sparc_linux_skip_prologue_frameless_p (PC)
 extern CORE_ADDR sparc_linux_skip_prologue_frameless_p (CORE_ADDR pc);
--- ./config/sparc/tm-sp64linux.h.~1~	Sun Apr 21 00:55:05 2002
+++ ./config/sparc/tm-sp64linux.h	Sun Apr 21 01:30:27 2002
@@ -29,14 +29,6 @@ Foundation, Inc., 59 Temple Place - Suit
 
 #include "tm-linux.h"
 
-/* When we call a function in a shared library, and the PLT sends us
-   into the dynamic linker to find the function's real address, we
-   need to skip over the dynamic linker call.  This function decides
-   when to skip, and where to skip to.  See the comments for
-   SKIP_SOLIB_RESOLVER at the top of infrun.c.  */
-#define SKIP_SOLIB_RESOLVER sparc_linux_skip_solib_resolver
-extern CORE_ADDR sparc_linux_skip_solib_resolver (CORE_ADDR pc);
-
 #undef SKIP_PROLOGUE_FRAMELESS_P
 #define SKIP_PROLOGUE_FRAMELESS_P(PC) sparc_linux_skip_prologue_frameless_p (PC)
 extern CORE_ADDR sparc_linux_skip_prologue_frameless_p (CORE_ADDR pc);
--- ./arch-utils.c.~1~	Sun Apr 21 00:50:49 2002
+++ ./arch-utils.c	Sun Apr 21 01:20:26 2002
@@ -108,6 +108,12 @@ generic_skip_trampoline_code (CORE_ADDR 
   return 0;
 }
 
+CORE_ADDR
+generic_skip_solib_resolver (CORE_ADDR pc)
+{
+  return 0;
+}
+
 int
 generic_in_solib_call_trampoline (CORE_ADDR pc, char *name)
 {
--- ./arch-utils.h.~1~	Sun Apr 21 00:52:05 2002
+++ ./arch-utils.h	Sun Apr 21 01:20:44 2002
@@ -142,6 +142,8 @@ extern gdbarch_virtual_frame_pointer_fty
 
 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_sigtramp (CORE_ADDR pc, char *name);
--- ./gdbarch.sh.~1~	Sun Apr 21 00:51:11 2002
+++ ./gdbarch.sh	Sun Apr 21 01:29:11 2002
@@ -604,6 +604,10 @@ f:2:SMASH_TEXT_ADDRESS:CORE_ADDR:smash_t
 F:2:SOFTWARE_SINGLE_STEP:void:software_single_step:enum target_signal sig, int insert_breakpoints_p:sig, insert_breakpoints_p::0:0
 f:2:TARGET_PRINT_INSN:int:print_insn:bfd_vma vma, disassemble_info *info:vma, info:::legacy_print_insn::0
 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 current stopped in one of these.
--- ./gdbarch.c.~1~	Sun Apr 21 00:57:19 2002
+++ ./gdbarch.c	Sun Apr 21 01:25:14 2002
@@ -249,6 +249,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_sigtramp_ftype *in_sigtramp;
   gdbarch_in_function_epilogue_p_ftype *in_function_epilogue_p;
@@ -398,6 +399,7 @@ struct gdbarch startup_gdbarch =
   0,
   0,
   0,
+  0,
   generic_in_function_epilogue_p,
   construct_inferior_arguments,
   0,
@@ -517,6 +519,7 @@ gdbarch_alloc (const struct gdbarch_info
   current_gdbarch->smash_text_address = core_addr_identity;
   current_gdbarch->print_insn = legacy_print_insn;
   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_function_epilogue_p = generic_in_function_epilogue_p;
   current_gdbarch->construct_inferior_arguments = construct_inferior_arguments;
@@ -765,6 +768,7 @@ verify_gdbarch (struct gdbarch *gdbarch)
   /* Skip verify of software_single_step, has predicate */
   /* Skip verify of print_insn, invalid_p == 0 */
   /* 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 */
   if (gdbarch->in_sigtramp == 0)
     gdbarch->in_sigtramp = generic_in_sigtramp;
@@ -1812,6 +1816,17 @@ gdbarch_dump (struct gdbarch *gdbarch, s
                         (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)));
+  if (GDB_MULTI_ARCH)
+    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",
@@ -4403,6 +4418,24 @@ set_gdbarch_skip_trampoline_code (struct
                                   gdbarch_skip_trampoline_code_ftype skip_trampoline_code)
 {
   gdbarch->skip_trampoline_code = skip_trampoline_code;
+}
+
+CORE_ADDR
+gdbarch_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
+{
+  if (gdbarch->skip_solib_resolver == 0)
+    internal_error (__FILE__, __LINE__,
+                    "gdbarch: gdbarch_skip_solib_resolver invalid");
+  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.h.~1~	Sun Apr 21 00:56:38 2002
+++ ./gdbarch.h	Sun Apr 21 01:24:33 2002
@@ -2247,6 +2247,27 @@ extern void set_gdbarch_skip_trampoline_
 #endif
 #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. */
+
+/* Default (function) for non- multi-arch platforms. */
+#if (!GDB_MULTI_ARCH) && !defined (SKIP_SOLIB_RESOLVER)
+#define SKIP_SOLIB_RESOLVER(pc) (generic_skip_solib_resolver (pc))
+#endif
+
+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 GDB_MULTI_ARCH
+#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) || !defined (SKIP_SOLIB_RESOLVER)
+#define SKIP_SOLIB_RESOLVER(pc) (gdbarch_skip_solib_resolver (current_gdbarch, pc))
+#endif
+#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 current stopped in one of these. */
--- ./infrun.c.~1~	Sun Mar 17 18:26:31 2002
+++ ./infrun.c	Sun Apr 21 01:31:36 2002
@@ -173,10 +173,6 @@ static int may_follow_exec = MAY_FOLLOW_
 #define IN_SOLIB_DYNSYM_RESOLVE_CODE(pc) 0
 #endif
 
-#ifndef SKIP_SOLIB_RESOLVER
-#define SKIP_SOLIB_RESOLVER(pc) 0
-#endif
-
 /* In some shared library schemes, the return path from a shared library
    call may need to go through a trampoline too.  */
 
--- ./sparc-linux-tdep.c.~1~	Sun Apr 21 00:54:02 2002
+++ ./sparc-linux-tdep.c	Sun Apr 21 01:30:03 2002
@@ -350,11 +350,9 @@ skip_hurd_resolver (CORE_ADDR pc)
    1) decides whether a PLT has sent us into the linker to resolve
       a function reference, and 
    2) if so, tells us where to set a temporary breakpoint that will
-      trigger when the dynamic linker is done.
+   trigger when the dynamic linker is done.  */
 
-   TODO Need to generically multi-arch this thing.  */
-
-CORE_ADDR
+static CORE_ADDR
 sparc_linux_skip_solib_resolver (CORE_ADDR pc)
 {
   CORE_ADDR result;
@@ -484,6 +482,7 @@ sparc_linux_gdbarch_os_init(struct gdbar
   set_gdbarch_frame_saved_pc (gdbarch, sparc_linux_frame_saved_pc);
   set_gdbarch_saved_pc_after_call (gdbarch, sparc_linux_saved_pc_after_call);
   set_gdbarch_in_sigtramp (gdbarch, sparc_linux_in_sigtramp);
+  set_gdbarch_skip_solib_resolver (gdbarch, sparc_linux_skip_solib_resolver);
 
   if (gdbarch_tdep (gdbarch)->intreg_size == 4)
     {
--- ./arm-linux-tdep.c.~1~	Sat Feb 23 14:17:11 2002
+++ ./arm-linux-tdep.c	Sun Apr 21 01:32:38 2002
@@ -418,7 +418,7 @@ skip_hurd_resolver (CORE_ADDR pc)
    2) if so, tells us where to set a temporary breakpoint that will
       trigger when the dynamic linker is done.  */
 
-CORE_ADDR
+static CORE_ADDR
 arm_linux_skip_solib_resolver (CORE_ADDR pc)
 {
   CORE_ADDR result;
@@ -537,6 +537,7 @@ arm_linux_init_abi (struct gdbarch_info 
 
   /* Shared library handling.  */
   set_gdbarch_in_solib_call_trampoline (gdbarch, in_plt_section);
+  set_gdbarch_skip_solib_resolver (gdbarch, arm_linux_skip_solib_resolver);
   set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
 }
 


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