diff options
Diffstat (limited to 'lldb/source/Utility/Reproducer.cpp')
-rw-r--r-- | lldb/source/Utility/Reproducer.cpp | 66 |
1 files changed, 16 insertions, 50 deletions
diff --git a/lldb/source/Utility/Reproducer.cpp b/lldb/source/Utility/Reproducer.cpp index 4777d7576a32..b11e1a577ed2 100644 --- a/lldb/source/Utility/Reproducer.cpp +++ b/lldb/source/Utility/Reproducer.cpp @@ -25,6 +25,16 @@ llvm::Error Reproducer::Initialize(ReproducerMode mode, lldbassert(!InstanceImpl() && "Already initialized."); InstanceImpl().emplace(); + // 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; + } + switch (mode) { case ReproducerMode::Capture: { if (!root) { @@ -143,12 +153,14 @@ static FileSpec MakeAbsolute(FileSpec file_spec) { return FileSpec(path, file_spec.GetPathStyle()); } -Generator::Generator(FileSpec root) - : m_root(MakeAbsolute(std::move(root))), m_done(false) { +Generator::Generator(FileSpec root) : m_root(MakeAbsolute(std::move(root))) { GetOrCreate<repro::WorkingDirectoryProvider>(); } -Generator::~Generator() {} +Generator::~Generator() { + if (!m_done) + Discard(); +} ProviderBase *Generator::Register(std::unique_ptr<ProviderBase> provider) { std::lock_guard<std::mutex> lock(m_providers_mutex); @@ -243,7 +255,7 @@ DataRecorder::Create(const FileSpec &filename) { 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(".txt")) + llvm::Twine(i) + llvm::Twine(".yaml")) .str(); auto recorder_or_error = DataRecorder::Create(GetRoot().CopyByAppendingPathComponent(filename)); @@ -292,53 +304,9 @@ void WorkingDirectoryProvider::Keep() { os << m_cwd << "\n"; } -llvm::raw_ostream *ProcessGDBRemoteProvider::GetHistoryStream() { - FileSpec history_file = GetRoot().CopyByAppendingPathComponent(Info::file); - - std::error_code EC; - m_stream_up = std::make_unique<raw_fd_ostream>(history_file.GetPath(), EC, - sys::fs::OpenFlags::OF_Text); - return m_stream_up.get(); -} - -std::unique_ptr<CommandLoader> CommandLoader::Create(Loader *loader) { - if (!loader) - return {}; - - FileSpec file = loader->GetFile<repro::CommandProvider::Info>(); - if (!file) - return {}; - - auto error_or_file = llvm::MemoryBuffer::getFile(file.GetPath()); - if (auto err = error_or_file.getError()) - return {}; - - std::vector<std::string> files; - llvm::yaml::Input yin((*error_or_file)->getBuffer()); - yin >> files; - - if (auto err = yin.error()) - return {}; - - for (auto &file : files) { - FileSpec absolute_path = - loader->GetRoot().CopyByAppendingPathComponent(file); - file = absolute_path.GetPath(); - } - - return std::make_unique<CommandLoader>(std::move(files)); -} - -llvm::Optional<std::string> CommandLoader::GetNextFile() { - if (m_index >= m_files.size()) - return {}; - return m_files[m_index++]; -} - void ProviderBase::anchor() {} char CommandProvider::ID = 0; char FileProvider::ID = 0; -char ProcessGDBRemoteProvider::ID = 0; char ProviderBase::ID = 0; char VersionProvider::ID = 0; char WorkingDirectoryProvider::ID = 0; @@ -346,8 +314,6 @@ const char *CommandProvider::Info::file = "command-interpreter.yaml"; const char *CommandProvider::Info::name = "command-interpreter"; const char *FileProvider::Info::file = "files.yaml"; const char *FileProvider::Info::name = "files"; -const char *ProcessGDBRemoteProvider::Info::file = "gdb-remote.yaml"; -const char *ProcessGDBRemoteProvider::Info::name = "gdb-remote"; const char *VersionProvider::Info::file = "version.txt"; const char *VersionProvider::Info::name = "version"; const char *WorkingDirectoryProvider::Info::file = "cwd.txt"; |