Always use dwarf2_initialize_objfile

Internally we noticed that some tests would fail like so on Windows:

warning: Section .debug_aranges in [...] has duplicate debug_info_offset 0x0, ignoring .debug_aranges.

Debugging showed that, in fact, a second CU was being created at this
offset.  We tracked this down to the fact that, while the ELF reader
is careful to re-use the per-BFD data, other readers are not, and
could re-read the DWARF data multiple times.

However, since the change to allow an objfile to have multiple "quick
symbol" implementations, there's no reason for this approach -- it's
safe and easy for all symbol readers to reuse the per-BFD data when
reading DWARF.

This patch implements this idea, simplifying dwarf2_build_psymtabs and
making it private, and then switching to dwarf2_initialize_objfile as
the sole way to start the DWARF reader.

Note that, while I think the call to dwarf2_build_frame_info in
machoread.c is also obsolete, I haven't attempted to remove it here.
This commit is contained in:
Tom Tromey
2022-04-19 11:32:04 -06:00
parent 5f21c7aae2
commit 31de881f8f
5 changed files with 8 additions and 20 deletions

View File

@@ -702,11 +702,9 @@ coff_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
if (dwarf2_has_info (objfile, NULL))
{
/* DWARF2 sections. */
dwarf2_build_psymtabs (objfile);
dwarf2_initialize_objfile (objfile);
}
dwarf2_build_frame_info (objfile);
/* Try to add separate debug file if no symbols table found. */
if (!objfile->has_partial_symbols ())
{

View File

@@ -38,9 +38,6 @@ enum class dw_index_kind
entry on the objfile's "qf" list. */
extern void dwarf2_initialize_objfile (struct objfile *objfile);
struct psymbol_functions;
extern void dwarf2_build_psymtabs (struct objfile *,
bool already_attached = false);
extern void dwarf2_build_frame_info (struct objfile *);
#endif /* DWARF2_PUBLIC_H */

View File

@@ -5340,18 +5340,13 @@ dwarf2_initialize_objfile (struct objfile *objfile)
/* Build a partial symbol table. */
void
dwarf2_build_psymtabs (struct objfile *objfile, bool already_attached)
static void
dwarf2_build_psymtabs (struct objfile *objfile)
{
dwarf2_per_objfile *per_objfile = get_dwarf2_per_objfile (objfile);
if (already_attached)
{
if (per_objfile->per_bfd->index_table != nullptr)
return;
}
else
objfile->qf.push_front (make_cooked_index_funcs ());
if (per_objfile->per_bfd->index_table != nullptr)
return;
try
{
@@ -18457,7 +18452,7 @@ struct cooked_index_functions : public dwarf2_base_index_functions
void read_partial_symbols (struct objfile *objfile) override
{
if (dwarf2_has_info (objfile, nullptr))
dwarf2_build_psymtabs (objfile, true);
dwarf2_build_psymtabs (objfile);
}
};

View File

@@ -860,7 +860,7 @@ macho_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
if (dwarf2_has_info (objfile, NULL))
{
/* DWARF 2 sections */
dwarf2_build_psymtabs (objfile);
dwarf2_initialize_objfile (objfile);
}
/* Then the oso. */

View File

@@ -2872,9 +2872,7 @@ xcoff_initial_scan (struct objfile *objfile, symfile_add_flags symfile_flags)
/* DWARF2 sections. */
if (dwarf2_has_info (objfile, &dwarf2_xcoff_names))
dwarf2_build_psymtabs (objfile);
dwarf2_build_frame_info (objfile);
dwarf2_initialize_objfile (objfile);
}
static void