+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>:
 
       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;
            {
              /* 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);
   /* 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);
 
 #include "registry.h"
 #include "gdb_bfd.h"
 #include "psymtab.h"
+#include <bitset>
 #include <vector>
 #include "common/next-iterator.h"
 #include "common/safe-iterator.h"
   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