* coffread.c (coff_objfile_data_key): New global.
authorTom Tromey <tromey@redhat.com>
Wed, 12 Dec 2012 16:22:33 +0000 (16:22 +0000)
committerTom Tromey <tromey@redhat.com>
Wed, 12 Dec 2012 16:22:33 +0000 (16:22 +0000)
(coff_symfile_init): Use set_objfile_data.
(coff_symfile_read): Use objfile_data.
(coff_symfile_finish): Don't free deprecated_sym_private.
(coff_free_info): New function.
(_initialize_coffread): Initialize coff_objfile_data_key.
* mdebugread.c (pending_list): Update comment.
* objfiles.h (struct objfile) <deprecated_sym_private>: Remove.
* symfile.c (reread_symbols): Don't mention
deprecated_sym_private.
* xcoffread.c (xcoff_objfile_data_key): New global.
(XCOFF_DATA): New macro.
(process_linenos, enter_line_range, xcoff_next_symbol_text)
(read_xcoff_symtab, coff_getfilename, read_symbol_lineno): Use
XCOFF_DATA.
(xcoff_new_init) Use set_objfile_data.
(xcoff_symfile_finish): Don't free deprecated_sym_private.
(init_stringtab, swap_sym, scan_xcoff_symtab)
(xcoff_get_toc_offset, xcoff_initial_scan): Use XCOFF_DATA.
(xcoff_free_info): New function.
(_initialize_xcoffread): Initialize xcoff_objfile_data_key.

gdb/ChangeLog
gdb/coffread.c
gdb/mdebugread.c
gdb/objfiles.h
gdb/symfile.c
gdb/xcoffread.c

index 8ead70598dde70e020b400e816abf63a16bc2d1f..f9235b5bc955f911af5fbf5b44c867642a1375a0 100644 (file)
@@ -1,3 +1,27 @@
+2012-12-12  Tom Tromey  <tromey@redhat.com>
+
+       * coffread.c (coff_objfile_data_key): New global.
+       (coff_symfile_init): Use set_objfile_data.
+       (coff_symfile_read): Use objfile_data.
+       (coff_symfile_finish): Don't free deprecated_sym_private.
+       (coff_free_info): New function.
+       (_initialize_coffread): Initialize coff_objfile_data_key.
+       * mdebugread.c (pending_list): Update comment.
+       * objfiles.h (struct objfile) <deprecated_sym_private>: Remove.
+       * symfile.c (reread_symbols): Don't mention
+       deprecated_sym_private.
+       * xcoffread.c (xcoff_objfile_data_key): New global.
+       (XCOFF_DATA): New macro.
+       (process_linenos, enter_line_range, xcoff_next_symbol_text)
+       (read_xcoff_symtab, coff_getfilename, read_symbol_lineno): Use
+       XCOFF_DATA.
+       (xcoff_new_init) Use set_objfile_data.
+       (xcoff_symfile_finish): Don't free deprecated_sym_private.
+       (init_stringtab, swap_sym, scan_xcoff_symtab)
+       (xcoff_get_toc_offset, xcoff_initial_scan): Use XCOFF_DATA.
+       (xcoff_free_info): New function.
+       (_initialize_xcoffread): Initialize xcoff_objfile_data_key.
+
 2012-12-12  Tom Tromey  <tromey@redhat.com>
 
        * coffread.c (coff_symfile_init): Use set_objfile_data.
index 94d0554dab5d47c5e817f315d09a0c212e758d99..56ed5aea0d156b21fde994cab1e27a434a326e97 100644 (file)
 
 extern void _initialize_coffread (void);
 
+/* Key for COFF-associated data.  */
+
+static const struct objfile_data *coff_objfile_data_key;
+
 /* The objfile we are currently reading.  */
 
 static struct objfile *coffread_objfile;
@@ -451,17 +455,15 @@ static void
 coff_symfile_init (struct objfile *objfile)
 {
   struct dbx_symfile_info *dbx;
+  struct coff_symfile_info *coff;
 
   /* Allocate struct to keep track of stab reading.  */
   dbx = XCNEW (struct dbx_symfile_info);
   set_objfile_data (objfile, dbx_objfile_data_key, dbx);
 
   /* Allocate struct to keep track of the symfile.  */
-  objfile->deprecated_sym_private
-    = xmalloc (sizeof (struct coff_symfile_info));
-
-  memset (objfile->deprecated_sym_private, 0,
-         sizeof (struct coff_symfile_info));
+  coff = XCNEW (struct coff_symfile_info);
+  set_objfile_data (objfile, coff_objfile_data_key, coff);
 
   /* COFF objects may be reordered, so set OBJF_REORDERED.  If we
      find this causes a significant slowdown in gdb then we could
@@ -526,7 +528,7 @@ coff_symfile_read (struct objfile *objfile, int symfile_flags)
   struct cleanup *back_to, *cleanup_minimal_symbols;
   int stabstrsize;
   
-  info = (struct coff_symfile_info *) objfile->deprecated_sym_private;
+  info = objfile_data (objfile, coff_objfile_data_key);
   dbxinfo = DBX_SYMFILE_INFO (objfile);
   symfile_bfd = abfd;          /* Kludge for swap routines.  */
 
@@ -680,11 +682,6 @@ coff_new_init (struct objfile *ignore)
 static void
 coff_symfile_finish (struct objfile *objfile)
 {
-  if (objfile->deprecated_sym_private != NULL)
-    {
-      xfree (objfile->deprecated_sym_private);
-    }
-
   /* Let stabs reader clean up.  */
   stabsread_clear_cache ();
 
@@ -2199,8 +2196,19 @@ static const struct sym_fns coff_sym_fns =
   &psym_functions
 };
 
+/* Free the per-objfile COFF data.  */
+
+static void
+coff_free_info (struct objfile *objfile, void *arg)
+{
+  xfree (arg);
+}
+
 void
 _initialize_coffread (void)
 {
   add_symtab_fns (&coff_sym_fns);
+
+  coff_objfile_data_key = register_objfile_data_with_cleanup (NULL,
+                                                             coff_free_info);
 }
index d1b91779088a4950350fa139e2e3aa62822f0c47..499a3f2d6d41ef1ece58ae56467606e1dfbb4375 100644 (file)
@@ -479,12 +479,10 @@ struct mdebug_pending
 };
 
 
-/* The pending information is kept for an entire object file, and used
-   to be in the deprecated_sym_private field.  I took it out when I
-   split mdebugread from mipsread, because this might not be the only
-   type of symbols read from an object file.  Instead, we allocate the
-   pending information table when we create the partial symbols, and
-   we store a pointer to the single table in each psymtab.  */
+/* The pending information is kept for an entire object file.  We
+   allocate the pending information table when we create the partial
+   symbols, and we store a pointer to the single table in each
+   psymtab.  */
 
 static struct mdebug_pending **pending_list;
 
index 65162a175670df2e69879ecf9f9f2710a41df5ff..877c9e0894f5964cf091fe4fd5b7ff62407e150f 100644 (file)
@@ -322,20 +322,7 @@ struct objfile
 
     struct entry_info ei;
 
-    /* Hook for information for use by the symbol reader (currently used
-       for information shared by sym_init and sym_read).  It is
-       typically a pointer to malloc'd memory.  The symbol reader's finish
-       function is responsible for freeing the memory thusly allocated.  */
-    /* NOTE: cagney/2004-10-23: This has been replaced by per-objfile
-       data points implemented using "data" and "num_data" below.  For
-       an example of how to use this replacement, see "objfile_data"
-       in "mips-tdep.c".  */
-
-    void *deprecated_sym_private;
-
     /* Per objfile data-pointers required by other GDB modules.  */
-    /* FIXME: kettenis/20030711: This mechanism could replace
-        deprecated_sym_private entirely.  */
 
     REGISTRY_FIELDS;
 
index 9afaf91b60e2cb6ef04df35293c3e9f8cabd8d7e..6e09cbd1a8ed78e237d3b5ffa1e85cf8d7874095 100644 (file)
@@ -2563,7 +2563,6 @@ reread_symbols (void)
          objfile->free_psymtabs = NULL;
          objfile->template_symbols = NULL;
          objfile->msymbols = NULL;
-         objfile->deprecated_sym_private = NULL;
          objfile->minimal_symbol_count = 0;
          memset (&objfile->msymbol_hash, 0,
                  sizeof (objfile->msymbol_hash));
index e4d08615caf3bdcfec95e3eb07221c18892a9e2d..40fd97d0c557ab5db4a2c40f6e4bb022044dd750 100644 (file)
 #include "aout/stab_gnu.h"
 
 \f
+/* Key for XCOFF-associated data.  */
+
+static const struct objfile_data *xcoff_objfile_data_key;
+
 /* We put a pointer to this structure in the read_symtab_private field
    of the psymtab.  */
 
@@ -150,6 +154,12 @@ struct coff_symfile_info
     CORE_ADDR toc_offset;
   };
 
+/* Convenience macro to access the per-objfile XCOFF data.  */
+
+#define XCOFF_DATA(objfile)                                            \
+  ((struct coff_symfile_info *) objfile_data ((objfile),               \
+                                             xcoff_objfile_data_key))
+
 /* XCOFF names for dwarf sections.  There is no compressed sections.  */
 
 static const struct dwarf2_debug_sections dwarf2_xcoff_names = {
@@ -593,9 +603,8 @@ static void
 process_linenos (CORE_ADDR start, CORE_ADDR end)
 {
   int offset, ii;
-  file_ptr max_offset =
-    ((struct coff_symfile_info *) this_symtab_psymtab->objfile
-     ->deprecated_sym_private)->max_lineno_offset;
+  file_ptr max_offset
+    = XCOFF_DATA (this_symtab_psymtab->objfile)->max_lineno_offset;
 
   /* subfile structure for the main compilation unit.  */
   struct subfile main_subfile;
@@ -829,9 +838,7 @@ enter_line_range (struct subfile *subfile, unsigned beginoffset,
   if (endoffset == 0 && startaddr == 0 && endaddr == 0)
     return;
   curoffset = beginoffset;
-  limit_offset =
-    ((struct coff_symfile_info *) objfile->deprecated_sym_private)
-    ->max_lineno_offset;
+  limit_offset = XCOFF_DATA (objfile)->max_lineno_offset;
 
   if (endoffset != 0)
     {
@@ -965,9 +972,7 @@ xcoff_next_symbol_text (struct objfile *objfile)
     }
   else if (symbol.n_sclass & 0x80)
     {
-      retval = ((struct coff_symfile_info *)
-               objfile->deprecated_sym_private)->debugsec
-       + symbol.n_offset;
+      retval = XCOFF_DATA (objfile)->debugsec + symbol.n_offset;
       raw_symbol += coff_data (objfile->obfd)->local_symesz;
       ++symnum;
     }
@@ -990,10 +995,9 @@ read_xcoff_symtab (struct partial_symtab *pst)
   struct objfile *objfile = pst->objfile;
   bfd *abfd = objfile->obfd;
   char *raw_auxptr;            /* Pointer to first raw aux entry for sym.  */
-  char *strtbl = 
-    ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl;
-  char *debugsec =
-    ((struct coff_symfile_info *) objfile->deprecated_sym_private)->debugsec;
+  struct coff_symfile_info *xcoff = XCOFF_DATA (objfile);
+  char *strtbl = xcoff->strtbl;
+  char *debugsec = xcoff->debugsec;
   const char *debugfmt = bfd_xcoff_is_xcoff64 (abfd) ? "XCOFF64" : "XCOFF";
 
   struct internal_syment symbol[1];
@@ -1035,9 +1039,7 @@ read_xcoff_symtab (struct partial_symtab *pst)
     symnum + ((struct symloc *) pst->read_symtab_private)->numsyms;
   first_object_file_end = 0;
 
-  raw_symbol =
-    ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl
-    + symnum * local_symesz;
+  raw_symbol = xcoff->symtbl + symnum * local_symesz;
 
   while (symnum < max_symnum)
     {
@@ -1661,9 +1663,8 @@ coff_getfilename (union internal_auxent *aux_entry, struct objfile *objfile)
   static char buffer[BUFSIZ];
 
   if (aux_entry->x_file.x_n.x_zeroes == 0)
-    strcpy (buffer, ((struct coff_symfile_info *)
-                    objfile->deprecated_sym_private)->strtbl
-           + aux_entry->x_file.x_n.x_offset);
+    strcpy (buffer, (XCOFF_DATA (objfile)->strtbl
+                    + aux_entry->x_file.x_n.x_offset));
   else
     {
       strncpy (buffer, aux_entry->x_file.x_fname, FILNMLEN);
@@ -1676,11 +1677,9 @@ coff_getfilename (union internal_auxent *aux_entry, struct objfile *objfile)
 static void
 read_symbol (struct internal_syment *symbol, int symno)
 {
-  int nsyms
-    = ((struct coff_symfile_info *)
-       this_symtab_psymtab->objfile->deprecated_sym_private)->symtbl_num_syms;
-  char *stbl = ((struct coff_symfile_info *)
-               this_symtab_psymtab->objfile->deprecated_sym_private)->symtbl;
+  struct coff_symfile_info *xcoff = XCOFF_DATA (this_symtab_psymtab->objfile);
+  int nsyms = xcoff->symtbl_num_syms;
+  char *stbl = xcoff->symtbl;
 
   if (symno < 0 || symno >= nsyms)
     {
@@ -1715,8 +1714,7 @@ read_symbol_lineno (int symno)
   struct objfile *objfile = this_symtab_psymtab->objfile;
   int xcoff64 = bfd_xcoff_is_xcoff64 (objfile->obfd);
 
-  struct coff_symfile_info *info =
-    (struct coff_symfile_info *)objfile->deprecated_sym_private;
+  struct coff_symfile_info *info = XCOFF_DATA (objfile);
   int nsyms = info->symtbl_num_syms;
   char *stbl = info->symtbl;
   char *strtbl = info->strtbl;
@@ -1919,9 +1917,11 @@ xcoff_new_init (struct objfile *objfile)
 static void
 xcoff_symfile_init (struct objfile *objfile)
 {
+  struct coff_symfile_info *xcoff;
+
   /* Allocate struct to keep track of the symfile.  */
-  objfile->deprecated_sym_private
-    = xmalloc (sizeof (struct coff_symfile_info));
+  xcoff = XNEW (struct coff_symfile_info);
+  set_objfile_data (objfile, xcoff_objfile_data_key, xcoff);
 
   /* XCOFF objects may be reordered, so set OBJF_REORDERED.  If we
      find this causes a significant slowdown in gdb then we could
@@ -1939,11 +1939,6 @@ xcoff_symfile_init (struct objfile *objfile)
 static void
 xcoff_symfile_finish (struct objfile *objfile)
 {
-  if (objfile->deprecated_sym_private != NULL)
-    {
-      xfree (objfile->deprecated_sym_private);
-    }
-
   /* Start with a fresh include table for the next objfile.  */
   if (inclTable)
     {
@@ -1963,9 +1958,9 @@ init_stringtab (bfd *abfd, file_ptr offset, struct objfile *objfile)
   int val;
   unsigned char lengthbuf[4];
   char *strtbl;
+  struct coff_symfile_info *xcoff = XCOFF_DATA (objfile);
 
-  ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl
-    = NULL;
+  xcoff->strtbl = NULL;
 
   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
     error (_("cannot seek to string table in %s: %s"),
@@ -1984,8 +1979,7 @@ init_stringtab (bfd *abfd, file_ptr offset, struct objfile *objfile)
      as long as we have its symbol table around.  */
 
   strtbl = (char *) obstack_alloc (&objfile->objfile_obstack, length);
-  ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl
-    = strtbl;
+  xcoff->strtbl = strtbl;
 
   /* Copy length buffer, the first byte is usually zero and is
      used for stabs with a name length of zero.  */
@@ -2165,13 +2159,11 @@ swap_sym (struct internal_syment *symbol, union internal_auxent *aux,
     }
   else if (symbol->n_sclass & 0x80)
     {
-      *name = ((struct coff_symfile_info *)
-              objfile->deprecated_sym_private)->debugsec + symbol->n_offset;
+      *name = XCOFF_DATA (objfile)->debugsec + symbol->n_offset;
     }
   else
     {
-      *name = ((struct coff_symfile_info *)
-              objfile->deprecated_sym_private)->strtbl + symbol->n_offset;
+      *name = XCOFF_DATA (objfile)->strtbl + symbol->n_offset;
     }
   ++*symnump;
   *raw += coff_data (objfile->obfd)->local_symesz;
@@ -2248,10 +2240,8 @@ scan_xcoff_symtab (struct objfile *objfile)
   abfd = objfile->obfd;
   next_symbol_text_func = xcoff_next_symbol_text;
 
-  sraw_symbol = ((struct coff_symfile_info *)
-                objfile->deprecated_sym_private)->symtbl;
-  nsyms = ((struct coff_symfile_info *)
-          objfile->deprecated_sym_private)->symtbl_num_syms;
+  sraw_symbol = XCOFF_DATA (objfile)->symtbl;
+  nsyms = XCOFF_DATA (objfile)->symtbl_num_syms;
   ssymnum = 0;
   while (ssymnum < nsyms)
     {
@@ -2930,8 +2920,7 @@ scan_xcoff_symtab (struct objfile *objfile)
      Another place to obtain this information would be file auxiliary
      header.  */
 
-  ((struct coff_symfile_info *) objfile->deprecated_sym_private)->toc_offset
-    = toc_offset;
+  XCOFF_DATA (objfile)->toc_offset = toc_offset;
 }
 
 /* Return the toc offset value for a given objfile.  */
@@ -2940,8 +2929,7 @@ CORE_ADDR
 xcoff_get_toc_offset (struct objfile *objfile)
 {
   if (objfile)
-    return ((struct coff_symfile_info *)
-           objfile->deprecated_sym_private)->toc_offset;
+    return XCOFF_DATA (objfile)->toc_offset;
   return 0;
 }
 
@@ -2967,7 +2955,7 @@ xcoff_initial_scan (struct objfile *objfile, int symfile_flags)
   char *name;
   unsigned int size;
 
-  info = (struct coff_symfile_info *) objfile->deprecated_sym_private;
+  info = XCOFF_DATA (objfile);
   symfile_bfd = abfd = objfile->obfd;
   name = objfile->name;
 
@@ -3006,9 +2994,7 @@ xcoff_initial_scan (struct objfile *objfile, int symfile_flags)
                  }
              }
          }
-       ((struct coff_symfile_info *)
-        objfile->deprecated_sym_private)->debugsec
-         = debugsec;
+       info->debugsec = debugsec;
       }
     }
 
@@ -3019,15 +3005,10 @@ xcoff_initial_scan (struct objfile *objfile, int symfile_flags)
     error (_("Error reading symbols from %s: %s"),
           name, bfd_errmsg (bfd_get_error ()));
   size = coff_data (abfd)->local_symesz * num_symbols;
-  ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl =
-    obstack_alloc (&objfile->objfile_obstack, size);
-  ((struct coff_symfile_info *)
-   objfile->deprecated_sym_private)->symtbl_num_syms
-    = num_symbols;
-
-  val = bfd_bread (((struct coff_symfile_info *)
-                   objfile->deprecated_sym_private)->symtbl,
-                  size, abfd);
+  info->symtbl = obstack_alloc (&objfile->objfile_obstack, size);
+  info->symtbl_num_syms = num_symbols;
+
+  val = bfd_bread (info->symtbl, size, abfd);
   if (val != size)
     perror_with_name (_("reading symbol table"));
 
@@ -3138,6 +3119,14 @@ static const struct sym_fns xcoff_sym_fns =
   &psym_functions
 };
 
+/* Free the per-objfile xcoff data.  */
+
+static void
+xcoff_free_info (struct objfile *objfile, void *arg)
+{
+  xfree (arg);
+}
+
 /* Provide a prototype to silence -Wmissing-prototypes.  */
 extern initialize_file_ftype _initialize_xcoffread;
 
@@ -3145,4 +3134,7 @@ void
 _initialize_xcoffread (void)
 {
   add_symtab_fns (&xcoff_sym_fns);
+
+  xcoff_objfile_data_key = register_objfile_data_with_cleanup (NULL,
+                                                              xcoff_free_info);
 }