summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Devlieghere <jonas@devlieghere.com>2019-02-18 20:31:18 +0000
committerJonas Devlieghere <jonas@devlieghere.com>2019-02-18 20:31:18 +0000
commit9764b65c8233c0385b7625e5176d6d7fd0de2b8c (patch)
tree99dadf7009a352cf9cd49838c141b52023217dd4
parenteb3bcc1c951039c7ab4656ef44e7e5deffe1ad92 (diff)
downloadbcm5719-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
-rw-r--r--lldb/include/lldb/Host/FileSystem.h4
-rw-r--r--lldb/include/lldb/Symbol/ClangASTImporter.h5
-rw-r--r--lldb/lit/Reproducer/Inputs/ModuleCapture.in2
-rw-r--r--lldb/lit/Reproducer/Modules/Inputs/Bar.h3
-rw-r--r--lldb/lit/Reproducer/Modules/Inputs/Foo.h1
-rw-r--r--lldb/lit/Reproducer/Modules/Inputs/ModuleCXX.in6
-rw-r--r--lldb/lit/Reproducer/Modules/Inputs/main.cpp9
-rw-r--r--lldb/lit/Reproducer/Modules/Inputs/module.modulemap7
-rw-r--r--lldb/lit/Reproducer/Modules/TestModuleCXX.test34
-rw-r--r--lldb/lit/Reproducer/TestClangFileRepro.test8
-rw-r--r--lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp4
-rw-r--r--lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp2
-rw-r--r--lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp4
-rw-r--r--lldb/source/Symbol/ClangASTContext.cpp3
-rw-r--r--lldb/unittests/Language/Highlighting/HighlighterTest.cpp3
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) {
OpenPOWER on IntegriCloud