aboutsummaryrefslogtreecommitdiff
path: root/gdb/xcoffread.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/xcoffread.c')
-rw-r--r--gdb/xcoffread.c116
1 files changed, 54 insertions, 62 deletions
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);
}