/* DWARF index storage Copyright (C) 2022-2025 Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef GDB_DWARF2_COOKED_INDEX_STORAGE_H #define GDB_DWARF2_COOKED_INDEX_STORAGE_H #include "dwarf2/abbrev-table-cache.h" #include "dwarf2/cooked-index.h" #include "dwarf2/types.h" struct cutu_reader; struct dwarf2_per_cu; using cutu_reader_up = std::unique_ptr; /* 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 table_cache. */ const abbrev_table_cache &get_abbrev_table_cache () const { return m_abbrev_table_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 *per_cu); /* Preserve READER by storing it in the local hash table. */ cutu_reader *preserve (cutu_reader_up reader); /* Add an entry to the index. The arguments describe the entry; see cooked-index.h. The new entry is returned. */ cooked_index_entry *add (sect_offset die_offset, enum dwarf_tag tag, cooked_index_flag flags, const char *name, cooked_index_entry_ref parent_entry, dwarf2_per_cu *per_cu) { return m_shard->add (die_offset, tag, flags, per_cu->lang (), name, parent_entry, per_cu); } /* Install the current addrmap into the shard being constructed, then transfer ownership of the index to the caller. */ cooked_index_shard_up release () { m_shard->install_addrmap (&m_addrmap); return std::move (m_shard); } /* Return the mutable addrmap that is currently being created. */ addrmap_mutable *get_addrmap () { return &m_addrmap; } /* Return the parent_map that is currently being created. */ parent_map *get_parent_map () { return &m_parent_map; } /* Return the parent_map that is currently being created. Ownership is passed to the caller. */ parent_map release_parent_map () { return std::move (m_parent_map); } private: /* 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. */ gdb::unordered_set m_reader_hash; /* The index shard that is being constructed. */ cooked_index_shard_up m_shard; /* Parent map for each CU that is read. */ parent_map m_parent_map; /* A writeable addrmap being constructed by this scanner. */ addrmap_mutable m_addrmap; }; #endif /* GDB_DWARF2_COOKED_INDEX_STORAGE_H */