Remove sym_fns::sym_read_psymbols

Partial symbols are read via the sym_fns::sym_read_psymbols function
pointer.  In order to separate the partial symbols from the objfile,
this must instead be done via a virtual method on
quick_symbol_functions.  This patch implements this change.

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

	* xcoffread.c (xcoff_sym_fns): Update.
	* symfile.h (struct sym_fns) <sym_read_psymbols>: Remove.
	* symfile-debug.c (objfile::has_partial_symbols): Use
	can_lazily_read_symbols.
	(debug_sym_read_psymbols): Remove.
	(debug_sym_fns, install_symfile_debug_logging): Update.
	* quick-symbol.h (struct quick_symbol_functions)
	<can_lazily_read_symbols, read_partial_symbols>: New methods.
	* psymtab.c (require_partial_symbols): Use new 'qf' methods.
	* mipsread.c (ecoff_sym_fns): Update.
	* machoread.c (macho_sym_fns): Update.
	* elfread.c (struct lazy_dwarf_reader): New.
	(elf_symfile_read): Update.
	(read_psyms): Now a method of lazy_dwarf_reader.
	(elf_sym_fns): Update.
	(elf_sym_fns_lazy_psyms): Remove.
	* dbxread.c (aout_sym_fns): Update.
	* coffread.c (coff_sym_fns): Update.
This commit is contained in:
Tom Tromey 2021-03-20 17:23:40 -06:00
parent b29b98cf84
commit eb00e4686d
11 changed files with 59 additions and 61 deletions

View file

@ -1,3 +1,24 @@
2021-03-20 Tom Tromey <tom@tromey.com>
* xcoffread.c (xcoff_sym_fns): Update.
* symfile.h (struct sym_fns) <sym_read_psymbols>: Remove.
* symfile-debug.c (objfile::has_partial_symbols): Use
can_lazily_read_symbols.
(debug_sym_read_psymbols): Remove.
(debug_sym_fns, install_symfile_debug_logging): Update.
* quick-symbol.h (struct quick_symbol_functions)
<can_lazily_read_symbols, read_partial_symbols>: New methods.
* psymtab.c (require_partial_symbols): Use new 'qf' methods.
* mipsread.c (ecoff_sym_fns): Update.
* machoread.c (macho_sym_fns): Update.
* elfread.c (struct lazy_dwarf_reader): New.
(elf_symfile_read): Update.
(read_psyms): Now a method of lazy_dwarf_reader.
(elf_sym_fns): Update.
(elf_sym_fns_lazy_psyms): Remove.
* dbxread.c (aout_sym_fns): Update.
* coffread.c (coff_sym_fns): Update.
2021-03-20 Tom Tromey <tom@tromey.com>
* symfile.c (syms_from_objfile_1): Call reset_psymtabs.

View file

@ -2168,7 +2168,6 @@ static const struct sym_fns coff_sym_fns =
for sym_read() */
coff_symfile_read, /* sym_read: read a symbol file into
symtab */
NULL, /* sym_read_psymbols */
coff_symfile_finish, /* sym_finish: finished with file,
cleanup */
default_symfile_offsets, /* sym_offsets: xlate external to

View file

@ -3131,7 +3131,6 @@ static const struct sym_fns aout_sym_fns =
dbx_new_init, /* init anything gbl to entire symtab */
dbx_symfile_init, /* read initial info, setup for sym_read() */
dbx_symfile_read, /* read a symbol file into symtab */
NULL, /* sym_read_psymbols */
dbx_symfile_finish, /* finished with file, cleanup */
default_symfile_offsets, /* parse user's offsets to internal form */
default_symfile_segments, /* Get segment information from a file. */

View file

@ -53,7 +53,24 @@
#include "debuginfod-support.h"
#include "dwarf2/public.h"
/* Forward declarations. */
/* A subclass of psymbol_functions that arranges to read the DWARF
partial symbols when needed. */
struct lazy_dwarf_reader : public psymbol_functions
{
using psymbol_functions::psymbol_functions;
bool can_lazily_read_symbols () override
{
return true;
}
void read_partial_symbols (struct objfile *objfile) override
{
if (dwarf2_has_info (objfile, nullptr))
dwarf2_build_psymtabs (objfile);
}
};
extern const struct sym_fns elf_sym_fns_lazy_psyms;
/* The struct elfinfo is available only during ELF symbol table and
@ -1283,7 +1300,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_set_sym_fns (objfile, &elf_sym_fns_lazy_psyms);
objfile->qf.reset
(new lazy_dwarf_reader (objfile->partial_symtabs));
}
}
/* If the file has its own symbol tables it has no separate debug
@ -1353,15 +1371,6 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
}
}
/* Callback to lazily read psymtabs. */
static void
read_psyms (struct objfile *objfile)
{
if (dwarf2_has_info (objfile, NULL))
dwarf2_build_psymtabs (objfile);
}
/* Initialize anything that needs initializing when a completely new symbol
file is specified (not just adding some symbols from another file, e.g. a
shared library). */
@ -1428,24 +1437,6 @@ static const struct sym_fns elf_sym_fns =
elf_new_init, /* init anything gbl to entire symtab */
elf_symfile_init, /* read initial info, setup for sym_read() */
elf_symfile_read, /* read a symbol file into symtab */
NULL, /* sym_read_psymbols */
elf_symfile_finish, /* finished with file, cleanup */
default_symfile_offsets, /* Translate ext. to int. relocation */
elf_symfile_segments, /* Get segment information from a file. */
NULL,
default_symfile_relocate, /* Relocate a debug section. */
&elf_probe_fns, /* sym_probe_fns */
};
/* The same as elf_sym_fns, but not registered and lazily reads
psymbols. */
const struct sym_fns elf_sym_fns_lazy_psyms =
{
elf_new_init, /* init anything gbl to entire symtab */
elf_symfile_init, /* read initial info, setup for sym_read() */
elf_symfile_read, /* read a symbol file into symtab */
read_psyms, /* sym_read_psymbols */
elf_symfile_finish, /* finished with file, cleanup */
default_symfile_offsets, /* Translate ext. to int. relocation */
elf_symfile_segments, /* Get segment information from a file. */

View file

@ -951,7 +951,6 @@ static const struct sym_fns macho_sym_fns = {
macho_new_init, /* init anything gbl to entire symtab */
macho_symfile_init, /* read initial info, setup for sym_read() */
macho_symfile_read, /* read a symbol file into symtab */
NULL, /* sym_read_psymbols */
macho_symfile_finish, /* finished with file, cleanup */
macho_symfile_offsets, /* xlate external to internal form */
default_symfile_segments, /* Get segment information from a file. */

View file

@ -369,7 +369,6 @@ static const struct sym_fns ecoff_sym_fns =
mipscoff_new_init, /* init anything gbl to entire symtab */
mipscoff_symfile_init, /* read initial info, setup for sym_read() */
mipscoff_symfile_read, /* read a symbol file into symtab */
NULL, /* sym_read_psymbols */
mipscoff_symfile_finish, /* finished with file, cleanup */
default_symfile_offsets, /* dummy FIXME til implem sym reloc */
default_symfile_segments, /* Get segment information from a file. */

View file

@ -84,13 +84,12 @@ require_partial_symbols (struct objfile *objfile, bool verbose)
{
objfile->flags |= OBJF_PSYMTABS_READ;
if (objfile->sf != nullptr
&& objfile->sf->sym_read_psymbols)
if (objfile->qf->can_lazily_read_symbols ())
{
if (verbose)
printf_filtered (_("Reading symbols from %s...\n"),
objfile_name (objfile));
(*objfile->sf->sym_read_psymbols) (objfile);
objfile->qf->read_partial_symbols (objfile);
if (verbose && !objfile_has_symbols (objfile))
printf_filtered (_("(No debugging symbols found in %s)\n"),

View file

@ -237,6 +237,20 @@ struct quick_symbol_functions
{
/* Do nothing. */
}
/* Return true if this class can lazily read the symbols. This may
only return true if there are in fact symbols to be read, because
this is used in the implementation of 'has_partial_symbols'. */
virtual bool can_lazily_read_symbols ()
{
return false;
}
/* Read the partial symbols for OBJFILE. This will only ever be
called if can_lazily_read_symbols returns true. */
virtual void read_partial_symbols (struct objfile *objfile)
{
}
};
typedef std::unique_ptr<quick_symbol_functions> quick_symbol_functions_up;

View file

@ -81,8 +81,8 @@ objfile::has_partial_symbols ()
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
&& sf != nullptr
&& sf->sym_read_psymbols != NULL)
&& qf != nullptr
&& qf->can_lazily_read_symbols ())
retval = true;
else if (qf != nullptr)
retval = qf->has_symbols (this);
@ -420,18 +420,6 @@ debug_sym_read (struct objfile *objfile, symfile_add_flags symfile_flags)
debug_data->real_sf->sym_read (objfile, symfile_flags);
}
static void
debug_sym_read_psymbols (struct objfile *objfile)
{
const struct debug_sym_fns_data *debug_data
= symfile_debug_objfile_data_key.get (objfile);
fprintf_filtered (gdb_stdlog, "sf->sym_read_psymbols (%s)\n",
objfile_debug_name (objfile));
debug_data->real_sf->sym_read_psymbols (objfile);
}
static void
debug_sym_finish (struct objfile *objfile)
{
@ -508,7 +496,6 @@ static const struct sym_fns debug_sym_fns =
debug_sym_new_init,
debug_sym_init,
debug_sym_read,
debug_sym_read_psymbols,
debug_sym_finish,
debug_sym_offsets,
debug_sym_segments,
@ -543,8 +530,6 @@ install_symfile_debug_logging (struct objfile *objfile)
COPY_SF_PTR (real_sf, debug_data, sym_new_init, debug_sym_new_init);
COPY_SF_PTR (real_sf, debug_data, sym_init, debug_sym_init);
COPY_SF_PTR (real_sf, debug_data, sym_read, debug_sym_read);
COPY_SF_PTR (real_sf, debug_data, sym_read_psymbols,
debug_sym_read_psymbols);
COPY_SF_PTR (real_sf, debug_data, sym_finish, debug_sym_finish);
COPY_SF_PTR (real_sf, debug_data, sym_offsets, debug_sym_offsets);
COPY_SF_PTR (real_sf, debug_data, sym_segments, debug_sym_segments);

View file

@ -137,13 +137,6 @@ struct sym_fns
void (*sym_read) (struct objfile *, symfile_add_flags);
/* Read the partial symbols for an objfile. This may be NULL, in which case
gdb has to check other ways if this objfile has any symbols. This may
only be non-NULL if the objfile actually does have debuginfo available.
*/
void (*sym_read_psymbols) (struct objfile *);
/* Called when we are finished with an objfile. Should do all
cleanup that is specific to the object file format for the
particular objfile. */

View file

@ -3005,7 +3005,6 @@ static const struct sym_fns xcoff_sym_fns =
xcoff_new_init, /* init anything gbl to entire symtab */
xcoff_symfile_init, /* read initial info, setup for sym_read() */
xcoff_initial_scan, /* read a symbol file into symtab */
NULL, /* sym_read_psymbols */
xcoff_symfile_finish, /* finished with file, cleanup */
xcoff_symfile_offsets, /* xlate offsets ext->int form */
default_symfile_segments, /* Get segment information from a file. */