Revert "[ORC][LLJIT] Move enable-debugger-support utility out of LLJITBuilder."
This reverts commit e1a5bb59b9 while I
investigate the bot failure at
https://lab.llvm.org/buildbot/#/builders/168/builds/15831
This commit is contained in:
@@ -17,7 +17,6 @@
|
||||
#include "clang/Interpreter/PartialTranslationUnit.h"
|
||||
#include "llvm/ExecutionEngine/ExecutionEngine.h"
|
||||
#include "llvm/ExecutionEngine/Orc/CompileUtils.h"
|
||||
#include "llvm/ExecutionEngine/Orc/DebuggerSupport.h"
|
||||
#include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
|
||||
#include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
|
||||
#include "llvm/ExecutionEngine/Orc/LLJIT.h"
|
||||
@@ -47,13 +46,8 @@ IncrementalExecutor::IncrementalExecutor(llvm::orc::ThreadSafeContext &TSC,
|
||||
JTMB.addFeatures(TI.getTargetOpts().Features);
|
||||
LLJITBuilder Builder;
|
||||
Builder.setJITTargetMachineBuilder(JTMB);
|
||||
Builder.setPrePlatformSetup(
|
||||
[](LLJIT &J) {
|
||||
// Try to enable debugging of JIT'd code (only works with JITLink for
|
||||
// ELF and MachO).
|
||||
consumeError(enableDebuggerSupport(J));
|
||||
return llvm::Error::success();
|
||||
});
|
||||
// Enable debugging of JIT'd code (only works on JITLink for ELF and MachO).
|
||||
Builder.setEnableDebuggerSupport(true);
|
||||
|
||||
if (auto JitOrErr = Builder.create())
|
||||
Jit = std::move(*JitOrErr);
|
||||
|
||||
@@ -152,7 +152,9 @@ int main(int argc, const char **argv) {
|
||||
llvm::InitializeAllAsmPrinters();
|
||||
|
||||
if (OptHostSupportsJit) {
|
||||
auto J = llvm::orc::LLJITBuilder().create();
|
||||
auto J = llvm::orc::LLJITBuilder()
|
||||
.setEnableDebuggerSupport(true)
|
||||
.create();
|
||||
if (J)
|
||||
llvm::outs() << "true\n";
|
||||
else {
|
||||
|
||||
@@ -52,7 +52,9 @@ TEST(InterpreterTest, CatchException) {
|
||||
llvm::InitializeNativeTargetAsmPrinter();
|
||||
|
||||
{
|
||||
auto J = llvm::orc::LLJITBuilder().create();
|
||||
auto J = llvm::orc::LLJITBuilder()
|
||||
.setEnableDebuggerSupport(true)
|
||||
.create();
|
||||
if (!J) {
|
||||
// The platform does not support JITs.
|
||||
// Using llvm::consumeError will require typeinfo for ErrorInfoBase, we
|
||||
|
||||
@@ -191,7 +191,9 @@ static std::string MangleName(NamedDecl *ND) {
|
||||
}
|
||||
|
||||
static bool HostSupportsJit() {
|
||||
auto J = llvm::orc::LLJITBuilder().create();
|
||||
auto J = llvm::orc::LLJITBuilder()
|
||||
.setEnableDebuggerSupport(true)
|
||||
.create();
|
||||
if (J)
|
||||
return true;
|
||||
LLVMConsumeError(llvm::wrap(J.takeError()));
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
//===-- DebugerSupport.h - Utils for enabling debugger support --*- 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
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Utilities for enabling debugger support.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_EXECUTIONENGINE_ORC_DEBUGGERSUPPORT_H
|
||||
#define LLVM_EXECUTIONENGINE_ORC_DEBUGGERSUPPORT_H
|
||||
|
||||
#include "llvm/Support/Error.h"
|
||||
|
||||
namespace llvm {
|
||||
namespace orc {
|
||||
|
||||
class LLJIT;
|
||||
|
||||
Error enableDebuggerSupport(LLJIT &J);
|
||||
|
||||
} // namespace orc
|
||||
} // namespace llvm
|
||||
|
||||
#endif // LLVM_EXECUTIONENGINE_ORC_DEBUGGERSUPPORT_H
|
||||
@@ -322,6 +322,7 @@ public:
|
||||
unique_function<Error(LLJIT &)> PrePlatformSetup;
|
||||
PlatformSetupFunction SetUpPlatform;
|
||||
unsigned NumCompileThreads = 0;
|
||||
bool EnableDebuggerSupport = false;
|
||||
|
||||
/// Called prior to JIT class construcion to fix up defaults.
|
||||
Error prepareForConstruction();
|
||||
@@ -454,6 +455,12 @@ public:
|
||||
return impl();
|
||||
}
|
||||
|
||||
/// Enable / disable debugger support (off by default).
|
||||
SetterImpl &setEnableDebuggerSupport(bool EnableDebuggerSupport) {
|
||||
impl().EnableDebuggerSupport = EnableDebuggerSupport;
|
||||
return impl();
|
||||
}
|
||||
|
||||
/// Set an ExecutorProcessControl object.
|
||||
///
|
||||
/// If the platform uses ObjectLinkingLayer by default and no
|
||||
|
||||
@@ -13,7 +13,6 @@ add_llvm_component_library(LLVMOrcJIT
|
||||
CompileUtils.cpp
|
||||
Core.cpp
|
||||
DebugObjectManagerPlugin.cpp
|
||||
DebuggerSupport.cpp
|
||||
DebuggerSupportPlugin.cpp
|
||||
DebugUtils.cpp
|
||||
EPCDynamicLibrarySearchGenerator.cpp
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
//===------ DebuggerSupport.cpp - Utils for enabling debugger support -----===//
|
||||
//
|
||||
// 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 "llvm/ExecutionEngine/Orc/DebuggerSupport.h"
|
||||
#include "llvm/ExecutionEngine/Orc/DebugObjectManagerPlugin.h"
|
||||
#include "llvm/ExecutionEngine/Orc/DebuggerSupportPlugin.h"
|
||||
#include "llvm/ExecutionEngine/Orc/LLJIT.h"
|
||||
|
||||
#define DEBUG_TYPE "orc"
|
||||
|
||||
using namespace llvm;
|
||||
using namespace llvm::orc;
|
||||
|
||||
namespace llvm::orc {
|
||||
|
||||
Error enableDebuggerSupport(LLJIT &J) {
|
||||
auto *ObjLinkingLayer = dyn_cast<ObjectLinkingLayer>(&J.getObjLinkingLayer());
|
||||
if (!ObjLinkingLayer)
|
||||
return make_error<StringError>("Cannot enable LLJIT debugger support: "
|
||||
"Debugger support requires JITLink",
|
||||
inconvertibleErrorCode());
|
||||
auto ProcessSymsJD = J.getProcessSymbolsJITDylib();
|
||||
if (!ProcessSymsJD)
|
||||
return make_error<StringError>("Cannot enable LLJIT debugger support: "
|
||||
"Process symbols are not available",
|
||||
inconvertibleErrorCode());
|
||||
|
||||
auto &ES = J.getExecutionSession();
|
||||
const auto &TT = J.getTargetTriple();
|
||||
|
||||
switch (TT.getObjectFormat()) {
|
||||
case Triple::ELF: {
|
||||
auto Registrar = createJITLoaderGDBRegistrar(ES);
|
||||
if (!Registrar)
|
||||
return Registrar.takeError();
|
||||
ObjLinkingLayer->addPlugin(std::make_unique<DebugObjectManagerPlugin>(
|
||||
ES, std::move(*Registrar), true, true));
|
||||
return Error::success();
|
||||
}
|
||||
case Triple::MachO: {
|
||||
auto DS = GDBJITDebugInfoRegistrationPlugin::Create(ES, *ProcessSymsJD, TT);
|
||||
if (!DS)
|
||||
return DS.takeError();
|
||||
ObjLinkingLayer->addPlugin(std::move(*DS));
|
||||
return Error::success();
|
||||
}
|
||||
default:
|
||||
return make_error<StringError>(
|
||||
"Cannot enable LLJIT debugger support: " +
|
||||
Triple::getObjectFormatTypeName(TT.getObjectFormat()) +
|
||||
" is not supported",
|
||||
inconvertibleErrorCode());
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace llvm::orc
|
||||
@@ -10,6 +10,8 @@
|
||||
#include "llvm/ExecutionEngine/JITLink/EHFrameSupport.h"
|
||||
#include "llvm/ExecutionEngine/JITLink/JITLinkMemoryManager.h"
|
||||
#include "llvm/ExecutionEngine/Orc/COFFPlatform.h"
|
||||
#include "llvm/ExecutionEngine/Orc/DebugObjectManagerPlugin.h"
|
||||
#include "llvm/ExecutionEngine/Orc/DebuggerSupportPlugin.h"
|
||||
#include "llvm/ExecutionEngine/Orc/ELFNixPlatform.h"
|
||||
#include "llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h"
|
||||
#include "llvm/ExecutionEngine/Orc/EPCEHFrameRegistrar.h"
|
||||
@@ -779,8 +781,18 @@ Error LLJITBuilderState::prepareForConstruction() {
|
||||
|
||||
// If we need a process JITDylib but no setup function has been given then
|
||||
// create a default one.
|
||||
if (!SetupProcessSymbolsJITDylib && LinkProcessSymbolsByDefault) {
|
||||
LLVM_DEBUG(dbgs() << "Creating default Process JD setup function\n");
|
||||
if (!SetupProcessSymbolsJITDylib &&
|
||||
(LinkProcessSymbolsByDefault || EnableDebuggerSupport)) {
|
||||
|
||||
LLVM_DEBUG({
|
||||
dbgs() << "Creating default Process JD setup function (neeeded for";
|
||||
if (LinkProcessSymbolsByDefault)
|
||||
dbgs() << " <link-process-syms-by-default>";
|
||||
if (EnableDebuggerSupport)
|
||||
dbgs() << " <debugger-support>";
|
||||
dbgs() << ")\n";
|
||||
});
|
||||
|
||||
SetupProcessSymbolsJITDylib = [this](LLJIT &J) -> Expected<JITDylibSP> {
|
||||
auto &JD =
|
||||
J.getExecutionSession().createBareJITDylib("<Process Symbols>");
|
||||
@@ -1002,6 +1014,46 @@ LLJIT::LLJIT(LLJITBuilderState &S, Error &Err)
|
||||
}
|
||||
}
|
||||
|
||||
if (S.EnableDebuggerSupport) {
|
||||
if (auto *OLL = dyn_cast<ObjectLinkingLayer>(ObjLinkingLayer.get())) {
|
||||
switch (TT.getObjectFormat()) {
|
||||
case Triple::ELF: {
|
||||
auto Registrar = createJITLoaderGDBRegistrar(*ES);
|
||||
if (!Registrar) {
|
||||
Err = Registrar.takeError();
|
||||
return;
|
||||
}
|
||||
OLL->addPlugin(std::make_unique<DebugObjectManagerPlugin>(
|
||||
*ES, std::move(*Registrar), true, true));
|
||||
break;
|
||||
}
|
||||
case Triple::MachO: {
|
||||
assert(ProcessSymbols && "ProcessSymbols JD should be available when "
|
||||
"EnableDebuggerSupport is set");
|
||||
auto DS =
|
||||
GDBJITDebugInfoRegistrationPlugin::Create(*ES, *ProcessSymbols, TT);
|
||||
if (!DS) {
|
||||
Err = DS.takeError();
|
||||
return;
|
||||
}
|
||||
OLL->addPlugin(std::move(*DS));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
LLVM_DEBUG({
|
||||
dbgs() << "Cannot enable LLJIT debugger support: "
|
||||
<< Triple::getObjectFormatTypeName(TT.getObjectFormat())
|
||||
<< " not supported.\n";
|
||||
});
|
||||
}
|
||||
} else {
|
||||
LLVM_DEBUG({
|
||||
dbgs() << "Cannot enable LLJIT debugger support: "
|
||||
" debugger support is only available when using JITLink.\n";
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (S.PrePlatformSetup) {
|
||||
if (auto Err2 = S.PrePlatformSetup(*this)) {
|
||||
Err = std::move(Err2);
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
#include "llvm/ExecutionEngine/MCJIT.h"
|
||||
#include "llvm/ExecutionEngine/ObjectCache.h"
|
||||
#include "llvm/ExecutionEngine/Orc/DebugUtils.h"
|
||||
#include "llvm/ExecutionEngine/Orc/DebuggerSupport.h"
|
||||
#include "llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h"
|
||||
#include "llvm/ExecutionEngine/Orc/EPCEHFrameRegistrar.h"
|
||||
#include "llvm/ExecutionEngine/Orc/EPCGenericRTDyldMemoryManager.h"
|
||||
@@ -845,17 +844,6 @@ int mingw_noop_main(void) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Try to enable debugger support for the given instance.
|
||||
// This alway returns success, but prints a warning if it's not able to enable
|
||||
// debugger support.
|
||||
Error tryEnableDebugSupport(orc::LLJIT &J) {
|
||||
if (auto Err = enableDebuggerSupport(J)) {
|
||||
[[maybe_unused]] std::string ErrMsg = toString(std::move(Err));
|
||||
LLVM_DEBUG(dbgs() << "lli: " << ErrMsg << "\n");
|
||||
}
|
||||
return Error::success();
|
||||
}
|
||||
|
||||
int runOrcJIT(const char *ProgName) {
|
||||
// Start setting up the JIT environment.
|
||||
|
||||
@@ -936,9 +924,6 @@ int runOrcJIT(const char *ProgName) {
|
||||
});
|
||||
}
|
||||
|
||||
// Enable debugging of JIT'd code (only works on JITLink for ELF and MachO).
|
||||
Builder.setPrePlatformSetup(tryEnableDebugSupport);
|
||||
|
||||
// Set up LLJIT platform.
|
||||
LLJITPlatform P = Platform;
|
||||
if (P == LLJITPlatform::Auto)
|
||||
@@ -975,6 +960,9 @@ int runOrcJIT(const char *ProgName) {
|
||||
});
|
||||
}
|
||||
|
||||
// Enable debugging of JIT'd code (only works on JITLink for ELF and MachO).
|
||||
Builder.setEnableDebuggerSupport(true);
|
||||
|
||||
auto J = ExitOnErr(Builder.create());
|
||||
|
||||
auto *ObjLayer = &J->getObjLinkingLayer();
|
||||
|
||||
Reference in New Issue
Block a user