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:
Lang Hames
2023-09-22 21:43:41 -07:00
parent bcc5b48b0f
commit e5f169f91a
10 changed files with 75 additions and 118 deletions

View File

@@ -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);

View File

@@ -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 {

View File

@@ -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

View File

@@ -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()));

View File

@@ -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

View File

@@ -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

View File

@@ -13,7 +13,6 @@ add_llvm_component_library(LLVMOrcJIT
CompileUtils.cpp
Core.cpp
DebugObjectManagerPlugin.cpp
DebuggerSupport.cpp
DebuggerSupportPlugin.cpp
DebugUtils.cpp
EPCDynamicLibrarySearchGenerator.cpp

View File

@@ -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

View File

@@ -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);

View File

@@ -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();