[Reproducer] Always use absolute paths for capture & replay.
authorJonas Devlieghere <jonas@devlieghere.com>
Fri, 27 Sep 2019 17:30:40 +0000 (17:30 +0000)
committerJonas Devlieghere <jonas@devlieghere.com>
Fri, 27 Sep 2019 17:30:40 +0000 (17:30 +0000)
The VFS requires files to be have absolute paths. The file collector
makes paths relative to the reproducer root. If the root is a relative
path, this would trigger an assert in the VFS. This patch ensures that
we always make the given path absolute.

Thank you Ted Woodward for pointing this out!

llvm-svn: 373102

lldb/include/lldb/Utility/Reproducer.h
lldb/lit/Reproducer/TestRelativePath.test [new file with mode: 0644]
lldb/source/Utility/Reproducer.cpp

index 556f390..1ad7638 100644 (file)
@@ -215,7 +215,7 @@ private:
 class Generator final {
 
 public:
-  Generator(const FileSpec &root);
+  Generator(FileSpec root);
   ~Generator();
 
   /// Method to indicate we want to keep the reproducer. If reproducer
@@ -272,7 +272,7 @@ private:
 
 class Loader final {
 public:
-  Loader(const FileSpec &root);
+  Loader(FileSpec root);
 
   template <typename T> FileSpec GetFile() {
     if (!HasFile(T::file))
diff --git a/lldb/lit/Reproducer/TestRelativePath.test b/lldb/lit/Reproducer/TestRelativePath.test
new file mode 100644 (file)
index 0000000..1c871ee
--- /dev/null
@@ -0,0 +1,8 @@
+# This tests relative capture paths.
+
+# RUN: mkdir -p %t
+# RUN: cd %t
+# RUN: rm -rf ./foo
+# RUN: %clang %S/Inputs/simple.c -g -o %t/reproducer.out
+# RUN: %lldb -x -b -s %S/Inputs/FileCapture.in -o 'reproducer dump -p files' --capture --capture-path ./foo %t/reproducer.out
+# RUN: %lldb --replay ./foo
index 8e44f08..a8a581f 100644 (file)
@@ -136,7 +136,15 @@ FileSpec Reproducer::GetReproducerPath() const {
   return {};
 }
 
-Generator::Generator(const FileSpec &root) : m_root(root), m_done(false) {}
+static FileSpec MakeAbsolute(FileSpec file_spec) {
+  SmallString<128> path;
+  file_spec.GetPath(path, false);
+  llvm::sys::fs::make_absolute(path);
+  return FileSpec(path, file_spec.GetPathStyle());
+}
+
+Generator::Generator(FileSpec root)
+    : m_root(MakeAbsolute(std::move(root))), m_done(false) {}
 
 Generator::~Generator() {}
 
@@ -188,7 +196,8 @@ void Generator::AddProvidersToIndex() {
   yout << files;
 }
 
-Loader::Loader(const FileSpec &root) : m_root(root), m_loaded(false) {}
+Loader::Loader(FileSpec root)
+    : m_root(MakeAbsolute(std::move(root))), m_loaded(false) {}
 
 llvm::Error Loader::LoadIndex() {
   if (m_loaded)