Move psymbol_map out of objfile
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:42 +0000 (17:23 -0600)
objfile::psymbol_map is used to implement a Rust feature.  It is
currently specific to partial symbols -- it isn't used by the DWARF
indices.

This patch moves it out of objfile and into psymbol_functions, adding
a new method to quick_symbol_functions to handle the clearing case.
This is needed because the map holds unrelocated addresses.

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

* quick-symbol.h (struct quick_symbol_functions)
<relocated>: New method.
* psymtab.h (struct psymbol_functions) <relocated>: New
method.
<fill_psymbol_map>: Declare method.
<m_psymbol_map>: New member.
* psymtab.c (psymbol_functions::fill_psymbol_map): Rename.
(psymbol_functions::find_compunit_symtab_by_address): Update.
* objfiles.h (reset_psymtabs): Don't clear psymbol_map.
(struct objfile) <psymbol_map>: Remove.
* objfiles.c (objfile_relocate1): Update.

gdb/ChangeLog
gdb/objfiles.c
gdb/objfiles.h
gdb/psympriv.h
gdb/psymtab.c
gdb/quick-symbol.h

index 1ab402b60ea6eb724ebd736f96e6d488d72e3f02..14440e73c51d841b677df45004d9163c352cfad5 100644 (file)
@@ -1,3 +1,17 @@
+2021-03-20  Tom Tromey  <tom@tromey.com>
+
+       * quick-symbol.h (struct quick_symbol_functions)
+       <relocated>: New method.
+       * psymtab.h (struct psymbol_functions) <relocated>: New
+       method.
+       <fill_psymbol_map>: Declare method.
+       <m_psymbol_map>: New member.
+       * psymtab.c (psymbol_functions::fill_psymbol_map): Rename.
+       (psymbol_functions::find_compunit_symtab_by_address): Update.
+       * objfiles.h (reset_psymtabs): Don't clear psymbol_map.
+       (struct objfile) <psymbol_map>: Remove.
+       * objfiles.c (objfile_relocate1): Update.
+
 2021-03-20  Tom Tromey  <tom@tromey.com>
 
        * psympriv.h (struct psymbol_functions): New.
index f18f6158fc3a57e05bfb750df202e1fc11718491..bfa5f0443e306e88df4e53070e2803bfaffebdf1 100644 (file)
@@ -703,9 +703,9 @@ objfile_relocate1 (struct objfile *objfile,
       }
   }
 
-  /* This stores relocated addresses and so must be cleared.  This
-     will cause it to be recreated on demand.  */
-  objfile->psymbol_map.clear ();
+  /* Notify the quick symbol object.  */
+  if (objfile->qf)
+    objfile->qf->relocated ();
 
   /* Relocate isolated symbols.  */
   {
index 7235713cbdf2cab133d7ce5c8c3c1b206a07c4ea..cd136eef788fa7b45c8e02d25f5c474ded80d550 100644 (file)
@@ -459,7 +459,6 @@ public:
 
   void reset_psymtabs ()
   {
-    psymbol_map.clear ();
     partial_symtabs.reset (new psymtab_storage ());
   }
 
@@ -665,11 +664,6 @@ public:
 
   struct obstack objfile_obstack {};
 
-  /* Map symbol addresses to the partial symtab that defines the
-     object at that address.  */
-
-  std::vector<std::pair<CORE_ADDR, partial_symtab *>> psymbol_map;
-
   /* Structure which keeps track of functions that manipulate objfile's
      of the same type as this objfile.  I.e. the function to read partial
      symbols for example.  Note that this structure is in statically
index 6b9ee184e9c2aa2a9b333731b45a46940bb82a4f..73f00a50992f125354b57c8957151ce1a02edafe 100644 (file)
@@ -535,6 +535,23 @@ struct psymbol_functions : public quick_symbol_functions
   void map_symbol_filenames (struct objfile *objfile,
                             symbol_filename_ftype *fun, void *data,
                             int need_fullname) override;
+
+  void relocated () override
+  {
+    m_psymbol_map.clear ();
+  }
+
+private:
+
+  void fill_psymbol_map (struct objfile *objfile,
+                        struct partial_symtab *psymtab,
+                        std::set<CORE_ADDR> *seen_addrs,
+                        const std::vector<partial_symbol *> &symbols);
+
+  /* Map symbol addresses to the partial symtab that defines the
+     object at that address.  */
+
+  std::vector<std::pair<CORE_ADDR, partial_symtab *>> m_psymbol_map;
 };
 
 #endif /* PSYMPRIV_H */
index c022daa7894255d3ec47255bf181b5bceb18e756..45a4db71c1f129b75429778b0f9b9167c072aa6d 100644 (file)
@@ -1346,13 +1346,14 @@ psymbol_functions::has_symbols (struct objfile *objfile)
 }
 
 /* Helper function for psym_find_compunit_symtab_by_address that fills
-   in psymbol_map for a given range of psymbols.  */
+   in m_psymbol_map for a given range of psymbols.  */
 
-static void
-psym_fill_psymbol_map (struct objfile *objfile,
-                      struct partial_symtab *psymtab,
-                      std::set<CORE_ADDR> *seen_addrs,
-                      const std::vector<partial_symbol *> &symbols)
+void
+psymbol_functions::fill_psymbol_map
+     (struct objfile *objfile,
+      struct partial_symtab *psymtab,
+      std::set<CORE_ADDR> *seen_addrs,
+      const std::vector<partial_symbol *> &symbols)
 {
   for (partial_symbol *psym : symbols)
     {
@@ -1362,7 +1363,7 @@ psym_fill_psymbol_map (struct objfile *objfile,
          if (seen_addrs->find (addr) == seen_addrs->end ())
            {
              seen_addrs->insert (addr);
-             objfile->psymbol_map.emplace_back (addr, psymtab);
+             m_psymbol_map.emplace_back (addr, psymtab);
            }
        }
     }
@@ -1375,23 +1376,23 @@ compunit_symtab *
 psymbol_functions::find_compunit_symtab_by_address (struct objfile *objfile,
                                                    CORE_ADDR address)
 {
-  if (objfile->psymbol_map.empty ())
+  if (m_psymbol_map.empty ())
     {
       std::set<CORE_ADDR> seen_addrs;
 
       for (partial_symtab *pst : require_partial_symbols (objfile, true))
        {
-         psym_fill_psymbol_map (objfile, pst,
-                                &seen_addrs,
-                                pst->global_psymbols);
-         psym_fill_psymbol_map (objfile, pst,
-                                &seen_addrs,
-                                pst->static_psymbols);
+         fill_psymbol_map (objfile, pst,
+                           &seen_addrs,
+                           pst->global_psymbols);
+         fill_psymbol_map (objfile, pst,
+                           &seen_addrs,
+                           pst->static_psymbols);
        }
 
-      objfile->psymbol_map.shrink_to_fit ();
+      m_psymbol_map.shrink_to_fit ();
 
-      std::sort (objfile->psymbol_map.begin (), objfile->psymbol_map.end (),
+      std::sort (m_psymbol_map.begin (), m_psymbol_map.end (),
                 [] (const std::pair<CORE_ADDR, partial_symtab *> &a,
                     const std::pair<CORE_ADDR, partial_symtab *> &b)
                 {
@@ -1400,14 +1401,14 @@ psymbol_functions::find_compunit_symtab_by_address (struct objfile *objfile,
     }
 
   auto iter = std::lower_bound
-    (objfile->psymbol_map.begin (), objfile->psymbol_map.end (), address,
+    (m_psymbol_map.begin (), m_psymbol_map.end (), address,
      [] (const std::pair<CORE_ADDR, partial_symtab *> &a,
         CORE_ADDR b)
      {
        return a.first < b;
      });
 
-  if (iter == objfile->psymbol_map.end () || iter->first != address)
+  if (iter == m_psymbol_map.end () || iter->first != address)
     return NULL;
 
   return psymtab_to_symtab (objfile, iter->second);
index 85e7a32eacd9441b9c2ed2e28eccb3439318fe3e..319ffe681c85ac2e25510bb7a25f25e718675f2f 100644 (file)
@@ -228,6 +228,13 @@ struct quick_symbol_functions
   virtual void map_symbol_filenames (struct objfile *objfile,
                                     symbol_filename_ftype *fun, void *data,
                                     int need_fullname) = 0;
+
+  /* This is called when the objfile is relocated.  It can be used to
+     clean up any internal caches.  */
+  virtual void relocated ()
+  {
+    /* Do nothing.  */
+  }
 };
 
 typedef std::unique_ptr<quick_symbol_functions> quick_symbol_functions_up;