summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Devlieghere <jonas@devlieghere.com>2019-06-13 04:35:22 +0000
committerJonas Devlieghere <jonas@devlieghere.com>2019-06-13 04:35:22 +0000
commitc2e2df7f7af139ff2edb0563bfe48896d841c5e2 (patch)
tree7d68bd724f75a701c5863757e99751ac3127715c
parent387acd64f3ed017f0341101000a84d5e5dcbbaed (diff)
downloadbcm5719-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.h20
-rw-r--r--lldb/lit/Reproducer/TestFileRepro.test3
-rw-r--r--lldb/source/Initialization/SystemInitializerCommon.cpp4
-rw-r--r--lldb/source/Utility/Reproducer.cpp21
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";
OpenPOWER on IntegriCloud