[lldb/Reproducers] Always record the current working directory

Setting the current working directory in the VFS will fail if the given
path doesn't exist in the YAML mapping or on disk.
This commit is contained in:
Jonas Devlieghere 2020-07-20 11:23:43 -07:00
parent 3f16114ddb
commit f8df2e1a19
4 changed files with 18 additions and 1 deletions
lldb
include/lldb/Utility
source
test/Shell/Reproducer

View File

@ -11,6 +11,7 @@
#include "lldb/Utility/FileSpec.h" #include "lldb/Utility/FileSpec.h"
#include "llvm/ADT/DenseMap.h" #include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Error.h" #include "llvm/Support/Error.h"
#include "llvm/Support/FileCollector.h" #include "llvm/Support/FileCollector.h"
#include "llvm/Support/YAMLTraits.h" #include "llvm/Support/YAMLTraits.h"
@ -149,6 +150,7 @@ public:
} }
void Update(llvm::StringRef path) { m_cwd = std::string(path); } void Update(llvm::StringRef path) { m_cwd = std::string(path); }
llvm::StringRef GetWorkingDirectory() { return m_cwd; }
struct Info { struct Info {
static const char *name; static const char *name;

View File

@ -234,7 +234,10 @@ const char *SBReproducer::GetPath() {
void SBReproducer::SetWorkingDirectory(const char *path) { void SBReproducer::SetWorkingDirectory(const char *path) {
if (auto *g = lldb_private::repro::Reproducer::Instance().GetGenerator()) { if (auto *g = lldb_private::repro::Reproducer::Instance().GetGenerator()) {
g->GetOrCreate<WorkingDirectoryProvider>().Update(path); auto &wp = g->GetOrCreate<repro::WorkingDirectoryProvider>();
wp.Update(path);
auto &fp = g->GetOrCreate<repro::FileProvider>();
fp.RecordInterestingDirectory(wp.GetWorkingDirectory());
} }
} }

View File

@ -94,6 +94,8 @@ llvm::Error SystemInitializerCommon::Initialize() {
vp.SetVersion(lldb_private::GetVersion()); vp.SetVersion(lldb_private::GetVersion());
repro::FileProvider &fp = g->GetOrCreate<repro::FileProvider>(); repro::FileProvider &fp = g->GetOrCreate<repro::FileProvider>();
FileSystem::Initialize(fp.GetFileCollector()); FileSystem::Initialize(fp.GetFileCollector());
repro::WorkingDirectoryProvider &wp = g->GetOrCreate<repro::WorkingDirectoryProvider>();
fp.RecordInterestingDirectory(wp.GetWorkingDirectory());
} else { } else {
FileSystem::Initialize(); FileSystem::Initialize();
} }

View File

@ -15,3 +15,13 @@
# RUN: cat %t.repro/cwd.txt | FileCheck %t.check # RUN: cat %t.repro/cwd.txt | FileCheck %t.check
# RUN: %lldb --replay %t.repro | FileCheck %t.check # RUN: %lldb --replay %t.repro | FileCheck %t.check
# Make sure the current working directory is recorded even when it's not
# referenced.
# RUN: rm -rf %t.repro
# RUN: mkdir -p %t/probably_unique
# RUN: cd %t/probably_unique
# RUN: %lldb -x -b -o 'reproducer generate' --capture --capture-path %t.repro
# RUN: cat %t.repro/cwd.txt | FileCheck %s
# CHECK: probably_unique