aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2021-03-20 17:23:40 -0600
committerTom Tromey <tom@tromey.com>2021-03-20 17:23:44 -0600
commiteb00e4686dd1a1530737e2de7eae971d61332da1 (patch)
tree72c57133482f5dbc22fe2d204357ab13c194bc06
parentb29b98cf8411ac136d17fc68236fc029447f1461 (diff)
downloadgdb-eb00e4686dd1a1530737e2de7eae971d61332da1.zip
gdb-eb00e4686dd1a1530737e2de7eae971d61332da1.tar.gz
gdb-eb00e4686dd1a1530737e2de7eae971d61332da1.tar.bz2
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.
-rw-r--r--gdb/ChangeLog21
-rw-r--r--gdb/coffread.c1
-rw-r--r--gdb/dbxread.c1
-rw-r--r--gdb/elfread.c49
-rw-r--r--gdb/machoread.c1
-rw-r--r--gdb/mipsread.c1
-rw-r--r--gdb/psymtab.c5
-rw-r--r--gdb/quick-symbol.h14
-rw-r--r--gdb/symfile-debug.c19
-rw-r--r--gdb/symfile.h7
-rw-r--r--gdb/xcoffread.c1
11 files changed, 59 insertions, 61 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 9eba43c..1640270 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,26 @@
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.
(reread_symbols): Move reset_psymtabs call later.
* objfiles.c (objfile::objfile): Don't initialize
diff --git a/gdb/coffread.c b/gdb/coffread.c
index 676deec..b527f93 100644
--- a/gdb/coffread.c
+++ b/gdb/coffread.c
@@ -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
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index 9a470bf..e0cc259 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -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. */
diff --git a/gdb/elfread.c b/gdb/elfread.c
index 4ca1f4d..157a071 100644
--- a/gdb/elfread.c
+++ b/gdb/elfread.c
@@ -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. */
diff --git a/gdb/machoread.c b/gdb/machoread.c
index 44baaa2..17aa9ce 100644
--- a/gdb/machoread.c
+++ b/gdb/machoread.c
@@ -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. */
diff --git a/gdb/mipsread.c b/gdb/mipsread.c
index 3f0697b..b51af3e 100644
--- a/gdb/mipsread.c
+++ b/gdb/mipsread.c
@@ -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. */
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index 1549ead..b5ddef9 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -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"),
diff --git a/gdb/quick-symbol.h b/gdb/quick-symbol.h
index 315a97a..dd2b896 100644
--- a/gdb/quick-symbol.h
+++ b/gdb/quick-symbol.h
@@ -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;
diff --git a/gdb/symfile-debug.c b/gdb/symfile-debug.c
index 406eac0..94559c7 100644
--- a/gdb/symfile-debug.c
+++ b/gdb/symfile-debug.c
@@ -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);
@@ -421,18 +421,6 @@ debug_sym_read (struct objfile *objfile, symfile_add_flags 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)
{
const struct debug_sym_fns_data *debug_data
@@ -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);
diff --git a/gdb/symfile.h b/gdb/symfile.h
index 2c37f88..bae2a79 100644
--- a/gdb/symfile.h
+++ b/gdb/symfile.h
@@ -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. */
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index 711d893..7f2fee3 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -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. */