diff options
| author | Jonas Devlieghere <jonas@devlieghere.com> | 2019-02-18 20:31:18 +0000 |
|---|---|---|
| committer | Jonas Devlieghere <jonas@devlieghere.com> | 2019-02-18 20:31:18 +0000 |
| commit | 9764b65c8233c0385b7625e5176d6d7fd0de2b8c (patch) | |
| tree | 99dadf7009a352cf9cd49838c141b52023217dd4 | |
| parent | eb3bcc1c951039c7ab4656ef44e7e5deffe1ad92 (diff) | |
| download | bcm5719-llvm-9764b65c8233c0385b7625e5176d6d7fd0de2b8c.tar.gz bcm5719-llvm-9764b65c8233c0385b7625e5176d6d7fd0de2b8c.zip | |
[Reproducers] Make clang use lldb's VFS.
In r353906 we hooked up clang and lldb's reproducer infrastructure to
capture files used by clang. This patch adds the necessary logic to have
clang reuse the files from lldb's reproducer during replay.
Differential revision: https://reviews.llvm.org/D58309
llvm-svn: 354283
15 files changed, 82 insertions, 13 deletions
diff --git a/lldb/include/lldb/Host/FileSystem.h b/lldb/include/lldb/Host/FileSystem.h index fe0386c601d..80621a38da1 100644 --- a/lldb/include/lldb/Host/FileSystem.h +++ b/lldb/include/lldb/Host/FileSystem.h @@ -181,6 +181,10 @@ public: llvm::ErrorOr<std::string> GetExternalPath(const llvm::Twine &path); llvm::ErrorOr<std::string> GetExternalPath(const FileSpec &file_spec); + llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> GetVirtualFileSystem() { + return m_fs; + } + private: static llvm::Optional<FileSystem> &InstanceImpl(); llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> m_fs; diff --git a/lldb/include/lldb/Symbol/ClangASTImporter.h b/lldb/include/lldb/Symbol/ClangASTImporter.h index 96641daccde..ab66e753e9c 100644 --- a/lldb/include/lldb/Symbol/ClangASTImporter.h +++ b/lldb/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 @@ public: 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); diff --git a/lldb/lit/Reproducer/Inputs/ModuleCapture.in b/lldb/lit/Reproducer/Inputs/ModuleCapture.in deleted file mode 100644 index 5a761c671ea..00000000000 --- a/lldb/lit/Reproducer/Inputs/ModuleCapture.in +++ /dev/null @@ -1,2 +0,0 @@ -expr -- @import Cocoa -reproducer generate diff --git a/lldb/lit/Reproducer/Modules/Inputs/Bar.h b/lldb/lit/Reproducer/Modules/Inputs/Bar.h new file mode 100644 index 00000000000..d004baf3168 --- /dev/null +++ b/lldb/lit/Reproducer/Modules/Inputs/Bar.h @@ -0,0 +1,3 @@ +struct Bar { + int success; +}; diff --git a/lldb/lit/Reproducer/Modules/Inputs/Foo.h b/lldb/lit/Reproducer/Modules/Inputs/Foo.h new file mode 100644 index 00000000000..1fe02e89786 --- /dev/null +++ b/lldb/lit/Reproducer/Modules/Inputs/Foo.h @@ -0,0 +1 @@ +struct Foo {}; diff --git a/lldb/lit/Reproducer/Modules/Inputs/ModuleCXX.in b/lldb/lit/Reproducer/Modules/Inputs/ModuleCXX.in new file mode 100644 index 00000000000..0f5bb7864f2 --- /dev/null +++ b/lldb/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 diff --git a/lldb/lit/Reproducer/Modules/Inputs/main.cpp b/lldb/lit/Reproducer/Modules/Inputs/main.cpp new file mode 100644 index 00000000000..e6a331bb405 --- /dev/null +++ b/lldb/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; +} diff --git a/lldb/lit/Reproducer/Modules/Inputs/module.modulemap b/lldb/lit/Reproducer/Modules/Inputs/module.modulemap new file mode 100644 index 00000000000..4221d0f9134 --- /dev/null +++ b/lldb/lit/Reproducer/Modules/Inputs/module.modulemap @@ -0,0 +1,7 @@ +module Foo { + header "Foo.h" +} + +module Bar { + header "Bar.h" +} diff --git a/lldb/lit/Reproducer/Modules/TestModuleCXX.test b/lldb/lit/Reproducer/Modules/TestModuleCXX.test new file mode 100644 index 00000000000..2d4fc81dd8a --- /dev/null +++ b/lldb/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) diff --git a/lldb/lit/Reproducer/TestClangFileRepro.test b/lldb/lit/Reproducer/TestClangFileRepro.test deleted file mode 100644 index dced57ff31f..00000000000 --- a/lldb/lit/Reproducer/TestClangFileRepro.test +++ /dev/null @@ -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 diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp index 937d6c70d3a..e3597d6c4b9 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp @@ -258,6 +258,10 @@ ClangExpressionParser::ClangExpressionParser(ExecutionContextScope *exe_scope, 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; diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp index b08c4540fe2..9d5ead4c97e 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp @@ -661,6 +661,8 @@ ClangModulesDeclVendor::Create(Target &target) { 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); diff --git a/lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp b/lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp index e70e45c7975..a9a1b44731f 100644 --- a/lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp +++ b/lldb/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 @@ void ClangHighlighter::Highlight(const HighlightStyle &options, 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; diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp index aafbe2ec1c3..8184f7c024c 100644 --- a/lldb/source/Symbol/ClangASTContext.cpp +++ b/lldb/source/Symbol/ClangASTContext.cpp @@ -911,7 +911,8 @@ SelectorTable *ClangASTContext::getSelectorTable() { 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(); } diff --git a/lldb/unittests/Language/Highlighting/HighlighterTest.cpp b/lldb/unittests/Language/Highlighting/HighlighterTest.cpp index 1faf226d3e7..842671284f1 100644 --- a/lldb/unittests/Language/Highlighting/HighlighterTest.cpp +++ b/lldb/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 @@ public: 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 @@ void HighlighterTest::TearDownTestCase() { CPlusPlusLanguage::Terminate(); ObjCLanguage::Terminate(); ObjCPlusPlusLanguage::Terminate(); + FileSystem::Terminate(); } static std::string getName(lldb::LanguageType type) { |

