/* DWARF indexer 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_INDEXER_H #define GDB_DWARF2_COOKED_INDEXER_H #include "dwarf2/cooked-index.h" #include "dwarf2/parent-map.h" #include "dwarf2/types.h" #include struct abbrev_info; struct cooked_index_storage; struct cutu_reader; struct dwarf2_per_cu; struct dwarf2_per_objfile; /* An instance of this is created to index a CU. */ class cooked_indexer { public: cooked_indexer (cooked_index_storage *storage, dwarf2_per_cu *per_cu, enum language language); DISABLE_COPY_AND_ASSIGN (cooked_indexer); /* Index the given CU. */ void make_index (cutu_reader *reader); private: /* A helper function to scan the PC bounds of READER and record them in the storage's addrmap. */ void check_bounds (cutu_reader *reader); /* Ensure that the indicated CU exists. The cutu_reader for it is returned. FOR_SCANNING is true if the caller intends to scan all the DIEs in the CU; when false, this use is assumed to be to look up just a single DIE. */ cutu_reader *ensure_cu_exists (cutu_reader *reader, sect_offset sect_off, bool is_dwz, bool for_scanning); /* Index DIEs in the READER starting at INFO_PTR. PARENT is the entry for the enclosing scope (nullptr at top level). FULLY is true when a full scan must be done -- in some languages, function scopes must be fully explored in order to find nested functions. This returns a pointer to just after the spot where reading stopped. */ const gdb_byte *index_dies (cutu_reader *reader, const gdb_byte *info_ptr, std::variant parent, bool fully); /* Scan the attributes for a given DIE and update the out parameters. Returns a pointer to the byte after the DIE. */ const gdb_byte *scan_attributes (dwarf2_per_cu *scanning_per_cu, cutu_reader *reader, const gdb_byte *watermark_ptr, const gdb_byte *info_ptr, const abbrev_info *abbrev, const char **name, const char **linkage_name, cooked_index_flag *flags, sect_offset *sibling_offset, const cooked_index_entry **parent_entry, parent_map::addr_type *maybe_defer, bool *is_enum_class, bool for_specification); /* Handle DW_TAG_imported_unit, by scanning the DIE to find DW_AT_import, and then scanning the referenced CU. Returns a pointer to the byte after the DIE. */ const gdb_byte *index_imported_unit (cutu_reader *reader, const gdb_byte *info_ptr, const abbrev_info *abbrev); /* Recursively read DIEs, recording the section offsets in m_die_range_map and then calling index_dies. */ const gdb_byte *recurse (cutu_reader *reader, const gdb_byte *info_ptr, std::variant parent_entry, bool fully); /* The storage object, where the results are kept. */ cooked_index_storage *m_index_storage; /* The CU that we are reading on behalf of. This object might be asked to index one CU but to treat the results as if they come from some including CU; in this case the including CU would be recorded here. */ dwarf2_per_cu *m_per_cu; /* The language that we're assuming when reading. */ enum language m_language; /* Map from DIE ranges to newly-created entries. */ parent_map *m_die_range_map; }; #endif /* GDB_DWARF2_COOKED_INDEXER_H */