* solib-svr4.c: Update copyright year. Include "gdb_assert.h".
authorMark Kettenis <kettenis@gnu.org>
Wed, 27 Apr 2005 14:30:15 +0000 (14:30 +0000)
committerMark Kettenis <kettenis@gnu.org>
Wed, 27 Apr 2005 14:30:15 +0000 (14:30 +0000)
(SVR4_FETCH_LINK_MAP_OFFSETS): Don't define if not already
defined.
(legacy_fetch_link_map_offsets): Remove prototype.
(fetch_link_map_offsets_gdbarch_data): Remove.
(LM_ADDR, LM_NEXT, IGNORE_FIRST_LINK_MAP_ENTRY)
(first_link_map_member, open_symbol_file_object, svr4_current_sos)
(svr4_fetch_objfile_link_map): Call svr4_fetch_link_map_offsets
instead of SVR4_FETCH_LINK_MAP_OFFSETS.
(solib_svr4_data): New variable.
(struct solib_svr4_ops): New.
(solib_svr4_init): New fynction.
(legacy_fetch_link_map_offsets, init_fetch_link_map_offsets):
Remove functions.
(svr4_fetch_link_map_offsets, svr4_have_link_map_offsets): Rewrite
using the new `struct solib_svr4_ops'.
(_initialize_svr4_solib): Replace registration of per-architecture
data.  Add temporary hack to set
svr4_legacy_fetch_link_map_offsets if SVR4_FETCH_LINK_MAP_OFFSETS
is set.
* Makefile.in (solib-svr4.o): Update dependencies.

gdb/ChangeLog
gdb/Makefile.in
gdb/solib-svr4.c

index 7137fe173bd2f88e5aa86cb5a7a1b5190453a386..49f45af1aed9e18b90e4eab98ff229e006888f9c 100644 (file)
@@ -1,3 +1,27 @@
+2005-04-27  Mark Kettenis  <kettenis@gnu.org>
+
+       * solib-svr4.c: Update copyright year.  Include "gdb_assert.h".
+       (SVR4_FETCH_LINK_MAP_OFFSETS): Don't define if not already
+       defined.
+       (legacy_fetch_link_map_offsets): Remove prototype.
+       (fetch_link_map_offsets_gdbarch_data): Remove.
+       (LM_ADDR, LM_NEXT, IGNORE_FIRST_LINK_MAP_ENTRY)
+       (first_link_map_member, open_symbol_file_object, svr4_current_sos)
+       (svr4_fetch_objfile_link_map): Call svr4_fetch_link_map_offsets
+       instead of SVR4_FETCH_LINK_MAP_OFFSETS.
+       (solib_svr4_data): New variable.
+       (struct solib_svr4_ops): New.
+       (solib_svr4_init): New fynction.
+       (legacy_fetch_link_map_offsets, init_fetch_link_map_offsets):
+       Remove functions.
+       (svr4_fetch_link_map_offsets, svr4_have_link_map_offsets): Rewrite
+       using the new `struct solib_svr4_ops'.
+       (_initialize_svr4_solib): Replace registration of per-architecture
+       data.  Add temporary hack to set
+       svr4_legacy_fetch_link_map_offsets if SVR4_FETCH_LINK_MAP_OFFSETS
+       is set.
+       * Makefile.in (solib-svr4.o): Update dependencies.
+
 2005-04-26  Mark Kettenis  <kettenis@gnu.org>
 
        * configure.tgt (*-*-freebsd*): Set gdb_osabi to
index fdbb819477fe4172e7c18296239e58f220cf1dcd..a64d403eab0007ac93f9829e973c73ca6ea775ac 100644 (file)
@@ -2540,8 +2540,8 @@ solib-sunos.o: solib-sunos.c $(defs_h) $(gdb_string_h) $(symtab_h) $(bfd_h) \
        $(bcache_h) $(regcache_h)
 solib-svr4.o: solib-svr4.c $(defs_h) $(elf_external_h) $(elf_common_h) \
        $(elf_mips_h) $(symtab_h) $(bfd_h) $(symfile_h) $(objfiles_h) \
-       $(gdbcore_h) $(target_h) $(inferior_h) $(solist_h) $(solib_svr4_h) \
-       $(bfd_target_h) $(exec_h)
+       $(gdbcore_h) $(target_h) $(inferior_h) $(gdb_assert_h) \
+       $(solist_h) $(solib_svr4_h) $(bfd_target_h) $(exec_h)
 sol-thread.o: sol-thread.c $(defs_h) $(gdbthread_h) $(target_h) \
        $(inferior_h) $(gdb_stat_h) $(gdbcmd_h) $(gdbcore_h) $(regcache_h) \
        $(symfile_h) $(gdb_string_h) $(gregset_h)
index 6106d9e4d6ea381099a64a07964e3265545b09fe..253be0a8469f1b1554cd1127733d731e847eb60a 100644 (file)
@@ -1,7 +1,7 @@
 /* Handle SVR4 shared libraries for GDB, the GNU Debugger.
 
    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999,
-   2000, 2001, 2003, 2004
+   2000, 2001, 2003, 2004, 2005
    Free Software Foundation, Inc.
 
    This file is part of GDB.
 #include "target.h"
 #include "inferior.h"
 
+#include "gdb_assert.h"
+
 #include "solist.h"
 #include "solib-svr4.h"
 
 #include "bfd-target.h"
 #include "exec.h"
 
-#ifndef SVR4_FETCH_LINK_MAP_OFFSETS
-#define SVR4_FETCH_LINK_MAP_OFFSETS() svr4_fetch_link_map_offsets ()
-#endif
-
 static struct link_map_offsets *svr4_fetch_link_map_offsets (void);
-static struct link_map_offsets *legacy_fetch_link_map_offsets (void);
 static int svr4_have_link_map_offsets (void);
 
-/* fetch_link_map_offsets_gdbarch_data is a handle used to obtain the
-   architecture specific link map offsets fetching function.  */
-
-static struct gdbarch_data *fetch_link_map_offsets_gdbarch_data;
-
-/* legacy_svr4_fetch_link_map_offsets_hook is a pointer to a function
-   which is used to fetch link map offsets.  It will only be set
-   by solib-legacy.c, if at all.  */
-
-struct link_map_offsets *(*legacy_svr4_fetch_link_map_offsets_hook) (void) = 0;
+/* This hook is set to a function that provides native link map
+   offsets if the code in solib-legacy.c is linked in.  */
+struct link_map_offsets *(*legacy_svr4_fetch_link_map_offsets_hook) (void);
 
 /* Link map info to include in an allocated so_list entry */
 
@@ -138,7 +128,7 @@ static char *main_name_list[] =
 static CORE_ADDR
 LM_ADDR (struct so_list *so)
 {
-  struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
+  struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
 
   return (CORE_ADDR) extract_signed_integer (so->lm_info->lm + lmo->l_addr_offset, 
                                             lmo->l_addr_size);
@@ -147,7 +137,7 @@ LM_ADDR (struct so_list *so)
 static CORE_ADDR
 LM_NEXT (struct so_list *so)
 {
-  struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
+  struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
 
   /* Assume that the address is unsigned.  */
   return extract_unsigned_integer (so->lm_info->lm + lmo->l_next_offset,
@@ -157,7 +147,7 @@ LM_NEXT (struct so_list *so)
 static CORE_ADDR
 LM_NAME (struct so_list *so)
 {
-  struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
+  struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
 
   /* Assume that the address is unsigned.  */
   return extract_unsigned_integer (so->lm_info->lm + lmo->l_name_offset,
@@ -167,7 +157,7 @@ LM_NAME (struct so_list *so)
 static int
 IGNORE_FIRST_LINK_MAP_ENTRY (struct so_list *so)
 {
-  struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
+  struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
 
   /* Assume that the address is unsigned.  */
   return extract_unsigned_integer (so->lm_info->lm + lmo->l_prev_offset,
@@ -477,7 +467,7 @@ static CORE_ADDR
 first_link_map_member (void)
 {
   CORE_ADDR lm = 0;
-  struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
+  struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
   char *r_map_buf = xmalloc (lmo->r_map_size);
   struct cleanup *cleanups = make_cleanup (xfree, r_map_buf);
 
@@ -524,7 +514,7 @@ open_symbol_file_object (void *from_ttyp)
   char *filename;
   int errcode;
   int from_tty = *(int *)from_ttyp;
-  struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
+  struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
   char *l_name_buf = xmalloc (lmo->l_name_size);
   struct cleanup *cleanups = make_cleanup (xfree, l_name_buf);
 
@@ -612,7 +602,7 @@ svr4_current_sos (void)
   lm = first_link_map_member ();  
   while (lm)
     {
-      struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
+      struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
       struct so_list *new
        = (struct so_list *) xmalloc (sizeof (struct so_list));
       struct cleanup *old_chain = make_cleanup (xfree, new);
@@ -694,7 +684,7 @@ svr4_fetch_objfile_link_map (struct objfile *objfile)
   while (lm)
     {
       /* Get info on the layout of the r_debug and link_map structures. */
-      struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
+      struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
       int errcode;
       char *buffer;
       struct lm_info objfile_lm_info;
@@ -1283,92 +1273,65 @@ svr4_relocate_section_addresses (struct so_list *so,
   sec->addr    = svr4_truncate_ptr (sec->addr    + LM_ADDR (so));
   sec->endaddr = svr4_truncate_ptr (sec->endaddr + LM_ADDR (so));
 }
+\f
 
+/* Architecture-specific operations.  */
 
-/* Fetch a link_map_offsets structure for native targets using struct
-   definitions from link.h.  See solib-legacy.c for the function
-   which does the actual work.
-   
-   Note: For non-native targets (i.e. cross-debugging situations),
-   a target specific fetch_link_map_offsets() function should be
-   defined and registered via set_solib_svr4_fetch_link_map_offsets().  */
+/* Per-architecture data key.  */
+static struct gdbarch_data *solib_svr4_data;
 
-static struct link_map_offsets *
-legacy_fetch_link_map_offsets (void)
+struct solib_svr4_ops
 {
-  if (legacy_svr4_fetch_link_map_offsets_hook)
-    return legacy_svr4_fetch_link_map_offsets_hook ();
-  else
-    {
-      internal_error (__FILE__, __LINE__,
-                      _("legacy_fetch_link_map_offsets called without legacy "
-                     "link_map support enabled."));
-      return 0;
-    }
-}
+  /* Return a description of the layout of `struct link_map'.  */
+  struct link_map_offsets *(*fetch_link_map_offsets)(void);
+};
 
-/* Fetch a link_map_offsets structure using the method registered in the
-   architecture vector.  */
+/* Return a default for the architecture-specific operations.  */
 
-static struct link_map_offsets *
-svr4_fetch_link_map_offsets (void)
+static void *
+solib_svr4_init (struct obstack *obstack)
 {
-  struct link_map_offsets *(*flmo)(void) =
-    gdbarch_data (current_gdbarch, fetch_link_map_offsets_gdbarch_data);
+  struct solib_svr4_ops *ops;
 
-  if (flmo == NULL)
-    {
-      internal_error (__FILE__, __LINE__, 
-                      _("svr4_fetch_link_map_offsets: fetch_link_map_offsets "
-                     "method not defined for this architecture."));
-      return 0;
-    }
-  else
-    return (flmo ());
+  ops = OBSTACK_ZALLOC (obstack, struct solib_svr4_ops);
+  ops->fetch_link_map_offsets = legacy_svr4_fetch_link_map_offsets_hook;
+  return ops;
 }
 
-/* Return 1 if a link map offset fetcher has been defined, 0 otherwise.  */
-static int
-svr4_have_link_map_offsets (void)
-{
-  struct link_map_offsets *(*flmo)(void) =
-    gdbarch_data (current_gdbarch, fetch_link_map_offsets_gdbarch_data);
-  if (flmo == NULL
-      || (flmo == legacy_fetch_link_map_offsets 
-          && legacy_svr4_fetch_link_map_offsets_hook == NULL))
-    return 0;
-  else
-    return 1;
-}
-
-/* set_solib_svr4_fetch_link_map_offsets() is intended to be called by
-   a <arch>_gdbarch_init() function.  It is used to establish an
-   architecture specific link_map_offsets fetcher for the architecture
-   being defined.  */
+/* Set the architecture-specific `struct link_map_offsets' fetcher for
+   GDBARCH to FLMO.  */
 
 void
 set_solib_svr4_fetch_link_map_offsets (struct gdbarch *gdbarch,
                                        struct link_map_offsets *(*flmo) (void))
 {
-  deprecated_set_gdbarch_data (gdbarch, fetch_link_map_offsets_gdbarch_data, flmo);
+  struct solib_svr4_ops *ops = gdbarch_data (gdbarch, solib_svr4_data);
+
+  ops->fetch_link_map_offsets = flmo;
 }
 
-/* Initialize the architecture-specific link_map_offsets fetcher.
-   This is called after <arch>_gdbarch_init() has set up its `struct
-   gdbarch' for the new architecture, and is only called if the
-   link_map_offsets fetcher isn't already initialized (which is
-   usually done by calling set_solib_svr4_fetch_link_map_offsets()
-   above in <arch>_gdbarch_init()).  Therefore we attempt to provide a
-   reasonable alternative (for native targets anyway) if the
-   <arch>_gdbarch_init() fails to call
-   set_solib_svr4_fetch_link_map_offsets().  */
+/* Fetch a link_map_offsets structure using the architecture-specific
+   `struct link_map_offsets' fetcher.  */
 
-static void *
-init_fetch_link_map_offsets (struct gdbarch *gdbarch)
+static struct link_map_offsets *
+svr4_fetch_link_map_offsets (void)
 {
-  return legacy_fetch_link_map_offsets;
+  struct solib_svr4_ops *ops = gdbarch_data (current_gdbarch, solib_svr4_data);
+
+  gdb_assert (ops->fetch_link_map_offsets);
+  return ops->fetch_link_map_offsets ();
 }
 
+/* Return 1 if a link map offset fetcher has been defined, 0 otherwise.  */
+
+static int
+svr4_have_link_map_offsets (void)
+{
+  struct solib_svr4_ops *ops = gdbarch_data (current_gdbarch, solib_svr4_data);
+  return (ops->fetch_link_map_offsets != NULL);
+}
+\f
+
 /* Most OS'es that have SVR4-style ELF dynamic libraries define a
    `struct r_debug' and a `struct link_map' that are binary compatible
    with the origional SVR4 implementation.  */
@@ -1447,8 +1410,12 @@ extern initialize_file_ftype _initialize_svr4_solib; /* -Wmissing-prototypes */
 void
 _initialize_svr4_solib (void)
 {
-  fetch_link_map_offsets_gdbarch_data =
-    gdbarch_data_register_post_init (init_fetch_link_map_offsets);
+  solib_svr4_data = gdbarch_data_register_pre_init (solib_svr4_init);
+
+  /* FIXME: Eliminate this ASAP.  */
+#ifdef SVR4_FETCH_LINK_MAP_OFFSETS
+  svr4_legacy_fetch_link_map_offsets = SVR4_FETCH_LINK_MAP_OFFSETS;
+#endif
 
   svr4_so_ops.relocate_section_addresses = svr4_relocate_section_addresses;
   svr4_so_ops.free_so = svr4_free_so;