From a274da12ea9a4ea8bbb75489845c53be268fb450 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 26 Dec 2022 10:23:32 -0700 Subject: [PATCH] Move cooked_index_storage to cooked-index.h This moves cooked_index_storage to cooked-index.h. This is needed by a subsequent patch. --- gdb/dwarf2/cooked-index.h | 70 ++++++++++++++++++++++++ gdb/dwarf2/read.c | 135 ++++++++++++++-------------------------------- 2 files changed, 111 insertions(+), 94 deletions(-) diff --git a/gdb/dwarf2/cooked-index.h b/gdb/dwarf2/cooked-index.h index 3c6b9c3..63fed35 100644 --- a/gdb/dwarf2/cooked-index.h +++ b/gdb/dwarf2/cooked-index.h @@ -33,6 +33,7 @@ #include "gdbsupport/thread-pool.h" #include "dwarf2/mapped-index.h" #include "dwarf2/tag.h" +#include "dwarf2/abbrev-cache.h" #include "gdbsupport/range-chain.h" struct dwarf2_per_cu_data; @@ -355,6 +356,75 @@ private: gdb::future m_future; }; +class cutu_reader; + +/* An instance of this is created when scanning DWARF to create a + cooked index. */ + +class cooked_index_storage +{ +public: + + cooked_index_storage (); + DISABLE_COPY_AND_ASSIGN (cooked_index_storage); + + /* Return the current abbrev cache. */ + abbrev_cache *get_abbrev_cache () + { + return &m_abbrev_cache; + } + + /* Return the DIE reader corresponding to PER_CU. If no such reader + has been registered, return NULL. */ + cutu_reader *get_reader (dwarf2_per_cu_data *per_cu); + + /* Preserve READER by storing it in the local hash table. */ + cutu_reader *preserve (std::unique_ptr reader); + + /* Add an entry to the index. The arguments describe the entry; see + cooked-index.h. The new entry is returned. */ + const cooked_index_entry *add (sect_offset die_offset, enum dwarf_tag tag, + cooked_index_flag flags, + const char *name, + const cooked_index_entry *parent_entry, + dwarf2_per_cu_data *per_cu) + { + return m_index->add (die_offset, tag, flags, name, parent_entry, per_cu); + } + + /* Install the current addrmap into the shard being constructed, + then transfer ownership of the index to the caller. */ + std::unique_ptr release () + { + m_index->install_addrmap (&m_addrmap); + return std::move (m_index); + } + + /* Return the mutable addrmap that is currently being created. */ + addrmap_mutable *get_addrmap () + { + return &m_addrmap; + } + +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 cache used by this indexer. */ + abbrev_cache m_abbrev_cache; + /* A hash table of cutu_reader objects. */ + htab_up m_reader_hash; + /* The index shard that is being constructed. */ + std::unique_ptr m_index; + + /* A writeable addrmap being constructed by this scanner. */ + addrmap_mutable m_addrmap; +}; + /* The main index of DIEs. The parallel DIE indexers create cooked_index_shard objects. Then, these are all handled to a cooked_index for storage and final indexing. The index is diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 61d8700..eef0b06 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -742,7 +742,6 @@ show_dwarf_max_cache_age (struct ui_file *file, int from_tty, static void dwarf2_find_base_address (struct die_info *die, struct dwarf2_cu *cu); -class cooked_index_storage; static void build_type_psymtabs_reader (cutu_reader *reader, cooked_index_storage *storage); @@ -4418,105 +4417,53 @@ get_type_unit_group (struct dwarf2_cu *cu, const struct attribute *stmt_list) } -/* An instance of this is created when scanning DWARF to create a - cooked index. */ - -class cooked_index_storage +cooked_index_storage::cooked_index_storage () + : m_reader_hash (htab_create_alloc (10, hash_cutu_reader, + eq_cutu_reader, + htab_delete_entry, + xcalloc, xfree)), + m_index (new cooked_index_shard) { -public: - - cooked_index_storage () - : m_reader_hash (htab_create_alloc (10, hash_cutu_reader, - eq_cutu_reader, - htab_delete_entry, - xcalloc, xfree)), - m_index (new cooked_index_shard) - { - } - - DISABLE_COPY_AND_ASSIGN (cooked_index_storage); - - /* Return the current abbrev cache. */ - abbrev_cache *get_abbrev_cache () - { - return &m_abbrev_cache; - } - - /* Return the DIE reader corresponding to PER_CU. If no such reader - has been registered, return NULL. */ - cutu_reader *get_reader (dwarf2_per_cu_data *per_cu) - { - int index = per_cu->index; - return (cutu_reader *) htab_find_with_hash (m_reader_hash.get (), - &index, index); - } - - /* Preserve READER by storing it in the local hash table. */ - cutu_reader *preserve (std::unique_ptr reader) - { - m_abbrev_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; - } - - /* Add an entry to the index. The arguments describe the entry; see - cooked-index.h. The new entry is returned. */ - const cooked_index_entry *add (sect_offset die_offset, enum dwarf_tag tag, - cooked_index_flag flags, - const char *name, - const cooked_index_entry *parent_entry, - dwarf2_per_cu_data *per_cu) - { - return m_index->add (die_offset, tag, flags, name, parent_entry, per_cu); - } - - /* Install the current addrmap into the index shard being constructed, - then transfer ownership of the index to the caller. */ - std::unique_ptr release () - { - m_index->install_addrmap (&m_addrmap); - return std::move (m_index); - } - - /* Return the mutable addrmap that is currently being created. */ - addrmap_mutable *get_addrmap () - { - return &m_addrmap; - } +} -private: +cutu_reader * +cooked_index_storage::get_reader (dwarf2_per_cu_data *per_cu) +{ + int index = per_cu->index; + return (cutu_reader *) htab_find_with_hash (m_reader_hash.get (), + &index, index); +} - /* Hash function for a cutu_reader. */ - static hashval_t hash_cutu_reader (const void *a) - { - const cutu_reader *reader = (const cutu_reader *) a; - return reader->cu->per_cu->index; - } +cutu_reader * +cooked_index_storage::preserve (std::unique_ptr reader) +{ + m_abbrev_cache.add (reader->release_abbrev_table ()); - /* Equality function for cutu_reader. */ - static int eq_cutu_reader (const void *a, const void *b) - { - const cutu_reader *ra = (const cutu_reader *) a; - const int *rb = (const int *) b; - return ra->cu->per_cu->index == *rb; - } + 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; +} - /* The abbrev cache used by this indexer. */ - abbrev_cache m_abbrev_cache; - /* A hash table of cutu_reader objects. */ - htab_up m_reader_hash; - /* The index shard that is being constructed. */ - std::unique_ptr m_index; +/* Hash function for a cutu_reader. */ +hashval_t +cooked_index_storage::hash_cutu_reader (const void *a) +{ + const cutu_reader *reader = (const cutu_reader *) a; + return reader->cu->per_cu->index; +} - /* A writeable addrmap being constructed by this scanner. */ - addrmap_mutable m_addrmap; -}; +/* Equality function for cutu_reader. */ +int +cooked_index_storage::eq_cutu_reader (const void *a, const void *b) +{ + const cutu_reader *ra = (const cutu_reader *) a; + const int *rb = (const int *) b; + return ra->cu->per_cu->index == *rb; +} /* An instance of this is created to index a CU. */ -- 2.7.4