10#include "clang/Basic/ABI.h"
11#include "llvm/ADT/STLExtras.h"
12#include "llvm/ADT/SmallPtrSet.h"
13#include "llvm/ADT/StringExtras.h"
14#include "llvm/ADT/StringRef.h"
15#include "llvm/DebugInfo/DWARF/DWARFAddressRange.h"
16#include "llvm/DebugInfo/DWARF/DWARFDebugLoc.h"
17#include "llvm/Support/Casting.h"
18#include "llvm/Support/Error.h"
19#include "llvm/Support/ErrorExtras.h"
20#include "llvm/Support/FileUtilities.h"
21#include "llvm/Support/FormatAdapters.h"
22#include "llvm/Support/Threading.h"
43#include "lldb/Host/Config.h"
87#include "llvm/DebugInfo/DWARF/DWARFContext.h"
88#include "llvm/DebugInfo/DWARF/DWARFDebugAbbrev.h"
89#include "llvm/Demangle/Demangle.h"
90#include "llvm/Support/FileSystem.h"
91#include "llvm/Support/FormatVariadic.h"
103#ifdef ENABLE_DEBUG_PRINTF
105#define DEBUG_PRINTF(fmt, ...) printf(fmt, __VA_ARGS__)
107#define DEBUG_PRINTF(fmt, ...)
113using namespace llvm::dwarf;
121#define LLDB_PROPERTIES_symbolfiledwarf
122#include "SymbolFileDWARFProperties.inc"
125#define LLDB_PROPERTIES_symbolfiledwarf
126#include "SymbolFileDWARFPropertiesEnum.inc"
131 static llvm::StringRef GetSettingName() {
136 m_collection_sp = std::make_shared<OptionValueProperties>(GetSettingName());
137 m_collection_sp->Initialize(g_symbolfiledwarf_properties_def);
140 bool IgnoreFileIndexes()
const {
141 return GetPropertyAtIndexAs<bool>(ePropertyIgnoreIndexes,
false);
148 return Tag == llvm::dwarf::Tag::DW_TAG_class_type ||
149 Tag == llvm::dwarf::Tag::DW_TAG_structure_type;
153 static PluginProperties g_settings;
157static const llvm::DWARFDebugLine::LineTable *
163 llvm::DWARFContext &ctx = context.
GetAsLLVM();
164 llvm::Expected<const llvm::DWARFDebugLine::LineTable *> line_table =
165 line.getOrParseLineTable(
166 data, line_offset, ctx,
nullptr, [&](llvm::Error e) {
169 "SymbolFileDWARF::ParseLineTable failed to parse: {0}");
174 "SymbolFileDWARF::ParseLineTable failed to parse: {0}");
181 llvm::DWARFDebugLine::Prologue &prologue,
187 llvm::DWARFContext &ctx = context.
GetAsLLVM();
188 uint64_t offset = line_offset;
189 llvm::Error
error = prologue.parse(
194 "SymbolFileDWARF::ParseSupportFiles failed to parse "
195 "line table prologue: {0}");
200 "SymbolFileDWARF::ParseSupportFiles failed to parse line "
201 "table prologue: {0}");
207static std::optional<std::string>
211 std::string abs_path;
212 auto absolute = llvm::DILineInfoSpecifier::FileLineInfoKind::AbsoluteFilePath;
213 if (prologue.getFileNameByIndex(idx, compile_dir, absolute, abs_path, style))
214 return std::move(abs_path);
217 std::string rel_path;
218 auto relative = llvm::DILineInfoSpecifier::FileLineInfoKind::RawValue;
219 if (!prologue.getFileNameByIndex(idx, compile_dir, relative, rel_path, style))
221 return std::move(rel_path);
227 llvm::StringRef compile_dir = {}) {
230 if (prologue.FileNames.empty())
234 const bool is_one_based = prologue.getVersion() < 5;
235 const size_t file_names = prologue.FileNames.size();
236 const size_t first_file_idx = is_one_based ? 1 : 0;
237 const size_t last_file_idx = is_one_based ? file_names : file_names - 1;
244 for (
size_t idx = first_file_idx; idx <= last_file_idx; ++idx) {
245 std::string remapped_file;
246 if (
auto file_path =
GetFileByIndex(prologue, idx, compile_dir, style)) {
247 auto entry = prologue.getFileNameEntry(idx);
248 auto source = entry.Source.getAsCString();
250 consumeError(source.takeError());
252 llvm::StringRef source_ref(*source);
253 if (!source_ref.empty()) {
257 LazyDWARFSourceFile(
const FileSpec &fs, llvm::StringRef source,
258 FileSpec::Style style)
259 : SupportFile(fs), source(source), style(style) {}
262 llvm::StringRef source;
264 std::unique_ptr<llvm::FileRemover> remover;
265 FileSpec::Style style;
271 llvm::SmallString<0> name;
274 auto ec = llvm::sys::fs::createTemporaryFile(
275 "", llvm::sys::path::filename(orig_name, style), fd, name);
278 "Could not create temporary file");
281 remover = std::make_unique<llvm::FileRemover>(name);
283 size_t num_bytes = source.size();
284 file.Write(source.data(), num_bytes);
289 support_files.
Append(std::make_unique<LazyDWARFSourceFile>(
290 FileSpec(*file_path), *source, style));
294 if (
auto remapped = module->RemapSourceFile(llvm::StringRef(*file_path)))
295 remapped_file = *remapped;
297 remapped_file = std::move(*file_path);
301 if (prologue.ContentTypes.HasMD5) {
302 const llvm::DWARFDebugLine::FileNameEntry &file_name_entry =
303 prologue.getFileNameEntry(idx);
304 checksum = file_name_entry.
Checksum;
322 debugger, PluginProperties::GetSettingName())) {
323 const bool is_global_setting =
true;
326 "Properties for the dwarf symbol-file plug-in.", is_global_setting);
337 return "DWARF and DWARF3 debug symbol file reader.";
341 return LLDB_DWO_DIAGNOSTIC_SUFFIX;
345 if (objfile_sp->GetArchitecture().GetTriple().isWasm())
355 return debug_map_symfile->GetTypeList();
364 if (die_offset >= max_die_offset)
367 if (die_offset >= min_die_offset) {
370 bool add_type =
false;
373 case DW_TAG_array_type:
374 add_type = (type_mask & eTypeClassArray) != 0;
376 case DW_TAG_unspecified_type:
377 case DW_TAG_base_type:
378 add_type = (type_mask & eTypeClassBuiltin) != 0;
380 case DW_TAG_class_type:
381 add_type = (type_mask & eTypeClassClass) != 0;
383 case DW_TAG_structure_type:
384 add_type = (type_mask & eTypeClassStruct) != 0;
386 case DW_TAG_union_type:
387 add_type = (type_mask & eTypeClassUnion) != 0;
389 case DW_TAG_enumeration_type:
390 add_type = (type_mask & eTypeClassEnumeration) != 0;
392 case DW_TAG_subroutine_type:
393 case DW_TAG_subprogram:
394 case DW_TAG_inlined_subroutine:
395 add_type = (type_mask & eTypeClassFunction) != 0;
397 case DW_TAG_pointer_type:
398 add_type = (type_mask & eTypeClassPointer) != 0;
400 case DW_TAG_rvalue_reference_type:
401 case DW_TAG_reference_type:
402 add_type = (type_mask & eTypeClassReference) != 0;
405 add_type = (type_mask & eTypeClassTypedef) != 0;
407 case DW_TAG_ptr_to_member_type:
408 add_type = (type_mask & eTypeClassMemberPointer) != 0;
415 const bool assert_not_being_parsed =
true;
418 type_set.insert(type);
423 GetTypes(child_die, min_die_offset, max_die_offset, type_mask, type_set);
429 TypeClass type_mask,
TypeList &type_list)
442 unit = &unit->GetNonSkeletonUnit();
443 GetTypes(unit->DIE(), unit->GetOffset(), unit->GetNextUnitOffset(),
444 type_mask, type_set);
451 for (
size_t cu_idx = 0; cu_idx < num_cus; ++cu_idx)
455 std::set<CompilerType> compiler_type_set;
456 for (
Type *type : type_set) {
457 CompilerType compiler_type = type->GetForwardCompilerType();
458 if (compiler_type_set.find(compiler_type) == compiler_type_set.end()) {
459 compiler_type_set.insert(compiler_type);
460 type_list.
Insert(type->shared_from_this());
474 case DW_TAG_compile_unit:
475 case DW_TAG_partial_unit:
476 case DW_TAG_subprogram:
477 case DW_TAG_inlined_subroutine:
478 case DW_TAG_lexical_block:
497 static ConstString g_dwarf_section_name(
"__DWARF");
498 return g_dwarf_section_name;
501llvm::DenseMap<const DWARFDebugInfoEntry *, Type *> &
504 return debug_map_symfile->GetDIEToType();
508llvm::DenseMap<lldb::opaque_compiler_type_t, DIERef> &
511 return debug_map_symfile->GetForwardDeclCompilerTypeToDIE();
517 if (debug_map_symfile)
523llvm::Expected<lldb::TypeSystemSP>
526 return debug_map_symfile->GetTypeSystemForLanguage(language);
549 *
GetObjectFile()->GetModule(), apple_names, apple_namespaces,
550 apple_types, apple_objc,
m_context.getOrLoadStrData());
560 llvm::Expected<std::unique_ptr<DebugNamesDWARFIndex>> index_or =
565 m_index = std::move(*index_or);
569 "Unable to read .debug_names data: {0}");
574 std::make_unique<ManualDWARFIndex>(*
GetObjectFile()->GetModule(), *
this);
586 for (
SectionSP section_sp : section_list) {
587 if (section_sp->GetChildren().GetSize() > 0) {
597 return version >= 2 && version <= 5;
600static std::set<dw_form_t>
605 std::set<dw_form_t> unsupported_forms;
606 for (
const auto &[_, decl_set] : *debug_abbrev)
607 for (
const auto &decl : decl_set)
608 for (
const auto &attr : decl.attributes())
610 unsupported_forms.insert(attr.Form);
612 return unsupported_forms;
616 uint32_t abilities = 0;
618 const Section *section =
nullptr;
620 if (section_list ==
nullptr)
623 uint64_t debug_abbrev_file_size = 0;
624 uint64_t debug_info_file_size = 0;
625 uint64_t debug_line_file_size = 0;
634 if (section !=
nullptr) {
645 if (!unsupported_forms.empty()) {
647 error.Printf(
"unsupported DW_FORM value%s:",
648 unsupported_forms.size() > 1 ?
"s" :
"");
649 for (
auto form : unsupported_forms)
650 error.Printf(
" %#x", form);
661 llvm::StringRef symfile_dir =
m_objfile_sp->GetFileSpec().GetDirectory();
662 if (symfile_dir.contains_insensitive(
".dsym")) {
673 "empty dSYM file detected, dSYM was created with an "
674 "executable with no debug info");
681 if (debug_info_file_size >= MaxDebugInfoSize) {
683 "SymbolFileDWARF can't load this DWARF. It's larger then {0:x+16}",
688 if (debug_abbrev_file_size > 0 && debug_info_file_size > 0)
692 if (debug_line_file_size > 0)
701 const SectionList *section_list = module_sp->GetSectionList();
723 std::make_unique<llvm::DWARFDebugAbbrev>(debug_abbrev_data.
GetAsLLVM());
724 llvm::Error
error = abbr->parse();
728 "Unable to read .debug_abbrev section: {0}");
755 return llvm::cast_or_null<DWARFCompileUnit>(dwarf_cu);
769 if (
auto remapped_file = module_sp->RemapSourceFile(file_spec.
GetPath()))
770 file_spec.
SetFile(*remapped_file, FileSpec::Style::native);
776 const char *dwo_name =
789 cu_sp = comp_unit->shared_from_this();
802 cu_sp = std::make_shared<CompileUnit>(
803 module_sp, &dwarf_cu, support_file_nsp,
812 auto lazy_initialize_cu = [&]() {
834 if (support_files.
GetSize() == 0)
841 if (!lazy_initialize_cu()) {
855 initialize_cu(std::make_shared<SupportFile>(cu_file_spec),
874 for (uint32_t i = 0, num = info.
GetNumUnits(); i < num; ++i) {
875 if (
auto *cu = llvm::dyn_cast<DWARFCompileUnit>(info.
GetUnitAtIndex(i))) {
900 if (
auto *dwarf_cu = llvm::cast_or_null<DWARFCompileUnit>(
915 if (
auto err = type_system_or_err.takeError()) {
916 LLDB_LOG_ERROR(log, std::move(err),
"Unable to parse function: {0}");
919 auto ts = *type_system_or_err;
928 if (llvm::Expected<llvm::DWARFAddressRangesVector> die_ranges =
929 die.
GetDIE()->GetAttributeAddressRanges(die.
GetCU(),
931 for (
const auto &range : *die_ranges) {
937 if (
Address base_addr(range.LowPC, module_sp->GetSectionList());
939 ranges.emplace_back(std::move(base_addr), range.HighPC - range.LowPC);
959 if (
auto err = type_system_or_err.takeError()) {
961 "Unable to construct demangled name for function: {0}");
965 auto ts = *type_system_or_err;
979 if (debug_map_symfile)
986 if (debug_map_symfile) {
1012 llvm::StringRef sysroot =
1017 if (!sysroot.starts_with(
"/Library/Developer/CommandLineTools/SDKs")) {
1024 module_sp->RegisterXcodeSDK(sdk, sysroot);
1027 if (local_module_sp && local_module_sp != module_sp)
1028 local_module_sp->RegisterXcodeSDK(sdk, sysroot);
1041 size_t functions_added = 0;
1044 if (entry.Tag() != DW_TAG_subprogram)
1054 return functions_added;
1059 llvm::DenseSet<lldb_private::SymbolFile *> &visited_symbol_files,
1060 llvm::function_ref<
bool(
Module &)> lambda) {
1062 if (!visited_symbol_files.insert(
this).second)
1072 if (lambda(*module))
1075 for (std::size_t i = 0; i < module->GetNumCompileUnits(); ++i) {
1076 auto cu =
module->GetCompileUnitAtIndex(i);
1077 bool early_exit = cu->ForEachExternalModule(visited_symbol_files, lambda);
1107 llvm::DWARFDebugLine::Prologue prologue;
1119 if (
auto *dwarf_cu = llvm::dyn_cast<DWARFCompileUnit>(&unit)) {
1121 return lldb_cu->GetSupportFiles().GetFileSpecAtIndex(file_idx);
1125 auto &tu = llvm::cast<DWARFTypeUnit>(unit);
1142 std::unique_ptr<SupportFileList> &list = iter_bool.first->second;
1143 if (iter_bool.second) {
1144 list = std::make_unique<SupportFileList>();
1145 uint64_t line_table_offset = offset;
1146 llvm::DWARFDataExtractor data =
1147 m_context.getOrLoadLineData().GetAsLLVMDWARF();
1148 llvm::DWARFContext &ctx =
m_context.GetAsLLVM();
1149 llvm::DWARFDebugLine::Prologue prologue;
1150 auto report = [](llvm::Error
error) {
1153 "SymbolFileDWARF::GetTypeUnitSupportFiles failed to parse "
1154 "the line table prologue: {0}");
1157 llvm::Error
error = prologue.parse(data, &line_table_offset, report, ctx);
1159 report(std::move(
error));
1177 std::vector<SourceModule> &imported_modules) {
1193 if (child_die.Tag() != DW_TAG_imported_declaration)
1196 DWARFDIE module_die = child_die.GetReferencedDIE(DW_AT_import);
1197 if (module_die.
Tag() != DW_TAG_module)
1200 if (
const char *name =
1203 module.path.push_back(ConstString(name));
1206 DW_AT_LLVM_include_path,
nullptr);
1208 while ((parent_die = parent_die.
GetParent())) {
1209 if (parent_die.
Tag() != DW_TAG_module)
1211 if (
const char *name =
1213 module.path.push_back(ConstString(name));
1220 DW_AT_LLVM_include_path,
nullptr);
1222 std::reverse(module.
path.begin(), module.
path.end());
1227 module.search_path = ConstString(include_spec.GetPath());
1230 DW_AT_LLVM_sysroot,
nullptr))
1231 module.sysroot = ConstString(sysroot);
1232 imported_modules.push_back(module);
1252 llvm::DWARFDebugLine line;
1253 const llvm::DWARFDebugLine::LineTable *line_table =
1262 std::vector<LineTable::Sequence> sequences;
1265 for (
const llvm::DWARFDebugLine::Sequence &seq : line_table->Sequences) {
1273 for (
unsigned idx = seq.FirstRowIndex; idx < seq.LastRowIndex; ++idx) {
1274 const llvm::DWARFDebugLine::Row &row = line_table->Rows[idx];
1276 sequence, row.Address.Address, row.Line, row.Column, row.File,
1277 row.IsStmt, row.BasicBlock, row.PrologueEnd, row.EpilogueBegin,
1280 sequences.push_back(std::move(sequence));
1283 std::unique_ptr<LineTable> line_table_up =
1284 std::make_unique<LineTable>(&comp_unit, std::move(sequences));
1291 debug_map_symfile->LinkOSOLineTable(
this, line_table_up.get()));
1303 return iter->second;
1317 offset,
this, debug_macros_sp);
1319 return debug_macros_sp;
1326 if (dwarf_cu ==
nullptr)
1348 addr_t function_file_addr) {
1349 size_t blocks_added = 0;
1353 if (tag != DW_TAG_inlined_subroutine && tag != DW_TAG_lexical_block)
1357 llvm::DWARFAddressRangesVector ranges;
1358 const char *name =
nullptr;
1359 const char *mangled_name =
nullptr;
1361 std::optional<int> decl_file;
1362 std::optional<int> decl_line;
1363 std::optional<int> decl_column;
1364 std::optional<int> call_file;
1365 std::optional<int> call_line;
1366 std::optional<int> call_column;
1368 decl_line, decl_column, call_file, call_line,
1369 call_column,
nullptr)) {
1370 for (
const llvm::DWARFAddressRange &range : ranges) {
1373 range.HighPC - range.LowPC));
1377 if (tag != DW_TAG_subprogram &&
1378 (name !=
nullptr || mangled_name !=
nullptr)) {
1379 std::unique_ptr<Declaration> decl_up;
1380 if (decl_file || decl_line || decl_column)
1381 decl_up = std::make_unique<Declaration>(
1383 decl_file.value_or(0)),
1384 decl_line.value_or(0), decl_column.value_or(0));
1386 std::unique_ptr<Declaration> call_up;
1387 if (call_file || call_line || call_column)
1388 call_up = std::make_unique<Declaration>(
1390 call_file.value_or(0)),
1391 call_line.value_or(0), call_column.value_or(0));
1405 return blocks_added;
1412 bool check_virtuality =
false;
1414 case DW_TAG_inheritance:
1415 case DW_TAG_subprogram:
1416 check_virtuality =
true;
1421 if (check_virtuality) {
1422 if (die.GetAttributeValueAsUnsigned(DW_AT_virtuality, 0) != 0)
1432 if (type_system !=
nullptr)
1476std::vector<CompilerContext>
1483 return die.GetDeclContext();
1493 return type_die.ResolveType();
1504 return std::nullopt;
1512 bool assert_not_being_parsed) {
1518 "SymbolFileDWARF::ResolveTypeUID (die = {0:x16}) {1} ({2}) '{3}'",
1528 switch (decl_ctx_die.
Tag()) {
1529 case DW_TAG_structure_type:
1530 case DW_TAG_union_type:
1531 case DW_TAG_class_type: {
1536 "SymbolFileDWARF::ResolveTypeUID (die = {0:x16}) {1} ({2}) "
1537 "'{3}' resolve parent forward type for {4:x16})",
1564 if (!clang_type_system)
1567 llvm::cast<DWARFASTParserClang>(clang_type_system->GetDWARFParser());
1568 return ast_parser->GetClangASTImporter().CanImport(compiler_type);
1574 if (clang_type_system) {
1576 llvm::cast<DWARFASTParserClang>(clang_type_system->GetDWARFParser());
1578 ast_parser->GetClangASTImporter().CanImport(compiler_type))
1579 return ast_parser->GetClangASTImporter().CompleteType(compiler_type);
1600 if (debug_map_symfile) {
1618 if (decl_die != def_die) {
1620 auto *ast_parser = llvm::cast<DWARFASTParserClang>(dwarf_ast);
1621 ast_parser->MapDeclDIEToDefDIE(decl_die, def_die);
1627 log,
"{0:x8}: {1} ({2}) '{3}' resolving forward declaration...",
1630 assert(compiler_type);
1635 bool assert_not_being_parsed,
1636 bool resolve_function_context) {
1640 if (assert_not_being_parsed) {
1645 "Parsing a die that is being parsed die: {0:x16}: {1} ({2}) {3}",
1676 m_index->GetObjCMethods(class_name, callback);
1682 if (die && llvm::isa<DWARFCompileUnit>(die.
GetCU())) {
1717 std::optional<uint32_t> file_index = die_ref.
file_index();
1728 return debug_map->GetSymbolFileByOSOIndex(*file_index);
1759 std::optional<uint64_t> dwo_id =
1771 return ::GetDWOId(*cu, *cu_die);
1780std::shared_ptr<SymbolFileDWARFDwo>
1794 if (!dwarf_cu || !dwarf_cu->
GetDWOId().has_value())
1797 const char *dwo_name =
GetDWOName(*dwarf_cu, cu_die);
1800 "missing DWO name in skeleton DIE {0:x16}", cu_die.
GetOffset()));
1813 size_t num_search_paths = debug_file_search_paths.
GetSize();
1819 const char *comp_dir =
1824 dwo_file.
SetFile(comp_dir, FileSpec::Style::native);
1835 FileSpec relative_to_binary = dwo_file;
1840 dwo_paths.
Append(relative_to_binary);
1843 for (
size_t idx = 0; idx < num_search_paths; ++idx) {
1851 dwo_paths.
Append(dirspec);
1854 size_t num_possible = dwo_paths.
GetSize();
1855 for (
size_t idx = 0; idx < num_possible && !found; ++idx) {
1858 dwo_file = dwo_spec;
1866 "unable to locate relative .dwo debug file \"%s\" for "
1867 "skeleton DIE 0x%016" PRIx64
" without valid DW_AT_comp_dir "
1878 llvm::StringRef filename_only = dwo_name_spec.
GetFilename();
1884 FileSpec dwo_name_binary_directory(binary_directory);
1886 dwo_paths.
Append(dwo_name_binary_directory);
1889 FileSpec filename_binary_directory(binary_directory);
1891 dwo_paths.
Append(filename_binary_directory);
1893 for (
size_t idx = 0; idx < num_search_paths; ++idx) {
1899 FileSpec dwo_name_dirspec(dirspec);
1901 dwo_paths.
Append(dwo_name_dirspec);
1903 FileSpec filename_dirspec(dirspec);
1905 dwo_paths.
Append(filename_dirspec);
1908 size_t num_possible = dwo_paths.
GetSize();
1909 for (
size_t idx = 0; idx < num_possible && !found; ++idx) {
1912 dwo_file = dwo_spec;
1921 if (error_dwo_path.
IsRelative() && comp_dir !=
nullptr) {
1926 "unable to locate .dwo debug file \"{0}\" for skeleton DIE "
1933 "unable to locate separate debug file (dwo, dwp). {0}",
1945 dwo_file_data_offset);
1946 if (dwo_obj_file ==
nullptr) {
1948 "unable to load object file for .dwo debug file \"{0}\" for "
1954 return std::make_shared<SymbolFileDWARFDwo>(*
this, dwo_obj_file,
1966 for (uint32_t cu_idx = 0; cu_idx < num_compile_units; ++cu_idx) {
1968 llvm::dyn_cast<DWARFCompileUnit>(debug_info.
GetUnitAtIndex(cu_idx));
1992 const char *comp_dir =
1996 FileSpec::Style::native);
2016 if (
m_objfile_sp->GetFileSpec().GetFileNameExtension() ==
".dwo" &&
2029 "{0}",
error.AsCString(
"unknown error"));
2031 "unable to locate module needed for external types.\n"
2032 "Debugging will be degraded due to missing types. Rebuilding the "
2033 "project will regenerate the needed module files");
2044 llvm::dyn_cast_or_null<SymbolFileDWARF>(module_sp->GetSymbolFile());
2047 std::optional<uint64_t> dwo_dwo_id = dwo_symfile->GetDWOId();
2051 if (dwo_id != dwo_dwo_id) {
2053 "module {0} is out-of-date (hash mismatch).\n"
2054 "Type information from this module may be incomplete or inconsistent "
2055 "with the rest of the program. Rebuilding the project will "
2056 "regenerate the needed module files",
2068 const size_t num_cus = module_sp->GetNumCompileUnits();
2069 for (
size_t i = 0; i < num_cus; ++i) {
2070 CompUnitSP cu_sp = module_sp->GetCompileUnitAtIndex(i);
2074 const size_t num_globals = globals_sp->GetSize();
2075 for (
size_t g = 0; g < num_globals; ++g) {
2076 VariableSP var_sp = globals_sp->GetVariableAtIndex(g);
2077 if (var_sp && !var_sp->GetLocationIsConstantValueData()) {
2079 var_sp->LocationExpressionList();
2081 llvm::Expected<Value> location_result = location.
Evaluate(
2083 if (location_result) {
2084 if (location_result->GetValueType() ==
2087 location_result->GetScalar().ULongLong();
2089 if (var_sp->GetType())
2090 byte_size = llvm::expectedToOptional(
2091 var_sp->GetType()->GetByteSize(
nullptr))
2094 file_addr, byte_size, var_sp.get()));
2098 location_result.takeError(),
2099 "location expression failed to execute: {0}");
2140 SymbolContextItem resolve_scope,
2144 "ResolveSymbolContext (so_addr = { "
2145 "section = %p, offset = 0x%" PRIx64
2146 " }, resolve_scope = 0x%8.8x)",
2147 static_cast<void *
>(so_addr.
GetSection().get()),
2149 uint32_t resolved = 0;
2151 (eSymbolContextCompUnit | eSymbolContextFunction | eSymbolContextBlock |
2152 eSymbolContextLineEntry | eSymbolContextVariable)) {
2164 if (resolve_scope & eSymbolContextVariable) {
2167 map.FindEntryThatContains(file_vm_addr);
2168 if (entry && entry->data) {
2180 if (
auto *dwarf_cu = llvm::dyn_cast_or_null<DWARFCompileUnit>(
2185 resolved |= eSymbolContextCompUnit;
2187 bool force_check_line_table =
false;
2188 if (resolve_scope & (eSymbolContextFunction | eSymbolContextBlock)) {
2190 resolve_scope & eSymbolContextBlock, sc);
2192 resolved |= eSymbolContextFunction;
2200 force_check_line_table =
true;
2203 resolved |= eSymbolContextBlock;
2206 if ((resolve_scope & eSymbolContextLineEntry) ||
2207 force_check_line_table) {
2209 if (line_table !=
nullptr) {
2215 Address exe_so_addr(so_addr);
2219 resolved |= eSymbolContextLineEntry;
2225 if (force_check_line_table && !(resolved & eSymbolContextLineEntry)) {
2232 resolved &= ~eSymbolContextCompUnit;
2236 "{0:x16}: compile unit {1} failed to create a valid "
2237 "lldb_private::CompileUnit class",
2247 const SourceLocationSpec &src_location_spec,
2248 SymbolContextItem resolve_scope, SymbolContextList &sc_list) {
2251 const uint32_t prev_size = sc_list.
GetSize();
2252 if (resolve_scope & eSymbolContextCompUnit) {
2261 if (check_inlines || file_spec_matches_cu_file_spec) {
2268 return sc_list.
GetSize() - prev_size;
2286 return module_sp->GetMutex();
2302 if (
auto err = type_system_or_err.takeError()) {
2304 "Unable to match namespace decl using TypeSystem: {0}");
2308 if (decl_ctx_type_system == type_system_or_err->get())
2316 log,
"Valid namespace does not match symbol file");
2330 "SymbolFileDWARF::FindGlobalVariables (name=\"{0}\", "
2331 "parent_decl_ctx={1:p}, max_matches={2}, variables)",
2332 name.
GetCString(),
static_cast<const void *
>(&parent_decl_ctx),
2339 const uint32_t original_size = variables.
GetSize();
2341 llvm::StringRef basename;
2342 llvm::StringRef context;
2350 if (name ==
"__clang_vtable")
2351 name_is_mangled =
true;
2359 uint32_t pruned_idx = original_size;
2367 if (die.
Tag() != DW_TAG_variable && die.
Tag() != DW_TAG_member)
2370 auto *dwarf_cu = llvm::dyn_cast<DWARFCompileUnit>(die.
GetCU());
2375 if (parent_decl_ctx) {
2378 dwarf_ast->GetDeclContextContainingUIDFromDWARF(die);
2384 if (!actual_parent_decl_ctx ||
2385 (actual_parent_decl_ctx != parent_decl_ctx &&
2392 while (pruned_idx < variables.
GetSize()) {
2394 if (name_is_mangled ||
2395 var_sp->GetName().GetStringRef().contains(name.
GetStringRef()))
2401 if (variables.
GetSize() - original_size < max_matches)
2408 const uint32_t num_matches = variables.
GetSize() - original_size;
2409 if (log && num_matches > 0) {
2412 "SymbolFileDWARF::FindGlobalVariables (name=\"{0}\", "
2413 "parent_decl_ctx={1:p}, max_matches={2}, variables) => {3}",
2414 name.
GetCString(),
static_cast<const void *
>(&parent_decl_ctx),
2415 max_matches, num_matches);
2420 uint32_t max_matches,
2428 "SymbolFileDWARF::FindGlobalVariables (regex=\"{0}\", "
2429 "max_matches={1}, variables)",
2430 regex.
GetText().str().c_str(), max_matches);
2434 const uint32_t original_size = variables.
GetSize();
2449 if (variables.
GetSize() - original_size < max_matches)
2457 bool include_inlines,
2465 if (!(orig_die.
Tag() == DW_TAG_subprogram ||
2466 (include_inlines && orig_die.
Tag() == DW_TAG_inlined_subroutine)))
2471 if (die.
Tag() == DW_TAG_inlined_subroutine) {
2478 if (die.
Tag() == DW_TAG_subprogram)
2484 assert(die && die.
Tag() == DW_TAG_subprogram);
2490 if (sc.
block ==
nullptr)
2503 case clang::CXXCtorType::Ctor_Complete:
2505 case clang::CXXCtorType::Ctor_Base:
2507 case clang::CXXCtorType::Ctor_Unified:
2509 case clang::CXXCtorType::Ctor_CopyingClosure:
2510 case clang::CXXCtorType::Ctor_DefaultClosure:
2511 case clang::CXXCtorType::Ctor_Comdat:
2512 llvm_unreachable(
"Unexpected constructor kind.");
2514 llvm_unreachable(
"Fully covered switch above");
2519 case clang::CXXDtorType::Dtor_Deleting:
2521 case clang::CXXDtorType::Dtor_Complete:
2523 case clang::CXXDtorType::Dtor_Base:
2525 case clang::CXXDtorType::Dtor_Unified:
2527 case clang::CXXDtorType::Dtor_Comdat:
2528 case clang::CXXDtorType::Dtor_VectorDeleting:
2529 llvm_unreachable(
"Unexpected destructor kind.");
2531 llvm_unreachable(
"Fully covered switch above");
2534static llvm::StringRef
2536 const bool is_ctor = discriminator.consume_front(
"C");
2537 if (!is_ctor && !discriminator.consume_front(
"D"))
2540 uint64_t structor_kind;
2541 if (!llvm::to_integer(discriminator, structor_kind))
2545 if (structor_kind > clang::CXXCtorType::Ctor_Unified)
2549 static_cast<clang::CXXCtorType
>(structor_kind));
2552 if (structor_kind > clang::CXXDtorType::Dtor_Unified)
2558llvm::Expected<DWARFDIE>
2561 auto do_lookup = [
this](llvm::StringRef lookup_name) ->
DWARFDIE {
2564 ConstString(lookup_name), lldb::eFunctionNameTypeFull,
2568 if (entry.GetAttributeValueAsUnsigned(llvm::dwarf::DW_AT_declaration, 0))
2584 return llvm::createStringError(
2585 "no definition DIE found in this SymbolFile");
2598 return subst_or_err.takeError();
2600 definition = do_lookup(*subst_or_err);
2603 return llvm::createStringError(
2604 "failed to find definition DIE for structor alias in fallback lookup");
2609llvm::Expected<SymbolContext>
2614 llvm::StringRef from = label.
discriminator[0] ==
'C' ?
"C4" :
"D4";
2617 if (variant.empty())
2618 return llvm::createStringError(
2619 "failed to get Itanium variant for discriminator");
2621 if (from == variant)
2622 return llvm::createStringError(
2623 "tried substituting unified structor variant into label");
2631 return llvm::joinErrors(
2632 llvm::createStringErrorV(
2633 "failed to substitute {0} for {1} in mangled name {2}:", from,
2635 subst_or_err.takeError());
2638 return llvm::createStringErrorV(
2639 "got invalid substituted mangled named (substituted "
2640 "{0} for {1} in mangled name {2})",
2648 return llvm::createStringErrorV(
"invalid DIE ID in {0}", label);
2655 return llvm::joinErrors(
2656 llvm::createStringError(
"failed to find definition DIE:"),
2657 die_or_err.takeError());
2659 die = std::move(*die_or_err);
2664 return llvm::createStringError(
"failed to resolve function");
2667 return llvm::createStringError(
"failed to find function");
2669 assert(sc_list.
GetSize() == 1);
2676 bool only_root_namespaces) {
2683 if (only_root_namespaces)
2684 return die.
GetParent().
Tag() == llvm::dwarf::DW_TAG_compile_unit;
2692 dwarf_ast->GetDeclContextContainingUIDFromDWARF(die))
2701 bool include_inlines,
2709 assert((name_type_mask & eFunctionNameTypeAuto) == 0);
2716 "SymbolFileDWARF::FindFunctions (name=\"{0}\", name_type_mask={1:x}, "
2731 const uint32_t original_size = sc_list.
GetSize();
2733 llvm::DenseSet<const DWARFDebugInfoEntry *> resolved_dies;
2735 m_index->GetFunctions(lookup_info, *
this, parent_decl_ctx, [&](
DWARFDIE die) {
2736 if (resolved_dies.insert(die.
GetDIE()).second)
2745 auto it = name_ref.find(
'<');
2746 if (it != llvm::StringRef::npos) {
2747 const llvm::StringRef name_no_template_params = name_ref.slice(0, it);
2750 lookup_info,
ConstString(name_no_template_params));
2751 m_index->GetFunctions(no_tp_lookup_info, *
this, parent_decl_ctx,
2753 if (resolved_dies.insert(die.
GetDIE()).second)
2761 const uint32_t num_matches = sc_list.
GetSize() - original_size;
2763 if (log && num_matches > 0) {
2766 "SymbolFileDWARF::FindFunctions (name=\"{0}\", "
2767 "name_type_mask={1:x}, include_inlines={2:d}, sc_list) => {3}",
2768 name.
GetCString(), name_type_mask, include_inlines, num_matches);
2773 bool include_inlines,
2777 regex.
GetText().str().c_str());
2783 log,
"SymbolFileDWARF::FindFunctions (regex=\"{0}\", sc_list)",
2784 regex.
GetText().str().c_str());
2787 llvm::DenseSet<const DWARFDebugInfoEntry *> resolved_dies;
2789 if (resolved_dies.insert(die.
GetDIE()).second)
2796 const std::string &scope_qualified_name,
2797 std::vector<ConstString> &mangled_names) {
2800 for (uint32_t i = 0; i < num_comp_units; i++) {
2819 llvm::StringRef &basename,
2820 llvm::StringRef &template_params) {
2821 auto it = fullname.find(
'<');
2822 if (it == llvm::StringRef::npos) {
2823 basename = fullname;
2824 template_params = llvm::StringRef();
2827 basename = fullname.slice(0, it);
2828 template_params = fullname.slice(it, fullname.size());
2836 bool any_context_updated =
false;
2838 llvm::StringRef basename, params;
2841 any_context_updated =
true;
2844 return any_context_updated;
2854 return debug_info_size + dwp_sp->GetDebugInfoSize();
2857 for (uint32_t i = 0; i < num_comp_units; i++) {
2866 return debug_info_size;
2880 log,
"SymbolFileDWARF::FindTypes(type_basename=\"{0}\")",
2887 bool have_index_match =
false;
2899 auto CompilerTypeBasename =
2900 matching_type->GetForwardCompilerType().GetTypeName(
true);
2904 have_index_match =
true;
2905 results.
InsertUnique(matching_type->shared_from_this());
2907 if (!results.
Done(query))
2913 if (results.
Done(query)) {
2916 log,
"SymbolFileDWARF::FindTypes(type_basename=\"{0}\") => {1}",
2939 std::vector<CompilerContext> qualified_context =
2945 results.
InsertUnique(matching_type->shared_from_this());
2946 if (!results.
Done(query))
2951 if (results.
Done(query)) {
2955 "SymbolFileDWARF::FindTypes(type_basename=\"{0}\") => {1} "
2956 "(simplified as \"{2}\")",
2958 type_basename_simple);
2971 if (
ModuleSP external_module_sp = pair.second) {
2972 external_module_sp->FindTypes(query, results);
2973 if (results.
Done(query)) {
2985 bool only_root_namespaces) {
2991 log,
"SymbolFileDWARF::FindNamespace (sc, name=\"{0}\")",
2998 return namespace_decl_ctx;
3000 m_index->GetNamespacesWithParents(name, parent_decl_ctx, [&](
DWARFDIE die) {
3009 if (namespace_decl_ctx.
IsValid())
3015 if (log && namespace_decl_ctx) {
3018 "SymbolFileDWARF::FindNamespace (sc, name=\"{0}\") => "
3019 "CompilerDeclContext({1:p}/{2:p}) \"{3}\"",
3021 static_cast<const void *
>(namespace_decl_ctx.
GetTypeSystem()),
3026 return namespace_decl_ctx;
3030 bool resolve_function_context) {
3034 if (type_ptr ==
nullptr) {
3036 if (
auto *dwarf_cu = llvm::dyn_cast<DWARFCompileUnit>(die.
GetCU()))
3043 while (parent_die !=
nullptr) {
3044 if (parent_die->
Tag() == DW_TAG_subprogram)
3049 if (resolve_function_context && parent_die !=
nullptr &&
3056 type_sp = type_ptr->shared_from_this();
3065 llvm::SmallVector<std::pair<DWARFDIE, bool>, 4> worklist;
3067 worklist.emplace_back(orig_die,
true);
3070 llvm::SmallPtrSet<const DWARFDebugInfoEntry *, 4> seen;
3072 while (!worklist.empty()) {
3073 auto [die, is_elaboration] = worklist.pop_back_val();
3075 if (is_elaboration) {
3076 if (!seen.insert(die.GetDIE()).second)
3079 switch (die.Tag()) {
3080 case DW_TAG_compile_unit:
3081 case DW_TAG_partial_unit:
3082 case DW_TAG_namespace:
3083 case DW_TAG_structure_type:
3084 case DW_TAG_union_type:
3085 case DW_TAG_class_type:
3086 case DW_TAG_lexical_block:
3087 case DW_TAG_subprogram:
3089 case DW_TAG_inlined_subroutine:
3090 if (
DWARFDIE abs_die = die.GetReferencedDIE(DW_AT_abstract_origin))
3099 if (
DWARFDIE parent = die.GetParent())
3100 worklist.emplace_back(parent,
false);
3101 if (
DWARFDIE abs_die = die.GetReferencedDIE(DW_AT_abstract_origin))
3102 worklist.emplace_back(abs_die,
true);
3103 if (
DWARFDIE spec_die = die.GetReferencedDIE(DW_AT_specification))
3104 worklist.emplace_back(spec_die,
true);
3111 Symbol *objc_class_symbol =
nullptr;
3120 return objc_class_symbol;
3133 m_index->GetCompleteObjCClass(
3134 type_name, must_be_implementation, [&](
DWARFDIE type_die) {
3140 if (must_be_implementation) {
3142 DW_AT_APPLE_objc_complete_type, 0);
3143 if (!try_resolving_type)
3152 "resolved 0x%8.8" PRIx64
" from %s to 0x%8.8" PRIx64
3153 " (cu 0x%8.8" PRIx64
")\n",
3155 m_objfile_sp->GetFileSpec().GetFilename().AsCString(
"<Unknown>"),
3156 type_die.
GetID(), type_cu->GetID());
3160 type_sp = resolved_type->shared_from_this();
3168 const char *name = die.
GetName();
3174 Progress progress(llvm::formatv(
"Searching definition DIE in {0}: '{1}'",
3184 "SymbolFileDWARF::FindDefinitionDIE(tag={0} "
3185 "({1}), name='{2}')",
3196 if (
auto err = type_system_or_err.takeError()) {
3198 "Cannot get TypeSystem for language {1}: {0}",
3201 type_system = *type_system_or_err;
3207 std::vector<std::string> template_params;
3210 type_system ? type_system->GetDWARFParser() :
nullptr;
3211 for (
DWARFDIE ctx_die = die; ctx_die && !isUnitType(ctx_die.Tag());
3212 ctx_die = ctx_die.GetParentDeclContextDIE()) {
3214 template_params.push_back(
3215 (ctx_die.IsStructUnionOrClass() && dwarf_ast)
3219 const bool any_template_params = llvm::any_of(
3220 template_params, [](llvm::StringRef p) {
return !p.empty(); });
3222 auto die_matches = [&](
DWARFDIE type_die) {
3224 const bool tag_matches =
3225 type_die.Tag() == tag ||
3229 if (any_template_params) {
3231 for (
DWARFDIE ctx_die = type_die; ctx_die && !isUnitType(ctx_die.Tag()) &&
3232 pos < template_params.size();
3233 ctx_die = ctx_die.GetParentDeclContextDIE(), ++pos) {
3234 if (template_params[pos].empty())
3236 if (template_params[pos] !=
3240 if (pos != template_params.size())
3246 m_index->GetFullyQualifiedType(die_dwarf_decl_ctx, [&](
DWARFDIE type_die) {
3254 if (!die_matches(type_die)) {
3258 "SymbolFileDWARF::FindDefinitionDIE(tag={0} ({1}), "
3259 "name='{2}') ignoring die={3:x16} ({4})",
3270 "SymbolFileDWARF::FindDefinitionTypeDIE(tag={0} ({1}), name='{2}') "
3271 "trying die={3:x16} ({4})",
3283 bool *type_is_new_ptr) {
3288 if (
auto err = type_system_or_err.takeError()) {
3290 "Unable to parse type: {0}");
3293 auto ts = *type_system_or_err;
3303 if (die.
Tag() == DW_TAG_subprogram) {
3307 if (scope_qualified_name.size()) {
3319 bool parse_siblings,
bool parse_children) {
3320 size_t types_added = 0;
3325 bool type_is_new =
false;
3327 Tag dwarf_tag =
static_cast<Tag
>(tag);
3332 if (isType(dwarf_tag) && tag != DW_TAG_subrange_type)
3339 if (die.
Tag() == DW_TAG_subprogram) {
3364 size_t functions_added = 0;
3371 if (llvm::Expected<llvm::DWARFAddressRangesVector> ranges =
3372 function_die.
GetDIE()->GetAttributeAddressRanges(
3373 function_die.
GetCU(),
3375 if (ranges->empty())
3377 dw_addr_t function_file_addr = ranges->begin()->LowPC;
3387 return functions_added;
3392 size_t types_added = 0;
3413 if (llvm::Expected<llvm::DWARFAddressRangesVector> ranges =
3414 function_die.
GetDIE()->GetAttributeAddressRanges(
3415 function_die.
GetCU(),
true)) {
3416 if (!ranges->empty())
3417 func_lo_pc = ranges->begin()->LowPC;
3420 "DIE({1:x}): {0}", function_die.
GetID());
3423 const size_t num_variables =
3428 return num_variables;
3433 if (dwarf_cu ==
nullptr)
3436 uint32_t vars_added = 0;
3439 if (variables.get() ==
nullptr) {
3440 variables = std::make_shared<VariableList>();
3446 variables->AddVariableIfUnique(var_sp);
3471 die_to_variable[die.
GetDIE()] = var_sp;
3473 die_to_variable[spec_die.GetDIE()] = var_sp;
3481 unsigned max_depth = 64) {
3483 if (!die || !max_depth)
3484 return std::nullopt;
3486 if (std::optional<uint64_t> byte_size =
3490 switch (die.
Tag()) {
3491 case DW_TAG_const_type:
3492 case DW_TAG_volatile_type:
3493 case DW_TAG_restrict_type:
3494 case DW_TAG_atomic_type:
3495 case DW_TAG_typedef:
3502 return std::nullopt;
3509 const addr_t func_low_pc) {
3514 uint64_t block_length = form_value.
Unsigned();
3522 if (form_value.
Form() == DW_FORM_loclistx)
3531 return location_list;
3537static DWARFExpressionList
3543 uint64_t block_offset =
3545 uint64_t block_length = form_value.
Unsigned();
3547 module,
DataExtractor(debug_info_data, block_offset, block_length),
3550 if (
const char *str = form_value.
AsCString())
3570 if (!debug_map_objfile)
3574 if (!debug_map_symtab)
3603 if (tag != DW_TAG_variable && tag != DW_TAG_constant &&
3604 tag != DW_TAG_member && (tag != DW_TAG_formal_parameter || !sc.
function))
3608 const char *name =
nullptr;
3609 const char *mangled =
nullptr;
3612 bool is_external =
false;
3613 bool is_artificial =
false;
3614 std::optional<uint64_t> tag_offset = std::nullopt;
3618 for (
size_t i = 0; i < attributes.
Size(); ++i) {
3625 case DW_AT_LLVM_tag_offset:
3626 tag_offset = form_value.
Unsigned();
3628 case DW_AT_decl_file:
3632 case DW_AT_decl_line:
3635 case DW_AT_decl_column:
3641 case DW_AT_linkage_name:
3642 case DW_AT_MIPS_linkage_name:
3649 type_die_form = form_value;
3651 case DW_AT_external:
3652 is_external = form_value.
Boolean();
3654 case DW_AT_const_value:
3655 const_value_form = form_value;
3657 case DW_AT_location:
3658 location_form = form_value;
3660 case DW_AT_start_scope:
3663 case DW_AT_artificial:
3664 is_artificial = form_value.
Boolean();
3666 case DW_AT_declaration:
3667 case DW_AT_description:
3668 case DW_AT_endianity:
3670 case DW_AT_specification:
3671 case DW_AT_visibility:
3673 case DW_AT_abstract_origin:
3682 bool location_is_const_value_data =
3688 if (const_value_form.
IsValid())
3696 bool is_static_member = (parent_tag == DW_TAG_compile_unit ||
3697 parent_tag == DW_TAG_partial_unit) &&
3698 (parent_context_die.
Tag() == DW_TAG_class_type ||
3699 parent_context_die.
Tag() == DW_TAG_structure_type);
3704 bool has_explicit_mangled = mangled !=
nullptr;
3716 if ((parent_tag == DW_TAG_compile_unit ||
3717 parent_tag == DW_TAG_partial_unit) &&
3724 if (tag == DW_TAG_formal_parameter)
3735 bool has_explicit_location = location_form.
IsValid();
3736 bool is_static_lifetime =
3737 has_explicit_mangled ||
3738 (has_explicit_location && !location_list.
IsValid());
3741 if (!location_is_const_value_data) {
3744 if (
auto maybe_location_DW_OP_addr =
3745 location->GetLocation_DW_OP_addr(location_form.
GetUnit())) {
3746 location_DW_OP_addr = *maybe_location_DW_OP_addr;
3751 "{0:x16}: {1} ({2}) has an invalid location: {3}: {4}",
3753 llvm::fmt_consume(maybe_location_DW_OP_addr.takeError()),
3758 is_static_lifetime =
true;
3761 if (debug_map_symfile)
3767 if (is_static_lifetime) {
3773 if (debug_map_symfile) {
3774 bool linked_oso_file_addr =
false;
3776 if (is_external && location_DW_OP_addr == 0) {
3778 *debug_map_symfile, mangled ? mangled : name, location_list,
3780 linked_oso_file_addr =
true;
3781 symbol_context_scope = exe_symbol;
3785 if (!linked_oso_file_addr) {
3802 if (location_is_const_value_data &&
3803 die.
GetDIE()->IsGlobalOrStaticScopeVariable())
3807 if (debug_map_symfile) {
3812 [
this, debug_map_symfile](
3814 return debug_map_symfile->LinkOSOFileAddress(
3815 this, unlinked_file_addr);
3824 if (symbol_context_scope ==
nullptr) {
3825 switch (parent_tag) {
3826 case DW_TAG_subprogram:
3827 case DW_TAG_inlined_subroutine:
3828 case DW_TAG_lexical_block:
3830 symbol_context_scope =
3832 if (symbol_context_scope ==
nullptr)
3833 symbol_context_scope = sc.
function;
3843 if (!symbol_context_scope) {
3850 auto type_sp = std::make_shared<SymbolFileType>(
3853 bool use_type_size_for_value =
3854 location_is_const_value_data &&
3856 if (use_type_size_for_value) {
3857 std::optional<uint64_t> byte_size;
3858 if (
Type *t = type_sp->GetType())
3859 byte_size = llvm::expectedToOptional(t->GetByteSize(
nullptr));
3876 return std::make_shared<Variable>(
3877 die.
GetID(), name, mangled, type_sp, scope, symbol_context_scope,
3878 scope_ranges, &decl, location_list, is_external, is_artificial,
3879 location_is_const_value_data, is_static_member, tag_offset);
3889 spec_block_die_offset);
3896 switch (die.
Tag()) {
3897 case DW_TAG_subprogram:
3898 case DW_TAG_inlined_subroutine:
3899 case DW_TAG_lexical_block: {
3901 spec_block_die_offset)
3905 spec_block_die_offset)
3933 if (tag != DW_TAG_variable && tag != DW_TAG_constant && tag != DW_TAG_member)
3949 switch (parent_tag) {
3950 case DW_TAG_compile_unit:
3951 case DW_TAG_partial_unit:
3956 "parent {0:x8} {1} ({2}) with no valid compile unit in "
3957 "symbol context for {3:x8} {4} ({5}).\n",
3967 "{0} '{1}' ({2:x8}) is not a global variable - ignoring", tag,
3977 if (variable_list_sp)
3978 variable_list_sp->AddVariableIfUnique(var_sp);
3994 if (block_die.
Tag() != DW_TAG_inlined_subroutine) {
3995 return std::move(variable_dies);
4000 if (!abs_die || abs_die.
Tag() != DW_TAG_subprogram ||
4002 return std::move(variable_dies);
4007 DIEArray::iterator concrete_it = variable_dies.
begin();
4010 bool did_merge_abstract =
false;
4011 for (; abstract_child; abstract_child = abstract_child.
GetSibling()) {
4012 if (abstract_child.
Tag() == DW_TAG_formal_parameter) {
4013 if (concrete_it == variable_dies.end() ||
4014 GetDIE(*concrete_it).Tag() != DW_TAG_formal_parameter) {
4018 merged.push_back(*abstract_child.
GetDIERef());
4019 did_merge_abstract =
true;
4025 if (origin_of_concrete == abstract_child) {
4028 merged.push_back(*concrete_it);
4033 merged.push_back(*abstract_child.
GetDIERef());
4034 did_merge_abstract =
true;
4040 if (!did_merge_abstract)
4041 return std::move(variable_dies);
4048 for (; concrete_it != variable_dies.end(); ++concrete_it) {
4049 if (
GetDIE(*concrete_it).
Tag() == DW_TAG_formal_parameter) {
4050 return std::move(variable_dies);
4052 merged.push_back(*concrete_it);
4068 dummy_block_variables);
4078 size_t vars_added = 0;
4081 if ((tag == DW_TAG_variable) || (tag == DW_TAG_constant) ||
4082 (tag == DW_TAG_formal_parameter)) {
4083 accumulator.push_back(*die.
GetDIERef());
4087 case DW_TAG_subprogram:
4088 case DW_TAG_inlined_subroutine:
4089 case DW_TAG_lexical_block: {
4093 if (block ==
nullptr) {
4100 if (concrete_block_die)
4105 if (block ==
nullptr)
4108 const bool can_create =
false;
4111 if (block_variable_list_sp.get() ==
nullptr) {
4112 block_variable_list_sp = std::make_shared<VariableList>();
4120 sc, child, func_low_pc, block_variables);
4125 block_variables, func_low_pc);
4134 sc, child, func_low_pc, accumulator);
4144 llvm::ArrayRef<DIERef> variable_dies,
lldb::addr_t func_low_pc) {
4146 for (
auto &die : variable_dies) {
4151 return variable_dies.size();
4159 if (child.Tag() != DW_TAG_call_site_parameter &&
4160 child.Tag() != DW_TAG_GNU_call_site_parameter)
4163 std::optional<DWARFExpressionList> LocationInCallee;
4164 std::optional<DWARFExpressionList> LocationInCaller;
4170 auto parse_simple_location =
4171 [&](
int attr_index) -> std::optional<DWARFExpressionList> {
4177 auto data = child.GetData();
4178 uint64_t block_offset = form_value.
BlockData() - data.GetDataStart();
4179 uint64_t block_length = form_value.
Unsigned();
4185 for (
size_t i = 0; i < attributes.
Size(); ++i) {
4187 if (attr == DW_AT_location)
4188 LocationInCallee = parse_simple_location(i);
4189 if (attr == DW_AT_call_value || attr == DW_AT_GNU_call_site_value)
4190 LocationInCaller = parse_simple_location(i);
4193 if (LocationInCallee && LocationInCaller) {
4195 parameters.push_back(param);
4202std::vector<std::unique_ptr<lldb_private::CallEdge>>
4206 bool has_call_edges =
4209 if (!has_call_edges)
4213 LLDB_LOG(log,
"CollectCallEdges: Found call site info in {0}",
4221 std::vector<std::unique_ptr<CallEdge>> call_edges;
4223 if (child.Tag() != DW_TAG_call_site && child.Tag() != DW_TAG_GNU_call_site)
4226 std::optional<DWARFDIE> call_origin;
4227 std::optional<DWARFExpressionList> call_target;
4231 bool tail_call =
false;
4237 for (
size_t i = 0; i < attributes.
Size(); ++i) {
4240 LLDB_LOG(log,
"CollectCallEdges: Could not extract TAG_call_site form");
4246 if (attr == DW_AT_call_tail_call || attr == DW_AT_GNU_tail_call)
4247 tail_call = form_value.
Boolean();
4250 if (attr == DW_AT_call_origin || attr == DW_AT_abstract_origin) {
4252 if (!call_origin->IsValid()) {
4253 LLDB_LOG(log,
"CollectCallEdges: Invalid call origin in {0}",
4259 if (attr == DW_AT_low_pc)
4260 low_pc = form_value.
Address();
4265 if (attr == DW_AT_call_return_pc)
4266 return_pc = form_value.
Address();
4271 if (attr == DW_AT_call_pc)
4272 call_inst_pc = form_value.
Address();
4276 if (attr == DW_AT_call_target || attr == DW_AT_GNU_call_site_target) {
4279 "CollectCallEdges: AT_call_target does not have block form");
4283 auto data = child.GetData();
4284 uint64_t block_offset = form_value.
BlockData() - data.GetDataStart();
4285 uint64_t block_length = form_value.
Unsigned();
4291 if (!call_origin && !call_target) {
4292 LLDB_LOG(log,
"CollectCallEdges: call site without any call target");
4299 caller_address = return_pc;
4302 caller_address = low_pc;
4305 caller_address = call_inst_pc;
4308 LLDB_LOG(log,
"CollectCallEdges: No caller address");
4320 std::unique_ptr<CallEdge> edge;
4323 "CollectCallEdges: Found call origin: {0} (retn-PC: {1:x}) "
4325 call_origin->GetPubname(), return_pc, call_inst_pc);
4326 edge = std::make_unique<DirectCallEdge>(
4327 call_origin->GetMangledName(), caller_address_type, caller_address,
4328 tail_call, std::move(parameters));
4334 LLDB_LOG(log,
"CollectCallEdges: Found indirect call target: {0}",
4337 edge = std::make_unique<IndirectCallEdge>(
4338 *call_target, caller_address_type, caller_address, tail_call,
4339 std::move(parameters));
4342 if (log && parameters.size()) {
4345 param.LocationInCallee.GetDescription(&callee_loc_desc,
4347 param.LocationInCaller.GetDescription(&caller_loc_desc,
4349 LLDB_LOG(log,
"CollectCallEdges: \tparam: {0} => {1}",
4354 call_edges.push_back(std::move(edge));
4359std::vector<std::unique_ptr<lldb_private::CallEdge>>
4382 auto ts = *ts_or_err;
4395 if (
ObjectFile *dwp_obj = dwp_sp->GetObjectFile()) {
4402 for (uint32_t cu_idx = 0; cu_idx < num_cus; ++cu_idx) {
4405 if (dwarf_cu ==
nullptr || !dwarf_cu->
GetDWOId().has_value())
4419 dwarf_cu, DW_AT_comp_dir,
nullptr);
4430 bool load_all_debug_info) {
4434 for (
size_t cu_idx = 0; cu_idx < num_cus; cu_idx++) {
4437 if (dwarf_cu ==
nullptr)
4442 if (!dwarf_cu->
GetDWOId().has_value())
4446 std::make_shared<StructuredData::Dictionary>();
4447 const uint64_t dwo_id = dwarf_cu->
GetDWOId().value();
4448 dwo_data->AddIntegerItem(
"dwo_id", dwo_id);
4453 dwo_data->AddStringItem(
"dwo_name", dwo_name);
4455 dwo_data->AddStringItem(
"error",
"missing dwo name");
4458 const char *comp_dir = die.GetDIE()->GetAttributeValueAsString(
4459 dwarf_cu, DW_AT_comp_dir,
nullptr);
4461 dwo_data->AddStringItem(
"comp_dir", comp_dir);
4464 dwo_data->AddStringItem(
4466 llvm::formatv(
"unable to get unit DIE for DWARFUnit at {0:x}",
4475 dwo_data->AddStringItem(
4476 "resolved_dwo_path",
4479 dwo_data->AddStringItem(
"error",
4482 dwo_data->AddBooleanItem(
"loaded", dwo_symfile !=
nullptr);
4483 if (!errors_only || dwo_data->HasKey(
"error"))
4484 separate_debug_info_files.
AddItem(dwo_data);
4489 d.
AddItem(
"separate-debug-info-files",
4490 std::make_shared<StructuredData::Array>(
4491 std::move(separate_debug_info_files)));
4500 module_sp->GetSymbolFile()->GetBackingSymbolFile());
4508 if (
m_objfile_sp->GetArchitecture().GetTriple().isAppleMachO())
4515 symfiles.
Append(module_fspec);
4521 if (symfile_fspec != module_fspec) {
4522 symfiles.
Append(symfile_fspec);
4527 llvm::StringRef filename_no_ext =
4529 if (filename_no_ext != module_fspec.
GetFilename()) {
4530 FileSpec module_spec_no_ext(module_fspec);
4532 symfiles.
Append(module_spec_no_ext);
4540 for (
const auto &symfile : symfiles.
files()) {
4542 FileSpec(symfile.GetPath() +
".dwp", symfile.GetPathStyle());
4543 LLDB_LOG(log,
"Searching for DWP using: \"{0}\"",
4546 module_spec, search_paths,
4547 m_objfile_sp->GetModule()->GetSymbolLocatorStatistics());
4553 LLDB_LOG(log,
"No DWP file found locally");
4559 module_spec, search_paths,
4560 m_objfile_sp->GetModule()->GetSymbolLocatorStatistics());
4563 LLDB_LOG(log,
"Found DWP file: \"{0}\"", dwp_filespec);
4569 dwp_file_extractor_sp, dwp_file_data_offset);
4576 LLDB_LOG(log,
"Unable to locate for DWP file for: \"{0}\"",
4583llvm::Expected<lldb::TypeSystemSP>
4590 if (
auto err = type_system_or_err.takeError()) {
4592 "Unable to get DWARFASTParser: {0}");
4595 if (
auto ts = *type_system_or_err)
4596 return ts->GetDWARFParser();
4602 return dwarf_ast->GetDeclForUIDFromDWARF(die);
4608 return dwarf_ast->GetDeclContextForUIDFromDWARF(die);
4615 return dwarf_ast->GetDeclContextContainingUIDFromDWARF(die);
4626 case DW_LANG_Mips_Assembler:
4639 if (llvm::dwarf::isCPlusPlus(lang))
4640 lang = DW_LANG_C_plus_plus;
4646 return m_index->GetIndexTime();
4653 return m_index->ResetStatistics();
4671 if (dwo_error.
Fail())
4672 return dwo_error.
Clone();
4681 if (dwarf_cu->
HasAny({DW_TAG_variable, DW_TAG_formal_parameter}))
4685 "no variable information is available in debug info for this "
4690 std::unordered_map<lldb::CompUnitSP, lldb_private::Args> &args) {
4694 for (uint32_t cu_idx = 0; cu_idx < num_compile_units; ++cu_idx) {
4711 args.insert({comp_unit,
Args(flags)});
4720 for (
size_t cu_idx = 0; cu_idx < num_cus; cu_idx++) {
4722 if (dwarf_cu ==
nullptr)
4726 if (!dwarf_cu->
GetDWOId().has_value())
4741 if (dwo_error.
Fail())
4751 if (die.
Tag() != DW_TAG_variable)
static llvm::raw_ostream & error(Stream &strm)
#define DEBUG_PRINTF(fmt,...)
static PluginProperties & GetGlobalPluginProperties()
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOG_ERRORV(log, error,...)
#define LLDB_LOGF(log,...)
#define LLDB_LOG_ERROR(log, error,...)
#define LLDB_PLUGIN_DEFINE(PluginName)
static double elapsed(const StatsTimepoint &start, const StatsTimepoint &end)
static PluginProperties & GetGlobalPluginProperties()
static bool UpdateCompilerContextForSimpleTemplateNames(TypeQuery &match)
static ConstString GetDWARFMachOSegmentName()
static DWARFExpressionList GetExprListFromAtConstValue(DWARFFormValue form_value, ModuleSP module, const DWARFDIE &die)
Creates a DWARFExpressionList from an DW_AT_const_value.
static llvm::StringRef ClangToItaniumCtorKind(clang::CXXCtorType kind)
static void ParseSupportFilesFromPrologue(SupportFileList &support_files, const lldb::ModuleSP &module, const llvm::DWARFDebugLine::Prologue &prologue, FileSpec::Style style, llvm::StringRef compile_dir={})
static std::optional< uint64_t > GetByteSizeFromTypeDIE(DWARFDIE die, unsigned max_depth=64)
Walks transparent type wrappers following DW_AT_type and returns the first DW_AT_byte_size encountere...
static CallSiteParameterArray CollectCallSiteParameters(ModuleSP module, DWARFDIE call_site_die)
Collect call site parameters in a DW_TAG_call_site DIE.
static void MakeAbsoluteAndRemap(FileSpec &file_spec, DWARFUnit &dwarf_cu, const ModuleSP &module_sp)
Make an absolute path out of file_spec and remap it using the module's source remapping dictionary.
static llvm::StringRef GetItaniumCtorDtorVariant(llvm::StringRef discriminator)
static const llvm::DWARFDebugLine::LineTable * ParseLLVMLineTable(DWARFContext &context, llvm::DWARFDebugLine &line, dw_offset_t line_offset, dw_offset_t unit_offset)
bool IsStructOrClassTag(llvm::dwarf::Tag Tag)
static bool SplitTemplateParams(llvm::StringRef fullname, llvm::StringRef &basename, llvm::StringRef &template_params)
Split a name up into a basename and template parameters.
static Symbol * fixupExternalAddrZeroVariable(SymbolFileDWARFDebugMap &debug_map_symfile, llvm::StringRef name, DWARFExpressionList &expr_list, const DWARFDIE &die)
Global variables that are not initialized may have their address set to zero.
static std::optional< uint64_t > GetDWOId(DWARFCompileUnit &dwarf_cu, const DWARFDebugInfoEntry &cu_die)
Return the DW_AT_(GNU_)dwo_id.
static std::set< dw_form_t > GetUnsupportedForms(llvm::DWARFDebugAbbrev *debug_abbrev)
static std::optional< std::string > GetFileByIndex(const llvm::DWARFDebugLine::Prologue &prologue, size_t idx, llvm::StringRef compile_dir, FileSpec::Style style)
static llvm::StringRef ClangToItaniumDtorKind(clang::CXXDtorType kind)
static DWARFExpressionList GetExprListFromAtLocation(DWARFFormValue form_value, ModuleSP module, const DWARFDIE &die, const addr_t func_low_pc)
Creates a DWARFExpressionList from an DW_AT_location form_value.
static bool ParseLLVMLineTablePrologue(DWARFContext &context, llvm::DWARFDebugLine::Prologue &prologue, dw_offset_t line_offset, dw_offset_t unit_offset)
static const char * GetDWOName(DWARFCompileUnit &dwarf_cu, const DWARFDebugInfoEntry &cu_die)
Return the DW_AT_(GNU_)dwo_name.
#define DIE_IS_BEING_PARSED
#define ASSERT_MODULE_LOCK(expr)
#define LLDB_SCOPED_TIMER()
#define LLDB_SCOPED_TIMERF(...)
A section + offset based address class.
lldb::SectionSP GetSection() const
Get const accessor for the section.
lldb::addr_t GetFileAddress() const
Get the file address.
lldb::addr_t GetOffset() const
Get the section relative offset value.
bool IsSectionOffset() const
Check if an address is section offset.
A command line argument class.
A class that describes a single lexical block.
lldb::VariableListSP GetBlockVariableList(bool can_create)
Get the variable list for this block only.
lldb::BlockSP CreateChild(lldb::user_id_t uid)
Creates a block with the specified UID uid.
Block * FindBlockByID(lldb::user_id_t block_id)
void SetVariableList(lldb::VariableListSP &variable_list_sp)
Set accessor for the variable list.
void SetDidParseVariables(bool b, bool set_children)
void AddRange(const Range &range)
Add a new offset range to this block.
void SetInlinedFunctionInfo(const char *name, const char *mangled, const Declaration *decl_ptr, const Declaration *call_decl_ptr)
Set accessor for any inlined function information.
static bool ExtractContextAndIdentifier(llvm::StringRef name, llvm::StringRef &context, llvm::StringRef &identifier)
static llvm::Expected< ConstString > SubstituteStructor_ItaniumMangle(llvm::StringRef mangled_name, llvm::StringRef subst_from, llvm::StringRef subst_to)
Substitutes Itanium structor encoding substrings given by subst_from in mangled_name with subst_to.
static llvm::Expected< ConstString > SubstituteStructorAliases_ItaniumMangle(llvm::StringRef mangled_name)
Tries replacing Itanium structor encoding substrings in mangled_name with potential aliases....
Checksum(llvm::MD5::MD5Result md5=g_sentinel)
static bool LanguageSupportsClangModules(lldb::LanguageType language)
Query whether Clang supports modules for a particular language.
A class that describes a compilation unit.
void SetVariableList(lldb::VariableListSP &variable_list_sp)
Set accessor for the variable list.
const SupportFileList & GetSupportFiles()
Get the compile unit's support file list.
lldb::VariableListSP GetVariableList(bool can_create)
Get the variable list for a compile unit.
void SetDebugMacros(const DebugMacrosSP &debug_macros)
const FileSpec & GetPrimaryFile() const
Return the primary source spec associated with this compile unit.
void ResolveSymbolContext(const SourceLocationSpec &src_location_spec, lldb::SymbolContextItem resolve_scope, SymbolContextList &sc_list, RealpathPrefixes *realpath_prefixes=nullptr)
Resolve symbol contexts by file and line.
void SetLineTable(LineTable *line_table)
Set the line table for the compile unit.
lldb::FunctionSP FindFunctionByUID(lldb::user_id_t uid)
Finds a function by user ID.
lldb::LanguageType GetLanguage()
LineTable * GetLineTable()
Get the line table for the compile unit.
Represents a generic declaration context in a program.
ConstString GetScopeQualifiedName() const
ConstString GetName() const
bool IsContainedInLookup(CompilerDeclContext other) const
Check if the given other decl context is contained in the lookup of this decl context (for example be...
TypeSystem * GetTypeSystem() const
void * GetOpaqueDeclContext() const
Represents a generic declaration such as a function declaration.
Generic representation of a type in a programming language.
TypeSystemSPWrapper GetTypeSystem() const
Accessors.
lldb::opaque_compiler_type_t GetOpaqueQualType() const
A uniqued constant string class.
bool IsEmpty() const
Test for empty string.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
const char * GetCString() const
Get the string value as a C string.
const char * AsCString(const char *value_if_empty) const
Get the string value as a C string.
"lldb/Expression/DWARFExpressionList.h" Encapsulates a range map from file address range to a single ...
llvm::Expected< Value > Evaluate(ExecutionContext *exe_ctx, RegisterContext *reg_ctx, lldb::addr_t func_load_addr, const Value *initial_value_ptr, const Value *object_address_ptr) const
bool ContainsThreadLocalStorage() const
const DWARFExpression * GetAlwaysValidExpr() const
void SetModule(const lldb::ModuleSP &module)
bool IsValid() const
Return true if the location expression contains data.
void SetFuncFileAddress(lldb::addr_t func_file_addr)
bool LinkThreadLocalStorage(lldb::ModuleSP new_module_sp, std::function< lldb::addr_t(lldb::addr_t file_addr)> const &link_address_callback)
DWARFExpression * GetMutableExpressionAtAddress(lldb::addr_t func_load_addr=LLDB_INVALID_ADDRESS, lldb::addr_t load_addr=0)
"lldb/Expression/DWARFExpression.h" Encapsulates a DWARF location expression and interprets it.
void UpdateValue(uint64_t const_value, lldb::offset_t const_value_byte_size, uint8_t addr_byte_size)
bool Update_DW_OP_addr(const Delegate *dwarf_cu, lldb::addr_t file_addr)
A class to manage flag bits.
A class that describes the declaration location of a lldb object.
void SetLine(uint32_t line)
Set accessor for the declaration line number.
void SetColumn(uint16_t column)
Set accessor for the declaration column number.
void SetFile(const FileSpec &file_spec)
Set accessor for the declaration file specification.
A class that measures elapsed time in an exception safe way.
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
llvm::iterator_range< const_iterator > files() const
const FileSpec & GetFileSpecAtIndex(size_t idx) const
Get file at index.
void Append(const FileSpec &file)
Append a FileSpec object to the list.
size_t GetSize() const
Get the number of files in the file list.
void SetFile(llvm::StringRef path, Style style)
Change the file specified with a new path.
void AppendPathComponent(llvm::StringRef component)
static bool Match(const FileSpec &pattern, const FileSpec &file)
Match FileSpec pattern against FileSpec file.
bool IsRelative() const
Returns true if the filespec represents a relative path.
llvm::StringRef GetFileNameStrippingExtension() const
Return the filename without the extension part.
void SetFilename(llvm::StringRef filename)
Filename string set accessor.
void MakeAbsolute(const FileSpec &dir)
Make the FileSpec absolute by treating it relative to dir.
void SetPath(llvm::StringRef p)
Temporary helper for FileSystem change.
llvm::StringRef GetFilename() const
Filename string const get accessor.
bool IsAbsolute() const
Returns true if the filespec represents an absolute path.
void PrependPathComponent(llvm::StringRef component)
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
llvm::sys::path::Style Style
bool Exists(const FileSpec &file_spec) const
Returns whether the given file exists.
static FileSystem & Instance()
void Resolve(llvm::SmallVectorImpl< char > &path, bool force_make_absolute=false)
Resolve path to make it canonical.
A class that describes a function.
lldb::ModuleSP CalculateSymbolContextModule() override
CompileUnit * GetCompileUnit()
Get accessor for the compile unit that owns this function.
Block & GetBlock(bool can_create)
Get accessor for the block list.
static const char * GetNameForLanguageType(lldb::LanguageType language)
Returns the internal LLDB name for the specified language.
static bool LanguageIsCPlusPlus(lldb::LanguageType language)
static void AppendLineEntryToSequence(Sequence &sequence, lldb::addr_t file_addr, uint32_t line, uint16_t column, uint16_t file_idx, bool is_start_of_statement, bool is_start_of_basic_block, bool is_prologue_end, bool is_epilogue_begin, bool is_terminal_entry)
bool FindLineEntryByAddress(const Address &so_addr, LineEntry &line_entry, uint32_t *index_ptr=nullptr)
Find a line entry that contains the section offset address so_addr.
static Mangled::ManglingScheme GetManglingScheme(llvm::StringRef name)
Try to identify the mangling scheme used.
lldb::ModuleSP GetModule() const
Get const accessor for the module pointer.
static Status GetSharedModule(const ModuleSpec &module_spec, lldb::ModuleSP &module_sp, llvm::SmallVectorImpl< lldb::ModuleSP > *old_modules, bool *did_create_ptr, bool invoke_locate_callback=true, bool invoke_symbol_locators=true)
void Append(const ModuleSpec &spec)
ArchSpec & GetArchitecture()
FileSpec & GetSymbolFileSpec()
A class that encapsulates name lookup information.
lldb::FunctionNameType GetNameTypeMask() const
ConstString GetLookupName() const
static std::vector< LookupInfo > MakeLookupInfos(ConstString name, lldb::FunctionNameType name_type_mask, lldb::LanguageType lang_type, ConstString lookup_name_override={})
Creates a vector of lookup infos for function name resolution.
A class that describes an executable image and its associated object and symbol files.
A plug-in interface definition class for object file parsers.
static lldb::ObjectFileSP FindPlugin(const lldb::ModuleSP &module_sp, const FileSpec *file_spec, lldb::offset_t file_offset, lldb::offset_t file_size, lldb::DataExtractorSP extractor_sp, lldb::offset_t &data_offset)
Find a ObjectFile plug-in that can parse file_spec.
Symtab * GetSymtab(bool can_create=true)
Gets the symbol table for the currently selected architecture (and object for archives).
@ eTypeDebugInfo
An object file that contains only debug information.
virtual FileSpec & GetFileSpec()
Get accessor to the object file specification.
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static FileSpec LocateExecutableSymbolFile(const ModuleSpec &module_spec, const FileSpecList &default_search_paths, StatisticsMap &map)
static bool CreateSettingForSymbolFilePlugin(Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, llvm::StringRef description, bool is_global_property)
static lldb::OptionValuePropertiesSP GetSettingForSymbolFilePlugin(Debugger &debugger, llvm::StringRef setting_name)
static bool UnregisterPlugin(ABICreateInstance create_callback)
A Progress indicator helper class.
RangeData< lldb::addr_t, lldb::addr_t, Variable * > Entry
llvm::StringRef GetText() const
Access the regular expression text.
lldb::SectionSP FindSectionByName(llvm::StringRef section_name) const
lldb::SectionSP FindSectionByType(lldb::SectionType sect_type, bool check_children, size_t start_idx=0) const
SectionList & GetChildren()
lldb::offset_t GetFileSize() const
bool GetCheckInlines() const
FileSpec GetFileSpec() const
This base class provides an interface to stack frames.
virtual const SymbolContext & GetSymbolContext(lldb::SymbolContextItem resolve_scope)
Provide a SymbolContext for this StackFrame's current pc value.
std::chrono::duration< double > Duration
Status Clone() const
Don't call this function in new code.
static Status FromErrorString(const char *str)
bool Fail() const
Test for error condition.
const char * AsCString(const char *default_error_str="unknown error") const
Get the error string associated with the current error.
static Status static Status FromErrorStringWithFormatv(const char *format, Args &&...args)
const char * GetData() const
llvm::StringRef GetString() const
A stream class that can stream formatted output to a file.
llvm::raw_ostream & AsRawOstream()
Returns a raw_ostream that forwards the data to this Stream object.
void AddItem(const ObjectSP &item)
void AddStringItem(llvm::StringRef key, llvm::StringRef value)
void AddItem(llvm::StringRef key, ObjectSP value_sp)
std::shared_ptr< Dictionary > DictionarySP
A list of support files for a CompileUnit.
const FileSpec & GetFileSpecAtIndex(size_t idx) const
void Append(const FileSpec &file)
SupportFileNSP GetSupportFileAtIndex(size_t idx) const
void EmplaceBack(Args &&...args)
Wraps a FileSpec and an optional Checksum.
virtual const FileSpec & Materialize()
Materialize the file to disk and return the path to that temporary file.
Defines a list of symbol context objects.
uint32_t GetSize() const
Get accessor for a symbol context list size.
bool AppendIfUnique(const SymbolContext &sc, bool merge_symbol_into_function)
"lldb/Symbol/SymbolContextScope.h" Inherit from this if your object is part of a symbol context and c...
virtual CompileUnit * CalculateSymbolContextCompileUnit()
virtual void CalculateSymbolContext(SymbolContext *sc)=0
Reconstruct the object's symbol context into sc.
Defines a symbol context baton that can be handed other debug core functions.
Function * function
The Function for a given query.
Block * block
The Block for a given query.
lldb::ModuleSP module_sp
The Module for a given query.
CompileUnit * comp_unit
The CompileUnit for a given query.
uint32_t GetResolvedMask() const
void Clear(bool clear_target)
Clear the object's state.
Variable * variable
The global variable matching the given query.
LineEntry line_entry
The LineEntry for a given query.
lldb::CompUnitSP GetCompileUnitAtIndex(uint32_t idx) override
ObjectFile * GetObjectFile() override
virtual TypeList & GetTypeList()
lldb::ObjectFileSP m_objfile_sp
ObjectFile * GetMainObjectFile() override
void SetCompileUnitAtIndex(uint32_t idx, const lldb::CompUnitSP &cu_sp)
SymbolFileCommon(lldb::ObjectFileSP objfile_sp)
Symtab * GetSymtab(bool can_create=true) override
llvm::Expected< lldb::TypeSystemSP > GetTypeSystemForLanguage(lldb::LanguageType language) override
uint32_t GetNumCompileUnits() override
void Dump(Stream &s) override
uint64_t GetDebugInfoSize(bool load_all_debug_info=false) override
Metrics gathering functions.
std::unordered_map< lldb::CompUnitSP, Args > GetCompileOptions()
Returns a map of compilation unit to the compile option arguments associated with that compilation un...
virtual ObjectFile * GetObjectFile()=0
bool ValueIsAddress() const
Address & GetAddressRef()
Symbol * FindFirstSymbolWithNameAndType(ConstString name, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility)
static FileSpecList GetDefaultDebugFileSearchPaths()
void Insert(const lldb::TypeSP &type)
A class that contains all state required for type lookups.
bool GetModuleSearch() const
The m_context can be used in two ways: normal types searching with the context containing a stanadard...
std::vector< lldb_private::CompilerContext > & GetContextRef()
Access the internal compiler context array.
ConstString GetTypeBasename() const
Get the type basename to use when searching the type indexes in each SymbolFile object.
bool ContextMatches(llvm::ArrayRef< lldb_private::CompilerContext > context) const
Check of a CompilerContext array from matching type from a symbol file matches the m_context.
bool GetSearchByMangledName() const
Returns true if the type query is supposed to treat the name to be searched as a mangled name.
This class tracks the state and results of a TypeQuery.
bool InsertUnique(const lldb::TypeSP &type_sp)
When types that match a TypeQuery are found, this API is used to insert the matching types.
bool Done(const TypeQuery &query) const
Check if the type matching has found all of the matches that it needs.
bool AlreadySearched(lldb_private::SymbolFile *sym_file)
Check if a SymbolFile object has already been searched by this type match object.
A TypeSystem implementation based on Clang.
Interface for representing a type system.
virtual lldb::LanguageType GetMinimumLanguage(lldb::opaque_compiler_type_t type)=0
virtual plugin::dwarf::DWARFASTParser * GetDWARFParser()
@ FileAddress
A file address value.
bool AddVariableIfUnique(const lldb::VariableSP &var_sp)
lldb::VariableSP GetVariableAtIndex(size_t idx) const
lldb::VariableSP RemoveVariableAtIndex(size_t idx)
SymbolContextScope * GetSymbolContextScope() const
RangeVector< lldb::addr_t, lldb::addr_t > RangeList
An abstraction which groups an XcodeSDK with the sysroot it was used from.
static std::unique_ptr< AppleDWARFIndex > Create(Module &module, DWARFDataExtractor apple_names, DWARFDataExtractor apple_namespaces, DWARFDataExtractor apple_types, DWARFDataExtractor apple_objc, DWARFDataExtractor debug_str)
Identifies a DWARF debug info entry within a given Module.
std::optional< uint32_t > file_index() const
static constexpr uint64_t k_file_index_mask
dw_offset_t die_offset() const
virtual void EnsureAllDIEsInDeclContextHaveBeenParsed(CompilerDeclContext decl_context)=0
virtual bool CompleteTypeFromDWARF(const DWARFDIE &die, Type *type, const CompilerType &compiler_type)=0
virtual std::string GetDIEClassTemplateParams(DWARFDIE die)=0
virtual Function * ParseFunctionFromDWARF(CompileUnit &comp_unit, const DWARFDIE &die, AddressRanges ranges)=0
virtual ConstString ConstructDemangledNameFromDWARF(const DWARFDIE &die)=0
virtual lldb::TypeSP ParseTypeFromDWARF(const SymbolContext &sc, const DWARFDIE &die, bool *type_is_new_ptr)=0
static std::optional< SymbolFile::ArrayInfo > ParseChildArrayInfo(const DWARFDIE &parent_die, const ExecutionContext *exe_ctx=nullptr)
virtual CompilerDeclContext GetDeclContextForUIDFromDWARF(const DWARFDIE &die)=0
DWARFUnit * CompileUnitAtIndex(uint32_t i) const
dw_attr_t AttributeAtIndex(uint32_t i) const
bool ExtractFormValueAtIndex(uint32_t i, DWARFFormValue &form_value) const
DWARFAttributes GetAttributes(Recurse recurse=Recurse::yes) const
std::optional< uint64_t > GetAttributeValueAsOptionalUnsigned(const dw_attr_t attr) const
const DWARFDataExtractor & GetData() const
const char * GetAttributeValueAsString(const dw_attr_t attr, const char *fail_value) const
std::optional< DIERef > GetDIERef() const
lldb::ModuleSP GetModule() const
SymbolFileDWARF * GetDWARF() const
DWARFDebugInfoEntry * GetDIE() const
DWARFUnit * GetCU() const
const char * GetName() const
uint64_t GetAttributeValueAsUnsigned(const dw_attr_t attr, uint64_t fail_value) const
dw_offset_t GetOffset() const
lldb::user_id_t GetID() const
DWARFDIE LookupAddress(const dw_addr_t address)
DWARFCompileUnit & GetNonSkeletonUnit()
const DWARFDataExtractor & getOrLoadLineData()
llvm::DWARFContext & GetAsLLVM()
void GetName(Stream &s) const
const char * GetMangledName(bool substitute_name_allowed=true) const
DWARFDIE GetFirstChild() const
DWARFDIE GetParent() const
bool GetDIENamesAndRanges(const char *&name, const char *&mangled, llvm::DWARFAddressRangesVector &ranges, std::optional< int > &decl_file, std::optional< int > &decl_line, std::optional< int > &decl_column, std::optional< int > &call_file, std::optional< int > &call_line, std::optional< int > &call_column, DWARFExpressionList *frame_base) const
DWARFDIE GetDIE(dw_offset_t die_offset) const
llvm::iterator_range< child_iterator > children() const
The range of all the children of this DIE.
DWARFDIE GetParentDeclContextDIE() const
std::vector< CompilerContext > GetDeclContext(bool derive_template_names=false) const
Return this DIE's decl context as it is needed to look up types in Clang modules.
DWARFDIE LookupDeepestBlock(lldb::addr_t file_addr) const
DWARFDIE GetAttributeValueAsReferenceDIE(const dw_attr_t attr) const
DWARFDeclContext GetDWARFDeclContext() const
child_iterator begin() const
DWARFDIE GetReferencedDIE(const dw_attr_t attr) const
std::vector< CompilerContext > GetTypeLookupContext(bool derive_template_names=false) const
Get a context to a type so it can be looked up.
const char * GetPubname() const
DWARFDIE GetSibling() const
dw_offset_t FindAddress(dw_addr_t address) const
DWARFDebugInfoEntry objects assume that they are living in one big vector and do pointer arithmetic o...
dw_offset_t GetOffset() const
std::optional< uint64_t > GetAttributeValueAsOptionalUnsigned(const DWARFUnit *cu, const dw_attr_t attr, bool check_elaborating_dies=false) const
DWARFDebugInfoEntry * GetParent()
const char * GetAttributeValueAsString(const DWARFUnit *cu, const dw_attr_t attr, const char *fail_value, bool check_elaborating_dies=false) const
DWARFUnit * GetSkeletonUnit(DWARFUnit *dwo_unit)
DWARFUnit * GetUnitAtOffset(DIERef::Section section, dw_offset_t cu_offset, uint32_t *idx_ptr=nullptr)
const DWARFDebugAranges & GetCompileUnitAranges()
DWARFDIE GetDIE(DIERef::Section section, dw_offset_t die_offset)
DWARFUnit * GetUnitAtIndex(size_t idx)
static void ReadMacroEntries(const DWARFDataExtractor &debug_macro_data, const DWARFDataExtractor &debug_str_data, const bool offset_is_64_bit, lldb::offset_t *sect_offset, SymbolFileDWARF *sym_file_dwarf, DebugMacrosSP &debug_macros_sp)
const char * GetQualifiedName() const
ConstString GetQualifiedNameAsConstString() const
void AppendDeclContext(dw_tag_t tag, const char *name)
FileSpec::Style GetPathStyle()
DWARFBaseDIE GetUnitDIEOnly()
void ExtractUnitDIEIfNeeded()
SymbolFileDWARF & GetSymbolFileDWARF() const
dw_offset_t GetLineTableOffset()
DWARFCompileUnit * GetSkeletonUnit()
Get the skeleton compile unit for a DWO file.
const Status & GetDwoError() const
Get the fission .dwo file specific error for this compile unit.
void SetLLDBCompUnit(lldb_private::CompileUnit *cu)
lldb_private::CompileUnit * GetLLDBCompUnit() const
dw_offset_t GetOffset() const
uint8_t GetAddressByteSize() const override
DWARFDataExtractor GetLocationData() const
die_iterator_range dies()
std::optional< uint64_t > GetLoclistOffset(uint32_t Index)
bool ParseDWARFLocationList(const DataExtractor &data, DWARFExpressionList &loc_list) const
void SetDwoError(Status &&error)
Set the fission .dwo file specific error for this compile unit.
uint64_t GetDWARFLanguageType()
DWARFUnit & GetNonSkeletonUnit()
DWARFDIE GetDIE(dw_offset_t die_offset)
lldb::ByteOrder GetByteOrder() const
SymbolFileDWARFDwo * GetDwoSymbolFile(bool load_all_debug_info=true)
uint16_t GetVersion() const override
const FileSpec & GetCompilationDirectory()
std::optional< uint64_t > GetDWOId()
Get the DWO ID from the DWARFUnitHeader for DWARF5, or from the unit DIE's DW_AT_dwo_id or DW_AT_GNU_...
bool HasAny(llvm::ArrayRef< dw_tag_t > tags)
Returns true if any DIEs in the unit match any DW_TAG values in tags.
FileSpec GetFile(size_t file_idx)
static llvm::Expected< std::unique_ptr< DebugNamesDWARFIndex > > Create(Module &module, DWARFDataExtractor debug_names, DWARFDataExtractor debug_str, SymbolFileDWARF &dwarf)
lldb::addr_t LinkOSOFileAddress(SymbolFileDWARF *oso_symfile, lldb::addr_t oso_file_addr)
Convert a .o file "file address" to an executable "file address".
bool LinkOSOAddress(Address &addr)
Convert addr from a .o file address, to an executable address.
UniqueDWARFASTTypeMap & GetUniqueDWARFASTTypeMap()
DWARFDIE FindDefinitionDIE(const DWARFDIE &die)
uint64_t GetDebugInfoSize(bool load_all_debug_info=false) override
Metrics gathering functions.
CompilerDeclContext GetDeclContextContainingUID(lldb::user_id_t uid) override
static CompilerDeclContext GetContainingDeclContext(const DWARFDIE &die)
static bool SupportedVersion(uint16_t version)
std::optional< uint32_t > GetDWARFUnitIndex(uint32_t cu_idx)
CompileUnit * GetCompUnitForDWARFCompUnit(DWARFCompileUnit &dwarf_cu)
lldb::ModuleSP GetExternalModule(ConstString name)
void BuildCuTranslationTable()
friend class DWARFASTParser
void FindGlobalVariables(ConstString name, const CompilerDeclContext &parent_decl_ctx, uint32_t max_matches, VariableList &variables) override
virtual DWARFDIE FindDefinitionDIE(const DWARFDIE &die)
DWARFDIE FindBlockContainingSpecification(const DIERef &func_die_ref, dw_offset_t spec_block_die_offset)
lldb::VariableSP ParseVariableDIE(const SymbolContext &sc, const DWARFDIE &die, const lldb::addr_t func_low_pc)
void UpdateExternalModuleListIfNeeded()
static DWARFASTParser * GetDWARFParser(DWARFUnit &unit)
static lldb::LanguageType GetLanguageFamily(DWARFUnit &unit)
Same as GetLanguage() but reports all C++ versions as C++ (no version).
bool ForEachExternalModule(CompileUnit &, llvm::DenseSet< SymbolFile * > &, llvm::function_ref< bool(Module &)>) override
static llvm::StringRef GetDwoDiagnosticSuffix()
static char ID
LLVM RTTI support.
std::unique_ptr< DWARFDebugInfo > m_info
bool DeclContextMatchesThisSymbolFile(const CompilerDeclContext &decl_ctx)
void GetMangledNamesForFunction(const std::string &scope_qualified_name, std::vector< ConstString > &mangled_names) override
size_t PopulateBlockVariableList(VariableList &variable_list, const SymbolContext &sc, llvm::ArrayRef< DIERef > variable_dies, lldb::addr_t func_low_pc)
Type * ResolveType(const DWARFDIE &die, bool assert_not_being_parsed=true, bool resolve_function_context=false)
DWOStats GetDwoStats() override
Gets statistics about dwo files associated with this symbol file.
virtual llvm::DenseMap< lldb::opaque_compiler_type_t, DIERef > & GetForwardDeclCompilerTypeToDIE()
llvm::DenseMap< const DWARFDebugInfoEntry *, lldb::VariableSP > DIEToVariableSP
friend class SymbolFileDWARFDwo
size_t ParseVariablesInFunctionContextRecursive(const SymbolContext &sc, const DWARFDIE &die, lldb::addr_t func_low_pc, DIEArray &accumulator)
virtual lldb::TypeSP FindCompleteObjCDefinitionTypeForDIE(const DWARFDIE &die, ConstString type_name, bool must_be_implementation)
const std::shared_ptr< SymbolFileDWARFDwo > & GetDwpSymbolFile()
std::recursive_mutex & GetModuleMutex() const override
Symbols file subclasses should override this to return the Module that owns the TypeSystem that this ...
bool GetSeparateDebugInfo(StructuredData::Dictionary &d, bool errors_only, bool load_all_debug_info=false) override
List separate dwo files.
UniqueDWARFASTTypeMap m_unique_ast_type_map
llvm::Expected< DWARFDIE > FindFunctionDefinition(const FunctionCallLabel &label, const DWARFDIE &declaration)
Find the definition DIE for the specified label in this SymbolFile.
bool m_fetched_external_modules
virtual llvm::DenseMap< const DWARFDebugInfoEntry *, Type * > & GetDIEToType()
GlobalVariableMap & GetGlobalAranges()
virtual DWARFCompileUnit * GetDWARFCompileUnit(CompileUnit *comp_unit)
llvm::SetVector< Type * > TypeSet
Function * ParseFunction(CompileUnit &comp_unit, const DWARFDIE &die)
friend class SymbolFileDWARFDebugMap
lldb::TypeSP GetTypeForDIE(const DWARFDIE &die, bool resolve_function_context=false)
friend class DWARFCompileUnit
llvm::Expected< SymbolContext > ResolveFunctionCallLabel(FunctionCallLabel &label) override
Resolves the function corresponding to the specified LLDB function call label.
lldb::addr_t m_first_code_address
DWARF does not provide a good way for traditional (concatenating) linkers to invalidate debug info de...
ConstString ConstructFunctionDemangledName(const DWARFDIE &die)
lldb::ModuleWP m_debug_map_module_wp
DWARFUnit * GetSkeletonUnit(DWARFUnit *dwo_unit)
Given a DWO DWARFUnit, find the corresponding skeleton DWARFUnit in the main symbol file.
FileSpec GetFile(DWARFUnit &unit, size_t file_idx)
std::shared_ptr< SymbolFileDWARFDwo > m_dwp_symfile
void DumpClangAST(Stream &s, llvm::StringRef filter, bool show_colors) override
void InitializeFirstCodeAddressRecursive(const SectionList §ion_list)
std::unique_ptr< llvm::DWARFDebugAbbrev > m_abbr
llvm::DenseMap< lldb::opaque_compiler_type_t, DIERef > m_forward_decl_compiler_type_to_die
std::vector< CompilerContext > GetCompilerContextForUID(lldb::user_id_t uid) override
virtual DWARFDIE GetDIE(const DIERef &die_ref)
static llvm::StringRef GetPluginNameStatic()
void InitializeFirstCodeAddress()
std::unique_ptr< GlobalVariableMap > m_global_aranges_up
llvm::once_flag m_info_once_flag
uint64_t GetDebugInfoSize(bool load_all_debug_info=false) override
Metrics gathering functions.
void FindTypes(const lldb_private::TypeQuery &match, lldb_private::TypeResults &results) override
Find types using a type-matching object that contains all search parameters.
static CompilerDecl GetDecl(const DWARFDIE &die)
void ResolveFunctionAndBlock(lldb::addr_t file_vm_addr, bool lookup_block, SymbolContext &sc)
Resolve functions and (possibly) blocks for the given file address and a compile unit.
void ResetStatistics() override
Reset the statistics for the symbol file.
size_t ParseVariablesForContext(const SymbolContext &sc) override
uint32_t CalculateNumCompileUnits() override
std::optional< ArrayInfo > GetDynamicArrayInfoForUID(lldb::user_id_t type_uid, const ExecutionContext *exe_ctx) override
If type_uid points to an array type, return its characteristics.
size_t ParseBlocksRecursive(Function &func) override
ExternalTypeModuleMap m_external_type_modules
Type * ResolveTypeUID(lldb::user_id_t type_uid) override
static lldb::LanguageType GetLanguage(DWARFUnit &unit)
bool ClassOrStructIsVirtual(const DWARFDIE &die)
llvm::DenseMap< dw_offset_t, std::unique_ptr< SupportFileList > > m_type_unit_support_files
size_t ParseFunctions(CompileUnit &comp_unit) override
bool ParseDebugMacros(CompileUnit &comp_unit) override
NameToOffsetMap m_function_scope_qualified_name_map
static SymbolFile * CreateInstance(lldb::ObjectFileSP objfile_sp)
std::atomic_flag m_dwo_warning_issued
bool ParseSupportFiles(CompileUnit &comp_unit, SupportFileList &support_files) override
bool ParseImportedModules(const SymbolContext &sc, std::vector< SourceModule > &imported_modules) override
std::optional< uint64_t > GetDWOId()
If this is a DWARF object with a single CU, return its DW_AT_dwo_id.
uint32_t CalculateAbilities() override
void GetTypes(SymbolContextScope *sc_scope, lldb::TypeClass type_mask, TypeList &type_list) override
SymbolFileDWARFDebugMap * GetDebugMapSymfile()
void ParseDeclsForContext(CompilerDeclContext decl_ctx) override
size_t ParseTypes(CompileUnit &comp_unit) override
std::shared_ptr< SymbolFileDWARFDwo > GetDwoSymbolFileForCompileUnit(DWARFUnit &dwarf_cu, const DWARFDebugInfoEntry &cu_die)
SymbolFileDWARF(lldb::ObjectFileSP objfile_sp, SectionList *dwo_section_list)
~SymbolFileDWARF() override
lldb::VariableSP ParseVariableDIECached(const SymbolContext &sc, const DWARFDIE &die)
lldb_private::ModuleSpecList GetSeparateDebugInfoFiles() override
Return a map of separate debug info files that are loaded.
StatsDuration::Duration GetDebugInfoIndexTime() override
Return the time it took to index the debug information in the object file.
bool CompleteType(CompilerType &compiler_type) override
DWARFDebugInfo & DebugInfo()
bool ParseLineTable(CompileUnit &comp_unit) override
lldb::TypeSP GetTypeEnclosingVariableUID(lldb::user_id_t uid) override
Get the semantically innermost non-function type that encloses the provided variable.
bool ResolveFunction(const DWARFDIE &die, bool include_inlines, SymbolContextList &sc_list)
bool ParseIsOptimized(CompileUnit &comp_unit) override
static llvm::StringRef GetPluginDescriptionStatic()
std::vector< std::unique_ptr< CallEdge > > CollectCallEdges(lldb::ModuleSP module, DWARFDIE function_die)
Parse call site entries (DW_TAG_call_site), including any nested call site parameters (DW_TAG_call_si...
void Dump(Stream &s) override
DIEArray MergeBlockAbstractParameters(const DWARFDIE &block_die, DIEArray &&variable_dies)
DWARFDIE GetDeclContextDIEContainingDIE(const DWARFDIE &die)
SymbolFileDWARFDebugMap * m_debug_map_symfile
void InitializeObject() override
Initialize the SymbolFile object.
void ParseAndAppendGlobalVariable(const SymbolContext &sc, const DWARFDIE &die, VariableList &cc_variable_list)
static llvm::Expected< lldb::TypeSystemSP > GetTypeSystem(DWARFUnit &unit)
std::vector< uint32_t > m_lldb_cu_to_dwarf_unit
XcodeSDKAndSysroot ParseXcodeSDK(CompileUnit &comp_unit) override
Return the Xcode SDK comp_unit was compiled against.
void FindFunctions(const Module::LookupInfo &lookup_info, const CompilerDeclContext &parent_decl_ctx, bool include_inlines, SymbolContextList &sc_list) override
static bool DIEInDeclContext(const CompilerDeclContext &parent_decl_ctx, const DWARFDIE &die, bool only_root_namespaces=false)
uint32_t ResolveSymbolContext(const Address &so_addr, lldb::SymbolContextItem resolve_scope, SymbolContext &sc) override
std::unique_ptr< DWARFIndex > m_index
bool HasForwardDeclForCompilerType(const CompilerType &compiler_type)
void PreloadSymbols() override
TypeList & GetTypeList() override
lldb::CompUnitSP ParseCompileUnit(DWARFCompileUnit &dwarf_cu)
CompilerDeclContext FindNamespace(ConstString name, const CompilerDeclContext &parent_decl_ctx, bool only_root_namespaces) override
Finds a namespace of name name and whose parent context is parent_decl_ctx.
lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index) override
static lldb::LanguageType LanguageTypeFromDWARF(uint64_t val)
lldb::TypeSP ParseType(const SymbolContext &sc, const DWARFDIE &die, bool *type_is_new)
static DWARFDIE GetParentSymbolContextDIE(const DWARFDIE &die)
std::vector< std::unique_ptr< CallEdge > > ParseCallEdgesInFunction(UserID func_id) override
lldb::addr_t FixupAddress(lldb::addr_t file_addr)
If this symbol file is linked to by a debug map (see SymbolFileDWARFDebugMap), and file_addr is a fil...
virtual void GetObjCMethods(ConstString class_name, llvm::function_ref< IterationAction(DWARFDIE die)> callback)
llvm::Expected< lldb::TypeSystemSP > GetTypeSystemForLanguage(lldb::LanguageType language) override
CompilerDecl GetDeclForUID(lldb::user_id_t uid) override
virtual SymbolFileDWARF * GetDIERefSymbolFile(const DIERef &die_ref)
Given a DIERef, find the correct SymbolFileDWARF.
lldb::LanguageType ParseLanguage(CompileUnit &comp_unit) override
StatsDuration m_parse_time
llvm::once_flag m_dwp_symfile_once_flag
CompilerDeclContext GetDeclContextForUID(lldb::user_id_t uid) override
static void DebuggerInitialize(Debugger &debugger)
RangeDataVector< lldb::addr_t, lldb::addr_t, Variable * > GlobalVariableMap
size_t ParseVariablesInFunctionContext(const SymbolContext &sc, const DWARFDIE &die, const lldb::addr_t func_low_pc)
DebugMacrosMap m_debug_macros_map
llvm::DWARFDebugAbbrev * DebugAbbrev()
llvm::DenseMap< const DWARFDebugInfoEntry *, Type * > m_die_to_type
bool GetFunction(const DWARFDIE &die, SymbolContext &sc)
const SupportFileList * GetTypeUnitSupportFiles(DWARFTypeUnit &tu)
virtual DIEToVariableSP & GetDIEToVariable()
std::optional< uint64_t > GetFileIndex() const
Symbol * GetObjCClassSymbol(ConstString objc_class_name)
static CompilerDeclContext GetDeclContext(const DWARFDIE &die)
virtual UniqueDWARFASTTypeMap & GetUniqueDWARFASTTypeMap()
virtual void LoadSectionData(lldb::SectionType sect_type, DWARFDataExtractor &data)
Status CalculateFrameVariableError(StackFrame &frame) override
Subclasses will override this function to for GetFrameVariableError().
#define DW_INVALID_OFFSET
llvm::dwarf::Tag dw_tag_t
#define DW_DIE_OFFSET_MAX_BITSIZE
llvm::dwarf::Attribute dw_attr_t
#define LLDB_INVALID_ADDRESS
llvm::StringRef DW_TAG_value_to_name(dw_tag_t tag)
std::vector< DIERef > DIEArray
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
NonNullSharedPtr< lldb_private::SupportFile > SupportFileNSP
NativeFilePosix NativeFile
std::shared_ptr< DebugMacros > DebugMacrosSP
llvm::SmallVector< CallSiteParameter, 0 > CallSiteParameterArray
A vector of CallSiteParameter.
IterationAction
Useful for callbacks whose return type indicates whether to continue iteration or short-circuit.
std::shared_ptr< lldb_private::TypeSystem > TypeSystemSP
std::shared_ptr< lldb_private::ObjectFile > ObjectFileSP
LanguageType
Programming language type.
@ eLanguageTypeMipsAssembler
Mips_Assembler.
@ eLanguageTypeUnknown
Unknown or invalid language value.
@ eLanguageTypeC_plus_plus
ISO C++:1998.
@ eLanguageTypeLastStandardLanguage
std::shared_ptr< lldb_private::Type > TypeSP
std::shared_ptr< lldb_private::VariableList > VariableListSP
std::shared_ptr< lldb_private::Variable > VariableSP
@ eValueTypeVariableGlobal
globals variable
@ eValueTypeVariableLocal
function local variables
@ eValueTypeVariableArgument
function argument variables
@ eValueTypeVariableStatic
static variable
@ eValueTypeVariableThreadLocal
thread local storage variable
std::shared_ptr< lldb_private::Section > SectionSP
@ eSectionTypeDWARFAppleNamespaces
@ eSectionTypeDWARFDebugNames
DWARF v5 .debug_names.
@ eSectionTypeDWARFAppleTypes
@ eSectionTypeDWARFDebugInfo
@ eSectionTypeDWARFDebugLine
@ eSectionTypeDWARFDebugStr
@ eSectionTypeDWARFAppleNames
@ eSectionTypeDWARFAppleObjC
@ eSectionTypeDWARFDebugAbbrev
std::shared_ptr< lldb_private::DataExtractor > DataExtractorSP
std::shared_ptr< lldb_private::Module > ModuleSP
std::shared_ptr< lldb_private::CompileUnit > CompUnitSP
Represent the locations of a parameter at a call site, both in the caller and in the callee.
static CompilerType RemoveFastQualifiers(const CompilerType &ct)
Holds statistics about DWO (Debug With Object) files.
uint32_t loaded_dwo_file_count
Holds parsed information about a function call label that LLDB attaches as an AsmLabel to function AS...
lldb::user_id_t symbol_id
Unique identifier of the function symbol on which to perform the function call.
llvm::StringRef discriminator
Arbitrary string which language plugins can interpret for their own needs.
llvm::StringRef lookup_name
Name to use when searching for the function symbol in module_id.
Information needed to import a source-language module.
std::vector< ConstString > path
Something like "Module.Submodule".
A mix in class that contains a generic user ID.
lldb::user_id_t GetID() const
Get accessor for the user ID.