forked from OSchip/llvm-project
[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
This commit is contained in:
parent
387acd64f3
commit
c2e2df7f7a
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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";
|
||||
|
|
Loading…
Reference in New Issue