Attach partial symtab storage to psymbol_functions
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)
Currently, the storage for partial symtabs is attached to the objfile.
Ultimately, though, this direct assocation will be removed, and the
storage will be owned by the psymbol_functions object.

This patch is a step toward this goal.  The storage is already managed
as a shared_ptr, to enable cross-objfile sharing, so this adds a
reference from the psymbol_functions, and changes some code in
psymtab.c to use this reference instead.

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

* dwarf2/read.c (dwarf2_build_psymtabs): Call
set_partial_symtabs.
* symfile.c (syms_from_objfile_1, reread_symbols): Update.
* psymtab.h (make_psymbol_functions): Add partial_symtabs
parameter.
* psymtab.c (find_pc_sect_psymtab): Add partial_symtabs
parameter.
(psymbol_functions::find_pc_sect_compunit_symtab)
(psymbol_functions::print_stats, psymbol_functions::dump)
(psymbol_functions::has_symbols): Update.
(make_psymbol_functions, dump_psymtab_addrmap): Add
partial_symtabs parameter.
(maintenance_print_psymbols): Update.
(psymbol_functions::expand_symtabs_matching): Update.
* psympriv.h (struct psymbol_functions): Add constructor.
<m_partial_symtabs>: New member.
<set_partial_symtabs>: New method.

gdb/ChangeLog
gdb/dwarf2/read.c
gdb/psympriv.h
gdb/psymtab.c
gdb/psymtab.h
gdb/symfile.c

index 14efa054c7963bbb384840cc61a72163277b8111..abeaad8f61333db6026cfa85d40c9e6f10ead388 100644 (file)
@@ -1,3 +1,23 @@
+2021-03-20  Tom Tromey  <tom@tromey.com>
+
+       * dwarf2/read.c (dwarf2_build_psymtabs): Call
+       set_partial_symtabs.
+       * symfile.c (syms_from_objfile_1, reread_symbols): Update.
+       * psymtab.h (make_psymbol_functions): Add partial_symtabs
+       parameter.
+       * psymtab.c (find_pc_sect_psymtab): Add partial_symtabs
+       parameter.
+       (psymbol_functions::find_pc_sect_compunit_symtab)
+       (psymbol_functions::print_stats, psymbol_functions::dump)
+       (psymbol_functions::has_symbols): Update.
+       (make_psymbol_functions, dump_psymtab_addrmap): Add
+       partial_symtabs parameter.
+       (maintenance_print_psymbols): Update.
+       (psymbol_functions::expand_symtabs_matching): Update.
+       * psympriv.h (struct psymbol_functions): Add constructor.
+       <m_partial_symtabs>: New member.
+       <set_partial_symtabs>: New method.
+
 2021-03-20  Tom Tromey  <tom@tromey.com>
 
        * dwarf2/read.c (dwarf2_create_include_psymtab): Add per_bfd
index befaea5aea78fa5d82d0beff4d1e82428ea297a7..c4acf292542fb5aafeefddf9a96502cd839ad924 100644 (file)
@@ -6128,6 +6128,12 @@ dwarf2_build_psymtabs (struct objfile *objfile)
       /* Partial symbols were already read, so now we can simply
         attach them.  */
       objfile->partial_symtabs = per_bfd->partial_symtabs;
+      /* 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 ());
+      gdb_assert (psf != nullptr);
+      psf->set_partial_symtabs (per_bfd->partial_symtabs);
       per_objfile->resize_symtabs ();
       return;
     }
index 943d6c13919596764bf95a9b1ea56ff5145d42d6..b1b8027ce3ae0a9f56d423badfef0edf69a0b7ff 100644 (file)
@@ -476,6 +476,11 @@ class psymtab_discarder
    partial symbols.  */
 struct psymbol_functions : public quick_symbol_functions
 {
+  explicit psymbol_functions (const std::shared_ptr<psymtab_storage> &storage)
+    : m_partial_symtabs (storage)
+  {
+  }
+
   bool has_symbols (struct objfile *objfile) override;
 
   struct symtab *find_last_source_symtab (struct objfile *objfile) override;
@@ -540,6 +545,13 @@ struct psymbol_functions : public quick_symbol_functions
     m_psymbol_map.clear ();
   }
 
+  /* Replace the partial symbol table storage in this object with
+     SYMS.  */
+  void set_partial_symtabs (const std::shared_ptr<psymtab_storage> &syms)
+  {
+    m_partial_symtabs = syms;
+  }
+
 private:
 
   void fill_psymbol_map (struct objfile *objfile,
@@ -547,6 +559,9 @@ private:
                         std::set<CORE_ADDR> *seen_addrs,
                         const std::vector<partial_symbol *> &symbols);
 
+  /* Storage for the partial symbols.  */
+  std::shared_ptr<psymtab_storage> m_partial_symtabs;
+
   /* Map symbol addresses to the partial symtab that defines the
      object at that address.  */
 
index 867b71530ebd99b37b10ebfb767409d5f09a95d5..1549ead04d01c4ae8ac93b9f2eeced21accd60dd 100644 (file)
@@ -275,7 +275,9 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
    psymtab that contains a symbol whose address is closest to PC.  */
 
 static struct partial_symtab *
-find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
+find_pc_sect_psymtab (struct objfile *objfile,
+                     psymtab_storage *partial_symtabs,
+                     CORE_ADDR pc,
                      struct obj_section *section,
                      struct bound_minimal_symbol msymbol)
 {
@@ -291,14 +293,14 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
      partial symtabs then we will end up returning a pointer to an object
      that is not a partial_symtab, which doesn't end well.  */
 
-  if (objfile->partial_symtabs->psymtabs != NULL
-      && objfile->partial_symtabs->psymtabs_addrmap != NULL)
+  if (partial_symtabs->psymtabs != NULL
+      && partial_symtabs->psymtabs_addrmap != NULL)
     {
       CORE_ADDR baseaddr = objfile->text_section_offset ();
 
       struct partial_symtab *pst
        = ((struct partial_symtab *)
-          addrmap_find (objfile->partial_symtabs->psymtabs_addrmap,
+          addrmap_find (partial_symtabs->psymtabs_addrmap,
                         pc - baseaddr));
       if (pst != NULL)
        {
@@ -367,7 +369,9 @@ psymbol_functions::find_pc_sect_compunit_symtab
       struct obj_section *section,
       int warn_if_readin)
 {
-  struct partial_symtab *ps = find_pc_sect_psymtab (objfile, pc, section,
+  struct partial_symtab *ps = find_pc_sect_psymtab (objfile,
+                                                   m_partial_symtabs.get (),
+                                                   pc, section,
                                                    msymbol);
   if (ps != NULL)
     {
@@ -1013,12 +1017,12 @@ psymbol_functions::print_stats (struct objfile *objfile, bool print_bcache)
       printf_filtered (_("  Number of psym tables (not yet expanded): %d\n"),
                       i);
       printf_filtered (_("  Total memory used for psymbol cache: %d\n"),
-                      objfile->partial_symtabs->psymbol_cache.memory_used ());
+                      m_partial_symtabs->psymbol_cache.memory_used ());
     }
   else
     {
       printf_filtered (_("Psymbol byte cache statistics:\n"));
-      objfile->partial_symtabs->psymbol_cache.print_statistics
+      m_partial_symtabs->psymbol_cache.print_statistics
        ("partial symbol cache");
     }
 }
@@ -1031,10 +1035,10 @@ psymbol_functions::dump (struct objfile *objfile)
 {
   struct partial_symtab *psymtab;
 
-  if (objfile->partial_symtabs->psymtabs)
+  if (m_partial_symtabs->psymtabs)
     {
       printf_filtered ("Psymtabs:\n");
-      for (psymtab = objfile->partial_symtabs->psymtabs;
+      for (psymtab = m_partial_symtabs->psymtabs;
           psymtab != NULL;
           psymtab = psymtab->next)
        {
@@ -1321,7 +1325,7 @@ psymbol_functions::expand_symtabs_matching
   for (partial_symtab *ps : require_partial_symbols (objfile, true))
     ps->searched_flag = PST_NOT_SEARCHED;
 
-  for (partial_symtab *ps : objfile->psymtabs ())
+  for (partial_symtab *ps : m_partial_symtabs->range ())
     {
       QUIT;
 
@@ -1373,7 +1377,7 @@ psymbol_functions::expand_symtabs_matching
 bool
 psymbol_functions::has_symbols (struct objfile *objfile)
 {
-  return objfile->partial_symtabs->psymtabs != NULL;
+  return m_partial_symtabs->psymtabs != NULL;
 }
 
 /* Helper function for psym_find_compunit_symtab_by_address that fills
@@ -1446,9 +1450,9 @@ psymbol_functions::find_compunit_symtab_by_address (struct objfile *objfile,
 }
 
 quick_symbol_functions_up
-make_psymbol_functions ()
+make_psymbol_functions (const std::shared_ptr<psymtab_storage> &storage)
 {
-  return quick_symbol_functions_up (new psymbol_functions);
+  return quick_symbol_functions_up (new psymbol_functions (storage));
 }
 
 \f
@@ -1724,14 +1728,16 @@ dump_psymtab_addrmap_1 (void *datap, CORE_ADDR start_addr, void *obj)
    of PSYMTAB.  If PSYMTAB is NULL print the entire addrmap.  */
 
 static void
-dump_psymtab_addrmap (struct objfile *objfile, struct partial_symtab *psymtab,
+dump_psymtab_addrmap (struct objfile *objfile,
+                     psymtab_storage *partial_symtabs,
+                     struct partial_symtab *psymtab,
                      struct ui_file *outfile)
 {
   struct dump_psymtab_addrmap_data addrmap_dump_data;
 
   if ((psymtab == NULL
        || psymtab->psymtabs_addrmap_supported)
-      && objfile->partial_symtabs->psymtabs_addrmap != NULL)
+      && partial_symtabs->psymtabs_addrmap != NULL)
     {
       addrmap_dump_data.objfile = objfile;
       addrmap_dump_data.psymtab = psymtab;
@@ -1739,7 +1745,7 @@ dump_psymtab_addrmap (struct objfile *objfile, struct partial_symtab *psymtab,
       addrmap_dump_data.previous_matched = 0;
       fprintf_filtered (outfile, "%sddress map:\n",
                        psymtab == NULL ? "Entire a" : "  A");
-      addrmap_foreach (objfile->partial_symtabs->psymtabs_addrmap,
+      addrmap_foreach (partial_symtabs->psymtabs_addrmap,
                       dump_psymtab_addrmap_1, &addrmap_dump_data);
     }
 }
@@ -1830,14 +1836,17 @@ maintenance_print_psymbols (const char *args, int from_tty)
       if (!print_for_objfile)
        continue;
 
+      psymtab_storage *partial_symtabs = objfile->partial_symtabs.get ();
+
       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 = find_pc_sect_psymtab (objfile, pc,
-                                                           section, msymbol);
+         struct partial_symtab *ps
+           = find_pc_sect_psymtab (objfile, partial_symtabs, pc,
+                                   section, msymbol);
          if (ps != NULL)
            {
              if (!printed_objfile_header)
@@ -1847,7 +1856,7 @@ maintenance_print_psymbols (const char *args, int from_tty)
                  printed_objfile_header = 1;
                }
              dump_psymtab (objfile, ps, outfile);
-             dump_psymtab_addrmap (objfile, ps, outfile);
+             dump_psymtab_addrmap (objfile, partial_symtabs, ps, outfile);
              found = 1;
            }
        }
@@ -1874,7 +1883,8 @@ maintenance_print_psymbols (const char *args, int from_tty)
                      printed_objfile_header = 1;
                    }
                  dump_psymtab (objfile, ps, outfile);
-                 dump_psymtab_addrmap (objfile, ps, outfile);
+                 dump_psymtab_addrmap (objfile, partial_symtabs, ps,
+                                       outfile);
                }
            }
        }
@@ -1886,7 +1896,7 @@ maintenance_print_psymbols (const char *args, int from_tty)
          && objfile->partial_symtabs->psymtabs_addrmap != NULL)
        {
          outfile->puts ("\n");
-         dump_psymtab_addrmap (objfile, NULL, outfile);
+         dump_psymtab_addrmap (objfile, partial_symtabs, NULL, outfile);
        }
     }
 
index 45eaf0b9013950f48686481fbb12ad8138b2f1c3..18b47c55b3caf9ad21fc7fc8f1f2bcb9eb38decf 100644 (file)
@@ -154,6 +154,7 @@ private:
 extern psymtab_storage::partial_symtab_range require_partial_symbols
     (struct objfile *objfile, bool verbose);
 
-extern quick_symbol_functions_up make_psymbol_functions ();
+extern quick_symbol_functions_up make_psymbol_functions
+     (const std::shared_ptr<psymtab_storage> &);
 
 #endif /* PSYMTAB_H */
index d0b9da2138b9393f00d68d2480bf21497ec1aea5..12746c4337478b900d44c0621af9c4123b3bc695 100644 (file)
@@ -904,7 +904,7 @@ syms_from_objfile_1 (struct objfile *objfile,
   const int mainline = add_flags & SYMFILE_MAINLINE;
 
   objfile_set_sym_fns (objfile, find_sym_fns (objfile->obfd));
-  objfile->qf = make_psymbol_functions ();
+  objfile->qf = make_psymbol_functions (objfile->partial_symtabs);
 
   if (objfile->sf == NULL)
     {
@@ -2555,7 +2555,7 @@ reread_symbols (void)
             based on whether .gdb_index is present, and we need it to
             start over.  PR symtab/15885  */
          objfile_set_sym_fns (objfile, find_sym_fns (objfile->obfd));
-         objfile->qf = make_psymbol_functions ();
+         objfile->qf = make_psymbol_functions (objfile->partial_symtabs);
 
          build_objfile_section_table (objfile);