Use bitset for demangled_hash_languages

I noticed that objfile_per_bfd_storage::demangled_hash_languages is a
std::vector, which seemed quite large for something that,
fundamentally, can be represented as a bitset.  This patch
reimplements it as a std::bitset.

gdb/ChangeLog
2019-03-15  Tom Tromey  <tom@tromey.com>

	* objfiles.h (struct objfile_per_bfd_storage)
	<demangled_hash_languages>: Now a bitset.
	* minsyms.c (add_minsym_to_demangled_hash_table): Update.
	(lookup_minimal_symbol): Update.
This commit is contained in:
Tom Tromey 2019-03-01 19:55:46 -07:00
parent 3db066bcd5
commit 1b7a07cba0
3 changed files with 21 additions and 11 deletions

View File

@ -1,3 +1,10 @@
2019-03-15 Tom Tromey <tom@tromey.com>
* objfiles.h (struct objfile_per_bfd_storage)
<demangled_hash_languages>: Now a bitset.
* minsyms.c (add_minsym_to_demangled_hash_table): Update.
(lookup_minimal_symbol): Update.
2019-03-15 Tom Tromey <tom@tromey.com> 2019-03-15 Tom Tromey <tom@tromey.com>
* minsyms.h (class minimal_symbol_reader) <record_with_info>: * minsyms.h (class minimal_symbol_reader) <record_with_info>:

View File

@ -160,11 +160,7 @@ add_minsym_to_demangled_hash_table (struct minimal_symbol *sym,
unsigned int hash = search_name_hash (MSYMBOL_LANGUAGE (sym), unsigned int hash = search_name_hash (MSYMBOL_LANGUAGE (sym),
MSYMBOL_SEARCH_NAME (sym)); MSYMBOL_SEARCH_NAME (sym));
auto &vec = objfile->per_bfd->demangled_hash_languages; objfile->per_bfd->demangled_hash_languages.set (MSYMBOL_LANGUAGE (sym));
auto it = std::lower_bound (vec.begin (), vec.end (),
MSYMBOL_LANGUAGE (sym));
if (it == vec.end () || *it != MSYMBOL_LANGUAGE (sym))
vec.insert (it, MSYMBOL_LANGUAGE (sym));
struct minimal_symbol **table struct minimal_symbol **table
= objfile->per_bfd->msymbol_demangled_hash; = objfile->per_bfd->msymbol_demangled_hash;
@ -354,8 +350,12 @@ lookup_minimal_symbol (const char *name, const char *sfile,
{ {
/* Once for each language in the demangled hash names /* Once for each language in the demangled hash names
table (usually just zero or one languages). */ table (usually just zero or one languages). */
for (auto lang : objfile->per_bfd->demangled_hash_languages) for (unsigned iter = 0; iter < nr_languages; ++iter)
{ {
if (!objfile->per_bfd->demangled_hash_languages.test (iter))
continue;
enum language lang = (enum language) iter;
unsigned int hash unsigned int hash
= (lookup_name.search_name_hash (lang) = (lookup_name.search_name_hash (lang)
% MINIMAL_SYMBOL_HASH_SIZE); % MINIMAL_SYMBOL_HASH_SIZE);
@ -497,8 +497,12 @@ iterate_over_minimal_symbols
/* The second pass is over the demangled table. Once for each /* The second pass is over the demangled table. Once for each
language in the demangled hash names table (usually just zero or language in the demangled hash names table (usually just zero or
one). */ one). */
for (auto lang : objf->per_bfd->demangled_hash_languages) for (unsigned liter = 0; liter < nr_languages; ++liter)
{ {
if (!objf->per_bfd->demangled_hash_languages.test (liter))
continue;
enum language lang = (enum language) liter;
const language_defn *lang_def = language_def (lang); const language_defn *lang_def = language_def (lang);
symbol_name_matcher_ftype *name_match symbol_name_matcher_ftype *name_match
= get_symbol_name_matcher (lang_def, lookup_name); = get_symbol_name_matcher (lang_def, lookup_name);

View File

@ -28,6 +28,7 @@
#include "registry.h" #include "registry.h"
#include "gdb_bfd.h" #include "gdb_bfd.h"
#include "psymtab.h" #include "psymtab.h"
#include <bitset>
#include <vector> #include <vector>
#include "common/next-iterator.h" #include "common/next-iterator.h"
#include "common/safe-iterator.h" #include "common/safe-iterator.h"
@ -313,10 +314,8 @@ struct objfile_per_bfd_storage
minimal_symbol *msymbol_demangled_hash[MINIMAL_SYMBOL_HASH_SIZE] {}; minimal_symbol *msymbol_demangled_hash[MINIMAL_SYMBOL_HASH_SIZE] {};
/* All the different languages of symbols found in the demangled /* All the different languages of symbols found in the demangled
hash table. A flat/vector-based map is more efficient than a map hash table. */
or hash table here, since this will only usually contain zero or std::bitset<nr_languages> demangled_hash_languages;
one entries. */
std::vector<enum language> demangled_hash_languages;
}; };
/* Master structure for keeping track of each file from which /* Master structure for keeping track of each file from which