Index: include/lldb/Symbol/CompileUnit.h =================================================================== --- include/lldb/Symbol/CompileUnit.h +++ include/lldb/Symbol/CompileUnit.h @@ -266,7 +266,7 @@ /// @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 @@ 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 { Index: include/lldb/Symbol/SourceModule.h =================================================================== --- include/lldb/Symbol/SourceModule.h +++ 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 Index: include/lldb/Symbol/SymbolFile.h =================================================================== --- include/lldb/Symbol/SymbolFile.h +++ 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 @@ 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; Index: include/lldb/Symbol/SymbolVendor.h =================================================================== --- include/lldb/Symbol/SymbolVendor.h +++ 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 @@ 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); Index: packages/Python/lldbsuite/test/lang/cpp/modules-import/Bar.h =================================================================== --- packages/Python/lldbsuite/test/lang/cpp/modules-import/Bar.h +++ packages/Python/lldbsuite/test/lang/cpp/modules-import/Bar.h @@ -0,0 +1 @@ +struct Bar { int success; }; Index: packages/Python/lldbsuite/test/lang/cpp/modules-import/Foo.h =================================================================== --- packages/Python/lldbsuite/test/lang/cpp/modules-import/Foo.h +++ packages/Python/lldbsuite/test/lang/cpp/modules-import/Foo.h @@ -0,0 +1 @@ +struct Foo {}; Index: packages/Python/lldbsuite/test/lang/cpp/modules-import/Makefile =================================================================== --- packages/Python/lldbsuite/test/lang/cpp/modules-import/Makefile +++ 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 Index: packages/Python/lldbsuite/test/lang/cpp/modules-import/TestCXXModulesImport.py =================================================================== --- packages/Python/lldbsuite/test/lang/cpp/modules-import/TestCXXModulesImport.py +++ 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"]) Index: packages/Python/lldbsuite/test/lang/cpp/modules-import/main.cpp =================================================================== --- packages/Python/lldbsuite/test/lang/cpp/modules-import/main.cpp +++ 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; +} Index: packages/Python/lldbsuite/test/lang/cpp/modules-import/module.modulemap =================================================================== --- packages/Python/lldbsuite/test/lang/cpp/modules-import/module.modulemap +++ packages/Python/lldbsuite/test/lang/cpp/modules-import/module.modulemap @@ -0,0 +1,7 @@ +module Foo { + header "Foo.h" +} + +module Bar { + header "Bar.h" +} Index: source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp =================================================================== --- source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp +++ source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp @@ -113,24 +113,19 @@ 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; } Index: source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h =================================================================== --- source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h +++ source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h @@ -36,7 +36,7 @@ //------------------------------------------------------------------ /// 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 @@ /// 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; //------------------------------------------------------------------ Index: source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp =================================================================== --- source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp +++ 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 @@ ~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 @@ } } -bool ClangModulesDeclVendorImpl::AddModule(ModulePath &path, +bool ClangModulesDeclVendorImpl::AddModule(const SourceModule &module, ModuleVector *exported_modules, Stream &error_stream) { // Fail early. @@ -199,7 +200,7 @@ 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 @@ } } - 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 @@ 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 @@ 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 @@ 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 @@ 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; } Index: source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h =================================================================== --- source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h +++ source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h @@ -69,9 +69,9 @@ 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; } Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h =================================================================== --- source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -125,7 +125,7 @@ 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; Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp =================================================================== --- source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -72,6 +72,7 @@ #include "llvm/Support/FileSystem.h" +#include #include #include @@ -911,43 +912,57 @@ 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 { Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h =================================================================== --- source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h +++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h @@ -72,7 +72,7 @@ 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; Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp =================================================================== --- source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -670,7 +670,7 @@ } 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); Index: source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h =================================================================== --- source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h +++ source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h @@ -94,9 +94,9 @@ 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; Index: source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp =================================================================== --- source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp +++ source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp @@ -1136,7 +1136,7 @@ } 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; } Index: source/Plugins/SymbolFile/PDB/SymbolFilePDB.h =================================================================== --- source/Plugins/SymbolFile/PDB/SymbolFilePDB.h +++ source/Plugins/SymbolFile/PDB/SymbolFilePDB.h @@ -74,7 +74,7 @@ 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; Index: source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp =================================================================== --- source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp +++ source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp @@ -377,7 +377,7 @@ 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; } Index: source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h =================================================================== --- source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h +++ source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h @@ -63,7 +63,7 @@ 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; Index: source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp =================================================================== --- source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp +++ source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp @@ -221,7 +221,7 @@ } bool SymbolFileSymtab::ParseImportedModules( - const SymbolContext &sc, std::vector &imported_modules) { + const SymbolContext &sc, std::vector &imported_modules) { return false; } Index: source/Symbol/CompileUnit.cpp =================================================================== --- source/Symbol/CompileUnit.cpp +++ source/Symbol/CompileUnit.cpp @@ -390,7 +390,7 @@ 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); Index: source/Symbol/SymbolVendor.cpp =================================================================== --- source/Symbol/SymbolVendor.cpp +++ source/Symbol/SymbolVendor.cpp @@ -185,7 +185,7 @@ } 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());