Skip to content

Commit

Permalink
[Reproducers] Make clang use lldb's VFS.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
JDevlieghere committed Feb 18, 2019
1 parent eb3bcc1 commit 9764b65
Show file tree
Hide file tree
Showing 15 changed files with 82 additions and 13 deletions.
4 changes: 4 additions & 0 deletions lldb/include/lldb/Host/FileSystem.h
Expand Up @@ -181,6 +181,10 @@ class FileSystem {
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;
Expand Down
5 changes: 4 additions & 1 deletion lldb/include/lldb/Symbol/ClangASTImporter.h
Expand Up @@ -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"

Expand Down Expand Up @@ -93,7 +94,9 @@ class ClangASTImporter {
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);
Expand Down
2 changes: 0 additions & 2 deletions lldb/lit/Reproducer/Inputs/ModuleCapture.in

This file was deleted.

3 changes: 3 additions & 0 deletions lldb/lit/Reproducer/Modules/Inputs/Bar.h
@@ -0,0 +1,3 @@
struct Bar {
int success;
};
1 change: 1 addition & 0 deletions lldb/lit/Reproducer/Modules/Inputs/Foo.h
@@ -0,0 +1 @@
struct Foo {};
6 changes: 6 additions & 0 deletions 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
9 changes: 9 additions & 0 deletions 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;
}
7 changes: 7 additions & 0 deletions lldb/lit/Reproducer/Modules/Inputs/module.modulemap
@@ -0,0 +1,7 @@
module Foo {
header "Foo.h"
}

module Bar {
header "Bar.h"
}
34 changes: 34 additions & 0 deletions 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)
8 changes: 0 additions & 8 deletions lldb/lit/Reproducer/TestClangFileRepro.test

This file was deleted.

Expand Up @@ -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;
Expand Down
Expand Up @@ -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);

Expand Down
Expand Up @@ -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"
Expand Down Expand Up @@ -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;

Expand Down
3 changes: 2 additions & 1 deletion lldb/source/Symbol/ClangASTContext.cpp
Expand Up @@ -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();
}
Expand Down
3 changes: 3 additions & 0 deletions lldb/unittests/Language/Highlighting/HighlighterTest.cpp
Expand Up @@ -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"
Expand All @@ -27,6 +28,7 @@ class HighlighterTest : public testing::Test {
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();
Expand All @@ -36,6 +38,7 @@ void HighlighterTest::TearDownTestCase() {
CPlusPlusLanguage::Terminate();
ObjCLanguage::Terminate();
ObjCPlusPlusLanguage::Terminate();
FileSystem::Terminate();
}

static std::string getName(lldb::LanguageType type) {
Expand Down

0 comments on commit 9764b65

Please sign in to comment.