mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-03-25 14:01:00 +08:00
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>
This commit is contained in:
parent
c08c2adbb0
commit
4ea28692e8
@ -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;
|
||||
}
|
||||
|
@ -90,18 +90,34 @@ public:
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user