aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@polymtl.ca>2025-03-18 09:48:51 -0400
committerSimon Marchi <simon.marchi@efficios.com>2025-03-18 16:21:29 -0400
commit4ea28692e88cdc4ff5d80f486bfd9ba7a78b5cc7 (patch)
tree5a786ea91d7ad9d09fa277d83998d79d3656101a
parentc08c2adbb03ecd4fa9338932f26143389bf1135e (diff)
downloadbinutils-4ea28692e88cdc4ff5d80f486bfd9ba7a78b5cc7.zip
binutils-4ea28692e88cdc4ff5d80f486bfd9ba7a78b5cc7.tar.gz
binutils-4ea28692e88cdc4ff5d80f486bfd9ba7a78b5cc7.tar.bz2
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>
-rw-r--r--gdb/dwarf2/cooked-index-storage.c56
-rw-r--r--gdb/dwarf2/cooked-index-storage.h26
2 files changed, 53 insertions, 29 deletions
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. */
+
+std::uint64_t
+cooked_index_storage::cutu_reader_hash::operator()
+ (const cutu_reader_up &reader) const noexcept
+{
+ return (*this) (*reader->cu ()->per_cu);
+}
+
+/* See cooked-index-storage.h. */
+
+std::uint64_t
+cooked_index_storage::cutu_reader_hash::operator() (const dwarf2_per_cu &per_cu)
+ const noexcept
+{
+ return per_cu.index;
}
/* See cooked-index-storage.h. */
-hashval_t
-cooked_index_storage::hash_cutu_reader (const void *a)
+bool
+cooked_index_storage::cutu_reader_eq::operator() (const cutu_reader_up &a,
+ const cutu_reader_up &b) const noexcept
{
- const cutu_reader *reader = (const cutu_reader *) a;
- return reader->cu ()->per_cu->index;
+ return (*this) (*a->cu ()->per_cu, b);
}
/* See cooked-index-storage.h. */
-int
-cooked_index_storage::eq_cutu_reader (const void *a, const void *b)
+bool cooked_index_storage::cutu_reader_eq::operator()
+ (const dwarf2_per_cu &per_cu, const cutu_reader_up &reader) 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 == 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 @@ public:
}
private:
+ /* The abbrev table cache used by this indexer. */
+ abbrev_table_cache m_abbrev_table_cache;
/* Hash function for a cutu_reader. */
- static hashval_t hash_cutu_reader (const void *a);
+ 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. */
- static int eq_cutu_reader (const void *a, const void *b);
+ struct cutu_reader_eq
+ {
+ using is_transparent = void;
- /* The abbrev table cache used by this indexer. */
- abbrev_table_cache m_abbrev_table_cache;
+ 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;