diff options
Diffstat (limited to 'lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp')
-rw-r--r-- | lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 36cedb1ac88..7f165f428ed 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -1091,9 +1091,42 @@ SymbolFileDWARF::ParseImportedModules (const lldb_private::SymbolContext &sc, st if (ClangModulesDeclVendor::LanguageSupportsClangModules(sc.comp_unit->GetLanguage())) { UpdateExternalModuleListIfNeeded(); - for (const auto &pair : m_external_type_modules) + + if (sc.comp_unit) { - imported_modules.push_back(pair.first); + DWARFCompileUnit *dwarf_cu = GetDWARFCompileUnit (sc.comp_unit); + + const DWARFDIE die = dwarf_cu->GetCompileUnitDIEOnly(); + + if (die) + { + for (DWARFDIE child_die = die.GetFirstChild(); + child_die; + child_die = child_die.GetSibling()) + { + if (child_die.Tag() == DW_TAG_imported_declaration) + { + if (DWARFDIE module_die = child_die.GetReferencedDIE(DW_AT_import)) + { + if (module_die.Tag() == DW_TAG_module) + { + if (const char *name = module_die.GetAttributeValueAsString(DW_AT_name, nullptr)) + { + ConstString const_name(name); + imported_modules.push_back(const_name); + } + } + } + } + } + } + } + else + { + for (const auto &pair : m_external_type_modules) + { + imported_modules.push_back(pair.first); + } } } } |