gdb/dwarf: use gdb::unordered_set for cooked_index_storage::m_reader_hash Replace an htab with gdb::unordered_set. I think we could also use the dwarf2_per_cu pointer itself as the identity, basically have the functional equivalent of: gdb::unordered_map<dwarf2_per_cu *, cutu_reader_up> But I kept the existing behavior of using dwarf2_per_cu::index as the identity. Change-Id: Ief3df9a71ac26ca7c07a7b79ca0c26c9d031c11d Approved-By: Tom Tromey <tom@tromey.com>
diff --git a/gdb/dwarf2/cooked-index-storage.c b/gdb/dwarf2/cooked-index-storage.c index 820989e..9c05cf5 100644 --- a/gdb/dwarf2/cooked-index-storage.c +++ b/gdb/dwarf2/cooked-index-storage.c
@@ -22,11 +22,7 @@ /* See cooked-index-storage.h. */ cooked_index_storage::cooked_index_storage () - : m_reader_hash (htab_create_alloc (10, hash_cutu_reader, - eq_cutu_reader, - htab_delete_entry<cutu_reader>, - xcalloc, xfree)), - m_shard (new cooked_index_shard) + : m_shard (new cooked_index_shard) { } @@ -35,9 +31,8 @@ cooked_index_storage::cooked_index_storage () cutu_reader * cooked_index_storage::get_reader (dwarf2_per_cu *per_cu) { - int index = per_cu->index; - return (cutu_reader *) htab_find_with_hash (m_reader_hash.get (), - &index, index); + auto it = m_reader_hash.find (*per_cu); + return it != m_reader_hash.end () ? it->get () : nullptr; } /* See cooked-index-storage.h. */ @@ -47,30 +42,43 @@ cooked_index_storage::preserve (cutu_reader_up reader) { m_abbrev_table_cache.add (reader->release_abbrev_table ()); - int index = reader->cu ()->per_cu->index; - void **slot = htab_find_slot_with_hash (m_reader_hash.get (), &index, - index, INSERT); - gdb_assert (*slot == nullptr); - cutu_reader *result = reader.get (); - *slot = reader.release (); - return result; + auto [it, inserted] = m_reader_hash.insert (std::move (reader)); + gdb_assert (inserted); + + return it->get(); } /* See cooked-index-storage.h. */ -hashval_t -cooked_index_storage::hash_cutu_reader (const void *a) +std::uint64_t +cooked_index_storage::cutu_reader_hash::operator() + (const cutu_reader_up &reader) const noexcept { - const cutu_reader *reader = (const cutu_reader *) a; - return reader->cu ()->per_cu->index; + return (*this) (*reader->cu ()->per_cu); } /* See cooked-index-storage.h. */ -int -cooked_index_storage::eq_cutu_reader (const void *a, const void *b) +std::uint64_t +cooked_index_storage::cutu_reader_hash::operator() (const dwarf2_per_cu &per_cu) + const noexcept { - const cutu_reader *ra = (const cutu_reader *) a; - const int *rb = (const int *) b; - return ra->cu ()->per_cu->index == *rb; + return per_cu.index; +} + +/* See cooked-index-storage.h. */ + +bool +cooked_index_storage::cutu_reader_eq::operator() (const cutu_reader_up &a, + const cutu_reader_up &b) const noexcept +{ + return (*this) (*a->cu ()->per_cu, b); +} + +/* See cooked-index-storage.h. */ + +bool cooked_index_storage::cutu_reader_eq::operator() + (const dwarf2_per_cu &per_cu, const cutu_reader_up &reader) const noexcept +{ + return per_cu.index == reader->cu ()->per_cu->index; }
diff --git a/gdb/dwarf2/cooked-index-storage.h b/gdb/dwarf2/cooked-index-storage.h index 3d0b5b2..449fbe1 100644 --- a/gdb/dwarf2/cooked-index-storage.h +++ b/gdb/dwarf2/cooked-index-storage.h
@@ -90,18 +90,34 @@ class cooked_index_storage } private: - - /* Hash function for a cutu_reader. */ - static hashval_t hash_cutu_reader (const void *a); - - /* Equality function for cutu_reader. */ - static int eq_cutu_reader (const void *a, const void *b); - /* The abbrev table cache used by this indexer. */ abbrev_table_cache m_abbrev_table_cache; + /* Hash function for a cutu_reader. */ + struct cutu_reader_hash + { + using is_transparent = void; + + std::uint64_t operator() (const cutu_reader_up &reader) const noexcept; + std::uint64_t operator() (const dwarf2_per_cu &per_cu) const noexcept; + }; + + /* Equality function for cutu_reader. */ + struct cutu_reader_eq + { + using is_transparent = void; + + bool operator() (const cutu_reader_up &a, + const cutu_reader_up &b) const noexcept; + + bool operator() (const dwarf2_per_cu &per_cu, + const cutu_reader_up &reader) const noexcept; + }; + /* A hash table of cutu_reader objects. */ - htab_up m_reader_hash; + gdb::unordered_set<cutu_reader_up, cutu_reader_hash, cutu_reader_eq> + m_reader_hash; + /* The index shard that is being constructed. */ cooked_index_shard_up m_shard;