forked from Imagelibrary/binutils-gdb
* dbxread.c (read_dbx_symtab): Update.
(end_psymtab, dbx_psymtab_to_symtab_1, dbx_psymtab_to_symtab) (read_ofile_symtab): Add 'objfile' argument. * dwarf2read.c (process_psymtab_comp_unit_reader) (build_type_psymtabs_reader): Update. (dwarf2_psymtab_to_symtab): Add 'objfile' argument. * mdebugread.c (mdebug_psymtab_to_symtab): Add 'objfile' argument. (parse_procedure, parse_partial_symbols): Update. (psymtab_to_symtab_1): Add 'objfile' argument. * psympriv.h (struct partial_symtab) <objfile>: Remove. <read_symtab>: Add 'objfile' argument. (sort_pst_symbols, discard_psymtab): Update. * psymtab.c (partial_map_expand_apply): Update. (find_pc_sect_psymtab_closer): Add 'objfile' argument. (find_pc_sect_psymtab, find_pc_sect_symtab_from_partial): Update. (find_pc_sect_psymbol): Add 'objfile' argument. (lookup_symbol_aux_psymtabs): Update. (match_partial_symbol, lookup_partial_symbol, psymtab_to_symtab): Add 'objfile' argument. (find_last_source_symtab_from_partial, dump_psymtab) (dump_psymtabs_for_objfile, read_symtabs_for_function) (expand_partial_symbol_tables, read_psymtabs_with_filename) (find_symbol_file_from_partial, map_matching_symbols_psymtab) (expand_symtabs_matching_via_partial): Update. (sort_pst_symbols): Add 'objfile' argument. (allocate_psymtab): Update. (discard_psymtab): Add 'objfile' argument. (maintenance_info_psymtabs, maintenance_check_symtabs): Update. * stabsread.h (end_psymtab): Update. * xcoffread.c (this_symtab_objfile): New global. (process_linenos, enter_line_range, xcoff_next_symbol_text): Update. (read_xcoff_symtab): Add 'objfile' argument. (read_symbol, read_symbol_lineno): Update. (xcoff_psymtab_to_symtab_1, xcoff_psymtab_to_symtab) (xcoff_end_psymtab): Add 'objfile' argument. (scan_xcoff_symtab): Update.
This commit is contained in:
116
gdb/psymtab.c
116
gdb/psymtab.c
@@ -45,19 +45,22 @@ struct psymbol_bcache
|
||||
struct bcache *bcache;
|
||||
};
|
||||
|
||||
static struct partial_symbol *match_partial_symbol (struct partial_symtab *,
|
||||
static struct partial_symbol *match_partial_symbol (struct objfile *,
|
||||
struct partial_symtab *,
|
||||
int,
|
||||
const char *, domain_enum,
|
||||
symbol_compare_ftype *,
|
||||
symbol_compare_ftype *);
|
||||
|
||||
static struct partial_symbol *lookup_partial_symbol (struct partial_symtab *,
|
||||
static struct partial_symbol *lookup_partial_symbol (struct objfile *,
|
||||
struct partial_symtab *,
|
||||
const char *, int,
|
||||
domain_enum);
|
||||
|
||||
static char *psymtab_to_fullname (struct partial_symtab *ps);
|
||||
|
||||
static struct partial_symbol *find_pc_sect_psymbol (struct partial_symtab *,
|
||||
static struct partial_symbol *find_pc_sect_psymbol (struct objfile *,
|
||||
struct partial_symtab *,
|
||||
CORE_ADDR,
|
||||
struct obj_section *);
|
||||
|
||||
@@ -65,7 +68,8 @@ static struct partial_symbol *fixup_psymbol_section (struct partial_symbol
|
||||
*psym,
|
||||
struct objfile *objfile);
|
||||
|
||||
static struct symtab *psymtab_to_symtab (struct partial_symtab *pst);
|
||||
static struct symtab *psymtab_to_symtab (struct objfile *objfile,
|
||||
struct partial_symtab *pst);
|
||||
|
||||
/* Ensure that the partial symbols for OBJFILE have been loaded. This
|
||||
function always returns its argument, as a convenience. */
|
||||
@@ -145,7 +149,7 @@ partial_map_expand_apply (struct objfile *objfile,
|
||||
|
||||
/* This may expand more than one symtab, and we want to iterate over
|
||||
all of them. */
|
||||
psymtab_to_symtab (pst);
|
||||
psymtab_to_symtab (objfile, pst);
|
||||
|
||||
return iterate_over_some_symtabs (name, full_path, real_path, callback, data,
|
||||
objfile->symtabs, last_made);
|
||||
@@ -237,11 +241,11 @@ partial_map_symtabs_matching_filename (struct objfile *objfile,
|
||||
We may find a different psymtab than PST. See FIND_PC_SECT_PSYMTAB. */
|
||||
|
||||
static struct partial_symtab *
|
||||
find_pc_sect_psymtab_closer (CORE_ADDR pc, struct obj_section *section,
|
||||
find_pc_sect_psymtab_closer (struct objfile *objfile,
|
||||
CORE_ADDR pc, struct obj_section *section,
|
||||
struct partial_symtab *pst,
|
||||
struct minimal_symbol *msymbol)
|
||||
{
|
||||
struct objfile *objfile = pst->objfile;
|
||||
struct partial_symtab *tpst;
|
||||
struct partial_symtab *best_pst = pst;
|
||||
CORE_ADDR best_addr = pst->textlow;
|
||||
@@ -277,7 +281,7 @@ find_pc_sect_psymtab_closer (CORE_ADDR pc, struct obj_section *section,
|
||||
corresponding msymbol, which is not necessarily
|
||||
true; the debug info might be much richer than the
|
||||
object's symbol table. */
|
||||
p = find_pc_sect_psymbol (tpst, pc, section);
|
||||
p = find_pc_sect_psymbol (objfile, tpst, pc, section);
|
||||
if (p != NULL
|
||||
&& SYMBOL_VALUE_ADDRESS (p)
|
||||
== SYMBOL_VALUE_ADDRESS (msymbol))
|
||||
@@ -342,7 +346,7 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
|
||||
corresponding msymbol, which is not necessarily
|
||||
true; the debug info might be much richer than the
|
||||
object's symbol table. */
|
||||
p = find_pc_sect_psymbol (pst, pc, section);
|
||||
p = find_pc_sect_psymbol (objfile, pst, pc, section);
|
||||
if (!p
|
||||
|| SYMBOL_VALUE_ADDRESS (p)
|
||||
!= SYMBOL_VALUE_ADDRESS (msymbol))
|
||||
@@ -376,7 +380,8 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
|
||||
{
|
||||
struct partial_symtab *best_pst;
|
||||
|
||||
best_pst = find_pc_sect_psymtab_closer (pc, section, pst, msymbol);
|
||||
best_pst = find_pc_sect_psymtab_closer (objfile, pc, section, pst,
|
||||
msymbol);
|
||||
if (best_pst != NULL)
|
||||
return best_pst;
|
||||
}
|
||||
@@ -400,8 +405,8 @@ find_pc_sect_symtab_from_partial (struct objfile *objfile,
|
||||
continue, so let's not. */
|
||||
warning (_("\
|
||||
(Internal error: pc %s in read in psymtab, but not in symtab.)\n"),
|
||||
paddress (get_objfile_arch (ps->objfile), pc));
|
||||
psymtab_to_symtab (ps);
|
||||
paddress (get_objfile_arch (objfile), pc));
|
||||
psymtab_to_symtab (objfile, ps);
|
||||
return ps->symtab;
|
||||
}
|
||||
return NULL;
|
||||
@@ -411,7 +416,8 @@ find_pc_sect_symtab_from_partial (struct objfile *objfile,
|
||||
Return 0 if none. */
|
||||
|
||||
static struct partial_symbol *
|
||||
find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc,
|
||||
find_pc_sect_psymbol (struct objfile *objfile,
|
||||
struct partial_symtab *psymtab, CORE_ADDR pc,
|
||||
struct obj_section *section)
|
||||
{
|
||||
struct partial_symbol *best = NULL, *p, **pp;
|
||||
@@ -425,8 +431,8 @@ find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc,
|
||||
/* Search the global symbols as well as the static symbols, so that
|
||||
find_pc_partial_function doesn't use a minimal symbol and thus
|
||||
cache a bad endaddr. */
|
||||
for (pp = psymtab->objfile->global_psymbols.list + psymtab->globals_offset;
|
||||
(pp - (psymtab->objfile->global_psymbols.list + psymtab->globals_offset)
|
||||
for (pp = objfile->global_psymbols.list + psymtab->globals_offset;
|
||||
(pp - (objfile->global_psymbols.list + psymtab->globals_offset)
|
||||
< psymtab->n_global_syms);
|
||||
pp++)
|
||||
{
|
||||
@@ -440,7 +446,7 @@ find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc,
|
||||
{
|
||||
if (section) /* Match on a specific section. */
|
||||
{
|
||||
fixup_psymbol_section (p, psymtab->objfile);
|
||||
fixup_psymbol_section (p, objfile);
|
||||
if (!matching_obj_sections (SYMBOL_OBJ_SECTION (p), section))
|
||||
continue;
|
||||
}
|
||||
@@ -449,8 +455,8 @@ find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc,
|
||||
}
|
||||
}
|
||||
|
||||
for (pp = psymtab->objfile->static_psymbols.list + psymtab->statics_offset;
|
||||
(pp - (psymtab->objfile->static_psymbols.list + psymtab->statics_offset)
|
||||
for (pp = objfile->static_psymbols.list + psymtab->statics_offset;
|
||||
(pp - (objfile->static_psymbols.list + psymtab->statics_offset)
|
||||
< psymtab->n_static_syms);
|
||||
pp++)
|
||||
{
|
||||
@@ -464,7 +470,7 @@ find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc,
|
||||
{
|
||||
if (section) /* Match on a specific section. */
|
||||
{
|
||||
fixup_psymbol_section (p, psymtab->objfile);
|
||||
fixup_psymbol_section (p, objfile);
|
||||
if (!matching_obj_sections (SYMBOL_OBJ_SECTION (p), section))
|
||||
continue;
|
||||
}
|
||||
@@ -518,10 +524,11 @@ lookup_symbol_aux_psymtabs (struct objfile *objfile,
|
||||
|
||||
ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
|
||||
{
|
||||
if (!ps->readin && lookup_partial_symbol (ps, name, psymtab_index, domain))
|
||||
if (!ps->readin && lookup_partial_symbol (objfile, ps, name,
|
||||
psymtab_index, domain))
|
||||
{
|
||||
struct symbol *sym = NULL;
|
||||
struct symtab *stab = psymtab_to_symtab (ps);
|
||||
struct symtab *stab = psymtab_to_symtab (objfile, ps);
|
||||
|
||||
/* Some caution must be observed with overloaded functions
|
||||
and methods, since the psymtab will not contain any overload
|
||||
@@ -558,7 +565,8 @@ lookup_symbol_aux_psymtabs (struct objfile *objfile,
|
||||
with MATCH. Returns the symbol, if found, and otherwise NULL. */
|
||||
|
||||
static struct partial_symbol *
|
||||
match_partial_symbol (struct partial_symtab *pst, int global,
|
||||
match_partial_symbol (struct objfile *objfile,
|
||||
struct partial_symtab *pst, int global,
|
||||
const char *name, domain_enum domain,
|
||||
symbol_compare_ftype *match,
|
||||
symbol_compare_ftype *ordered_compare)
|
||||
@@ -571,8 +579,8 @@ match_partial_symbol (struct partial_symtab *pst, int global,
|
||||
if (length == 0)
|
||||
return NULL;
|
||||
start = (global ?
|
||||
pst->objfile->global_psymbols.list + pst->globals_offset :
|
||||
pst->objfile->static_psymbols.list + pst->statics_offset);
|
||||
objfile->global_psymbols.list + pst->globals_offset :
|
||||
objfile->static_psymbols.list + pst->statics_offset);
|
||||
|
||||
if (global && ordered_compare) /* Can use a binary search. */
|
||||
{
|
||||
@@ -674,7 +682,8 @@ psymtab_search_name (const char *name)
|
||||
Check the global symbols if GLOBAL, the static symbols if not. */
|
||||
|
||||
static struct partial_symbol *
|
||||
lookup_partial_symbol (struct partial_symtab *pst, const char *name,
|
||||
lookup_partial_symbol (struct objfile *objfile,
|
||||
struct partial_symtab *pst, const char *name,
|
||||
int global, domain_enum domain)
|
||||
{
|
||||
struct partial_symbol **start, **psym;
|
||||
@@ -692,8 +701,8 @@ lookup_partial_symbol (struct partial_symtab *pst, const char *name,
|
||||
search_name = psymtab_search_name (name);
|
||||
cleanup = make_cleanup (xfree, search_name);
|
||||
start = (global ?
|
||||
pst->objfile->global_psymbols.list + pst->globals_offset :
|
||||
pst->objfile->static_psymbols.list + pst->statics_offset);
|
||||
objfile->global_psymbols.list + pst->globals_offset :
|
||||
objfile->static_psymbols.list + pst->statics_offset);
|
||||
|
||||
if (global) /* This means we can use a binary search. */
|
||||
{
|
||||
@@ -778,7 +787,7 @@ lookup_partial_symbol (struct partial_symtab *pst, const char *name,
|
||||
This is fast after the first time you do it. */
|
||||
|
||||
static struct symtab *
|
||||
psymtab_to_symtab (struct partial_symtab *pst)
|
||||
psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst)
|
||||
{
|
||||
/* If it is a shared psymtab, find an unshared psymtab that includes
|
||||
it. Any such psymtab will do. */
|
||||
@@ -794,7 +803,7 @@ psymtab_to_symtab (struct partial_symtab *pst)
|
||||
{
|
||||
struct cleanup *back_to = increment_reading_symtab ();
|
||||
|
||||
(*pst->read_symtab) (pst);
|
||||
(*pst->read_symtab) (objfile, pst);
|
||||
do_cleanups (back_to);
|
||||
}
|
||||
|
||||
@@ -860,7 +869,7 @@ find_last_source_symtab_from_partial (struct objfile *ofp)
|
||||
"readin pst found and no symtabs."));
|
||||
}
|
||||
else
|
||||
return psymtab_to_symtab (cs_pst);
|
||||
return psymtab_to_symtab (ofp, cs_pst);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@@ -1007,7 +1016,7 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
|
||||
}
|
||||
|
||||
fprintf_filtered (outfile, " Relocate symbols by ");
|
||||
for (i = 0; i < psymtab->objfile->num_sections; ++i)
|
||||
for (i = 0; i < objfile->num_sections; ++i)
|
||||
{
|
||||
if (i != 0)
|
||||
fprintf_filtered (outfile, ", ");
|
||||
@@ -1088,10 +1097,6 @@ dump_psymtabs_for_objfile (struct objfile *objfile)
|
||||
psymtab->filename);
|
||||
gdb_print_host_address (psymtab, gdb_stdout);
|
||||
printf_filtered (", ");
|
||||
if (psymtab->objfile != objfile)
|
||||
{
|
||||
printf_filtered ("NOT ON CHAIN! ");
|
||||
}
|
||||
wrap_here (" ");
|
||||
}
|
||||
printf_filtered ("\n\n");
|
||||
@@ -1111,11 +1116,11 @@ read_symtabs_for_function (struct objfile *objfile, const char *func_name)
|
||||
if (ps->readin)
|
||||
continue;
|
||||
|
||||
if ((lookup_partial_symbol (ps, func_name, 1, VAR_DOMAIN)
|
||||
if ((lookup_partial_symbol (objfile, ps, func_name, 1, VAR_DOMAIN)
|
||||
!= NULL)
|
||||
|| (lookup_partial_symbol (ps, func_name, 0, VAR_DOMAIN)
|
||||
|| (lookup_partial_symbol (objfile, ps, func_name, 0, VAR_DOMAIN)
|
||||
!= NULL))
|
||||
psymtab_to_symtab (ps);
|
||||
psymtab_to_symtab (objfile, ps);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1126,7 +1131,7 @@ expand_partial_symbol_tables (struct objfile *objfile)
|
||||
|
||||
ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, psymtab)
|
||||
{
|
||||
psymtab_to_symtab (psymtab);
|
||||
psymtab_to_symtab (objfile, psymtab);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1142,7 +1147,7 @@ read_psymtabs_with_filename (struct objfile *objfile, const char *filename)
|
||||
continue;
|
||||
|
||||
if (filename_cmp (filename, p->filename) == 0)
|
||||
psymtab_to_symtab (p);
|
||||
psymtab_to_symtab (objfile, p);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1220,7 +1225,7 @@ find_symbol_file_from_partial (struct objfile *objfile, const char *name)
|
||||
|
||||
ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
|
||||
{
|
||||
if (lookup_partial_symbol (pst, name, 1, VAR_DOMAIN))
|
||||
if (lookup_partial_symbol (objfile, pst, name, 1, VAR_DOMAIN))
|
||||
return pst->filename;
|
||||
}
|
||||
return NULL;
|
||||
@@ -1273,10 +1278,10 @@ map_matching_symbols_psymtab (const char *name, domain_enum namespace,
|
||||
{
|
||||
QUIT;
|
||||
if (ps->readin
|
||||
|| match_partial_symbol (ps, global, name, namespace, match,
|
||||
|| match_partial_symbol (objfile, ps, global, name, namespace, match,
|
||||
ordered_compare))
|
||||
{
|
||||
struct symtab *s = psymtab_to_symtab (ps);
|
||||
struct symtab *s = psymtab_to_symtab (objfile, ps);
|
||||
struct block *block;
|
||||
|
||||
if (s == NULL || !s->primary)
|
||||
@@ -1414,7 +1419,7 @@ expand_symtabs_matching_via_partial
|
||||
}
|
||||
|
||||
if (recursively_search_psymtabs (ps, objfile, kind, name_matcher, data))
|
||||
psymtab_to_symtab (ps);
|
||||
psymtab_to_symtab (objfile, ps);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1461,11 +1466,11 @@ compare_psymbols (const void *s1p, const void *s2p)
|
||||
}
|
||||
|
||||
void
|
||||
sort_pst_symbols (struct partial_symtab *pst)
|
||||
sort_pst_symbols (struct objfile *objfile, struct partial_symtab *pst)
|
||||
{
|
||||
/* Sort the global list; don't sort the static list. */
|
||||
|
||||
qsort (pst->objfile->global_psymbols.list + pst->globals_offset,
|
||||
qsort (objfile->global_psymbols.list + pst->globals_offset,
|
||||
pst->n_global_syms, sizeof (struct partial_symbol *),
|
||||
compare_psymbols);
|
||||
}
|
||||
@@ -1760,7 +1765,6 @@ allocate_psymtab (const char *filename, struct objfile *objfile)
|
||||
Psymtabs are searched in most recent inserted -> least recent
|
||||
inserted order. */
|
||||
|
||||
psymtab->objfile = objfile;
|
||||
psymtab->next = objfile->psymtabs;
|
||||
objfile->psymtabs = psymtab;
|
||||
|
||||
@@ -1788,7 +1792,7 @@ allocate_psymtab (const char *filename, struct objfile *objfile)
|
||||
}
|
||||
|
||||
void
|
||||
discard_psymtab (struct partial_symtab *pst)
|
||||
discard_psymtab (struct objfile *objfile, struct partial_symtab *pst)
|
||||
{
|
||||
struct partial_symtab **prev_pst;
|
||||
|
||||
@@ -1801,15 +1805,15 @@ discard_psymtab (struct partial_symtab *pst)
|
||||
|
||||
/* First, snip it out of the psymtab chain. */
|
||||
|
||||
prev_pst = &(pst->objfile->psymtabs);
|
||||
prev_pst = &(objfile->psymtabs);
|
||||
while ((*prev_pst) != pst)
|
||||
prev_pst = &((*prev_pst)->next);
|
||||
(*prev_pst) = pst->next;
|
||||
|
||||
/* Next, put it on a free list for recycling. */
|
||||
|
||||
pst->next = pst->objfile->free_psymtabs;
|
||||
pst->objfile->free_psymtabs = pst;
|
||||
pst->next = objfile->free_psymtabs;
|
||||
objfile->free_psymtabs = pst;
|
||||
}
|
||||
|
||||
|
||||
@@ -1922,7 +1926,7 @@ maintenance_info_psymtabs (char *regexp, int from_tty)
|
||||
if (psymtab->n_global_syms)
|
||||
{
|
||||
printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
|
||||
host_address_to_string (psymtab->objfile->global_psymbols.list
|
||||
host_address_to_string (objfile->global_psymbols.list
|
||||
+ psymtab->globals_offset),
|
||||
psymtab->n_global_syms);
|
||||
}
|
||||
@@ -1932,7 +1936,7 @@ maintenance_info_psymtabs (char *regexp, int from_tty)
|
||||
if (psymtab->n_static_syms)
|
||||
{
|
||||
printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
|
||||
host_address_to_string (psymtab->objfile->static_psymbols.list
|
||||
host_address_to_string (objfile->static_psymbols.list
|
||||
+ psymtab->statics_offset),
|
||||
psymtab->n_static_syms);
|
||||
}
|
||||
@@ -1985,12 +1989,12 @@ maintenance_check_symtabs (char *ignore, int from_tty)
|
||||
{
|
||||
struct gdbarch *gdbarch = get_objfile_arch (objfile);
|
||||
|
||||
s = psymtab_to_symtab (ps);
|
||||
s = psymtab_to_symtab (objfile, ps);
|
||||
if (s == NULL)
|
||||
continue;
|
||||
bv = BLOCKVECTOR (s);
|
||||
b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
|
||||
psym = ps->objfile->static_psymbols.list + ps->statics_offset;
|
||||
psym = objfile->static_psymbols.list + ps->statics_offset;
|
||||
length = ps->n_static_syms;
|
||||
while (length--)
|
||||
{
|
||||
@@ -2007,7 +2011,7 @@ maintenance_check_symtabs (char *ignore, int from_tty)
|
||||
psym++;
|
||||
}
|
||||
b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
|
||||
psym = ps->objfile->global_psymbols.list + ps->globals_offset;
|
||||
psym = objfile->global_psymbols.list + ps->globals_offset;
|
||||
length = ps->n_global_syms;
|
||||
while (length--)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user