aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Utility/Reproducer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Utility/Reproducer.cpp')
-rw-r--r--lldb/source/Utility/Reproducer.cpp88
1 files changed, 44 insertions, 44 deletions
diff --git a/lldb/source/Utility/Reproducer.cpp b/lldb/source/Utility/Reproducer.cpp
index b11e1a577ed2..7620ab2c389d 100644
--- a/lldb/source/Utility/Reproducer.cpp
+++ b/lldb/source/Utility/Reproducer.cpp
@@ -1,4 +1,4 @@
-//===-- Reproducer.cpp ------------------------------------------*- C++ -*-===//
+//===-- Reproducer.cpp ----------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -18,6 +18,15 @@ using namespace lldb_private::repro;
using namespace llvm;
using namespace llvm::yaml;
+static llvm::Optional<bool> GetEnv(const char *var) {
+ std::string val = llvm::StringRef(getenv(var)).lower();
+ if (val == "0" || val == "off")
+ return false;
+ if (val == "1" || val == "on")
+ return true;
+ return {};
+}
+
Reproducer &Reproducer::Instance() { return *InstanceImpl(); }
llvm::Error Reproducer::Initialize(ReproducerMode mode,
@@ -27,12 +36,12 @@ llvm::Error Reproducer::Initialize(ReproducerMode mode,
// The environment can override the capture mode.
if (mode != ReproducerMode::Replay) {
- std::string env =
- llvm::StringRef(getenv("LLDB_CAPTURE_REPRODUCER")).lower();
- if (env == "0" || env == "off")
- mode = ReproducerMode::Off;
- else if (env == "1" || env == "on")
- mode = ReproducerMode::Capture;
+ if (llvm::Optional<bool> override = GetEnv("LLDB_CAPTURE_REPRODUCER")) {
+ if (*override)
+ mode = ReproducerMode::Capture;
+ else
+ mode = ReproducerMode::Off;
+ }
}
switch (mode) {
@@ -53,7 +62,9 @@ llvm::Error Reproducer::Initialize(ReproducerMode mode,
return Instance().SetCapture(root);
} break;
case ReproducerMode::Replay:
- return Instance().SetReplay(root);
+ return Instance().SetReplay(root, /*passive*/ false);
+ case ReproducerMode::PassiveReplay:
+ return Instance().SetReplay(root, /*passive*/ true);
case ReproducerMode::Off:
break;
};
@@ -118,7 +129,7 @@ llvm::Error Reproducer::SetCapture(llvm::Optional<FileSpec> root) {
return Error::success();
}
-llvm::Error Reproducer::SetReplay(llvm::Optional<FileSpec> root) {
+llvm::Error Reproducer::SetReplay(llvm::Optional<FileSpec> root, bool passive) {
std::lock_guard<std::mutex> guard(m_mutex);
if (root && m_generator)
@@ -131,7 +142,7 @@ llvm::Error Reproducer::SetReplay(llvm::Optional<FileSpec> root) {
return Error::success();
}
- m_loader.emplace(*root);
+ m_loader.emplace(*root, passive);
if (auto e = m_loader->LoadIndex())
return e;
@@ -158,8 +169,12 @@ Generator::Generator(FileSpec root) : m_root(MakeAbsolute(std::move(root))) {
}
Generator::~Generator() {
- if (!m_done)
- Discard();
+ if (!m_done) {
+ if (m_auto_generate)
+ Keep();
+ else
+ Discard();
+ }
}
ProviderBase *Generator::Register(std::unique_ptr<ProviderBase> provider) {
@@ -190,6 +205,10 @@ void Generator::Discard() {
llvm::sys::fs::remove_directories(m_root.GetPath());
}
+void Generator::SetAutoGenerate(bool b) { m_auto_generate = b; }
+
+bool Generator::IsAutoGenerate() const { return m_auto_generate; }
+
const FileSpec &Generator::GetRoot() const { return m_root; }
void Generator::AddProvidersToIndex() {
@@ -210,8 +229,9 @@ void Generator::AddProvidersToIndex() {
yout << files;
}
-Loader::Loader(FileSpec root)
- : m_root(MakeAbsolute(std::move(root))), m_loaded(false) {}
+Loader::Loader(FileSpec root, bool passive)
+ : m_root(MakeAbsolute(std::move(root))), m_loaded(false),
+ m_passive_replay(passive) {}
llvm::Error Loader::LoadIndex() {
if (m_loaded)
@@ -252,40 +272,15 @@ DataRecorder::Create(const FileSpec &filename) {
return std::move(recorder);
}
-DataRecorder *CommandProvider::GetNewDataRecorder() {
- std::size_t i = m_data_recorders.size() + 1;
- std::string filename = (llvm::Twine(Info::name) + llvm::Twine("-") +
- llvm::Twine(i) + llvm::Twine(".yaml"))
- .str();
- auto recorder_or_error =
- DataRecorder::Create(GetRoot().CopyByAppendingPathComponent(filename));
- if (!recorder_or_error) {
- llvm::consumeError(recorder_or_error.takeError());
- return nullptr;
- }
-
- m_data_recorders.push_back(std::move(*recorder_or_error));
- return m_data_recorders.back().get();
-}
-
-void CommandProvider::Keep() {
- std::vector<std::string> files;
- for (auto &recorder : m_data_recorders) {
- recorder->Stop();
- files.push_back(recorder->GetFilename().GetPath());
- }
-
- FileSpec file = GetRoot().CopyByAppendingPathComponent(Info::file);
+llvm::Expected<std::unique_ptr<YamlRecorder>>
+YamlRecorder::Create(const FileSpec &filename) {
std::error_code ec;
- llvm::raw_fd_ostream os(file.GetPath(), ec, llvm::sys::fs::OF_Text);
+ auto recorder = std::make_unique<YamlRecorder>(std::move(filename), ec);
if (ec)
- return;
- yaml::Output yout(os);
- yout << files;
+ return llvm::errorCodeToError(ec);
+ return std::move(recorder);
}
-void CommandProvider::Discard() { m_data_recorders.clear(); }
-
void VersionProvider::Keep() {
FileSpec file = GetRoot().CopyByAppendingPathComponent(Info::file);
std::error_code ec;
@@ -304,6 +299,11 @@ void WorkingDirectoryProvider::Keep() {
os << m_cwd << "\n";
}
+void FileProvider::recordInterestingDirectory(const llvm::Twine &dir) {
+ if (m_collector)
+ m_collector->addDirectory(dir);
+}
+
void ProviderBase::anchor() {}
char CommandProvider::ID = 0;
char FileProvider::ID = 0;