diff options
| author | Jonas Devlieghere <jonas@devlieghere.com> | 2019-06-13 04:35:22 +0000 |
|---|---|---|
| committer | Jonas Devlieghere <jonas@devlieghere.com> | 2019-06-13 04:35:22 +0000 |
| commit | c2e2df7f7af139ff2edb0563bfe48896d841c5e2 (patch) | |
| tree | 7d68bd724f75a701c5863757e99751ac3127715c | |
| parent | 387acd64f3ed017f0341101000a84d5e5dcbbaed (diff) | |
| download | bcm5719-llvm-c2e2df7f7af139ff2edb0563bfe48896d841c5e2.tar.gz bcm5719-llvm-c2e2df7f7af139ff2edb0563bfe48896d841c5e2.zip | |
[Reproducers] Include lldb version in the reproducer root
Generally, reproducers are rev-locked to the version of LLDB, so it's
valuable to have the LLDB version in the reproducer. For now I just want
the information to be present, without enforcing it, but I envision
emitting a warning during replay in the future.
Differential revision: https://reviews.llvm.org/D63229
llvm-svn: 363225
| -rw-r--r-- | lldb/include/lldb/Utility/Reproducer.h | 20 | ||||
| -rw-r--r-- | lldb/lit/Reproducer/TestFileRepro.test | 3 | ||||
| -rw-r--r-- | lldb/source/Initialization/SystemInitializerCommon.cpp | 4 | ||||
| -rw-r--r-- | lldb/source/Utility/Reproducer.cpp | 21 |
4 files changed, 43 insertions, 5 deletions
diff --git a/lldb/include/lldb/Utility/Reproducer.h b/lldb/include/lldb/Utility/Reproducer.h index ae424519401..9f8a679959e 100644 --- a/lldb/include/lldb/Utility/Reproducer.h +++ b/lldb/include/lldb/Utility/Reproducer.h @@ -109,6 +109,26 @@ private: FileCollector m_collector; }; +/// Provider for the LLDB version number. +/// +/// When the reproducer is kept, it writes the lldb version to a file named +/// version.txt in the reproducer root. +class VersionProvider : public Provider<VersionProvider> { +public: + VersionProvider(const FileSpec &directory) : Provider(directory) {} + struct Info { + static const char *name; + static const char *file; + }; + void SetVersion(std::string version) { + assert(m_version.empty()); + m_version = std::move(version); + } + void Keep() override; + std::string m_version; + static char ID; +}; + class DataRecorder { public: DataRecorder(const FileSpec &filename, std::error_code &ec) diff --git a/lldb/lit/Reproducer/TestFileRepro.test b/lldb/lit/Reproducer/TestFileRepro.test index 788d77b88ea..31b76703689 100644 --- a/lldb/lit/Reproducer/TestFileRepro.test +++ b/lldb/lit/Reproducer/TestFileRepro.test @@ -11,6 +11,7 @@ # RUN: %lldb -x -b -s %S/Inputs/FileCapture.in --capture --capture-path %t.repro %t.out | FileCheck %s --check-prefix CHECK --check-prefix CAPTURE # RUN: rm %t.out # RUN: %lldb --replay %t.repro | FileCheck %s --check-prefix CHECK --check-prefix REPLAY +# RUN: cat %t.repro/version.txt | FileCheck %s --check-prefix VERSION # CAPTURE: testing # REPLAY-NOT: testing @@ -19,3 +20,5 @@ # CAPTURE: Reproducer is in capture mode. # CAPTURE: Reproducer written + +# VERSION: lldb version diff --git a/lldb/source/Initialization/SystemInitializerCommon.cpp b/lldb/source/Initialization/SystemInitializerCommon.cpp index d805e0bdaa9..8558911c2f4 100644 --- a/lldb/source/Initialization/SystemInitializerCommon.cpp +++ b/lldb/source/Initialization/SystemInitializerCommon.cpp @@ -16,6 +16,7 @@ #include "lldb/Utility/Log.h" #include "lldb/Utility/Reproducer.h" #include "lldb/Utility/Timer.h" +#include "lldb/lldb-private.h" #if defined(__linux__) || defined(__FreeBSD__) || defined(__NetBSD__) #include "Plugins/Process/POSIX/ProcessPOSIXLog.h" @@ -67,7 +68,6 @@ llvm::Error SystemInitializerCommon::Initialize() { return e; } - // Initialize the file system. auto &r = repro::Reproducer::Instance(); if (repro::Loader *loader = r.GetLoader()) { FileSpec vfs_mapping = loader->GetFile<FileProvider::Info>(); @@ -78,6 +78,8 @@ llvm::Error SystemInitializerCommon::Initialize() { FileSystem::Initialize(); } } else if (repro::Generator *g = r.GetGenerator()) { + repro::VersionProvider &vp = g->GetOrCreate<repro::VersionProvider>(); + vp.SetVersion(lldb_private::GetVersion()); repro::FileProvider &fp = g->GetOrCreate<repro::FileProvider>(); FileSystem::Initialize(fp.GetFileCollector()); } else { diff --git a/lldb/source/Utility/Reproducer.cpp b/lldb/source/Utility/Reproducer.cpp index 6e893c1c95d..9973723de16 100644 --- a/lldb/source/Utility/Reproducer.cpp +++ b/lldb/source/Utility/Reproducer.cpp @@ -8,6 +8,7 @@ #include "lldb/Utility/Reproducer.h" #include "lldb/Utility/LLDBAssert.h" +#include "lldb/lldb-private.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Threading.h" @@ -263,11 +264,23 @@ void CommandProvider::Keep() { void CommandProvider::Discard() { m_data_recorders.clear(); } +void VersionProvider::Keep() { + FileSpec file = GetRoot().CopyByAppendingPathComponent(Info::file); + std::error_code ec; + llvm::raw_fd_ostream os(file.GetPath(), ec, llvm::sys::fs::F_Text); + if (ec) + return; + os << lldb_private::GetVersion() << "\n"; +} + void ProviderBase::anchor() {} char ProviderBase::ID = 0; -char FileProvider::ID = 0; char CommandProvider::ID = 0; -const char *FileProvider::Info::name = "files"; -const char *FileProvider::Info::file = "files.yaml"; -const char *CommandProvider::Info::name = "command-interpreter"; +char FileProvider::ID = 0; +char VersionProvider::ID = 0; 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 *VersionProvider::Info::file = "version.txt"; +const char *VersionProvider::Info::name = "version"; |

