Use bitset for demangled_hash_languages
authorTom Tromey <tom@tromey.com>
Sat, 2 Mar 2019 02:55:46 +0000 (19:55 -0700)
committerTom Tromey <tom@tromey.com>
Fri, 15 Mar 2019 22:02:08 +0000 (16:02 -0600)
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.

gdb/ChangeLog
gdb/minsyms.c
gdb/objfiles.h

index 2d6d895bf671bd9f04263f77235ff031281ffc75..867df1788399145bb4520c9942bcfe1a5e3c957f 100644 (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>
 
        * minsyms.h (class minimal_symbol_reader) <record_with_info>:
index 0513cfe69f42fef43ef605a61cf59c84dbb7fabe..cbb45f141c98543acdfe74f02027ad62072b38f1 100644 (file)
@@ -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);
index c5ce9eec95546fc9d815b20601e8a8de81a3aada..47df0023dcc08c80227926d37321ff2f214780eb 100644 (file)
@@ -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
This page took 0.029338 seconds and 4 git commands to generate.