diff options
-rw-r--r-- | gdb/ChangeLog | 24 | ||||
-rw-r--r-- | gdb/coffread.c | 30 | ||||
-rw-r--r-- | gdb/mdebugread.c | 10 | ||||
-rw-r--r-- | gdb/objfiles.h | 13 | ||||
-rw-r--r-- | gdb/symfile.c | 1 | ||||
-rw-r--r-- | gdb/xcoffread.c | 116 |
6 files changed, 101 insertions, 93 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8ead705..f9235b5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,29 @@ 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. (coff_symfile_read): Use DBX_SYMFILE_INFO. * dbxread.c (dbx_objfile_data_key): New global. diff --git a/gdb/coffread.c b/gdb/coffread.c index 94d0554..56ed5ae 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -47,6 +47,10 @@ 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); } diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index d1b9177..499a3f2 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -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; diff --git a/gdb/objfiles.h b/gdb/objfiles.h index 65162a1..877c9e0 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -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; diff --git a/gdb/symfile.c b/gdb/symfile.c index 9afaf91..6e09cbd 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -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)); diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c index e4d0861..40fd97d 100644 --- a/gdb/xcoffread.c +++ b/gdb/xcoffread.c @@ -56,6 +56,10 @@ #include "aout/stab_gnu.h" +/* 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); } |