]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Precompute hash value for symbol_set_names
authorChristian Biesinger <cbiesinger@google.com>
Thu, 3 Oct 2019 18:05:06 +0000 (13:05 -0500)
committerChristian Biesinger <cbiesinger@google.com>
Sun, 10 Nov 2019 18:30:24 +0000 (12:30 -0600)
We can also compute the hash for the mangled name on a background
thread so make this function even faster (about a 7% speedup).

gdb/ChangeLog:

2019-10-03  Christian Biesinger  <cbiesinger@google.com>

* minsyms.c (minimal_symbol_reader::install): Also compute the hash
of the mangled name on the background thread.
* symtab.c (symbol_set_names): Allow passing in the hash of the
linkage_name.
* symtab.h (symbol_set_names): Likewise.

Change-Id: I044449e7eb60cffc1c43efd3412f2b485bd9faac

gdb/minsyms.c
gdb/symtab.c
gdb/symtab.h

index f9d1172322e6fb5135a93d03149ab2a76031fc29..d2d8bf50596489fef5a715497452dea6fe4ff208 100644 (file)
@@ -1258,6 +1258,12 @@ clear_minimal_symbol_hash_tables (struct objfile *objfile)
     }
 }
 
+struct computed_hash_values
+{
+  size_t name_length;
+  hashval_t mangled_name_hash;
+};
+
 /* Build (or rebuild) the minimal symbol hash tables.  This is necessary
    after compacting or sorting the table since the entries move around
    thus causing the internal minimal_symbol pointers to become jumbled.  */
@@ -1370,6 +1376,8 @@ minimal_symbol_reader::install ()
       std::mutex demangled_mutex;
 #endif
 
+      std::vector<computed_hash_values> hash_values (mcount);
+
       msymbols = m_objfile->per_bfd->msymbols.get ();
       gdb::parallel_for_each
        (&msymbols[0], &msymbols[mcount],
@@ -1377,6 +1385,8 @@ minimal_symbol_reader::install ()
         {
           for (minimal_symbol *msym = start; msym < end; ++msym)
             {
+              size_t idx = msym - msymbols;
+              hash_values[idx].name_length = strlen (msym->name);
               if (!msym->name_set)
                 {
                   /* This will be freed later, by symbol_set_names.  */
@@ -1386,6 +1396,9 @@ minimal_symbol_reader::install ()
                     (msym, demangled_name,
                      &m_objfile->per_bfd->storage_obstack);
                   msym->name_set = 1;
+
+                  hash_values[idx].mangled_name_hash
+                    = fast_hash (msym->name, hash_values[idx].name_length);
                 }
             }
           {
@@ -1396,8 +1409,14 @@ minimal_symbol_reader::install ()
 #endif
             for (minimal_symbol *msym = start; msym < end; ++msym)
               {
-                symbol_set_names (msym, msym->name, false,
-                                  m_objfile->per_bfd);
+                size_t idx = msym - msymbols;
+                symbol_set_names
+                  (msym,
+                   gdb::string_view(msym->name,
+                                    hash_values[idx].name_length),
+                   false,
+                   m_objfile->per_bfd,
+                   hash_values[idx].mangled_name_hash);
               }
           }
         });
index 9292eb99582cf4ce23e8b8a4eec012a97dafe6cd..9d6f33d4525e247b9290fc4e5801bba500f900be 100644 (file)
@@ -826,7 +826,8 @@ symbol_find_demangled_name (struct general_symbol_info *gsymbol,
 void
 symbol_set_names (struct general_symbol_info *gsymbol,
                  gdb::string_view linkage_name, bool copy_name,
-                 struct objfile_per_bfd_storage *per_bfd)
+                 struct objfile_per_bfd_storage *per_bfd,
+                 gdb::optional<hashval_t> hash)
 {
   struct demangled_name_entry **slot;
 
@@ -854,9 +855,11 @@ symbol_set_names (struct general_symbol_info *gsymbol,
     create_demangled_names_hash (per_bfd);
 
   struct demangled_name_entry entry (linkage_name);
+  if (!hash.has_value ())
+    hash = hash_demangled_name_entry (&entry);
   slot = ((struct demangled_name_entry **)
-         htab_find_slot (per_bfd->demangled_names_hash.get (),
-                         &entry, INSERT));
+          htab_find_slot_with_hash (per_bfd->demangled_names_hash.get (),
+                                   &entry, *hash, INSERT));
 
   /* If this name is not in the hash table, add it.  */
   if (*slot == NULL
index 5f4672da90e230b2ce8838e777a137988699714a..f9836139c1f45e88df9f954fd14d1ceae6e82832 100644 (file)
@@ -529,7 +529,9 @@ extern char *symbol_find_demangled_name (struct general_symbol_info *gsymbol,
                    (objfile)->per_bfd)
 extern void symbol_set_names (struct general_symbol_info *symbol,
                              gdb::string_view linkage_name, bool copy_name,
-                             struct objfile_per_bfd_storage *per_bfd);
+                             struct objfile_per_bfd_storage *per_bfd,
+                             gdb::optional<hashval_t> hash
+                               = gdb::optional<hashval_t> ());
 
 /* Now come lots of name accessor macros.  Short version as to when to
    use which: Use SYMBOL_NATURAL_NAME to refer to the name of the