Switch objfile to hold a list of psymbol readers

This changes objfile::qf to be a forward_list, and then updates all
the uses to iterate over the list.  Note that there is still only ever
a single element in the list; this is handled by clearing the list
whenever an object is added.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

	* dwarf2/read.c (dwarf2_build_psymtabs): Update.
	* symfile.c (syms_from_objfile_1, reread_symbols): Update.
	* symfile-debug.c (objfile::has_partial_symbols)
	(objfile::find_last_source_symtab)
	(objfile::forget_cached_source_info)
	(objfile::map_symtabs_matching_filename, objfile::lookup_symbol)
	(objfile::print_stats, objfile::dump)
	(objfile::expand_symtabs_for_function)
	(objfile::expand_all_symtabs)
	(objfile::expand_symtabs_with_fullname)
	(objfile::map_matching_symbols)
	(objfile::expand_symtabs_matching)
	(objfile::find_pc_sect_compunit_symtab)
	(objfile::map_symbol_filenames)
	(objfile::find_compunit_symtab_by_address)
	(objfile::lookup_global_symbol_language)
	(objfile::require_partial_symbols): Update.
	* psymtab.c (maintenance_print_psymbols)
	(maintenance_info_psymtabs, maintenance_check_psymtabs): Update.
	* objfiles.h (struct objfile) <qf>: Now a forward_list.
	* objfiles.c (objfile_relocate1): Update.
	* elfread.c (elf_symfile_read): Update.
This commit is contained in:
Tom Tromey 2021-03-20 17:23:40 -06:00
parent de909f0b76
commit e11145903f
8 changed files with 344 additions and 269 deletions

View file

@ -1,3 +1,28 @@
2021-03-20 Tom Tromey <tom@tromey.com>
* dwarf2/read.c (dwarf2_build_psymtabs): Update.
* symfile.c (syms_from_objfile_1, reread_symbols): Update.
* symfile-debug.c (objfile::has_partial_symbols)
(objfile::find_last_source_symtab)
(objfile::forget_cached_source_info)
(objfile::map_symtabs_matching_filename, objfile::lookup_symbol)
(objfile::print_stats, objfile::dump)
(objfile::expand_symtabs_for_function)
(objfile::expand_all_symtabs)
(objfile::expand_symtabs_with_fullname)
(objfile::map_matching_symbols)
(objfile::expand_symtabs_matching)
(objfile::find_pc_sect_compunit_symtab)
(objfile::map_symbol_filenames)
(objfile::find_compunit_symtab_by_address)
(objfile::lookup_global_symbol_language)
(objfile::require_partial_symbols): Update.
* psymtab.c (maintenance_print_psymbols)
(maintenance_info_psymtabs, maintenance_check_psymtabs): Update.
* objfiles.h (struct objfile) <qf>: Now a forward_list.
* objfiles.c (objfile_relocate1): Update.
* elfread.c (elf_symfile_read): Update.
2021-03-20 Tom Tromey <tom@tromey.com>
* objfiles.h (struct objfile) <psymtabs>: Remove method.

View file

@ -6131,7 +6131,7 @@ dwarf2_build_psymtabs (struct objfile *objfile)
/* This is a temporary hack to ensure that the objfile and 'qf'
psymtabs are identical. */
psymbol_functions *psf
= dynamic_cast<psymbol_functions *> (objfile->qf.get ());
= dynamic_cast<psymbol_functions *> (objfile->qf.front ().get ());
gdb_assert (psf != nullptr);
psf->set_partial_symtabs (per_bfd->partial_symtabs);
per_objfile->resize_symtabs ();

View file

@ -1287,10 +1287,12 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
switch (index_kind)
{
case dw_index_kind::GDB_INDEX:
objfile->qf = make_dwarf_gdb_index ();
objfile->qf.clear ();
objfile->qf.push_front (make_dwarf_gdb_index ());
break;
case dw_index_kind::DEBUG_NAMES:
objfile->qf = make_dwarf_debug_names ();
objfile->qf.clear ();
objfile->qf.push_front (make_dwarf_debug_names ());
break;
}
}
@ -1300,7 +1302,8 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
partial symbols, because OBJF_PSYMTABS_READ has not been
set, and so our lazy reader function will still be called
when needed. */
objfile->qf.reset
objfile->qf.clear ();
objfile->qf.emplace_front
(new lazy_dwarf_reader (objfile->partial_symtabs));
}
}

View file

@ -703,8 +703,8 @@ objfile_relocate1 (struct objfile *objfile,
}
/* Notify the quick symbol object. */
if (objfile->qf)
objfile->qf->relocated ();
for (const auto &iter : objfile->qf)
iter->relocated ();
/* Relocate isolated symbols. */
{

View file

@ -38,6 +38,7 @@
#include "gdbsupport/refcounted-object.h"
#include "jit.h"
#include "quick-symbol.h"
#include <forward_list>
struct htab;
struct objfile_data;
@ -668,7 +669,7 @@ public:
/* The "quick" (aka partial) symbol functions for this symbol
reader. */
quick_symbol_functions_up qf;
std::forward_list<quick_symbol_functions_up> qf;
/* Per objfile data-pointers required by other GDB modules. */

View file

@ -1810,49 +1810,25 @@ maintenance_print_psymbols (const char *args, int from_tty)
if (!print_for_objfile)
continue;
psymbol_functions *psf
= dynamic_cast<psymbol_functions *> (objfile->qf.get ());
if (psf == nullptr)
continue;
psymtab_storage *partial_symtabs = psf->get_partial_symtabs ().get ();
if (address_arg != NULL)
for (const auto &iter : objfile->qf)
{
struct bound_minimal_symbol msymbol = { NULL, NULL };
psymbol_functions *psf
= dynamic_cast<psymbol_functions *> (iter.get ());
if (psf == nullptr)
continue;
/* We don't assume each pc has a unique objfile (this is for
debugging). */
struct partial_symtab *ps
= psf->find_pc_sect_psymtab (objfile, pc, section, msymbol);
if (ps != NULL)
{
if (!printed_objfile_header)
{
outfile->printf ("\nPartial symtabs for objfile %s\n",
objfile_name (objfile));
printed_objfile_header = 1;
}
dump_psymtab (objfile, ps, outfile);
dump_psymtab_addrmap (objfile, partial_symtabs, ps, outfile);
found = 1;
}
}
else
{
for (partial_symtab *ps : psf->require_partial_symbols (objfile))
{
int print_for_source = 0;
psymtab_storage *partial_symtabs
= psf->get_partial_symtabs ().get ();
QUIT;
if (source_arg != NULL)
{
print_for_source
= compare_filenames_for_search (ps->filename, source_arg);
found = 1;
}
if (source_arg == NULL
|| print_for_source)
if (address_arg != NULL)
{
struct bound_minimal_symbol msymbol = { NULL, NULL };
/* We don't assume each pc has a unique objfile (this is for
debugging). */
struct partial_symtab *ps
= psf->find_pc_sect_psymtab (objfile, pc, section, msymbol);
if (ps != NULL)
{
if (!printed_objfile_header)
{
@ -1861,20 +1837,48 @@ maintenance_print_psymbols (const char *args, int from_tty)
printed_objfile_header = 1;
}
dump_psymtab (objfile, ps, outfile);
dump_psymtab_addrmap (objfile, partial_symtabs, ps,
outfile);
dump_psymtab_addrmap (objfile, partial_symtabs, ps, outfile);
found = 1;
}
}
}
else
{
for (partial_symtab *ps : psf->require_partial_symbols (objfile))
{
int print_for_source = 0;
/* If we're printing all the objfile's symbols dump the full addrmap. */
QUIT;
if (source_arg != NULL)
{
print_for_source
= compare_filenames_for_search (ps->filename, source_arg);
found = 1;
}
if (source_arg == NULL
|| print_for_source)
{
if (!printed_objfile_header)
{
outfile->printf ("\nPartial symtabs for objfile %s\n",
objfile_name (objfile));
printed_objfile_header = 1;
}
dump_psymtab (objfile, ps, outfile);
dump_psymtab_addrmap (objfile, partial_symtabs, ps,
outfile);
}
}
}
if (address_arg == NULL
&& source_arg == NULL
&& partial_symtabs->psymtabs_addrmap != NULL)
{
outfile->puts ("\n");
dump_psymtab_addrmap (objfile, partial_symtabs, NULL, outfile);
/* If we're printing all the objfile's symbols dump the full addrmap. */
if (address_arg == NULL
&& source_arg == NULL
&& partial_symtabs->psymtabs_addrmap != NULL)
{
outfile->puts ("\n");
dump_psymtab_addrmap (objfile, partial_symtabs, NULL, outfile);
}
}
}
@ -1904,91 +1908,94 @@ maintenance_info_psymtabs (const char *regexp, int from_tty)
actually find a symtab whose name matches. */
int printed_objfile_start = 0;
psymbol_functions *psf
= dynamic_cast<psymbol_functions *> (objfile->qf.get ());
if (psf == nullptr)
continue;
for (partial_symtab *psymtab : psf->require_partial_symbols (objfile))
for (const auto &iter : objfile->qf)
{
QUIT;
if (! regexp
|| re_exec (psymtab->filename))
psymbol_functions *psf
= dynamic_cast<psymbol_functions *> (iter.get ());
if (psf == nullptr)
continue;
for (partial_symtab *psymtab : psf->require_partial_symbols (objfile))
{
if (! printed_objfile_start)
QUIT;
if (! regexp
|| re_exec (psymtab->filename))
{
printf_filtered ("{ objfile %s ", objfile_name (objfile));
wrap_here (" ");
printf_filtered ("((struct objfile *) %s)\n",
host_address_to_string (objfile));
printed_objfile_start = 1;
}
printf_filtered (" { psymtab %s ", psymtab->filename);
wrap_here (" ");
printf_filtered ("((struct partial_symtab *) %s)\n",
host_address_to_string (psymtab));
printf_filtered (" readin %s\n",
psymtab->readin_p (objfile) ? "yes" : "no");
printf_filtered (" fullname %s\n",
psymtab->fullname
? psymtab->fullname : "(null)");
printf_filtered (" text addresses ");
fputs_filtered (paddress (gdbarch,
psymtab->text_low (objfile)),
gdb_stdout);
printf_filtered (" -- ");
fputs_filtered (paddress (gdbarch,
psymtab->text_high (objfile)),
gdb_stdout);
printf_filtered ("\n");
printf_filtered (" psymtabs_addrmap_supported %s\n",
(psymtab->psymtabs_addrmap_supported
? "yes" : "no"));
printf_filtered (" globals ");
if (!psymtab->global_psymbols.empty ())
printf_filtered
("(* (struct partial_symbol **) %s @ %d)\n",
host_address_to_string (psymtab->global_psymbols.data ()),
(int) psymtab->global_psymbols.size ());
else
printf_filtered ("(none)\n");
printf_filtered (" statics ");
if (!psymtab->static_psymbols.empty ())
printf_filtered
("(* (struct partial_symbol **) %s @ %d)\n",
host_address_to_string (psymtab->static_psymbols.data ()),
(int) psymtab->static_psymbols.size ());
else
printf_filtered ("(none)\n");
if (psymtab->user)
printf_filtered (" user %s "
"((struct partial_symtab *) %s)\n",
psymtab->user->filename,
host_address_to_string (psymtab->user));
printf_filtered (" dependencies ");
if (psymtab->number_of_dependencies)
{
int i;
printf_filtered ("{\n");
for (i = 0; i < psymtab->number_of_dependencies; i++)
if (! printed_objfile_start)
{
struct partial_symtab *dep = psymtab->dependencies[i];
/* Note the string concatenation there --- no
comma. */
printf_filtered (" psymtab %s "
"((struct partial_symtab *) %s)\n",
dep->filename,
host_address_to_string (dep));
printf_filtered ("{ objfile %s ", objfile_name (objfile));
wrap_here (" ");
printf_filtered ("((struct objfile *) %s)\n",
host_address_to_string (objfile));
printed_objfile_start = 1;
}
printf_filtered (" }\n");
printf_filtered (" { psymtab %s ", psymtab->filename);
wrap_here (" ");
printf_filtered ("((struct partial_symtab *) %s)\n",
host_address_to_string (psymtab));
printf_filtered (" readin %s\n",
psymtab->readin_p (objfile) ? "yes" : "no");
printf_filtered (" fullname %s\n",
psymtab->fullname
? psymtab->fullname : "(null)");
printf_filtered (" text addresses ");
fputs_filtered (paddress (gdbarch,
psymtab->text_low (objfile)),
gdb_stdout);
printf_filtered (" -- ");
fputs_filtered (paddress (gdbarch,
psymtab->text_high (objfile)),
gdb_stdout);
printf_filtered ("\n");
printf_filtered (" psymtabs_addrmap_supported %s\n",
(psymtab->psymtabs_addrmap_supported
? "yes" : "no"));
printf_filtered (" globals ");
if (!psymtab->global_psymbols.empty ())
printf_filtered
("(* (struct partial_symbol **) %s @ %d)\n",
host_address_to_string (psymtab->global_psymbols.data ()),
(int) psymtab->global_psymbols.size ());
else
printf_filtered ("(none)\n");
printf_filtered (" statics ");
if (!psymtab->static_psymbols.empty ())
printf_filtered
("(* (struct partial_symbol **) %s @ %d)\n",
host_address_to_string (psymtab->static_psymbols.data ()),
(int) psymtab->static_psymbols.size ());
else
printf_filtered ("(none)\n");
if (psymtab->user)
printf_filtered (" user %s "
"((struct partial_symtab *) %s)\n",
psymtab->user->filename,
host_address_to_string (psymtab->user));
printf_filtered (" dependencies ");
if (psymtab->number_of_dependencies)
{
int i;
printf_filtered ("{\n");
for (i = 0; i < psymtab->number_of_dependencies; i++)
{
struct partial_symtab *dep = psymtab->dependencies[i];
/* Note the string concatenation there --- no
comma. */
printf_filtered (" psymtab %s "
"((struct partial_symtab *) %s)\n",
dep->filename,
host_address_to_string (dep));
}
printf_filtered (" }\n");
}
else
printf_filtered ("(none)\n");
printf_filtered (" }\n");
}
else
printf_filtered ("(none)\n");
printf_filtered (" }\n");
}
}
@ -2009,92 +2016,95 @@ maintenance_check_psymtabs (const char *ignore, int from_tty)
for (objfile *objfile : current_program_space->objfiles ())
{
psymbol_functions *psf
= dynamic_cast<psymbol_functions *> (objfile->qf.get ());
if (psf == nullptr)
continue;
for (partial_symtab *ps : psf->require_partial_symbols (objfile))
for (const auto &iter : objfile->qf)
{
struct gdbarch *gdbarch = objfile->arch ();
/* We don't call psymtab_to_symtab here because that may cause symtab
expansion. When debugging a problem it helps if checkers leave
things unchanged. */
cust = ps->get_compunit_symtab (objfile);
/* First do some checks that don't require the associated symtab. */
if (ps->text_high (objfile) < ps->text_low (objfile))
{
printf_filtered ("Psymtab ");
puts_filtered (ps->filename);
printf_filtered (" covers bad range ");
fputs_filtered (paddress (gdbarch, ps->text_low (objfile)),
gdb_stdout);
printf_filtered (" - ");
fputs_filtered (paddress (gdbarch, ps->text_high (objfile)),
gdb_stdout);
printf_filtered ("\n");
continue;
}
/* Now do checks requiring the associated symtab. */
if (cust == NULL)
psymbol_functions *psf
= dynamic_cast<psymbol_functions *> (iter.get ());
if (psf == nullptr)
continue;
bv = COMPUNIT_BLOCKVECTOR (cust);
b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
for (partial_symbol *psym : ps->static_psymbols)
{
/* Skip symbols for inlined functions without address. These may
or may not have a match in the full symtab. */
if (psym->aclass == LOC_BLOCK
&& psym->ginfo.value.address == 0)
continue;
sym = block_lookup_symbol (b, psym->ginfo.search_name (),
symbol_name_match_type::SEARCH_NAME,
psym->domain);
if (!sym)
{
printf_filtered ("Static symbol `");
puts_filtered (psym->ginfo.linkage_name ());
printf_filtered ("' only found in ");
puts_filtered (ps->filename);
printf_filtered (" psymtab\n");
}
}
b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
for (partial_symbol *psym : ps->global_psymbols)
for (partial_symtab *ps : psf->require_partial_symbols (objfile))
{
sym = block_lookup_symbol (b, psym->ginfo.search_name (),
symbol_name_match_type::SEARCH_NAME,
psym->domain);
if (!sym)
struct gdbarch *gdbarch = objfile->arch ();
/* We don't call psymtab_to_symtab here because that may cause symtab
expansion. When debugging a problem it helps if checkers leave
things unchanged. */
cust = ps->get_compunit_symtab (objfile);
/* First do some checks that don't require the associated symtab. */
if (ps->text_high (objfile) < ps->text_low (objfile))
{
printf_filtered ("Global symbol `");
puts_filtered (psym->ginfo.linkage_name ());
printf_filtered ("' only found in ");
printf_filtered ("Psymtab ");
puts_filtered (ps->filename);
printf_filtered (" psymtab\n");
printf_filtered (" covers bad range ");
fputs_filtered (paddress (gdbarch, ps->text_low (objfile)),
gdb_stdout);
printf_filtered (" - ");
fputs_filtered (paddress (gdbarch, ps->text_high (objfile)),
gdb_stdout);
printf_filtered ("\n");
continue;
}
/* Now do checks requiring the associated symtab. */
if (cust == NULL)
continue;
bv = COMPUNIT_BLOCKVECTOR (cust);
b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
for (partial_symbol *psym : ps->static_psymbols)
{
/* Skip symbols for inlined functions without address. These may
or may not have a match in the full symtab. */
if (psym->aclass == LOC_BLOCK
&& psym->ginfo.value.address == 0)
continue;
sym = block_lookup_symbol (b, psym->ginfo.search_name (),
symbol_name_match_type::SEARCH_NAME,
psym->domain);
if (!sym)
{
printf_filtered ("Static symbol `");
puts_filtered (psym->ginfo.linkage_name ());
printf_filtered ("' only found in ");
puts_filtered (ps->filename);
printf_filtered (" psymtab\n");
}
}
b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
for (partial_symbol *psym : ps->global_psymbols)
{
sym = block_lookup_symbol (b, psym->ginfo.search_name (),
symbol_name_match_type::SEARCH_NAME,
psym->domain);
if (!sym)
{
printf_filtered ("Global symbol `");
puts_filtered (psym->ginfo.linkage_name ());
printf_filtered ("' only found in ");
puts_filtered (ps->filename);
printf_filtered (" psymtab\n");
}
}
if (ps->raw_text_high () != 0
&& (ps->text_low (objfile) < BLOCK_START (b)
|| ps->text_high (objfile) > BLOCK_END (b)))
{
printf_filtered ("Psymtab ");
puts_filtered (ps->filename);
printf_filtered (" covers ");
fputs_filtered (paddress (gdbarch, ps->text_low (objfile)),
gdb_stdout);
printf_filtered (" - ");
fputs_filtered (paddress (gdbarch, ps->text_high (objfile)),
gdb_stdout);
printf_filtered (" but symtab covers only ");
fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
printf_filtered (" - ");
fputs_filtered (paddress (gdbarch, BLOCK_END (b)), gdb_stdout);
printf_filtered ("\n");
}
}
if (ps->raw_text_high () != 0
&& (ps->text_low (objfile) < BLOCK_START (b)
|| ps->text_high (objfile) > BLOCK_END (b)))
{
printf_filtered ("Psymtab ");
puts_filtered (ps->filename);
printf_filtered (" covers ");
fputs_filtered (paddress (gdbarch, ps->text_low (objfile)),
gdb_stdout);
printf_filtered (" - ");
fputs_filtered (paddress (gdbarch, ps->text_high (objfile)),
gdb_stdout);
printf_filtered (" but symtab covers only ");
fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
printf_filtered (" - ");
fputs_filtered (paddress (gdbarch, BLOCK_END (b)), gdb_stdout);
printf_filtered ("\n");
}
}
}

View file

@ -80,12 +80,16 @@ objfile::has_partial_symbols ()
them, then that is an indication that they are in fact available. Without
this function the symbols may have been already read in but they also may
not be present in this objfile. */
if ((flags & OBJF_PSYMTABS_READ) == 0
&& qf != nullptr
&& qf->can_lazily_read_symbols ())
retval = true;
else if (qf != nullptr)
retval = qf->has_symbols (this);
for (const auto &iter : qf)
{
if ((flags & OBJF_PSYMTABS_READ) == 0
&& iter->can_lazily_read_symbols ())
retval = true;
else
retval = iter->has_symbols (this);
if (retval)
break;
}
if (debug_symfile)
fprintf_filtered (gdb_stdlog, "qf->has_symbols (%s) = %d\n",
@ -103,8 +107,12 @@ objfile::find_last_source_symtab ()
fprintf_filtered (gdb_stdlog, "qf->find_last_source_symtab (%s)\n",
objfile_debug_name (this));
if (qf != nullptr)
retval = qf->find_last_source_symtab (this);
for (const auto &iter : qf)
{
retval = iter->find_last_source_symtab (this);
if (retval != nullptr)
break;
}
if (debug_symfile)
fprintf_filtered (gdb_stdlog, "qf->find_last_source_symtab (...) = %s\n",
@ -120,8 +128,8 @@ objfile::forget_cached_source_info ()
fprintf_filtered (gdb_stdlog, "qf->forget_cached_source_info (%s)\n",
objfile_debug_name (this));
if (qf != nullptr)
qf->forget_cached_source_info (this);
for (const auto &iter : qf)
iter->forget_cached_source_info (this);
}
bool
@ -138,9 +146,13 @@ objfile::map_symtabs_matching_filename
host_address_to_string (&callback));
bool retval = false;
if (qf != nullptr)
retval = (qf->map_symtabs_matching_filename
(this, name, real_path, callback));
for (const auto &iter : qf)
{
retval = (iter->map_symtabs_matching_filename
(this, name, real_path, callback));
if (retval)
break;
}
if (debug_symfile)
fprintf_filtered (gdb_stdlog,
@ -161,8 +173,12 @@ objfile::lookup_symbol (block_enum kind, const char *name, domain_enum domain)
objfile_debug_name (this), kind, name,
domain_name (domain));
if (qf != nullptr)
retval = qf->lookup_symbol (this, kind, name, domain);
for (const auto &iter : qf)
{
retval = iter->lookup_symbol (this, kind, name, domain);
if (retval != nullptr)
break;
}
if (debug_symfile)
fprintf_filtered (gdb_stdlog, "qf->lookup_symbol (...) = %s\n",
@ -180,8 +196,8 @@ objfile::print_stats (bool print_bcache)
fprintf_filtered (gdb_stdlog, "qf->print_stats (%s, %d)\n",
objfile_debug_name (this), print_bcache);
if (qf != nullptr)
qf->print_stats (this, print_bcache);
for (const auto &iter : qf)
iter->print_stats (this, print_bcache);
}
void
@ -191,8 +207,8 @@ objfile::dump ()
fprintf_filtered (gdb_stdlog, "qf->dump (%s)\n",
objfile_debug_name (this));
if (qf != nullptr)
qf->dump (this);
for (const auto &iter : qf)
iter->dump (this);
}
void
@ -203,8 +219,8 @@ objfile::expand_symtabs_for_function (const char *func_name)
"qf->expand_symtabs_for_function (%s, \"%s\")\n",
objfile_debug_name (this), func_name);
if (qf != nullptr)
qf->expand_symtabs_for_function (this, func_name);
for (const auto &iter : qf)
iter->expand_symtabs_for_function (this, func_name);
}
void
@ -214,8 +230,8 @@ objfile::expand_all_symtabs ()
fprintf_filtered (gdb_stdlog, "qf->expand_all_symtabs (%s)\n",
objfile_debug_name (this));
if (qf != nullptr)
qf->expand_all_symtabs (this);
for (const auto &iter : qf)
iter->expand_all_symtabs (this);
}
void
@ -226,8 +242,8 @@ objfile::expand_symtabs_with_fullname (const char *fullname)
"qf->expand_symtabs_with_fullname (%s, \"%s\")\n",
objfile_debug_name (this), fullname);
if (qf != nullptr)
qf->expand_symtabs_with_fullname (this, fullname);
for (const auto &iter : qf)
iter->expand_symtabs_with_fullname (this, fullname);
}
void
@ -244,9 +260,9 @@ objfile::map_matching_symbols
domain_name (domain), global,
host_address_to_string (ordered_compare));
if (qf != nullptr)
qf->map_matching_symbols (this, name, domain, global,
callback, ordered_compare);
for (const auto &iter : qf)
iter->map_matching_symbols (this, name, domain, global,
callback, ordered_compare);
}
void
@ -266,9 +282,9 @@ objfile::expand_symtabs_matching
host_address_to_string (&expansion_notify),
search_domain_name (kind));
if (qf != nullptr)
qf->expand_symtabs_matching (this, file_matcher, lookup_name,
symbol_matcher, expansion_notify, kind);
for (const auto &iter : qf)
iter->expand_symtabs_matching (this, file_matcher, lookup_name,
symbol_matcher, expansion_notify, kind);
}
struct compunit_symtab *
@ -288,9 +304,13 @@ objfile::find_pc_sect_compunit_symtab (struct bound_minimal_symbol msymbol,
host_address_to_string (section),
warn_if_readin);
if (qf != nullptr)
retval = qf->find_pc_sect_compunit_symtab (this, msymbol, pc, section,
warn_if_readin);
for (const auto &iter : qf)
{
retval = iter->find_pc_sect_compunit_symtab (this, msymbol, pc, section,
warn_if_readin);
if (retval != nullptr)
break;
}
if (debug_symfile)
fprintf_filtered (gdb_stdlog,
@ -314,8 +334,8 @@ objfile::map_symbol_filenames (symbol_filename_ftype *fun, void *data,
host_address_to_string (data),
need_fullname);
if (qf != nullptr)
qf->map_symbol_filenames (this, fun, data, need_fullname);
for (const auto &iter : qf)
iter->map_symbol_filenames (this, fun, data, need_fullname);
}
struct compunit_symtab *
@ -328,8 +348,12 @@ objfile::find_compunit_symtab_by_address (CORE_ADDR address)
hex_string (address));
struct compunit_symtab *result = NULL;
if (qf != nullptr)
result = qf->find_compunit_symtab_by_address (this, address);
for (const auto &iter : qf)
{
result = iter->find_compunit_symtab_by_address (this, address);
if (result != nullptr)
break;
}
if (debug_symfile)
fprintf_filtered (gdb_stdlog,
@ -347,12 +371,15 @@ objfile::lookup_global_symbol_language (const char *name,
bool *symbol_found_p)
{
enum language result = language_unknown;
*symbol_found_p = false;
if (qf != nullptr)
result = qf->lookup_global_symbol_language (this, name, domain,
symbol_found_p);
else
*symbol_found_p = false;
for (const auto &iter : qf)
{
result = iter->lookup_global_symbol_language (this, name, domain,
symbol_found_p);
if (*symbol_found_p)
break;
}
return result;
}
@ -364,17 +391,23 @@ objfile::require_partial_symbols (bool verbose)
{
flags |= OBJF_PSYMTABS_READ;
if (qf->can_lazily_read_symbols ())
bool printed = false;
for (const auto &iter : qf)
{
if (verbose)
printf_filtered (_("Reading symbols from %s...\n"),
objfile_name (this));
qf->read_partial_symbols (this);
if (verbose && !objfile_has_symbols (this))
printf_filtered (_("(No debugging symbols found in %s)\n"),
objfile_name (this));
if (iter->can_lazily_read_symbols ())
{
if (verbose && !printed)
{
printf_filtered (_("Reading symbols from %s...\n"),
objfile_name (this));
printed = true;
}
iter->read_partial_symbols (this);
}
}
if (printed && !objfile_has_symbols (this))
printf_filtered (_("(No debugging symbols found in %s)\n"),
objfile_name (this));
}
}

View file

@ -903,7 +903,8 @@ syms_from_objfile_1 (struct objfile *objfile,
objfile_set_sym_fns (objfile, find_sym_fns (objfile->obfd));
objfile->reset_psymtabs ();
objfile->qf = make_psymbol_functions (objfile->partial_symtabs);
objfile->qf.clear ();
objfile->qf.push_front (make_psymbol_functions (objfile->partial_symtabs));
if (objfile->sf == NULL)
{
@ -2553,7 +2554,9 @@ reread_symbols (void)
start over. PR symtab/15885 */
objfile_set_sym_fns (objfile, find_sym_fns (objfile->obfd));
objfile->reset_psymtabs ();
objfile->qf = make_psymbol_functions (objfile->partial_symtabs);
objfile->qf.clear ();
objfile->qf.push_front
(make_psymbol_functions (objfile->partial_symtabs));
build_objfile_section_table (objfile);