From 0f30a3b68fa8d687d041c8cd69ed8018d1ed0c84 Mon Sep 17 00:00:00 2001 From: Adrian Prantl Date: Wed, 13 Feb 2019 18:10:41 +0000 Subject: [PATCH] Deserialize Clang module search path from DWARF This patch properly extracts the full submodule path as well as its search paths from DWARF import decls and passes it on to the ClangModulesDeclVendor. rdar://problem/47970144 Differential Revision: https://reviews.llvm.org/D58090 llvm-svn: 353961 --- lldb/include/lldb/Symbol/CompileUnit.h | 43 +++++------ lldb/include/lldb/Symbol/SourceModule.h | 27 +++++++ lldb/include/lldb/Symbol/SymbolFile.h | 3 +- lldb/include/lldb/Symbol/SymbolVendor.h | 6 +- .../test/lang/cpp/modules-import/Bar.h | 1 + .../test/lang/cpp/modules-import/Foo.h | 1 + .../test/lang/cpp/modules-import/Makefile | 6 ++ .../modules-import/TestCXXModulesImport.py | 31 ++++++++ .../test/lang/cpp/modules-import/main.cpp | 7 ++ .../lang/cpp/modules-import/module.modulemap | 7 ++ .../Clang/ClangExpressionParser.cpp | 15 ++-- .../Clang/ClangModulesDeclVendor.cpp | 70 +++++++++++------- .../Clang/ClangModulesDeclVendor.h | 5 +- .../SymbolFile/Breakpad/SymbolFileBreakpad.h | 6 +- .../SymbolFile/DWARF/SymbolFileDWARF.cpp | 73 +++++++++++-------- .../SymbolFile/DWARF/SymbolFileDWARF.h | 2 +- .../DWARF/SymbolFileDWARFDebugMap.cpp | 2 +- .../DWARF/SymbolFileDWARFDebugMap.h | 2 +- .../NativePDB/SymbolFileNativePDB.cpp | 2 +- .../NativePDB/SymbolFileNativePDB.h | 6 +- .../Plugins/SymbolFile/PDB/SymbolFilePDB.cpp | 2 +- .../Plugins/SymbolFile/PDB/SymbolFilePDB.h | 2 +- .../SymbolFile/Symtab/SymbolFileSymtab.cpp | 2 +- .../SymbolFile/Symtab/SymbolFileSymtab.h | 2 +- lldb/source/Symbol/CompileUnit.cpp | 2 +- lldb/source/Symbol/SymbolVendor.cpp | 2 +- 26 files changed, 219 insertions(+), 108 deletions(-) create mode 100644 lldb/include/lldb/Symbol/SourceModule.h create mode 100644 lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/Bar.h create mode 100644 lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/Foo.h create mode 100644 lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/Makefile create mode 100644 lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/TestCXXModulesImport.py create mode 100644 lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/main.cpp create mode 100644 lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/module.modulemap diff --git a/lldb/include/lldb/Symbol/CompileUnit.h b/lldb/include/lldb/Symbol/CompileUnit.h index d5447940956b..0468e53cc715 100644 --- a/lldb/include/lldb/Symbol/CompileUnit.h +++ b/lldb/include/lldb/Symbol/CompileUnit.h @@ -266,7 +266,7 @@ public: /// @return /// A list of imported module names. //------------------------------------------------------------------ - const std::vector &GetImportedModules(); + const std::vector &GetImportedModules(); //------------------------------------------------------------------ /// Get the SymbolFile plug-in user data. @@ -414,28 +414,29 @@ public: size_t GetNumFunctions() const { return m_functions_by_uid.size(); } protected: - void *m_user_data; ///< User data for the SymbolFile parser to store - ///information into. - lldb::LanguageType - m_language; ///< The programming language enumeration value. - Flags m_flags; ///< Compile unit flags that help with partial parsing. - + /// User data for the SymbolFile parser to store information into. + void *m_user_data; + /// The programming language enumeration value. + lldb::LanguageType m_language; + /// Compile unit flags that help with partial parsing. + Flags m_flags; /// Maps UIDs to functions. llvm::DenseMap m_functions_by_uid; - std::vector m_imported_modules; ///< All modules, including the - ///current module, imported by - ///this - ///< compile unit. - FileSpecList m_support_files; ///< Files associated with this compile unit's - ///line table and declarations. - std::unique_ptr - m_line_table_up; ///< Line table that will get parsed on demand. - DebugMacrosSP - m_debug_macros_sp; ///< Debug macros that will get parsed on demand. - lldb::VariableListSP m_variables; ///< Global and static variable list that - ///will get parsed on demand. - lldb_private::LazyBool m_is_optimized; /// eLazyBoolYes if this compile unit - /// was compiled with optimization. + /// All modules, including the current module, imported by this + /// compile unit. + std::vector m_imported_modules; + /// Files associated with this compile unit's line table and + /// declarations. + FileSpecList m_support_files; + /// Line table that will get parsed on demand. + std::unique_ptr m_line_table_up; + /// Debug macros that will get parsed on demand. + DebugMacrosSP m_debug_macros_sp; + /// Global and static variable list that will get parsed on demand. + lldb::VariableListSP m_variables; + /// eLazyBoolYes if this compile unit was compiled with + /// optimization. + lldb_private::LazyBool m_is_optimized; private: enum { diff --git a/lldb/include/lldb/Symbol/SourceModule.h b/lldb/include/lldb/Symbol/SourceModule.h new file mode 100644 index 000000000000..cac99bab65ce --- /dev/null +++ b/lldb/include/lldb/Symbol/SourceModule.h @@ -0,0 +1,27 @@ +//===-- SourceModule.h ------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_SourceModule_h_ +#define liblldb_SourceModule_h_ + +#include "lldb/Utility/ConstString.h" +#include + +namespace lldb_private { + +/// Information needed to import a source-language module. +struct SourceModule { + /// Something like "Module.Submodule". + std::vector path; + ConstString search_path; + ConstString sysroot; +}; + +}; // namespace lldb_private + +#endif diff --git a/lldb/include/lldb/Symbol/SymbolFile.h b/lldb/include/lldb/Symbol/SymbolFile.h index bdcebe16e4eb..b77f167c2257 100644 --- a/lldb/include/lldb/Symbol/SymbolFile.h +++ b/lldb/include/lldb/Symbol/SymbolFile.h @@ -14,6 +14,7 @@ #include "lldb/Symbol/CompilerDeclContext.h" #include "lldb/Symbol/CompilerType.h" #include "lldb/Symbol/Function.h" +#include "lldb/Symbol/SourceModule.h" #include "lldb/Symbol/Type.h" #include "lldb/lldb-private.h" @@ -135,7 +136,7 @@ public: virtual bool ParseImportedModules(const SymbolContext &sc, - std::vector &imported_modules) = 0; + std::vector &imported_modules) = 0; virtual size_t ParseBlocksRecursive(Function &func) = 0; virtual size_t ParseVariablesForContext(const SymbolContext &sc) = 0; virtual Type *ResolveTypeUID(lldb::user_id_t type_uid) = 0; diff --git a/lldb/include/lldb/Symbol/SymbolVendor.h b/lldb/include/lldb/Symbol/SymbolVendor.h index 37bea65f3869..27b2ac99af04 100644 --- a/lldb/include/lldb/Symbol/SymbolVendor.h +++ b/lldb/include/lldb/Symbol/SymbolVendor.h @@ -13,6 +13,7 @@ #include "lldb/Core/ModuleChild.h" #include "lldb/Core/PluginInterface.h" +#include "lldb/Symbol/SourceModule.h" #include "lldb/Symbol/TypeList.h" #include "lldb/Symbol/TypeMap.h" #include "lldb/lldb-private.h" @@ -60,8 +61,9 @@ public: virtual size_t ParseTypes(CompileUnit &comp_unit); - virtual bool ParseImportedModules(const SymbolContext &sc, - std::vector &imported_modules); + virtual bool + ParseImportedModules(const SymbolContext &sc, + std::vector &imported_modules); virtual size_t ParseBlocksRecursive(Function &func); diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/Bar.h b/lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/Bar.h new file mode 100644 index 000000000000..3d9a88c024d5 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/Bar.h @@ -0,0 +1 @@ +struct Bar { int success; }; diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/Foo.h b/lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/Foo.h new file mode 100644 index 000000000000..1fe02e89786c --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/Foo.h @@ -0,0 +1 @@ +struct Foo {}; diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/Makefile b/lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/Makefile new file mode 100644 index 000000000000..796b4dc5ef33 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/Makefile @@ -0,0 +1,6 @@ +LEVEL = ../../../make +CXX_SOURCES := main.cpp + +CFLAGS += $(MANDATORY_MODULE_BUILD_CFLAGS) + +include $(LEVEL)/Makefile.rules diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/TestCXXModulesImport.py b/lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/TestCXXModulesImport.py new file mode 100644 index 000000000000..9601db2586a8 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/TestCXXModulesImport.py @@ -0,0 +1,31 @@ +"""Test that importing modules in C++ works as expected.""" + +from __future__ import print_function + + +from distutils.version import StrictVersion +import unittest2 +import os +import time +import lldb +import platform + +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + + +class CXXModulesImportTestCase(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + @skipUnlessDarwin + @skipIf(macos_version=["<", "10.12"]) + def test_expr(self): + self.build() + exe = self.getBuildArtifact("a.out") + target, process, thread, bkpt = lldbutil.run_to_source_breakpoint( + self, 'break here', lldb.SBFileSpec('main.cpp')) + + self.expect("expr -- @import Bar") + self.expect("expr -- Bar()", substrs = ["success"]) diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/main.cpp b/lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/main.cpp new file mode 100644 index 000000000000..a6acf9a1a699 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/main.cpp @@ -0,0 +1,7 @@ +#include "Foo.h" + +int main(int argc, char **argv) { + Foo foo; + // break here. + return 0; +} diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/module.modulemap b/lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/module.modulemap new file mode 100644 index 000000000000..4221d0f91340 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/modules-import/module.modulemap @@ -0,0 +1,7 @@ +module Foo { + header "Foo.h" +} + +module Bar { + header "Bar.h" +} diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp index 266b1e229634..acb08a698e12 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp @@ -113,24 +113,19 @@ public: void moduleImport(SourceLocation import_location, clang::ModuleIdPath path, const clang::Module * /*null*/) override { - std::vector string_path; + SourceModule module; - for (const std::pair &component : path) { - string_path.push_back(ConstString(component.first->getName())); - } + for (const std::pair &component : path) + module.path.push_back(ConstString(component.first->getName())); StreamString error_stream; ClangModulesDeclVendor::ModuleVector exported_modules; - - if (!m_decl_vendor.AddModule(string_path, &exported_modules, - m_error_stream)) { + if (!m_decl_vendor.AddModule(module, &exported_modules, m_error_stream)) m_has_errors = true; - } - for (ClangModulesDeclVendor::ModuleID module : exported_modules) { + for (ClangModulesDeclVendor::ModuleID module : exported_modules) m_persistent_vars.AddHandLoadedClangModule(module); - } } bool hasErrors() { return m_has_errors; } diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp index de5c8098511f..b08c4540fe2a 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp @@ -28,6 +28,7 @@ #include "lldb/Host/Host.h" #include "lldb/Host/HostInfo.h" #include "lldb/Symbol/CompileUnit.h" +#include "lldb/Symbol/SourceModule.h" #include "lldb/Target/Target.h" #include "lldb/Utility/FileSpec.h" #include "lldb/Utility/LLDBAssert.h" @@ -71,7 +72,7 @@ public: ~ClangModulesDeclVendorImpl() override = default; - bool AddModule(ModulePath &path, ModuleVector *exported_modules, + bool AddModule(const SourceModule &module, ModuleVector *exported_modules, Stream &error_stream) override; bool AddModulesForCompileUnit(CompileUnit &cu, ModuleVector &exported_modules, @@ -184,7 +185,7 @@ void ClangModulesDeclVendorImpl::ReportModuleExports( } } -bool ClangModulesDeclVendorImpl::AddModule(ModulePath &path, +bool ClangModulesDeclVendorImpl::AddModule(const SourceModule &module, ModuleVector *exported_modules, Stream &error_stream) { // Fail early. @@ -199,7 +200,7 @@ bool ClangModulesDeclVendorImpl::AddModule(ModulePath &path, std::vector imported_module; - for (ConstString path_component : path) { + for (ConstString path_component : module.path) { imported_module.push_back(path_component); } @@ -214,11 +215,34 @@ bool ClangModulesDeclVendorImpl::AddModule(ModulePath &path, } } - if (!m_compiler_instance->getPreprocessor() - .getHeaderSearchInfo() - .lookupModule(path[0].GetStringRef())) { + clang::HeaderSearch &HS = + m_compiler_instance->getPreprocessor().getHeaderSearchInfo(); + + if (module.search_path) { + auto path_begin = llvm::sys::path::begin(module.search_path.GetStringRef()); + auto path_end = llvm::sys::path::end(module.search_path.GetStringRef()); + auto sysroot_begin = llvm::sys::path::begin(module.sysroot.GetStringRef()); + auto sysroot_end = llvm::sys::path::end(module.sysroot.GetStringRef()); + // FIXME: Use C++14 std::equal(it, it, it, it) variant once it's available. + bool is_system_module = (std::distance(path_begin, path_end) >= + std::distance(sysroot_begin, sysroot_end)) && + std::equal(sysroot_begin, sysroot_end, path_begin); + // No need to inject search paths to modules in the sysroot. + if (!is_system_module) { + bool is_system = true; + bool is_framework = false; + auto *dir = + HS.getFileMgr().getDirectory(module.search_path.GetStringRef()); + auto *file = HS.lookupModuleMapFile(dir, is_framework); + if (!HS.loadModuleMapFile(file, is_system)) + error_stream.Printf("error: No module map file in %s\n", + module.search_path.AsCString()); + return false; + } + } + if (!HS.lookupModule(module.path.front().GetStringRef())) { error_stream.Printf("error: Header search couldn't locate module %s\n", - path[0].AsCString()); + module.path.front().AsCString()); return false; } @@ -230,7 +254,7 @@ bool ClangModulesDeclVendorImpl::AddModule(ModulePath &path, clang::SourceManager &source_manager = m_compiler_instance->getASTContext().getSourceManager(); - for (ConstString path_component : path) { + for (ConstString path_component : module.path) { clang_path.push_back(std::make_pair( &m_compiler_instance->getASTContext().Idents.get( path_component.GetStringRef()), @@ -250,19 +274,18 @@ bool ClangModulesDeclVendorImpl::AddModule(ModulePath &path, if (!top_level_module) { diagnostic_consumer->DumpDiagnostics(error_stream); error_stream.Printf("error: Couldn't load top-level module %s\n", - path[0].AsCString()); + module.path.front().AsCString()); return false; } clang::Module *submodule = top_level_module; - for (size_t ci = 1; ci < path.size(); ++ci) { - llvm::StringRef component = path[ci].GetStringRef(); - submodule = submodule->findSubmodule(component.str()); + for (auto &component : llvm::ArrayRef(module.path).drop_front()) { + submodule = submodule->findSubmodule(component.GetStringRef()); if (!submodule) { diagnostic_consumer->DumpDiagnostics(error_stream); error_stream.Printf("error: Couldn't load submodule %s\n", - component.str().c_str()); + component.GetCString()); return false; } } @@ -289,12 +312,16 @@ bool ClangModulesDeclVendor::LanguageSupportsClangModules( switch (language) { default: return false; - // C++ and friends to be added case lldb::LanguageType::eLanguageTypeC: case lldb::LanguageType::eLanguageTypeC11: case lldb::LanguageType::eLanguageTypeC89: case lldb::LanguageType::eLanguageTypeC99: + case lldb::LanguageType::eLanguageTypeC_plus_plus: + case lldb::LanguageType::eLanguageTypeC_plus_plus_03: + case lldb::LanguageType::eLanguageTypeC_plus_plus_11: + case lldb::LanguageType::eLanguageTypeC_plus_plus_14: case lldb::LanguageType::eLanguageTypeObjC: + case lldb::LanguageType::eLanguageTypeObjC_plus_plus: return true; } } @@ -303,21 +330,10 @@ bool ClangModulesDeclVendorImpl::AddModulesForCompileUnit( CompileUnit &cu, ClangModulesDeclVendor::ModuleVector &exported_modules, Stream &error_stream) { if (LanguageSupportsClangModules(cu.GetLanguage())) { - std::vector imported_modules = cu.GetImportedModules(); - - for (ConstString imported_module : imported_modules) { - std::vector path; - - path.push_back(imported_module); - - if (!AddModule(path, &exported_modules, error_stream)) { + for (auto &imported_module : cu.GetImportedModules()) + if (!AddModule(imported_module, &exported_modules, error_stream)) return false; - } - } - - return true; } - return true; } diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h b/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h index bcb233a2e1da..c5b5a88358e0 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h @@ -36,7 +36,7 @@ public: //------------------------------------------------------------------ /// Add a module to the list of modules to search. /// - /// @param[in] path + /// @param[in] module /// The path to the exact module to be loaded. E.g., if the desired /// module is std.io, then this should be { "std", "io" }. /// @@ -53,7 +53,8 @@ public: /// compiler encountered a fatal error during a previous module /// load, then this will always return false for this ModuleImporter. //------------------------------------------------------------------ - virtual bool AddModule(ModulePath &path, ModuleVector *exported_modules, + virtual bool AddModule(const SourceModule &module, + ModuleVector *exported_modules, Stream &error_stream) = 0; //------------------------------------------------------------------ diff --git a/lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h b/lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h index 373a633403a3..ef3073b341d5 100644 --- a/lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h +++ b/lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h @@ -69,9 +69,9 @@ public: FileSpecList &support_files) override; size_t ParseTypes(CompileUnit &cu) override { return 0; } - bool - ParseImportedModules(const SymbolContext &sc, - std::vector &imported_modules) override { + bool ParseImportedModules( + const SymbolContext &sc, + std::vector &imported_modules) override { return false; } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 6a1e67411bab..55beef0abc11 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -72,6 +72,7 @@ #include "llvm/Support/FileSystem.h" +#include #include #include @@ -911,43 +912,57 @@ bool SymbolFileDWARF::ParseIsOptimized(CompileUnit &comp_unit) { bool SymbolFileDWARF::ParseImportedModules( const lldb_private::SymbolContext &sc, - std::vector &imported_modules) { + std::vector &imported_modules) { ASSERT_MODULE_LOCK(this); assert(sc.comp_unit); DWARFUnit *dwarf_cu = GetDWARFCompileUnit(sc.comp_unit); - if (dwarf_cu) { - if (ClangModulesDeclVendor::LanguageSupportsClangModules( - sc.comp_unit->GetLanguage())) { - UpdateExternalModuleListIfNeeded(); + if (!dwarf_cu) + return false; + if (!ClangModulesDeclVendor::LanguageSupportsClangModules( + sc.comp_unit->GetLanguage())) + return false; + UpdateExternalModuleListIfNeeded(); - if (sc.comp_unit) { - const DWARFDIE die = dwarf_cu->DIE(); + if (!sc.comp_unit) + return false; - 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); - } + const DWARFDIE die = dwarf_cu->DIE(); + if (!die) + return false; + + for (DWARFDIE child_die = die.GetFirstChild(); child_die; + child_die = child_die.GetSibling()) { + if (child_die.Tag() != DW_TAG_imported_declaration) + continue; + + DWARFDIE module_die = child_die.GetReferencedDIE(DW_AT_import); + if (module_die.Tag() != DW_TAG_module) + continue; + + if (const char *name = + module_die.GetAttributeValueAsString(DW_AT_name, nullptr)) { + SourceModule module; + module.path.push_back(ConstString(name)); + + DWARFDIE parent_die = module_die; + while ((parent_die = parent_die.GetParent())) { + if (parent_die.Tag() != DW_TAG_module) + break; + if (const char *name = + parent_die.GetAttributeValueAsString(DW_AT_name, nullptr)) + module.path.push_back(ConstString(name)); } + std::reverse(module.path.begin(), module.path.end()); + if (const char *include_path = module_die.GetAttributeValueAsString( + DW_AT_LLVM_include_path, nullptr)) + module.search_path = ConstString(include_path); + if (const char *sysroot = module_die.GetAttributeValueAsString( + DW_AT_LLVM_isysroot, nullptr)) + module.sysroot = ConstString(sysroot); + imported_modules.push_back(module); } } - return false; + return true; } struct ParseDWARFLineTableCallbackInfo { diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index 36c267a2d860..a93129d201c5 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -125,7 +125,7 @@ public: bool ParseImportedModules( const lldb_private::SymbolContext &sc, - std::vector &imported_modules) override; + std::vector &imported_modules) override; size_t ParseBlocksRecursive(lldb_private::Function &func) override; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp index eccc757bffdd..8bb41ad09af9 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -670,7 +670,7 @@ bool SymbolFileDWARFDebugMap::ParseIsOptimized(CompileUnit &comp_unit) { } bool SymbolFileDWARFDebugMap::ParseImportedModules( - const SymbolContext &sc, std::vector &imported_modules) { + const SymbolContext &sc, std::vector &imported_modules) { SymbolFileDWARF *oso_dwarf = GetSymbolFile(sc); if (oso_dwarf) return oso_dwarf->ParseImportedModules(sc, imported_modules); diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h index da50b4853cf5..c44f034fa2b6 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h @@ -72,7 +72,7 @@ public: bool ParseImportedModules( const lldb_private::SymbolContext &sc, - std::vector &imported_modules) override; + std::vector &imported_modules) override; size_t ParseBlocksRecursive(lldb_private::Function &func) override; size_t ParseVariablesForContext(const lldb_private::SymbolContext &sc) override; diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp index fecae7af0e11..004609f599b0 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp +++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp @@ -1136,7 +1136,7 @@ bool SymbolFileNativePDB::ParseSupportFiles(CompileUnit &comp_unit, } bool SymbolFileNativePDB::ParseImportedModules( - const SymbolContext &sc, std::vector &imported_modules) { + const SymbolContext &sc, std::vector &imported_modules) { // PDB does not yet support module debug info return false; } diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h index 22e9fb7ebb45..1264244b622f 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h +++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h @@ -94,9 +94,9 @@ public: FileSpecList &support_files) override; size_t ParseTypes(lldb_private::CompileUnit &comp_unit) override; - bool - ParseImportedModules(const SymbolContext &sc, - std::vector &imported_modules) override; + bool ParseImportedModules( + const SymbolContext &sc, + std::vector &imported_modules) override; size_t ParseBlocksRecursive(Function &func) override; diff --git a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp index 8d71b1309b1c..2c079c3a2ca7 100644 --- a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp +++ b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp @@ -377,7 +377,7 @@ bool SymbolFilePDB::ParseSupportFiles( bool SymbolFilePDB::ParseImportedModules( const lldb_private::SymbolContext &sc, - std::vector &imported_modules) { + std::vector &imported_modules) { // PDB does not yet support module debug info return false; } diff --git a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h index ee0c6d28353b..e3b093175071 100644 --- a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h +++ b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h @@ -74,7 +74,7 @@ public: bool ParseImportedModules( const lldb_private::SymbolContext &sc, - std::vector &imported_modules) override; + std::vector &imported_modules) override; size_t ParseBlocksRecursive(lldb_private::Function &func) override; diff --git a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp index c875f88325f5..d593e6313ebf 100644 --- a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp +++ b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp @@ -221,7 +221,7 @@ bool SymbolFileSymtab::ParseSupportFiles(CompileUnit &comp_unit, } bool SymbolFileSymtab::ParseImportedModules( - const SymbolContext &sc, std::vector &imported_modules) { + const SymbolContext &sc, std::vector &imported_modules) { return false; } diff --git a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h index 5247b9fd2862..f2e90c954512 100644 --- a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h +++ b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h @@ -63,7 +63,7 @@ public: bool ParseImportedModules( const lldb_private::SymbolContext &sc, - std::vector &imported_modules) override; + std::vector &imported_modules) override; size_t ParseBlocksRecursive(lldb_private::Function &func) override; diff --git a/lldb/source/Symbol/CompileUnit.cpp b/lldb/source/Symbol/CompileUnit.cpp index 940090be1d34..561f7cc25bd4 100644 --- a/lldb/source/Symbol/CompileUnit.cpp +++ b/lldb/source/Symbol/CompileUnit.cpp @@ -390,7 +390,7 @@ void CompileUnit::SetVariableList(VariableListSP &variables) { m_variables = variables; } -const std::vector &CompileUnit::GetImportedModules() { +const std::vector &CompileUnit::GetImportedModules() { if (m_imported_modules.empty() && m_flags.IsClear(flagsParsedImportedModules)) { m_flags.Set(flagsParsedImportedModules); diff --git a/lldb/source/Symbol/SymbolVendor.cpp b/lldb/source/Symbol/SymbolVendor.cpp index c0f0b67280d5..fd148a4aac85 100644 --- a/lldb/source/Symbol/SymbolVendor.cpp +++ b/lldb/source/Symbol/SymbolVendor.cpp @@ -185,7 +185,7 @@ bool SymbolVendor::ParseIsOptimized(CompileUnit &comp_unit) { } bool SymbolVendor::ParseImportedModules( - const SymbolContext &sc, std::vector &imported_modules) { + const SymbolContext &sc, std::vector &imported_modules) { ModuleSP module_sp(GetModule()); if (module_sp) { std::lock_guard guard(module_sp->GetMutex());