forked from OSchip/llvm-project
[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:
parent
eb3bcc1c95
commit
9764b65c82
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
expr -- @import Cocoa
|
||||
reproducer generate
|
|
@ -0,0 +1,3 @@
|
|||
struct Bar {
|
||||
int success;
|
||||
};
|
|
@ -0,0 +1 @@
|
|||
struct Foo {};
|
|
@ -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
|
|
@ -0,0 +1,9 @@
|
|||
#include "Foo.h"
|
||||
|
||||
void stop() {}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
Foo foo;
|
||||
stop(); // break here.
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
module Foo {
|
||||
header "Foo.h"
|
||||
}
|
||||
|
||||
module Bar {
|
||||
header "Bar.h"
|
||||
}
|
|
@ -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)
|
|
@ -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
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue