forked from Imagelibrary/binutils-gdb
I accidentally pushed my work-in-progress branch... revert that. Sorry
for the noise :(.
The list of commits reverted are:
ae2a50a9ae attempt to revamp to the CU/TU list
e9386435c9 gdb/dwarf: print DWARF CUs/TUs in "maint print objfiles"
6cbd64aa3e gdb/dwarf: add dwarf_source_language_name
32a187da76 libiberty: move DW_LANG_* definitions to dwarf2.def
b3fa38aef5 gdb/dwarf: move index unit vectors to debug names reader and use them
30ba744189 gdb/dwarf: track comp and type units count
bedb4e09f2 gdb/dwarf: remove unnecessary braces
b4f18de12c gdb/dwarf: use ranged for loop in some pots
Change-Id: I80aed2847025f5b15c16c997680783b39858a703
121 lines
4.2 KiB
C++
121 lines
4.2 KiB
C++
/* 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 <http://www.gnu.org/licenses/>. */
|
|
|
|
#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 <variant>
|
|
|
|
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,
|
|
dwarf2_per_objfile *per_objfile,
|
|
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<const cooked_index_entry *,
|
|
parent_map::addr_type> 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<const cooked_index_entry *,
|
|
parent_map::addr_type> 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 */
|