aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog24
-rw-r--r--gdb/coffread.c30
-rw-r--r--gdb/mdebugread.c10
-rw-r--r--gdb/objfiles.h13
-rw-r--r--gdb/symfile.c1
-rw-r--r--gdb/xcoffread.c116
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);
}