Index: lldb/trunk/include/lldb/Host/FileSystem.h =================================================================== --- lldb/trunk/include/lldb/Host/FileSystem.h +++ lldb/trunk/include/lldb/Host/FileSystem.h @@ -181,6 +181,10 @@ llvm::ErrorOr GetExternalPath(const llvm::Twine &path); llvm::ErrorOr GetExternalPath(const FileSpec &file_spec); + llvm::IntrusiveRefCntPtr GetVirtualFileSystem() { + return m_fs; + } + private: static llvm::Optional &InstanceImpl(); llvm::IntrusiveRefCntPtr m_fs; Index: lldb/trunk/include/lldb/Symbol/ClangASTImporter.h =================================================================== --- lldb/trunk/include/lldb/Symbol/ClangASTImporter.h +++ lldb/trunk/include/lldb/Symbol/ClangASTImporter.h @@ -21,6 +21,7 @@ #include "clang/Basic/FileManager.h" #include "clang/Basic/FileSystemOptions.h" +#include "lldb/Host/FileSystem.h" #include "lldb/Symbol/CompilerDeclContext.h" #include "lldb/lldb-types.h" @@ -93,7 +94,9 @@ vbase_offsets; }; - ClangASTImporter() : m_file_manager(clang::FileSystemOptions()) {} + ClangASTImporter() + : m_file_manager(clang::FileSystemOptions(), + FileSystem::Instance().GetVirtualFileSystem()) {} clang::QualType CopyType(clang::ASTContext *dst_ctx, clang::ASTContext *src_ctx, clang::QualType type); Index: lldb/trunk/lit/Reproducer/Inputs/ModuleCapture.in =================================================================== --- lldb/trunk/lit/Reproducer/Inputs/ModuleCapture.in +++ lldb/trunk/lit/Reproducer/Inputs/ModuleCapture.in @@ -1,2 +0,0 @@ -expr -- @import Cocoa -reproducer generate Index: lldb/trunk/lit/Reproducer/Modules/Inputs/Bar.h =================================================================== --- lldb/trunk/lit/Reproducer/Modules/Inputs/Bar.h +++ lldb/trunk/lit/Reproducer/Modules/Inputs/Bar.h @@ -0,0 +1,3 @@ +struct Bar { + int success; +}; Index: lldb/trunk/lit/Reproducer/Modules/Inputs/Foo.h =================================================================== --- lldb/trunk/lit/Reproducer/Modules/Inputs/Foo.h +++ lldb/trunk/lit/Reproducer/Modules/Inputs/Foo.h @@ -0,0 +1 @@ +struct Foo {}; Index: lldb/trunk/lit/Reproducer/Modules/Inputs/ModuleCXX.in =================================================================== --- lldb/trunk/lit/Reproducer/Modules/Inputs/ModuleCXX.in +++ lldb/trunk/lit/Reproducer/Modules/Inputs/ModuleCXX.in @@ -0,0 +1,6 @@ +breakpoint set -f main.cpp -l 5 +run +expr -l Objective-C++ -- @import Foo +expr -l Objective-C++ -- @import Bar +expr -- Bar() +reproducer generate Index: lldb/trunk/lit/Reproducer/Modules/Inputs/main.cpp =================================================================== --- lldb/trunk/lit/Reproducer/Modules/Inputs/main.cpp +++ lldb/trunk/lit/Reproducer/Modules/Inputs/main.cpp @@ -0,0 +1,9 @@ +#include "Foo.h" + +void stop() {} + +int main(int argc, char **argv) { + Foo foo; + stop(); // break here. + return 0; +} Index: lldb/trunk/lit/Reproducer/Modules/Inputs/module.modulemap =================================================================== --- lldb/trunk/lit/Reproducer/Modules/Inputs/module.modulemap +++ lldb/trunk/lit/Reproducer/Modules/Inputs/module.modulemap @@ -0,0 +1,7 @@ +module Foo { + header "Foo.h" +} + +module Bar { + header "Bar.h" +} Index: lldb/trunk/lit/Reproducer/Modules/TestModuleCXX.test =================================================================== --- lldb/trunk/lit/Reproducer/Modules/TestModuleCXX.test +++ lldb/trunk/lit/Reproducer/Modules/TestModuleCXX.test @@ -0,0 +1,34 @@ +# Start fresh. +# RUN: rm -rf %t.root +# RUN: rm -rf %t.clang-cache +# RUN: rm -rf %t.lldb-cache + +# Create a temporary root we can remove later. +# RUN: mkdir -p %t.root +# RUN: mkdir -p %t.clang-cache +# RUN: mkdir -p %t.lldb-cache +# RUN: cp %S/Inputs/main.cpp %t.root +# RUN: cp %S/Inputs/Foo.h %t.root +# RUN: cp %S/Inputs/Bar.h %t.root +# RUN: cp %S/Inputs/module.modulemap %t.root + +# Compile the test case form the temporary root. +# RUN: %clang %t.root/main.cpp -g -fmodules -fcxx-modules -fmodules-cache-path=%t.clang-cache -o %t.root/a.out + +# Capture the debug session. +# RUN: %lldb -x -b -o 'settings set symbols.clang-modules-cache-path %t.lldb-cache' -s %S/Inputs/ModuleCXX.in --capture %t.repro %t.root/a.out | FileCheck %s --check-prefix CAPTURE +# CAPTURE: (success = 0) + +# RUN: cat %t.repro/files.yaml | FileCheck %s --check-prefix YAML +# YAML-DAG: Foo.h +# YAML-DAG: Bar.h +# YAML-DAG: module.modulemap + +# Remove the temporary root. +# RUN: rm -rf %t.root +# RUN: rm -rf %t.clang-cache +# RUN: rm -rf %t.lldb-cache + +# Replay the debug session. +# RUN: %lldb -x -b -o 'settings set symbols.clang-modules-cache-path %t.lldb-cache' -s %S/Inputs/ModuleCXX.in --replay %t.repro %t.root/a.out | FileCheck %s --check-prefix REPLAY +# REPLAY: (success = 0) Index: lldb/trunk/lit/Reproducer/TestClangFileRepro.test =================================================================== --- lldb/trunk/lit/Reproducer/TestClangFileRepro.test +++ lldb/trunk/lit/Reproducer/TestClangFileRepro.test @@ -1,8 +0,0 @@ -# REQUIRES: system-darwin -# -# This tests that modules files from clang end up in the reproducer. -# -# RUN: %lldb -x -b -s %S/Inputs/ModuleCapture.in --capture %t.repro -# cat %t.repro/files.yaml | FileCheck %s -# -# CHECK: Cocoa.h Index: lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp =================================================================== --- lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp +++ lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp @@ -258,6 +258,10 @@ opts.IncludeModuleFiles = true; } + // Make sure clang uses the same VFS as LLDB. + m_compiler->setVirtualFileSystem( + FileSystem::Instance().GetVirtualFileSystem()); + lldb::LanguageType frame_lang = expr.Language(); // defaults to lldb::eLanguageTypeUnknown bool overridden_target_opts = false; Index: lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp =================================================================== --- lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp +++ lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp @@ -661,6 +661,8 @@ opts.IncludeModuleFiles = true; } + // Make sure clang uses the same VFS as LLDB. + instance->setVirtualFileSystem(FileSystem::Instance().GetVirtualFileSystem()); instance->setDiagnostics(diagnostics_engine.get()); instance->setInvocation(invocation); Index: lldb/trunk/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp =================================================================== --- lldb/trunk/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp +++ lldb/trunk/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp @@ -8,6 +8,7 @@ #include "ClangHighlighter.h" +#include "lldb/Host/FileSystem.h" #include "lldb/Target/Language.h" #include "lldb/Utility/AnsiTerminal.h" #include "lldb/Utility/StreamString.h" @@ -135,7 +136,8 @@ using namespace clang; FileSystemOptions file_opts; - FileManager file_mgr(file_opts); + FileManager file_mgr(file_opts, + FileSystem::Instance().GetVirtualFileSystem()); unsigned line_number = previous_lines.count('\n') + 1U; Index: lldb/trunk/source/Symbol/ClangASTContext.cpp =================================================================== --- lldb/trunk/source/Symbol/ClangASTContext.cpp +++ lldb/trunk/source/Symbol/ClangASTContext.cpp @@ -911,7 +911,8 @@ clang::FileManager *ClangASTContext::getFileManager() { if (m_file_manager_up == nullptr) { clang::FileSystemOptions file_system_options; - m_file_manager_up.reset(new clang::FileManager(file_system_options)); + m_file_manager_up.reset(new clang::FileManager( + file_system_options, FileSystem::Instance().GetVirtualFileSystem())); } return m_file_manager_up.get(); } Index: lldb/trunk/unittests/Language/Highlighting/HighlighterTest.cpp =================================================================== --- lldb/trunk/unittests/Language/Highlighting/HighlighterTest.cpp +++ lldb/trunk/unittests/Language/Highlighting/HighlighterTest.cpp @@ -9,6 +9,7 @@ #include "gtest/gtest.h" #include "lldb/Core/Highlighter.h" +#include "lldb/Host/FileSystem.h" #include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h" #include "Plugins/Language/ObjC/ObjCLanguage.h" @@ -27,6 +28,7 @@ void HighlighterTest::SetUpTestCase() { // The HighlighterManager uses the language plugins under the hood, so we // have to initialize them here for our test process. + FileSystem::Initialize(); CPlusPlusLanguage::Initialize(); ObjCLanguage::Initialize(); ObjCPlusPlusLanguage::Initialize(); @@ -36,6 +38,7 @@ CPlusPlusLanguage::Terminate(); ObjCLanguage::Terminate(); ObjCPlusPlusLanguage::Terminate(); + FileSystem::Terminate(); } static std::string getName(lldb::LanguageType type) {