Skip to content

Commit

Permalink
[Reproducers] Make reproducer relocatable
Browse files Browse the repository at this point in the history
Before this patch, reproducers weren't relocatable. The reproducer
contained hard coded paths in the VFS mapping, as well in the yaml file
listing the different input files for the command interpreter. This
patch changes that:

 - Use relative paths for the DataCollector.
 - Use an overlay prefix for the FileCollector.

Differential revision: https://reviews.llvm.org/D63467

llvm-svn: 363697
  • Loading branch information
JDevlieghere committed Jun 18, 2019
1 parent cfc7078 commit c470ac5
Show file tree
Hide file tree
Showing 7 changed files with 32 additions and 11 deletions.
5 changes: 4 additions & 1 deletion lldb/include/lldb/Utility/FileCollector.h
Expand Up @@ -25,7 +25,7 @@ namespace lldb_private {
/// the VFS.
class FileCollector {
public:
FileCollector(const FileSpec &root);
FileCollector(const FileSpec &root, const FileSpec &overlay);

void AddFile(const llvm::Twine &file);
void AddFile(const FileSpec &file) { return AddFile(file.GetPath()); }
Expand Down Expand Up @@ -59,6 +59,9 @@ class FileCollector {
/// The root directory where files are copied.
FileSpec m_root;

/// The root directory where the VFS overlay lives.
FileSpec m_overlay_root;

/// Tracks already seen files so they can be skipped.
llvm::StringSet<> m_seen;

Expand Down
7 changes: 4 additions & 3 deletions lldb/include/lldb/Utility/Reproducer.h
Expand Up @@ -91,7 +91,8 @@ class FileProvider : public Provider<FileProvider> {

FileProvider(const FileSpec &directory)
: Provider(directory),
m_collector(directory.CopyByAppendingPathComponent("root")) {}
m_collector(directory.CopyByAppendingPathComponent("root"), directory) {
}

FileCollector &GetFileCollector() { return m_collector; }

Expand Down Expand Up @@ -132,8 +133,8 @@ class VersionProvider : public Provider<VersionProvider> {
class DataRecorder {
public:
DataRecorder(const FileSpec &filename, std::error_code &ec)
: m_filename(std::move(filename)),
m_os(m_filename.GetPath(), ec, llvm::sys::fs::F_Text), m_record(true) {}
: m_filename(filename.GetFilename().GetStringRef()),
m_os(filename.GetPath(), ec, llvm::sys::fs::F_Text), m_record(true) {}

static llvm::Expected<std::unique_ptr<DataRecorder>>
Create(const FileSpec &filename);
Expand Down
7 changes: 7 additions & 0 deletions lldb/lit/Reproducer/TestReuseDirectory.test
Expand Up @@ -8,3 +8,10 @@
# RUN: %lldb -x -b -s %S/Inputs/GDBRemoteCapture.in --capture --capture-path %t.repro %t.out | FileCheck %S/TestGDBRemoteRepro.test --check-prefix CHECK --check-prefix CAPTURE
# RUN: %lldb -x -b -s %S/Inputs/GDBRemoteCapture.in --capture --capture-path %t.repro %t.out | FileCheck %S/TestGDBRemoteRepro.test --check-prefix CHECK --check-prefix CAPTURE
# RUN: %lldb --replay %t.repro | FileCheck %S/TestGDBRemoteRepro.test --check-prefix CHECK --check-prefix REPLAY

# Test that we can replay from a different location, i.e. that the reproducer
# is relocatable.

# RUN: rm -rf %t.repro_moved
# RUN: mv %t.repro %t.repro_moved
# RUN: %lldb --replay %t.repro_moved | FileCheck %S/TestGDBRemoteRepro.test --check-prefix CHECK --check-prefix REPLAY
6 changes: 6 additions & 0 deletions lldb/source/API/SBDebugger.cpp
Expand Up @@ -82,6 +82,12 @@ class CommandLoader {
if (auto err = yin.error())
return {};

for (auto &file : files) {
FileSpec absolute_path =
loader->GetRoot().CopyByAppendingPathComponent(file);
file = absolute_path.GetPath();
}

return llvm::make_unique<CommandLoader>(std::move(files));
}

Expand Down
5 changes: 3 additions & 2 deletions lldb/source/Host/common/FileSystem.cpp
Expand Up @@ -63,8 +63,9 @@ llvm::Error FileSystem::Initialize(const FileSpec &mapping) {
if (!buffer)
return llvm::errorCodeToError(buffer.getError());

InstanceImpl().emplace(
llvm::vfs::getVFSFromYAML(std::move(buffer.get()), nullptr, ""), true);
InstanceImpl().emplace(llvm::vfs::getVFSFromYAML(std::move(buffer.get()),
nullptr, mapping.GetPath()),
true);

return llvm::Error::success();
}
Expand Down
7 changes: 5 additions & 2 deletions lldb/source/Utility/FileCollector.cpp
Expand Up @@ -33,7 +33,8 @@ static bool IsCaseSensitivePath(StringRef path) {
return true;
}

FileCollector::FileCollector(const FileSpec &root) : m_root(root) {
FileCollector::FileCollector(const FileSpec &root, const FileSpec &overlay_root)
: m_root(root), m_overlay_root(overlay_root) {
sys::fs::create_directories(m_root.GetPath(), true);
}

Expand Down Expand Up @@ -133,7 +134,9 @@ std::error_code FileCollector::CopyFiles(bool stop_on_error) {
std::error_code FileCollector::WriteMapping(const FileSpec &mapping_file) {
std::lock_guard<std::mutex> lock(m_mutex);

const std::string root = m_root.GetPath();
llvm::StringRef root = m_overlay_root.GetPath();

m_vfs_writer.setOverlayDir(root);
m_vfs_writer.setCaseSensitivity(IsCaseSensitivePath(root));
m_vfs_writer.setUseExternalNames(false);

Expand Down
6 changes: 3 additions & 3 deletions lldb/unittests/Utility/FileCollectorTest.cpp
Expand Up @@ -105,7 +105,7 @@ struct ScopedFile {
TEST(FileCollectorTest, AddFile) {
ScopedDir root("add_file_root", true);
FileSpec root_fs(root.Path);
TestingFileCollector file_collector(root_fs);
TestingFileCollector file_collector(root_fs, root_fs);

file_collector.AddFile(FileSpec("/path/to/a"));
file_collector.AddFile(FileSpec("/path/to/b"));
Expand All @@ -132,7 +132,7 @@ TEST(FileCollectorTest, CopyFiles) {
// Create file collector and add files.
ScopedDir root("copy_files_root", true);
FileSpec root_fs(root.Path);
TestingFileCollector file_collector(root_fs);
TestingFileCollector file_collector(root_fs, root_fs);
file_collector.AddFile(a.Path);
file_collector.AddFile(b.Path);
file_collector.AddFile(c.Path);
Expand Down Expand Up @@ -174,7 +174,7 @@ TEST(FileCollectorTest, Symlinks) {
// Root where files are copied to.
ScopedDir reproducer_root("reproducer_root", true);
FileSpec root_fs(reproducer_root.Path);
TestingFileCollector file_collector(root_fs);
TestingFileCollector file_collector(root_fs, root_fs);

// Add all the files to the collector.
file_collector.AddFile(a.Path);
Expand Down

0 comments on commit c470ac5

Please sign in to comment.