Remove sym_fns::sym_read_psymbols
authorTom Tromey <tom@tromey.com>
Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)
committerTom Tromey <tom@tromey.com>
Sat, 20 Mar 2021 23:23:44 +0000 (17:23 -0600)
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.

gdb/ChangeLog
gdb/coffread.c
gdb/dbxread.c
gdb/elfread.c
gdb/machoread.c
gdb/mipsread.c
gdb/psymtab.c
gdb/quick-symbol.h
gdb/symfile-debug.c
gdb/symfile.h
gdb/xcoffread.c

index 9eba43c12e5a94d1396f8aa2f53ca5baaead65ce..1640270a7c197b56a65329db2d11336602a9c629 100644 (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.
index 676deec8cbe905e6a1f18bb662155289dc3fd232..b527f934c95f086360db92a5f1bc8038191f2295 100644 (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
index 9a470bf81778d98bb15269f183efc7f323e6001f..e0cc2597f73235afd3d5845447a85c674fb8e629 100644 (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.  */
index 4ca1f4d5284c59d32d2359b32aea568837c18277..157a07178289a48f42f14a849223f1117c3b415e 100644 (file)
 #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.  */
index 44baaa26f654bf7093ba6a14a3b4d2bac8560e7d..17aa9ceee01c7d6164e7fcf250c3224fbcb2575a 100644 (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.  */
index 3f0697b9150cb30e7e0c8df4bc8a141a27d1d27d..b51af3eeaa609811d7800cfe4d2dfddb1f5556a5 100644 (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.  */
index 1549ead04d01c4ae8ac93b9f2eeced21accd60dd..b5ddef90878715a419e5070069bb3cd8c872e0fd 100644 (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"),
index 315a97a49e074a2e1b21ed974cd7907014c3253b..dd2b896fd5f5e5fb5b0fbf7a808a48f31cb1cbe6 100644 (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;
index 406eac0b7d33489dde4d13065f82042415e8f987..94559c7370c4e8079ee0b97fef04e3548797b243 100644 (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);
index 2c37f88d7631e863e769736e0fa42151215ec26c..bae2a798703ecbad0552c84e0577807d747578fe 100644 (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.  */
index 711d8932706dd0693f2cef06d62e430b2dabb4c5..7f2fee3a29cc5241f745c41beab1c10aafaae4a2 100644 (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.  */