Stefan Gränitz 4268e677da
[ORC] Update ELF debugger support plugin to use AllocActions (#167866)
The `DebugObjectManagerPlugin` implements debugger support for ELF
platforms with the GDB JIT Interface. It emits a separate debug object
allocation in addition to the LinkGraph's own allocation. This used to
happen in the plugin's `notifyEmitted()` callback, i.e. after the
LinkGraph's allocation was finalized. In the meantime, it had to block
finalization of the corresponding materialization unit to make sure that
the debugger can register the object before the code runs.

This patch switches the plugin to use an allocation action instead. We
can remove the `notifyEmitted()` hook and implement all steps as JITLink
passes.
2025-11-17 09:33:03 +01:00

60 lines
2.1 KiB
C++

//===------ 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/Debugging/DebuggerSupport.h"
#include "llvm/ExecutionEngine/Orc/DebugObjectManagerPlugin.h"
#include "llvm/ExecutionEngine/Orc/Debugging/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: {
Error TargetSymErr = Error::success();
ObjLinkingLayer->addPlugin(std::make_unique<DebugObjectManagerPlugin>(
ES, false, true, TargetSymErr));
return TargetSymErr;
}
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