diff options
author | Christian Biesinger <cbiesinger@google.com> | 2019-10-03 13:05:06 -0500 |
---|---|---|
committer | Christian Biesinger <cbiesinger@google.com> | 2019-10-03 13:17:12 -0500 |
commit | b4fbb96b58d152194f0ffeefd35eea9a1bd89a52 (patch) | |
tree | f368d93c07bc97344b97dfbd909237f24efa7475 | |
parent | e1f6a52ca259c3b9bb4b90022f77ee5c99743ccc (diff) | |
download | gdb-users/cbiesinger/parallel-minsyms-mutex.zip gdb-users/cbiesinger/parallel-minsyms-mutex.tar.gz gdb-users/cbiesinger/parallel-minsyms-mutex.tar.bz2 |
Precompute hash value for symbol_set_namesusers/cbiesinger/parallel-minsyms-mutex
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.
-rw-r--r-- | gdb/minsyms.c | 12 | ||||
-rw-r--r-- | gdb/symtab.c | 8 | ||||
-rw-r--r-- | gdb/symtab.h | 7 |
3 files changed, 21 insertions, 6 deletions
diff --git a/gdb/minsyms.c b/gdb/minsyms.c index 95ca9f6..b60381a 100644 --- a/gdb/minsyms.c +++ b/gdb/minsyms.c @@ -1342,6 +1342,11 @@ minimal_symbol_reader::install () std::mutex demangled_mutex; #endif + struct computed_hash_values { + hashval_t mangled_name_hash; + }; + std::vector<computed_hash_values> hash_values (mcount); + msymbols = m_objfile->per_bfd->msymbols.get (); gdb::parallel_for_each (&msymbols[0], &msymbols[mcount], @@ -1361,6 +1366,9 @@ minimal_symbol_reader::install () symbol_set_demangled_name (msym, demangled_name, &m_objfile->per_bfd->storage_obstack); msym->name_set = 1; + + size_t idx = msym - msymbols; + hash_values[idx].mangled_name_hash = htab_hash_string (msym->name); } } { @@ -1371,9 +1379,11 @@ minimal_symbol_reader::install () #endif for (minimal_symbol *msym = start; msym < end; ++msym) { + size_t idx = msym - msymbols; symbol_set_names (msym, msym->name, strlen (msym->name), 0, - m_objfile->per_bfd); + m_objfile->per_bfd, + hash_values[idx].mangled_name_hash); } } }); diff --git a/gdb/symtab.c b/gdb/symtab.c index 47da5cf..40cc34b 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -808,7 +808,7 @@ symbol_find_demangled_name (struct general_symbol_info *gsymbol, void symbol_set_names (struct general_symbol_info *gsymbol, const char *linkage_name, int len, bool copy_name, - struct objfile_per_bfd_storage *per_bfd) + struct objfile_per_bfd_storage *per_bfd, hashval_t hash) { struct demangled_name_entry **slot; /* A 0-terminated copy of the linkage name. */ @@ -854,9 +854,11 @@ symbol_set_names (struct general_symbol_info *gsymbol, create_demangled_names_hash (per_bfd); entry.mangled = linkage_name_copy; + if (hash == 0) + 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 diff --git a/gdb/symtab.h b/gdb/symtab.h index 17903df..2814f40 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -502,13 +502,16 @@ extern char *symbol_find_demangled_name (struct general_symbol_info *gsymbol, (symbol)->ginfo.name = (linkage_name) /* Set the linkage and natural names of a symbol, by demangling - the linkage name. */ + the linkage name. Optionally, HASH can be set to the value + of htab_hash_string (linkage_name) (if nullterminated), to + speed up this function. */ #define SYMBOL_SET_NAMES(symbol,linkage_name,len,copy_name,objfile) \ symbol_set_names (&(symbol)->ginfo, linkage_name, len, copy_name, \ (objfile)->per_bfd) extern void symbol_set_names (struct general_symbol_info *symbol, const char *linkage_name, int len, bool copy_name, - struct objfile_per_bfd_storage *per_bfd); + struct objfile_per_bfd_storage *per_bfd, + hashval_t hash = 0); /* 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 |