diff options
Diffstat (limited to 'lldb/source/Utility/Reproducer.cpp')
-rw-r--r-- | lldb/source/Utility/Reproducer.cpp | 88 |
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; |