Author: Jonas Devlieghere Date: 2020-01-15T19:45:54-08:00 New Revision: 066e817b421e8502a72735988e14713940517aaa
URL: https://github.com/llvm/llvm-project/commit/066e817b421e8502a72735988e14713940517aaa DIFF: https://github.com/llvm/llvm-project/commit/066e817b421e8502a72735988e14713940517aaa.diff LOG: [lldb/Reproducers] Add a flag to always generating a reproducer Add a flag which always generates a reproducer when normally it would be discarded. This is meant for testing purposes to capture a debugger session without modification the session itself. Added: Modified: lldb/include/lldb/API/SBReproducer.h lldb/include/lldb/Utility/Reproducer.h lldb/source/API/SBReproducer.cpp lldb/source/Utility/Reproducer.cpp lldb/test/Shell/Reproducer/TestDriverOptions.test lldb/tools/driver/Driver.cpp lldb/tools/driver/Options.td Removed: ################################################################################ diff --git a/lldb/include/lldb/API/SBReproducer.h b/lldb/include/lldb/API/SBReproducer.h index 93d78f55fd76..0a25bcbf541e 100644 --- a/lldb/include/lldb/API/SBReproducer.h +++ b/lldb/include/lldb/API/SBReproducer.h @@ -23,6 +23,7 @@ class LLDB_API SBReproducer { static const char *Replay(const char *path); static const char *Replay(const char *path, bool skip_version_check); static const char *GetPath(); + static bool SetAutoGenerate(bool b); static bool Generate(); }; diff --git a/lldb/include/lldb/Utility/Reproducer.h b/lldb/include/lldb/Utility/Reproducer.h index 0d23fe8571ff..0524bcf6b24d 100644 --- a/lldb/include/lldb/Utility/Reproducer.h +++ b/lldb/include/lldb/Utility/Reproducer.h @@ -231,6 +231,9 @@ class Generator final { /// might need to clean up files already written to disk. void Discard(); + /// Enable or disable auto generate. + void SetAutoGenerate(bool b); + /// Create and register a new provider. template <typename T> T *Create() { std::unique_ptr<ProviderBase> provider = std::make_unique<T>(m_root); @@ -272,6 +275,9 @@ class Generator final { /// Flag to ensure that we never call both keep and discard. bool m_done = false; + + /// Flag to auto generate a reproducer when it would otherwise be discarded. + bool m_auto_generate = false; }; class Loader final { diff --git a/lldb/source/API/SBReproducer.cpp b/lldb/source/API/SBReproducer.cpp index 3d2de0727444..6d78eba52efb 100644 --- a/lldb/source/API/SBReproducer.cpp +++ b/lldb/source/API/SBReproducer.cpp @@ -178,6 +178,15 @@ bool SBReproducer::Generate() { return false; } +bool SBReproducer::SetAutoGenerate(bool b) { + auto &r = Reproducer::Instance(); + if (auto generator = r.GetGenerator()) { + generator->SetAutoGenerate(b); + return true; + } + return false; +} + const char *SBReproducer::GetPath() { static std::string path; auto &r = Reproducer::Instance(); diff --git a/lldb/source/Utility/Reproducer.cpp b/lldb/source/Utility/Reproducer.cpp index e243d784d185..8957763b7fd5 100644 --- a/lldb/source/Utility/Reproducer.cpp +++ b/lldb/source/Utility/Reproducer.cpp @@ -167,8 +167,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) { @@ -199,6 +203,8 @@ void Generator::Discard() { llvm::sys::fs::remove_directories(m_root.GetPath()); } +void Generator::SetAutoGenerate(bool b) { m_auto_generate = b; } + const FileSpec &Generator::GetRoot() const { return m_root; } void Generator::AddProvidersToIndex() { diff --git a/lldb/test/Shell/Reproducer/TestDriverOptions.test b/lldb/test/Shell/Reproducer/TestDriverOptions.test index 4b5dfbf063ca..e249a401d15b 100644 --- a/lldb/test/Shell/Reproducer/TestDriverOptions.test +++ b/lldb/test/Shell/Reproducer/TestDriverOptions.test @@ -11,7 +11,14 @@ # RUN: %lldb --capture --capture-path %t.repro -b -o 'reproducer status' 2>&1 | FileCheck %s --check-prefix NO-WARNING --check-prefix STATUS-CAPTURE # RUN: %lldb --capture -b -o 'reproducer status' 2>&1 | FileCheck %s --check-prefix NO-WARNING --check-prefix STATUS-CAPTURE # RUN: %lldb --capture-path %t.repro -b -o 'reproducer status' 2>&1 | FileCheck %s --check-prefix WARNING --check-prefix STATUS-CAPTURE +# RUN: %lldb --capture-path %t.repro -b -o 'reproducer status' --reproducer-auto-generate 2>&1 | FileCheck %s --check-prefix WARNING2 # # NO-WARNING-NOT: warning: -capture-path specified without -capture # WARNING: warning: -capture-path specified without -capture +# WARNING2: warning: -reproducer-auto-generate specified without -capture # STATUS-CAPTURE: Reproducer is in capture mode. + +# Check auto generate. +# RUN: rm -rf %t.repro +# RUN: %lldb --capture --capture-path %t.repro -b --reproducer-auto-generate -o 'reproducer status' 2>&1 | FileCheck %s --check-prefix NO-WARNING +# RUN: cat %t.repro/index.yaml diff --git a/lldb/tools/driver/Driver.cpp b/lldb/tools/driver/Driver.cpp index 73874389aa1b..670361787f1f 100644 --- a/lldb/tools/driver/Driver.cpp +++ b/lldb/tools/driver/Driver.cpp @@ -807,8 +807,14 @@ llvm::Optional<int> InitializeReproducer(opt::InputArgList &input_args) { } bool capture = input_args.hasArg(OPT_capture); + bool auto_generate = input_args.hasArg(OPT_auto_generate); auto *capture_path = input_args.getLastArg(OPT_capture_path); + if (auto_generate && !capture) { + WithColor::warning() + << "-reproducer-auto-generate specified without -capture\n"; + } + if (capture || capture_path) { if (capture_path) { if (!capture) @@ -824,6 +830,8 @@ llvm::Optional<int> InitializeReproducer(opt::InputArgList &input_args) { return 1; } } + if (auto_generate) + SBReproducer::SetAutoGenerate(true); } return llvm::None; diff --git a/lldb/tools/driver/Options.td b/lldb/tools/driver/Options.td index c237f568f64c..e459a153d618 100644 --- a/lldb/tools/driver/Options.td +++ b/lldb/tools/driver/Options.td @@ -234,5 +234,7 @@ def replay: Separate<["--", "-"], "replay">, HelpText<"Tells the debugger to replay a reproducer from <filename>.">; def skip_version_check: F<"reproducer-skip-version-check">, HelpText<"Skip the reproducer version check.">; +def auto_generate: F<"reproducer-auto-generate">, + HelpText<"Generate reproducer on exit.">; def REM : R<["--"], "">; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits