* config/mips/linux.mt (DEPRECATED_TM_FILE): Delete.
authorDaniel Jacobowitz <drow@false.org>
Wed, 16 May 2007 14:07:56 +0000 (14:07 +0000)
committerDaniel Jacobowitz <drow@false.org>
Wed, 16 May 2007 14:07:56 +0000 (14:07 +0000)
* config/mips/tm-linux.h: Delete.
* mips-linux-tdep.c (mips_svr4_so_ops): New.
(mips_linux_in_dynsym_resolve_code): Make static.  Use
svr4_in_dynsym_resolve_code.
(mips_linux_init_abi): Initialize mips_svr4_so_ops.  Call
set_solib_ops.
* solib-svr4.c (svr4_in_dynsym_resolve_code, svr4_so_ops): Make
global.
* solib-svr4.h (svr4_so_ops, svr4_in_dynsym_resolve_code): Declare.
* Makefile.in (mips-linux-tdep.o): Update.
* solib.c (set_solib_ops): New.
(current_target_so_ops): Update comment.
* solib.h (set_solib_ops): New prototype.

gdb/ChangeLog
gdb/Makefile.in
gdb/config/mips/linux.mt
gdb/mips-linux-tdep.c
gdb/solib-svr4.c
gdb/solib-svr4.h
gdb/solib.c
gdb/solib.h

index a867139592e3fc232df2b72f384cc5af7623435b..1b1e492cef58234c5ea3f36b346703b7b5c16571 100644 (file)
@@ -1,3 +1,20 @@
+2007-05-16  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * config/mips/linux.mt (DEPRECATED_TM_FILE): Delete.
+       * config/mips/tm-linux.h: Delete.
+       * mips-linux-tdep.c (mips_svr4_so_ops): New.
+       (mips_linux_in_dynsym_resolve_code): Make static.  Use
+       svr4_in_dynsym_resolve_code.
+       (mips_linux_init_abi): Initialize mips_svr4_so_ops.  Call
+       set_solib_ops.
+       * solib-svr4.c (svr4_in_dynsym_resolve_code, svr4_so_ops): Make
+       global.
+       * solib-svr4.h (svr4_so_ops, svr4_in_dynsym_resolve_code): Declare.
+       * Makefile.in (mips-linux-tdep.o): Update.
+       * solib.c (set_solib_ops): New.
+       (current_target_so_ops): Update comment.
+       * solib.h (set_solib_ops): New prototype.
+
 2007-05-16  Chris Dearman  <chris@mips.com>
 
        * printcmd.c (do_examine): Fix typos in a comment.
index db74f877e1c30bb6b825ea814e912ef1f7a9d68d..fe3bfade26e6d98b8fcd1b2dbffb7391c0868fac 100644 (file)
@@ -2342,7 +2342,7 @@ mips-linux-tdep.o: mips-linux-tdep.c $(defs_h) $(gdbcore_h) $(target_h) \
        $(solib_svr4_h) $(osabi_h) $(mips_tdep_h) $(gdb_string_h) \
        $(gdb_assert_h) $(frame_h) $(regcache_h) $(trad_frame_h) \
        $(tramp_frame_h) $(gdbtypes_h) $(solib_h) $(symtab_h) \
-       $(mips_linux_tdep_h)
+       $(mips_linux_tdep_h) $(solist_h) $(solib_svr4_h)
 mipsnbsd-nat.o: mipsnbsd-nat.c $(defs_h) $(inferior_h) $(regcache_h) \
        $(target_h) $(mips_tdep_h) $(mipsnbsd_tdep_h) $(inf_ptrace_h)
 mipsnbsd-tdep.o: mipsnbsd-tdep.c $(defs_h) $(gdbcore_h) $(regcache_h) \
index 8ff463d727dd48058ff1226c79b0f7ef5d7ae8a6..f45d647a2149225fd3b6c6155b78e15ee5d74adc 100644 (file)
@@ -1,7 +1,6 @@
 # Target: Linux/MIPS
 TDEPFILES= mips-tdep.o mips-linux-tdep.o corelow.o \
        solib.o solib-svr4.o symfile-mem.o
-DEPRECATED_TM_FILE= tm-linux.h
 
 SIM_OBS = remote-sim.o
 SIM = ../sim/mips/libsim.a
index 4ca20ac90c86bd461e6921ab8abc7845ed4b66e0..ff0b124d7d75cc9534af6be4033a58a1918dee89 100644 (file)
 #include "tramp-frame.h"
 #include "gdbtypes.h"
 #include "solib.h"
+#include "solib-svr4.h"
+#include "solist.h"
 #include "symtab.h"
 #include "mips-linux-tdep.h"
 
+static struct target_so_ops mips_svr4_so_ops;
+
 /* Figure out where the longjmp will land.
    We expect the first arg to be a pointer to the jmp_buf structure
    from which we extract the pc (MIPS_LINUX_JB_PC) that we will land
@@ -617,12 +621,12 @@ mips_linux_in_dynsym_stub (CORE_ADDR pc, char *name)
 /* Return non-zero iff PC belongs to the dynamic linker resolution
    code or to a stub.  */
 
-int
+static int
 mips_linux_in_dynsym_resolve_code (CORE_ADDR pc)
 {
   /* Check whether PC is in the dynamic linker.  This also checks
      whether it is in the .plt section, which MIPS does not use.  */
-  if (in_solib_dynsym_resolve_code (pc))
+  if (svr4_in_dynsym_resolve_code (pc))
     return 1;
 
   /* Pattern match for the stub.  It would be nice if there were a
@@ -1060,6 +1064,16 @@ mips_linux_init_abi (struct gdbarch_info info,
   /* Enable TLS support.  */
   set_gdbarch_fetch_tls_load_module_address (gdbarch,
                                              svr4_fetch_objfile_link_map);
+
+  /* Initialize this lazily, to avoid an initialization order
+     dependency on solib-svr4.c's _initialize routine.  */
+  if (mips_svr4_so_ops.in_dynsym_resolve_code == NULL)
+    {
+      mips_svr4_so_ops = svr4_so_ops;
+      mips_svr4_so_ops.in_dynsym_resolve_code
+       = mips_linux_in_dynsym_resolve_code;
+    }
+  set_solib_ops (gdbarch, &mips_svr4_so_ops);
 }
 
 void
index 105ff3397cfa4813f69479c52a4bd0bde620eac4..7867d452d3b8a2fe9f99606150df62a7d9e1b8cb 100644 (file)
@@ -901,7 +901,7 @@ static CORE_ADDR interp_text_sect_high;
 static CORE_ADDR interp_plt_sect_low;
 static CORE_ADDR interp_plt_sect_high;
 
-static int
+int
 svr4_in_dynsym_resolve_code (CORE_ADDR pc)
 {
   return ((pc >= interp_text_sect_low && pc < interp_text_sect_high)
@@ -1556,7 +1556,7 @@ svr4_lp64_fetch_link_map_offsets (void)
 }
 \f
 
-static struct target_so_ops svr4_so_ops;
+struct target_so_ops svr4_so_ops;
 
 extern initialize_file_ftype _initialize_svr4_solib; /* -Wmissing-prototypes */
 
index ea0080a65a53cfbcc289083d9c788b9dcc5f7cff..3cb2e31fc2248d7799dbe2f199de9b3eab41515d 100644 (file)
@@ -23,6 +23,9 @@
 #define SOLIB_SVR4_H
 
 struct objfile;
+struct target_so_ops;
+
+extern struct target_so_ops svr4_so_ops;
 
 /* Critical offsets and sizes which describe struct r_debug and
    struct link_map on SVR4-like targets.  All offsets and sizes are
@@ -81,4 +84,8 @@ extern struct link_map_offsets *(*legacy_svr4_fetch_link_map_offsets_hook) (void
 extern struct link_map_offsets *svr4_ilp32_fetch_link_map_offsets (void);
 extern struct link_map_offsets *svr4_lp64_fetch_link_map_offsets (void);
 
+/* Return 1 if PC lies in the dynamic symbol resolution code of the
+   SVR4 run time loader.  */
+int svr4_in_dynsym_resolve_code (CORE_ADDR pc);
+
 #endif /* solib-svr4.h */
index 0b5e2e3938c4436c2486b1c2c168d26d6f362034..d260c12ce782de894525d39409a6ff0e480836d7 100644 (file)
@@ -67,11 +67,21 @@ solib_ops (struct gdbarch *gdbarch)
   struct target_so_ops **ops = gdbarch_data (gdbarch, solib_data);
   return *ops;
 }
+
+/* Set the solib operations for GDBARCH to NEW_OPS.  */
+
+void
+set_solib_ops (struct gdbarch *gdbarch, struct target_so_ops *new_ops)
+{
+  struct target_so_ops **ops = gdbarch_data (gdbarch, solib_data);
+  *ops = new_ops;
+}
 \f
 
 /* external data declarations */
 
-/* FIXME: gdbarch needs to control this variable */
+/* FIXME: gdbarch needs to control this variable, or else every
+   configuration needs to call set_solib_ops.  */
 struct target_so_ops *current_target_so_ops;
 
 /* local data declarations */
index 0ab9efc0fa64f1d1787d1e5dd0e77b4bb91b261f..b937dce100f7d530b38c282b4e02c2e05307d7c5 100644 (file)
@@ -26,6 +26,7 @@
 /* Forward decl's for prototypes */
 struct so_list;
 struct target_ops;
+struct target_so_ops;
 
 /* Called when we free all symtabs, to free the shared library information
    as well. */
@@ -57,4 +58,9 @@ extern int in_solib_dynsym_resolve_code (CORE_ADDR);
 
 extern void no_shared_libraries (char *ignored, int from_tty);
 
+/* Set the solib operations for GDBARCH to NEW_OPS.  */
+
+extern void set_solib_ops (struct gdbarch *gdbarch,
+                          struct target_so_ops *new_ops);
+
 #endif /* SOLIB_H */