[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
This commit is contained in:
Jonas Devlieghere 2019-02-18 20:31:18 +00:00
parent eb3bcc1c95
commit 9764b65c82
15 changed files with 82 additions and 13 deletions

View File

@ -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;

View File

@ -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);

View File

@ -1,2 +0,0 @@
expr -- @import Cocoa
reproducer generate

View File

@ -0,0 +1,3 @@
struct Bar {
int success;
};

View File

@ -0,0 +1 @@
struct Foo {};

View File

@ -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

View File

@ -0,0 +1,9 @@
#include "Foo.h"
void stop() {}
int main(int argc, char **argv) {
Foo foo;
stop(); // break here.
return 0;
}

View File

@ -0,0 +1,7 @@
module Foo {
header "Foo.h"
}
module Bar {
header "Bar.h"
}

View File

@ -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)

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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();
}

View File

@ -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) {