* objfiles.h (struct objfile): Add memebers `data' and `num_data'.
authorMark Kettenis <kettenis@gnu.org>
Thu, 21 Aug 2003 22:35:33 +0000 (22:35 +0000)
committerMark Kettenis <kettenis@gnu.org>
Thu, 21 Aug 2003 22:35:33 +0000 (22:35 +0000)
(register_objfile_data, set_objfile_data, objfile_data): New
prototypes.
* objfiles.c (objfile_alloc_data, objfile_free_data): New
prototypes.
(allocate_objfile): Call objfile_alloc_data.
(free_objfile): Call objfile_free_data.
(struct objfile_data): New.
(struct objfile_data_registration): New.
(struct objfile_data_registry): New.
(objfile_data_registry): New variable.
(register_objfile_data): New function.
(objfile_alloc_data, objfile_free_data): New functions.
(set_objfile_data, objfile_data): New functions.
* dwarf2-frame.c (dwarf2_frame_data): New variable.
(dwarf2_frame_find_fde, add_fde): Use new per-objfile data mechanism.
(_initialize_dwarf2_frame): New function and prototype.

gdb/ChangeLog
gdb/dwarf2-frame.c
gdb/objfiles.c
gdb/objfiles.h

index c0c62696c06f698bcf801c1973ee63453b3192c0..8ef8b5cc6834502d531243421193da89d090c913 100644 (file)
@@ -1,3 +1,23 @@
+2003-07-13  Mark Kettenis  <kettenis@gnu.org>
+
+       * objfiles.h (struct objfile): Add memebers `data' and `num_data'.
+       (register_objfile_data, set_objfile_data, objfile_data): New
+       prototypes.
+       * objfiles.c (objfile_alloc_data, objfile_free_data): New
+       prototypes.
+       (allocate_objfile): Call objfile_alloc_data.
+       (free_objfile): Call objfile_free_data.
+       (struct objfile_data): New.
+       (struct objfile_data_registration): New.
+       (struct objfile_data_registry): New.
+       (objfile_data_registry): New variable.
+       (register_objfile_data): New function.
+       (objfile_alloc_data, objfile_free_data): New functions.
+       (set_objfile_data, objfile_data): New functions.
+       * dwarf2-frame.c (dwarf2_frame_data): New variable.
+       (dwarf2_frame_find_fde, add_fde): Use new per-objfile data mechanism.
+       (_initialize_dwarf2_frame): New function and prototype.
+
 2003-08-21  Andrew Cagney  <cagney@redhat.com>
 
        * sh3-rom.c (sh3_open, sh3e_open): Use gdbarch_update_p to select
index 6a40df5e32560938e635221e09d3ff867a7b2446..c40726a5907f28ce522eb2a430b85eed49c2f95f 100644 (file)
@@ -780,6 +780,8 @@ struct comp_unit
   bfd_vma dbase;
 };
 
+const struct objfile_data *dwarf2_frame_data;
+
 static unsigned int
 read_1_byte (bfd *bfd, char *buf)
 {
@@ -1024,7 +1026,7 @@ dwarf2_frame_find_fde (CORE_ADDR *pc)
 
       offset = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
       
-      fde = objfile->sym_private;
+      fde = objfile_data (objfile, dwarf2_frame_data);
       while (fde)
        {
          if (*pc >= fde->initial_location + offset
@@ -1044,8 +1046,8 @@ dwarf2_frame_find_fde (CORE_ADDR *pc)
 static void
 add_fde (struct comp_unit *unit, struct dwarf2_fde *fde)
 {
-  fde->next = unit->objfile->sym_private;
-  unit->objfile->sym_private = fde;
+  fde->next = objfile_data (unit->objfile, dwarf2_frame_data);
+  set_objfile_data (unit->objfile, dwarf2_frame_data, fde);
 }
 
 #ifdef CC_HAS_LONG_LONG
@@ -1441,3 +1443,12 @@ dwarf2_build_frame_info (struct objfile *objfile)
        frame_ptr = decode_frame_entry (&unit, frame_ptr, 0);
     }
 }
+
+/* Provide a prototype to silence -Wmissing-prototypes.  */
+void _initialize_dwarf2_frame (void);
+
+void
+_initialize_dwarf2_frame (void)
+{
+  dwarf2_frame_data = register_objfile_data ();
+}
index 39f5623749df987d0fabce5c2a7aac8961b9bd69..ee4cdc4032c1ddda8accd9657a13569f938de3b3 100644 (file)
@@ -34,6 +34,7 @@
 #include "target.h"
 #include "bcache.h"
 
+#include "gdb_assert.h"
 #include <sys/types.h>
 #include "gdb_stat.h"
 #include <fcntl.h>
@@ -61,6 +62,9 @@ static void *map_to_file (int);
 
 static void add_to_objfile_sections (bfd *, sec_ptr, void *);
 
+static void objfile_alloc_data (struct objfile *objfile);
+static void objfile_free_data (struct objfile *objfile);
+
 /* Externally visible variables that are owned by this module.
    See declarations in objfile.h for more info. */
 
@@ -302,6 +306,8 @@ allocate_objfile (bfd *abfd, int flags)
       terminate_minimal_symbol_table (objfile);
     }
 
+  objfile_alloc_data (objfile);
+
   /* Update the per-objfile information that comes from the bfd, ensuring
      that any data that is reference is saved in the per-objfile data
      region. */
@@ -561,6 +567,7 @@ free_objfile (struct objfile *objfile)
 
   if (objfile != NULL)
     {
+      objfile_free_data (objfile);
       if (objfile->name != NULL)
        {
          xmfree (objfile->md, objfile->name);
@@ -1097,4 +1104,74 @@ is_in_import_list (char *name, struct objfile *objfile)
       return 1;
   return 0;
 }
+\f
+
+/* Keep a registry of per-objfile data-pointers required by other GDB
+   modules.  */
+
+struct objfile_data
+{
+  unsigned index;
+};
+
+struct objfile_data_registration
+{
+  struct objfile_data *data;
+  struct objfile_data_registration *next;
+};
+  
+struct objfile_data_registry
+{
+  struct objfile_data_registration *registrations;
+  unsigned num_registrations;
+};
+
+static struct objfile_data_registry objfile_data_registry = { NULL, 0 };
+
+const struct objfile_data *
+register_objfile_data (void)
+{
+  struct objfile_data_registration **curr;
+
+  /* Append new registration.  */
+  for (curr = &objfile_data_registry.registrations;
+       *curr != NULL; curr = &(*curr)->next);
 
+  *curr = XMALLOC (struct objfile_data_registration);
+  (*curr)->next = NULL;
+  (*curr)->data = XMALLOC (struct objfile_data);
+  (*curr)->data->index = objfile_data_registry.num_registrations++;
+
+  return (*curr)->data;
+}
+
+static void
+objfile_alloc_data (struct objfile *objfile)
+{
+  gdb_assert (objfile->data == NULL);
+  objfile->num_data = objfile_data_registry.num_registrations;
+  objfile->data = XCALLOC (objfile->num_data, void *);
+}
+
+static void
+objfile_free_data (struct objfile *objfile)
+{
+  gdb_assert (objfile->data != NULL);
+  xfree (objfile->data);
+  objfile->data = NULL;
+}
+
+void
+set_objfile_data (struct objfile *objfile, const struct objfile_data *data,
+                 void *value)
+{
+  gdb_assert (data->index < objfile->num_data);
+  objfile->data[data->index] = value;
+}
+
+void *
+objfile_data (struct objfile *objfile, const struct objfile_data *data)
+{
+  gdb_assert (data->index < objfile->num_data);
+  return objfile->data[data->index];
+}
index f747a680108fd191cc152b12dbe5d8b336fc5c26..80e61c523489bea337d9cabcb71f13c7a7405792 100644 (file)
@@ -379,6 +379,13 @@ struct objfile
 
     void *obj_private;
 
+    /* Per objfile data-pointers required by other GDB modules.  */
+    /* FIXME: kettenis/20030711: This mechanism could replace
+       sym_stab_info, sym_private and obj_private entirely.  */
+
+    void **data;
+    unsigned num_data;
+
     /* Set of relocation offsets to apply to each section.
        Currently on the psymbol_obstack (which makes no sense, but I'm
        not sure it's harming anything).
@@ -565,6 +572,16 @@ extern int in_plt_section (CORE_ADDR, char *);
 
 extern int is_in_import_list (char *, struct objfile *);
 
+/* Keep a registry of per-objfile data-pointers required by other GDB
+   modules.  */
+
+extern const struct objfile_data *register_objfile_data (void);
+extern void set_objfile_data (struct objfile *objfile,
+                             const struct objfile_data *data, void *value);
+extern void *objfile_data (struct objfile *objfile,
+                          const struct objfile_data *data);
+\f
+
 /* Traverse all object files.  ALL_OBJFILES_SAFE works even if you delete
    the objfile during the traversal.  */