[lldb] Avoid confusing reproducer crashes when initialization failed
During active replay, the ::Initialize call is replayed like any other
SB API call and the return value is ignored. Since we can't intercept
this, we terminate here before the uninitialized debugger inevitably
crashes.
Differential revision: https://reviews.llvm.org/D90987
diff --git a/lldb/source/API/SystemInitializerFull.cpp b/lldb/source/API/SystemInitializerFull.cpp
index a9723f7..cd5b464 100644
--- a/lldb/source/API/SystemInitializerFull.cpp
+++ b/lldb/source/API/SystemInitializerFull.cpp
@@ -15,6 +15,7 @@
#include "lldb/Initialization/SystemInitializerCommon.h"
#include "lldb/Interpreter/CommandInterpreter.h"
#include "lldb/Target/ProcessTrace.h"
+#include "lldb/Utility/Reproducer.h"
#include "lldb/Utility/Timer.h"
#include "llvm/Support/TargetSelect.h"
@@ -34,8 +35,16 @@
SystemInitializerFull::~SystemInitializerFull() = default;
llvm::Error SystemInitializerFull::Initialize() {
- if (auto e = SystemInitializerCommon::Initialize())
- return e;
+ llvm::Error error = SystemInitializerCommon::Initialize();
+ if (error) {
+ // During active replay, the ::Initialize call is replayed like any other
+ // SB API call and the return value is ignored. Since we can't intercept
+ // this, we terminate here before the uninitialized debugger inevitably
+ // crashes.
+ if (repro::Reproducer::Instance().IsReplaying())
+ llvm::report_fatal_error("system initialization failed");
+ return error;
+ }
// Initialize LLVM and Clang
llvm::InitializeAllTargets();