/* Read dbx symbol tables and convert to internal format, for GDB.
- Copyright (C) 1986-2004, 2008-2012 Free Software Foundation, Inc.
+ Copyright (C) 1986-2013 Free Software Foundation, Inc.
This file is part of GDB.
native, now. */
\f
+/* Key for dbx-associated data. */
+
+const struct objfile_data *dbx_objfile_data_key;
+
/* We put a pointer to this structure in the read_symtab_private field
of the psymtab. */
extern void _initialize_dbxread (void);
-static void read_ofile_symtab (struct partial_symtab *);
+static void read_ofile_symtab (struct objfile *, struct partial_symtab *);
-static void dbx_psymtab_to_symtab (struct partial_symtab *);
+static void dbx_psymtab_to_symtab (struct objfile *, struct partial_symtab *);
-static void dbx_psymtab_to_symtab_1 (struct partial_symtab *);
+static void dbx_psymtab_to_symtab_1 (struct objfile *, struct partial_symtab *);
static void read_dbx_dynamic_symtab (struct objfile *objfile);
char *name = bfd_get_filename (sym_bfd);
asection *text_sect;
unsigned char size_temp[DBX_STRINGTAB_SIZE_SIZE];
+ struct dbx_symfile_info *dbx;
/* Allocate struct to keep track of the symfile. */
- objfile->deprecated_sym_stab_info = (struct dbx_symfile_info *)
- xmalloc (sizeof (struct dbx_symfile_info));
- memset (objfile->deprecated_sym_stab_info, 0,
- sizeof (struct dbx_symfile_info));
+ dbx = XCNEW (struct dbx_symfile_info);
+ set_objfile_data (objfile, dbx_objfile_data_key, dbx);
DBX_TEXT_SECTION (objfile) = bfd_get_section_by_name (sym_bfd, ".text");
DBX_DATA_SECTION (objfile) = bfd_get_section_by_name (sym_bfd, ".data");
static void
dbx_symfile_finish (struct objfile *objfile)
{
- if (objfile->deprecated_sym_stab_info != NULL)
+ free_header_files ();
+}
+
+static void
+dbx_free_symfile_info (struct objfile *objfile, void *arg)
+{
+ struct dbx_symfile_info *dbx = arg;
+
+ if (dbx->header_files != NULL)
{
- if (HEADER_FILES (objfile) != NULL)
- {
- int i = N_HEADER_FILES (objfile);
- struct header_file *hfiles = HEADER_FILES (objfile);
+ int i = dbx->n_header_files;
+ struct header_file *hfiles = dbx->header_files;
- while (--i >= 0)
- {
- xfree (hfiles[i].name);
- xfree (hfiles[i].vector);
- }
- xfree (hfiles);
+ while (--i >= 0)
+ {
+ xfree (hfiles[i].name);
+ xfree (hfiles[i].vector);
}
- xfree (objfile->deprecated_sym_stab_info);
+ xfree (hfiles);
}
- free_header_files ();
+
+ xfree (dbx);
}
+
\f
/* Buffer for reading the symbol table entries. */
which are not the address. */
&& nlist.n_value >= pst->textlow)
{
- end_psymtab (pst, psymtab_include_list, includes_used,
- symnum * symbol_size,
+ end_psymtab (objfile, pst, psymtab_include_list,
+ includes_used, symnum * symbol_size,
nlist.n_value > pst->texthigh
? nlist.n_value : pst->texthigh,
dependency_list, dependencies_used,
if (pst)
{
- end_psymtab (pst, psymtab_include_list, includes_used,
- symnum * symbol_size,
+ end_psymtab (objfile, pst, psymtab_include_list,
+ includes_used, symnum * symbol_size,
valu > pst->texthigh ? valu : pst->texthigh,
dependency_list, dependencies_used,
prev_textlow_not_set);
follows this module. */
if (pst && gdbarch_sofun_address_maybe_missing (gdbarch))
{
- end_psymtab (pst, psymtab_include_list, includes_used,
+ end_psymtab (objfile, pst, psymtab_include_list, includes_used,
symnum * symbol_size,
(CORE_ADDR) 0, dependency_list,
dependencies_used, textlow_not_set);
: lowest_text_address)
+ text_size;
- end_psymtab (pst, psymtab_include_list, includes_used,
+ end_psymtab (objfile, pst, psymtab_include_list, includes_used,
symnum * symbol_size,
text_end > pst->texthigh ? text_end : pst->texthigh,
dependency_list, dependencies_used, textlow_not_set);
FIXME: List variables and peculiarities of same. */
struct partial_symtab *
-end_psymtab (struct partial_symtab *pst,
+end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
const char **include_list, int num_includes,
int capping_symbol_offset, CORE_ADDR capping_text,
struct partial_symtab **dependency_list, int number_dependencies,
int textlow_not_set)
{
int i;
- struct objfile *objfile = pst->objfile;
struct gdbarch *gdbarch = get_objfile_arch (objfile);
if (capping_symbol_offset != -1)
subpst->read_symtab = pst->read_symtab;
}
- sort_pst_symbols (pst);
+ sort_pst_symbols (objfile, pst);
if (num_includes == 0
&& number_dependencies == 0
is not empty, but we don't realize that. Fixing that without slowing
things down might be tricky. */
- discard_psymtab (pst);
+ discard_psymtab (objfile, pst);
/* Indicate that psymtab was thrown away. */
pst = (struct partial_symtab *) NULL;
}
\f
static void
-dbx_psymtab_to_symtab_1 (struct partial_symtab *pst)
+dbx_psymtab_to_symtab_1 (struct objfile *objfile, struct partial_symtab *pst)
{
struct cleanup *old_chain;
int i;
- if (!pst)
- return;
-
if (pst->readin)
{
fprintf_unfiltered (gdb_stderr, "Psymtab for %s already read in. "
wrap_here (""); /* Flush output. */
gdb_flush (gdb_stdout);
}
- dbx_psymtab_to_symtab_1 (pst->dependencies[i]);
+ dbx_psymtab_to_symtab_1 (objfile, pst->dependencies[i]);
}
if (LDSYMLEN (pst)) /* Otherwise it's a dummy. */
symbol_size = SYMBOL_SIZE (pst);
/* Read in this file's symbols. */
- bfd_seek (pst->objfile->obfd, SYMBOL_OFFSET (pst), SEEK_SET);
- read_ofile_symtab (pst);
+ bfd_seek (objfile->obfd, SYMBOL_OFFSET (pst), SEEK_SET);
+ read_ofile_symtab (objfile, pst);
do_cleanups (old_chain);
}
}
/* Read in all of the symbols for a given psymtab for real.
- Be verbose about it if the user wants that. */
+ Be verbose about it if the user wants that. PST is not NULL. */
static void
-dbx_psymtab_to_symtab (struct partial_symtab *pst)
+dbx_psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst)
{
bfd *sym_bfd;
struct cleanup *back_to = NULL;
- if (!pst)
- return;
-
if (pst->readin)
{
fprintf_unfiltered (gdb_stderr, "Psymtab for %s already read in. "
gdb_flush (gdb_stdout);
}
- sym_bfd = pst->objfile->obfd;
+ sym_bfd = objfile->obfd;
next_symbol_text_func = dbx_next_symbol_text;
- if (DBX_STAB_SECTION (pst->objfile))
+ if (DBX_STAB_SECTION (objfile))
{
stabs_data
- = symfile_relocate_debug_section (pst->objfile,
- DBX_STAB_SECTION (pst->objfile),
+ = symfile_relocate_debug_section (objfile,
+ DBX_STAB_SECTION (objfile),
NULL);
if (stabs_data)
(void *) &stabs_data);
}
- dbx_psymtab_to_symtab_1 (pst);
+ dbx_psymtab_to_symtab_1 (objfile, pst);
if (back_to)
do_cleanups (back_to);
/* Match with global symbols. This only needs to be done once,
after all of the symtabs and dependencies have been read in. */
- scan_file_globals (pst->objfile);
+ scan_file_globals (objfile);
/* Finish up the debug error message. */
if (info_verbose)
/* Read in a defined section of a specific object file's symbols. */
static void
-read_ofile_symtab (struct partial_symtab *pst)
+read_ofile_symtab (struct objfile *objfile, struct partial_symtab *pst)
{
char *namestring;
struct external_nlist *bufp;
unsigned char type;
unsigned max_symnum;
bfd *abfd;
- struct objfile *objfile;
int sym_offset; /* Offset to start of symbols to read */
int sym_size; /* Size of symbols to read */
CORE_ADDR text_offset; /* Start of text segment for symbols */
int text_size; /* Size of text segment for symbols */
struct section_offsets *section_offsets;
- objfile = pst->objfile;
sym_offset = LDSYMOFF (pst);
sym_size = LDSYMLEN (pst);
text_offset = pst->textlow;
/* Relocate for dynamic loading. */
valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
- valu = gdbarch_smash_text_address (gdbarch, valu);
+ valu = gdbarch_addr_bits_remove (gdbarch, valu);
last_function_start = valu;
goto define_a_symbol;
/* There is already a dbx_symfile_info allocated by our caller.
It might even contain some info from the coff symtab to help us. */
- info = objfile->deprecated_sym_stab_info;
+ info = DBX_SYMFILE_INFO (objfile);
DBX_TEXT_ADDR (objfile) = textaddr;
DBX_TEXT_SIZE (objfile) = textsize;
/* There is already a dbx_symfile_info allocated by our caller.
It might even contain some info from the ELF symtab to help us. */
- info = objfile->deprecated_sym_stab_info;
+ info = DBX_SYMFILE_INFO (objfile);
/* Find the first and last text address. dbx_symfile_read seems to
want this. */
asection *stabsect;
asection *stabstrsect;
asection *text_sect;
+ struct dbx_symfile_info *dbx;
stabsect = bfd_get_section_by_name (sym_bfd, stab_name);
stabstrsect = bfd_get_section_by_name (sym_bfd, stabstr_name);
"but not string section (%s)"),
stab_name, stabstr_name);
- objfile->deprecated_sym_stab_info = (struct dbx_symfile_info *)
- xmalloc (sizeof (struct dbx_symfile_info));
- memset (objfile->deprecated_sym_stab_info, 0,
- sizeof (struct dbx_symfile_info));
+ dbx = XCNEW (struct dbx_symfile_info);
+ set_objfile_data (objfile, dbx_objfile_data_key, dbx);
text_sect = bfd_get_section_by_name (sym_bfd, text_name);
if (!text_sect)
default_symfile_segments, /* Get segment information from a file. */
NULL,
default_symfile_relocate, /* Relocate a debug section. */
+ NULL, /* sym_probe_fns */
&psym_functions
};
_initialize_dbxread (void)
{
add_symtab_fns (&aout_sym_fns);
+
+ dbx_objfile_data_key
+ = register_objfile_data_with_cleanup (NULL, dbx_free_symfile_info);
}