[2/9] Introduce and use language_set
Commit Message
John> Hmm, did you consider using std::bitset<nr_languages> for langauge_set? You'd
John> still have to write your own iterator class, so it wouldn't save much in terms
John> of lines of code.
In this case, because there are just two spots that iterate over this
set, and because we'd need to introduce somewhat ugly casts back to
"enum language" anyway, it seemed just as good to not write an iterator
and just do this in a simpler way.
Tom
commit d52ac096d7ae33144eb3a691a78e061d32833444
Author: Tom Tromey <tom@tromey.com>
Date: Fri Mar 1 19:55:46 2019 -0700
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-08 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.
Comments
On 3/8/19 2:43 PM, Tom Tromey wrote:
> John> Hmm, did you consider using std::bitset<nr_languages> for langauge_set? You'd
> John> still have to write your own iterator class, so it wouldn't save much in terms
> John> of lines of code.
>
> In this case, because there are just two spots that iterate over this
> set, and because we'd need to introduce somewhat ugly casts back to
> "enum language" anyway, it seemed just as good to not write an iterator
> and just do this in a simpler way.
Looks good to me.
@@ -1,3 +1,10 @@
+2019-03-08 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-07 Tom Tromey <tom@tromey.com>
* minsyms.h (class minimal_symbol_reader) <record_with_info>:
@@ -160,11 +160,7 @@ add_minsym_to_demangled_hash_table (struct minimal_symbol *sym,
unsigned int hash = search_name_hash (MSYMBOL_LANGUAGE (sym),
MSYMBOL_SEARCH_NAME (sym));
- auto &vec = objfile->per_bfd->demangled_hash_languages;
- 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));
+ objfile->per_bfd->demangled_hash_languages.set (MSYMBOL_LANGUAGE (sym));
struct minimal_symbol **table
= 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
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
= (lookup_name.search_name_hash (lang)
% MINIMAL_SYMBOL_HASH_SIZE);
@@ -497,8 +497,12 @@ iterate_over_minimal_symbols
/* The second pass is over the demangled table. Once for each
language in the demangled hash names table (usually just zero or
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);
symbol_name_matcher_ftype *name_match
= get_symbol_name_matcher (lang_def, lookup_name);
@@ -28,6 +28,7 @@
#include "registry.h"
#include "gdb_bfd.h"
#include "psymtab.h"
+#include <bitset>
#include <vector>
#include "common/next-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] {};
/* All the different languages of symbols found in the demangled
- hash table. A flat/vector-based map is more efficient than a map
- or hash table here, since this will only usually contain zero or
- one entries. */
- std::vector<enum language> demangled_hash_languages;
+ hash table. */
+ std::bitset<nr_languages> demangled_hash_languages;
};
/* Master structure for keeping track of each file from which