diff options
author | Jonas Devlieghere <jonas@devlieghere.com> | 2019-02-21 22:26:16 +0000 |
---|---|---|
committer | Jonas Devlieghere <jonas@devlieghere.com> | 2019-02-21 22:26:16 +0000 |
commit | 936c62422f5dc2d493978f1b99e2218016d8ea13 (patch) | |
tree | 9f3ba4139206711f46f88ca7779245a9a8407bbb | |
parent | ecfac6cd2ce0421a48c2e878e8efe745afd0b2e8 (diff) | |
download | bcm5719-llvm-936c62422f5dc2d493978f1b99e2218016d8ea13.tar.gz bcm5719-llvm-936c62422f5dc2d493978f1b99e2218016d8ea13.zip |
[Reproducers] Initialize reproducers before initializing the debugger.
As per the discussion on the mailing list:
http://lists.llvm.org/pipermail/lldb-commits/Week-of-Mon-20190218/048007.html
This commit implements option (3):
> Go back to initializing the reproducer before the rest of the debugger.
> The method wouldn't be instrumented and guarantee no other SB methods are
> called or SB objects are constructed. The initialization then becomes part
> of the replay.
Differential revision: https://reviews.llvm.org/D58410
llvm-svn: 354631
30 files changed, 86 insertions, 191 deletions
diff --git a/lldb/include/lldb/API/SBDebugger.h b/lldb/include/lldb/API/SBDebugger.h index 6bb3632a454..a3ac0e858d6 100644 --- a/lldb/include/lldb/API/SBDebugger.h +++ b/lldb/include/lldb/API/SBDebugger.h @@ -12,7 +12,6 @@ #include <stdio.h> #include "lldb/API/SBDefines.h" -#include "lldb/API/SBInitializerOptions.h" #include "lldb/API/SBPlatform.h" namespace lldb { @@ -45,7 +44,8 @@ public: lldb::SBDebugger &operator=(const lldb::SBDebugger &rhs); static void Initialize(); - static lldb::SBError Initialize(SBInitializerOptions &options); + + static lldb::SBError InitializeWithErrorHandling(); static void Terminate(); diff --git a/lldb/include/lldb/API/SBDefines.h b/lldb/include/lldb/API/SBDefines.h index b45ae08107a..fcbcffec995 100644 --- a/lldb/include/lldb/API/SBDefines.h +++ b/lldb/include/lldb/API/SBDefines.h @@ -50,7 +50,6 @@ class LLDB_API SBFileSpecList; class LLDB_API SBFrame; class LLDB_API SBFunction; class LLDB_API SBHostOS; -class LLDB_API SBInitializerOptions; class LLDB_API SBInstruction; class LLDB_API SBInstructionList; class LLDB_API SBLanguageRuntime; diff --git a/lldb/include/lldb/API/SBError.h b/lldb/include/lldb/API/SBError.h index c92c3338245..bcfa9acf55c 100644 --- a/lldb/include/lldb/API/SBError.h +++ b/lldb/include/lldb/API/SBError.h @@ -51,22 +51,23 @@ public: bool GetDescription(lldb::SBStream &description); protected: + friend class SBBreakpoint; + friend class SBBreakpointLocation; + friend class SBBreakpointName; friend class SBCommandReturnObject; + friend class SBCommunication; friend class SBData; friend class SBDebugger; - friend class SBCommunication; friend class SBHostOS; friend class SBPlatform; friend class SBProcess; + friend class SBReproducer; friend class SBStructuredData; + friend class SBTarget; friend class SBThread; friend class SBTrace; - friend class SBTarget; friend class SBValue; friend class SBWatchpoint; - friend class SBBreakpoint; - friend class SBBreakpointLocation; - friend class SBBreakpointName; lldb_private::Status *get(); diff --git a/lldb/include/lldb/API/SBFileSpec.h b/lldb/include/lldb/API/SBFileSpec.h index 627b5677005..3e81d592044 100644 --- a/lldb/include/lldb/API/SBFileSpec.h +++ b/lldb/include/lldb/API/SBFileSpec.h @@ -58,7 +58,6 @@ private: friend class SBDeclaration; friend class SBFileSpecList; friend class SBHostOS; - friend class SBInitializerOptions; friend class SBLaunchInfo; friend class SBLineEntry; friend class SBModule; diff --git a/lldb/include/lldb/API/SBInitializerOptions.h b/lldb/include/lldb/API/SBInitializerOptions.h deleted file mode 100644 index 61285689703..00000000000 --- a/lldb/include/lldb/API/SBInitializerOptions.h +++ /dev/null @@ -1,42 +0,0 @@ -//===-- SBInitializerOptions.h ----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef LLDB_SBInitializerOptuions_h_ -#define LLDB_SBInitializerOptuions_h_ - -#include "lldb/API/SBDefines.h" -#include "lldb/API/SBFileSpec.h" - -namespace lldb_private { -struct InitializerOptions; -} - -namespace lldb { - -class LLDB_API SBInitializerOptions { -public: - SBInitializerOptions(); - SBInitializerOptions(const lldb::SBInitializerOptions &rhs); - ~SBInitializerOptions(); - const SBInitializerOptions &operator=(const lldb::SBInitializerOptions &rhs); - - void SetCaptureReproducer(bool b); - void SetReplayReproducer(bool b); - void SetReproducerPath(const char *path); - - lldb_private::InitializerOptions &ref() const; - -private: - friend class SBDebugger; - - std::unique_ptr<lldb_private::InitializerOptions> m_opaque_up; -}; - -} // namespace lldb - -#endif // LLDB_SBInitializerOptuions_h_ diff --git a/lldb/include/lldb/API/SBReproducer.h b/lldb/include/lldb/API/SBReproducer.h index 771d73419cc..97901a3bb6d 100644 --- a/lldb/include/lldb/API/SBReproducer.h +++ b/lldb/include/lldb/API/SBReproducer.h @@ -9,13 +9,17 @@ #ifndef LLDB_API_SBREPRODUCER_H #define LLDB_API_SBREPRODUCER_H -#include "lldb/lldb-defines.h" +#include "lldb/API/SBDefines.h" namespace lldb { +/// The SBReproducer class is special because it bootstraps the capture and +/// replay of SB API calls. As a result we cannot rely on any other SB objects +/// in the interface or implementation of this class. class LLDB_API SBReproducer { public: - static bool Replay(); + static const char *Capture(const char *path); + static const char *Replay(const char *path); }; } // namespace lldb diff --git a/lldb/include/lldb/Initialization/SystemInitializer.h b/lldb/include/lldb/Initialization/SystemInitializer.h index ec699bd65ce..e616ad1ee81 100644 --- a/lldb/include/lldb/Initialization/SystemInitializer.h +++ b/lldb/include/lldb/Initialization/SystemInitializer.h @@ -15,18 +15,12 @@ namespace lldb_private { -struct InitializerOptions { - bool reproducer_capture = false; - bool reproducer_replay = false; - std::string reproducer_path; -}; - class SystemInitializer { public: SystemInitializer(); virtual ~SystemInitializer(); - virtual llvm::Error Initialize(const InitializerOptions &options) = 0; + virtual llvm::Error Initialize() = 0; virtual void Terminate() = 0; }; } diff --git a/lldb/include/lldb/Initialization/SystemInitializerCommon.h b/lldb/include/lldb/Initialization/SystemInitializerCommon.h index 785ae0459e0..83b24c0c670 100644 --- a/lldb/include/lldb/Initialization/SystemInitializerCommon.h +++ b/lldb/include/lldb/Initialization/SystemInitializerCommon.h @@ -27,7 +27,7 @@ public: SystemInitializerCommon(); ~SystemInitializerCommon() override; - llvm::Error Initialize(const InitializerOptions &options) override; + llvm::Error Initialize() override; void Terminate() override; }; diff --git a/lldb/include/lldb/Initialization/SystemLifetimeManager.h b/lldb/include/lldb/Initialization/SystemLifetimeManager.h index b176d394b43..2e99b86dbdb 100644 --- a/lldb/include/lldb/Initialization/SystemLifetimeManager.h +++ b/lldb/include/lldb/Initialization/SystemLifetimeManager.h @@ -24,7 +24,6 @@ public: ~SystemLifetimeManager(); llvm::Error Initialize(std::unique_ptr<SystemInitializer> initializer, - const InitializerOptions &options, LoadPluginCallbackType plugin_callback); void Terminate(); diff --git a/lldb/include/lldb/Utility/Reproducer.h b/lldb/include/lldb/Utility/Reproducer.h index 83f7d015227..2655586ac04 100644 --- a/lldb/include/lldb/Utility/Reproducer.h +++ b/lldb/include/lldb/Utility/Reproducer.h @@ -201,6 +201,7 @@ public: static Reproducer &Instance(); static llvm::Error Initialize(ReproducerMode mode, llvm::Optional<FileSpec> root); + static bool Initialized(); static void Terminate(); Reproducer() = default; diff --git a/lldb/lldb.xcodeproj/project.pbxproj b/lldb/lldb.xcodeproj/project.pbxproj index 2eb9151c965..cf031fe175f 100644 --- a/lldb/lldb.xcodeproj/project.pbxproj +++ b/lldb/lldb.xcodeproj/project.pbxproj @@ -793,8 +793,6 @@ 26DE205311618FAC00A093E2 /* SBFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 26DE205211618FAC00A093E2 /* SBFunction.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9A3576AA116E9AC700E8ED2F /* SBHostOS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A3576A9116E9AC700E8ED2F /* SBHostOS.cpp */; }; 9A3576A8116E9AB700E8ED2F /* SBHostOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A3576A7116E9AB700E8ED2F /* SBHostOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AFB2F2F621B71AF30078DEF1 /* SBInitializerOptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AFB2F2F421B71AE90078DEF1 /* SBInitializerOptions.cpp */; }; - 4C38996D21BA11CA002BAEF4 /* SBInitializerOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C38996C21BA11CA002BAEF4 /* SBInitializerOptions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9AC703AF117675410086C050 /* SBInstruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9AC703AE117675410086C050 /* SBInstruction.cpp */; }; 9AC7038E117674FB0086C050 /* SBInstruction.h in Headers */ = {isa = PBXBuildFile; fileRef = 9AC7038D117674EB0086C050 /* SBInstruction.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9AC703B1117675490086C050 /* SBInstructionList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9AC703B0117675490086C050 /* SBInstructionList.cpp */; }; @@ -2801,8 +2799,6 @@ 9A3576A9116E9AC700E8ED2F /* SBHostOS.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SBHostOS.cpp; path = source/API/SBHostOS.cpp; sourceTree = "<group>"; }; 9A3576A7116E9AB700E8ED2F /* SBHostOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SBHostOS.h; path = include/lldb/API/SBHostOS.h; sourceTree = "<group>"; }; 2611FF00142D83060017FEA3 /* SBHostOS.i */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c.preprocessed; path = SBHostOS.i; sourceTree = "<group>"; }; - AFB2F2F421B71AE90078DEF1 /* SBInitializerOptions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SBInitializerOptions.cpp; path = source/API/SBInitializerOptions.cpp; sourceTree = "<group>"; }; - 4C38996C21BA11CA002BAEF4 /* SBInitializerOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SBInitializerOptions.h; path = include/lldb/API/SBInitializerOptions.h; sourceTree = "<group>"; }; 9AC703AE117675410086C050 /* SBInstruction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SBInstruction.cpp; path = source/API/SBInstruction.cpp; sourceTree = "<group>"; }; 9AC7038D117674EB0086C050 /* SBInstruction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SBInstruction.h; path = include/lldb/API/SBInstruction.h; sourceTree = "<group>"; }; 2611FF02142D83060017FEA3 /* SBInstruction.i */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c.preprocessed; path = SBInstruction.i; sourceTree = "<group>"; }; @@ -4362,8 +4358,6 @@ 26DE205C1161901400A093E2 /* SBFunction.cpp */, 9A3576A7116E9AB700E8ED2F /* SBHostOS.h */, 9A3576A9116E9AC700E8ED2F /* SBHostOS.cpp */, - AFB2F2F421B71AE90078DEF1 /* SBInitializerOptions.cpp */, - 4C38996C21BA11CA002BAEF4 /* SBInitializerOptions.h */, 9AC7038D117674EB0086C050 /* SBInstruction.h */, 9AC703AE117675410086C050 /* SBInstruction.cpp */, 9AC7038F117675270086C050 /* SBInstructionList.h */, @@ -7079,7 +7073,6 @@ 4C56543519D2297A002E9C44 /* SBThreadPlan.h in Headers */, 263C493A178B50CF0070F12D /* SBModuleSpec.h in Headers */, 2617447A11685869005ADD65 /* SBType.h in Headers */, - 4C38996D21BA11CA002BAEF4 /* SBInitializerOptions.h in Headers */, 9475C18914E5EA08001BFC6D /* SBTypeCategory.h in Headers */, 941BCC7F14E48C4000BB969C /* SBTypeFilter.h in Headers */, 941BCC8014E48C4000BB969C /* SBTypeFormat.h in Headers */, @@ -7902,7 +7895,6 @@ 26680336116005EF008E1FE4 /* SBBreakpointLocation.cpp in Sources */, 26680337116005F1008E1FE4 /* SBBreakpoint.cpp in Sources */, 26DE204511618ADA00A093E2 /* SBAddress.cpp in Sources */, - AFB2F2F621B71AF30078DEF1 /* SBInitializerOptions.cpp in Sources */, 26DE204711618AED00A093E2 /* SBSymbolContext.cpp in Sources */, 26DE204D11618E7A00A093E2 /* SBModule.cpp in Sources */, 26DE205D1161901400A093E2 /* SBFunction.cpp in Sources */, diff --git a/lldb/scripts/interface/SBDebugger.i b/lldb/scripts/interface/SBDebugger.i index 5c9ebaa6f2a..a3ecc157359 100644 --- a/lldb/scripts/interface/SBDebugger.i +++ b/lldb/scripts/interface/SBDebugger.i @@ -122,8 +122,8 @@ public: static void Initialize(); - static void - Initialize(lldb::SBInitializerOptions& options); + static SBError + InitializeWithErrorHandling(); static void Terminate(); diff --git a/lldb/scripts/interface/SBInitializerOptions.i b/lldb/scripts/interface/SBInitializerOptions.i deleted file mode 100644 index 530a18e76f8..00000000000 --- a/lldb/scripts/interface/SBInitializerOptions.i +++ /dev/null @@ -1,23 +0,0 @@ -//===-- SWIG Interface for SBInitializerOptions -----------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -namespace lldb { - -class SBInitializerOptions -{ -public: - SBInitializerOptions (); - SBInitializerOptions (const lldb::SBInitializerOptions &rhs); - ~SBInitializerOptions(); - - void SetCaptureReproducer(bool b); - void SetReplayReproducer(bool b); - void SetReproducerPath(const char* path); -}; - -} // namespace lldb diff --git a/lldb/scripts/lldb.swig b/lldb/scripts/lldb.swig index 1cfa2718eb4..272559f8fb9 100644 --- a/lldb/scripts/lldb.swig +++ b/lldb/scripts/lldb.swig @@ -202,7 +202,6 @@ EMBED_VERSION(SWIG_VERSION) %include "./interface/SBFrame.i" %include "./interface/SBFunction.i" %include "./interface/SBHostOS.i" -%include "./interface/SBInitializerOptions.i" %include "./interface/SBInstruction.i" %include "./interface/SBInstructionList.i" %include "./interface/SBLanguageRuntime.i" diff --git a/lldb/source/API/CMakeLists.txt b/lldb/source/API/CMakeLists.txt index f5c33ed6ab5..2de284f1702 100644 --- a/lldb/source/API/CMakeLists.txt +++ b/lldb/source/API/CMakeLists.txt @@ -34,7 +34,6 @@ add_lldb_library(liblldb SHARED SBFrame.cpp SBFunction.cpp SBHostOS.cpp - SBInitializerOptions.cpp SBInstruction.cpp SBInstructionList.cpp SBLanguageRuntime.cpp diff --git a/lldb/source/API/SBDebugger.cpp b/lldb/source/API/SBDebugger.cpp index 92ca723a92d..d402bb0b48e 100644 --- a/lldb/source/API/SBDebugger.cpp +++ b/lldb/source/API/SBDebugger.cpp @@ -124,11 +124,10 @@ SBDebugger &SBDebugger::operator=(const SBDebugger &rhs) { } void SBDebugger::Initialize() { - SBInitializerOptions options; - SBDebugger::Initialize(options); + SBError ignored = SBDebugger::InitializeWithErrorHandling(); } -lldb::SBError SBDebugger::Initialize(SBInitializerOptions &options) { +lldb::SBError SBDebugger::InitializeWithErrorHandling() { Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); if (log) @@ -136,8 +135,7 @@ lldb::SBError SBDebugger::Initialize(SBInitializerOptions &options) { SBError error; if (auto e = g_debugger_lifetime->Initialize( - llvm::make_unique<SystemInitializerFull>(), *options.m_opaque_up, - LoadPlugin)) { + llvm::make_unique<SystemInitializerFull>(), LoadPlugin)) { error.SetError(Status(std::move(e))); } return error; diff --git a/lldb/source/API/SBInitializerOptions.cpp b/lldb/source/API/SBInitializerOptions.cpp deleted file mode 100644 index 654e72c4a44..00000000000 --- a/lldb/source/API/SBInitializerOptions.cpp +++ /dev/null @@ -1,48 +0,0 @@ -//===-- SBInitializerOptions.cpp --------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include "lldb/API/SBInitializerOptions.h" -#include "lldb/Initialization/SystemInitializer.h" - -using namespace lldb; -using namespace lldb_private; - -SBInitializerOptions::SBInitializerOptions(const SBInitializerOptions &rhs) { - m_opaque_up.reset(new InitializerOptions()); - *(m_opaque_up.get()) = rhs.ref(); -} - -const SBInitializerOptions &SBInitializerOptions:: -operator=(const SBInitializerOptions &rhs) { - if (this != &rhs) { - this->ref() = rhs.ref(); - } - return *this; -} - -SBInitializerOptions::~SBInitializerOptions() {} - -SBInitializerOptions::SBInitializerOptions() { - m_opaque_up.reset(new InitializerOptions()); -} - -void SBInitializerOptions::SetCaptureReproducer(bool b) { - m_opaque_up->reproducer_capture = b; -} - -void SBInitializerOptions::SetReplayReproducer(bool b) { - m_opaque_up->reproducer_replay = b; -} - -void SBInitializerOptions::SetReproducerPath(const char *path) { - m_opaque_up->reproducer_path = path; -} - -InitializerOptions &SBInitializerOptions::ref() const { - return *(m_opaque_up.get()); -} diff --git a/lldb/source/API/SBReproducer.cpp b/lldb/source/API/SBReproducer.cpp index 12303f79dba..17e13c55a94 100644 --- a/lldb/source/API/SBReproducer.cpp +++ b/lldb/source/API/SBReproducer.cpp @@ -30,19 +30,42 @@ using namespace lldb_private::repro; SBRegistry::SBRegistry() {} -bool SBReproducer::Replay() { +const char *SBReproducer::Capture(const char *path) { + static std::string error; + if (auto e = + Reproducer::Initialize(ReproducerMode::Capture, FileSpec(path))) { + error = llvm::toString(std::move(e)); + return error.c_str(); + } + return nullptr; +} + +const char *SBReproducer::Replay(const char *path) { + static std::string error; + if (auto e = Reproducer::Initialize(ReproducerMode::Replay, FileSpec(path))) { + error = llvm::toString(std::move(e)); + return error.c_str(); + } + repro::Loader *loader = repro::Reproducer::Instance().GetLoader(); - if (!loader) - return false; + if (!loader) { + error = "unable to get replay loader."; + return error.c_str(); + } + // FIXME: Enable the following code once the SB reproducer has landed. +#if 0 FileSpec file = loader->GetFile<SBInfo>(); - if (!file) - return false; + if (!file) { + error = "unable to get replay data from reproducer."; + return error.c_str(); + } SBRegistry registry; registry.Replay(file); +#endif - return true; + return nullptr; } char lldb_private::repro::SBProvider::ID = 0; diff --git a/lldb/source/API/SystemInitializerFull.cpp b/lldb/source/API/SystemInitializerFull.cpp index 3ca1e8c405f..427186f2c42 100644 --- a/lldb/source/API/SystemInitializerFull.cpp +++ b/lldb/source/API/SystemInitializerFull.cpp @@ -265,9 +265,8 @@ SystemInitializerFull::SystemInitializerFull() {} SystemInitializerFull::~SystemInitializerFull() {} -llvm::Error -SystemInitializerFull::Initialize(const InitializerOptions &options) { - if (auto e = SystemInitializerCommon::Initialize(options)) +llvm::Error SystemInitializerFull::Initialize() { + if (auto e = SystemInitializerCommon::Initialize()) return e; breakpad::ObjectFileBreakpad::Initialize(); diff --git a/lldb/source/API/SystemInitializerFull.h b/lldb/source/API/SystemInitializerFull.h index cfeb821b45c..80da7d01fb8 100644 --- a/lldb/source/API/SystemInitializerFull.h +++ b/lldb/source/API/SystemInitializerFull.h @@ -25,7 +25,7 @@ public: SystemInitializerFull(); ~SystemInitializerFull() override; - llvm::Error Initialize(const InitializerOptions &options) override; + llvm::Error Initialize() override; void Terminate() override; private: diff --git a/lldb/source/Initialization/SystemInitializerCommon.cpp b/lldb/source/Initialization/SystemInitializerCommon.cpp index 173d48308c6..f69f5b0bf59 100644 --- a/lldb/source/Initialization/SystemInitializerCommon.cpp +++ b/lldb/source/Initialization/SystemInitializerCommon.cpp @@ -41,8 +41,7 @@ SystemInitializerCommon::SystemInitializerCommon() {} SystemInitializerCommon::~SystemInitializerCommon() {} -llvm::Error -SystemInitializerCommon::Initialize(const InitializerOptions &options) { +llvm::Error SystemInitializerCommon::Initialize() { #if defined(_MSC_VER) const char *disable_crash_dialog_var = getenv("LLDB_DISABLE_CRASH_DIALOG"); if (disable_crash_dialog_var && @@ -65,15 +64,12 @@ SystemInitializerCommon::Initialize(const InitializerOptions &options) { } #endif - // Initialize the reproducer. - ReproducerMode mode = ReproducerMode::Off; - if (options.reproducer_capture) - mode = ReproducerMode::Capture; - if (options.reproducer_replay) - mode = ReproducerMode::Replay; - - if (auto e = Reproducer::Initialize(mode, FileSpec(options.reproducer_path))) - return e; + // If the reproducer wasn't initialized before, we can safely assume it's + // off. + if (!Reproducer::Initialized()) { + if (auto e = Reproducer::Initialize(ReproducerMode::Off, llvm::None)) + return e; + } // Initialize the file system. auto &r = repro::Reproducer::Instance(); diff --git a/lldb/source/Initialization/SystemLifetimeManager.cpp b/lldb/source/Initialization/SystemLifetimeManager.cpp index 97e696bb590..97f60489f04 100644 --- a/lldb/source/Initialization/SystemLifetimeManager.cpp +++ b/lldb/source/Initialization/SystemLifetimeManager.cpp @@ -25,7 +25,7 @@ SystemLifetimeManager::~SystemLifetimeManager() { llvm::Error SystemLifetimeManager::Initialize( std::unique_ptr<SystemInitializer> initializer, - const InitializerOptions &options, LoadPluginCallbackType plugin_callback) { + LoadPluginCallbackType plugin_callback) { std::lock_guard<std::recursive_mutex> guard(m_mutex); if (!m_initialized) { assert(!m_initializer && "Attempting to call " @@ -34,7 +34,7 @@ llvm::Error SystemLifetimeManager::Initialize( m_initialized = true; m_initializer = std::move(initializer); - if (auto e = m_initializer->Initialize(options)) + if (auto e = m_initializer->Initialize()) return e; Debugger::Initialize(plugin_callback); diff --git a/lldb/source/Utility/Reproducer.cpp b/lldb/source/Utility/Reproducer.cpp index 3fb0624c4fb..9f749aac36a 100644 --- a/lldb/source/Utility/Reproducer.cpp +++ b/lldb/source/Utility/Reproducer.cpp @@ -51,6 +51,8 @@ llvm::Error Reproducer::Initialize(ReproducerMode mode, return Error::success(); } +bool Reproducer::Initialized() { return InstanceImpl().operator bool(); } + void Reproducer::Terminate() { lldbassert(InstanceImpl() && "Already terminated."); InstanceImpl().reset(); diff --git a/lldb/tools/driver/Driver.cpp b/lldb/tools/driver/Driver.cpp index 2aaaa05d751..8845cb1fe54 100644 --- a/lldb/tools/driver/Driver.cpp +++ b/lldb/tools/driver/Driver.cpp @@ -13,6 +13,7 @@ #include "lldb/API/SBDebugger.h" #include "lldb/API/SBHostOS.h" #include "lldb/API/SBLanguageRuntime.h" +#include "lldb/API/SBReproducer.h" #include "lldb/API/SBStream.h" #include "lldb/API/SBStringList.h" @@ -888,26 +889,31 @@ main(int argc, char const *argv[]) << '\n'; } - SBInitializerOptions options; if (auto *arg = input_args.getLastArg(OPT_capture)) { auto arg_value = arg->getValue(); - options.SetReproducerPath(arg_value); - options.SetCaptureReproducer(true); + const char *error = SBReproducer::Capture(arg_value); + if (error) { + WithColor::error() << "reproducer capture failed: " << error << '\n'; + return 1; + } } if (auto *arg = input_args.getLastArg(OPT_replay)) { auto arg_value = arg->getValue(); - options.SetReplayReproducer(true); - options.SetReproducerPath(arg_value); + const char *error = SBReproducer::Replay(arg_value); + if (error) { + WithColor::error() << "reproducer replay failed: " << error << '\n'; + return 1; + } + // FIXME: Return once SBReproducer::Replay actually performs the replay. } - SBError error = SBDebugger::Initialize(options); + SBError error = SBDebugger::InitializeWithErrorHandling(); if (error.Fail()) { WithColor::error() << "initialization failed: " << error.GetCString() << '\n'; return 1; } - SBHostOS::ThreadCreated("<lldb.driver.main-thread>"); signal(SIGINT, sigint_handler); diff --git a/lldb/tools/lldb-server/SystemInitializerLLGS.cpp b/lldb/tools/lldb-server/SystemInitializerLLGS.cpp index 8b0b89de1ef..c7010f46f20 100644 --- a/lldb/tools/lldb-server/SystemInitializerLLGS.cpp +++ b/lldb/tools/lldb-server/SystemInitializerLLGS.cpp @@ -21,9 +21,8 @@ using HostObjectFile = ObjectFileELF; using namespace lldb_private; -llvm::Error -SystemInitializerLLGS::Initialize(const InitializerOptions &options) { - if (auto e = SystemInitializerCommon::Initialize(options)) +llvm::Error SystemInitializerLLGS::Initialize() { + if (auto e = SystemInitializerCommon::Initialize()) return e; HostObjectFile::Initialize(); diff --git a/lldb/tools/lldb-server/SystemInitializerLLGS.h b/lldb/tools/lldb-server/SystemInitializerLLGS.h index d35b1931c55..59a1fa14e81 100644 --- a/lldb/tools/lldb-server/SystemInitializerLLGS.h +++ b/lldb/tools/lldb-server/SystemInitializerLLGS.h @@ -14,8 +14,7 @@ class SystemInitializerLLGS : public lldb_private::SystemInitializerCommon { public: - llvm::Error - Initialize(const lldb_private::InitializerOptions &options) override; + llvm::Error Initialize() override; void Terminate() override; }; diff --git a/lldb/tools/lldb-server/lldb-server.cpp b/lldb/tools/lldb-server/lldb-server.cpp index 15aa3fc2be7..8d126b10c10 100644 --- a/lldb/tools/lldb-server/lldb-server.cpp +++ b/lldb/tools/lldb-server/lldb-server.cpp @@ -38,7 +38,7 @@ int main_platform(int argc, char *argv[]); static void initialize() { if (auto e = g_debugger_lifetime->Initialize( - llvm::make_unique<SystemInitializerLLGS>(), {}, nullptr)) + llvm::make_unique<SystemInitializerLLGS>(), nullptr)) llvm::consumeError(std::move(e)); } diff --git a/lldb/tools/lldb-test/SystemInitializerTest.cpp b/lldb/tools/lldb-test/SystemInitializerTest.cpp index 9bc59adbd05..f5b8f887e09 100644 --- a/lldb/tools/lldb-test/SystemInitializerTest.cpp +++ b/lldb/tools/lldb-test/SystemInitializerTest.cpp @@ -112,9 +112,8 @@ SystemInitializerTest::SystemInitializerTest() {} SystemInitializerTest::~SystemInitializerTest() {} -llvm::Error -SystemInitializerTest::Initialize(const InitializerOptions &options) { - if (auto e = SystemInitializerCommon::Initialize(options)) +llvm::Error SystemInitializerTest::Initialize() { + if (auto e = SystemInitializerCommon::Initialize()) return e; breakpad::ObjectFileBreakpad::Initialize(); diff --git a/lldb/tools/lldb-test/SystemInitializerTest.h b/lldb/tools/lldb-test/SystemInitializerTest.h index 336889088e7..4134c53d038 100644 --- a/lldb/tools/lldb-test/SystemInitializerTest.h +++ b/lldb/tools/lldb-test/SystemInitializerTest.h @@ -25,7 +25,7 @@ public: SystemInitializerTest(); ~SystemInitializerTest() override; - llvm::Error Initialize(const InitializerOptions &options) override; + llvm::Error Initialize() override; void Terminate() override; }; diff --git a/lldb/tools/lldb-test/lldb-test.cpp b/lldb/tools/lldb-test/lldb-test.cpp index 271b830ea77..3efb26b8c88 100644 --- a/lldb/tools/lldb-test/lldb-test.cpp +++ b/lldb/tools/lldb-test/lldb-test.cpp @@ -963,7 +963,7 @@ int main(int argc, const char *argv[]) { SystemLifetimeManager DebuggerLifetime; if (auto e = DebuggerLifetime.Initialize( - llvm::make_unique<SystemInitializerTest>(), {}, nullptr)) { + llvm::make_unique<SystemInitializerTest>(), nullptr)) { WithColor::error() << "initialization failed: " << toString(std::move(e)) << '\n'; return 1; |