Files
clang-p2996/llvm/lib/ExecutionEngine/Orc/EPCDebugObjectRegistrar.cpp
Stefan Gränitz 4c7f53b99c [Orc] Add AutoRegisterCode option for DebugObjectManagerPlugin
Configure the plugin to automatically call the debugger rendezvous breakpoint `__jit_debug_register_code()` for every translation unit (enabled) or never at all (disabled). Default API and behavior remain unchanged.

If AutoRegisterCode is turned off, it's the client's own responsibility to call the rendezvous breakpoint function at an appropriate time.
Depending on the complexity of the debugger's rendezvous breakpoint implementation, this can provide significant performance improvements in cases where many debug objects are added in sequence.

Reviewed By: lhames

Differential Revision: https://reviews.llvm.org/D147310
2023-04-03 15:38:07 +02:00

59 lines
2.0 KiB
C++

//===----- EPCDebugObjectRegistrar.cpp - EPC-based debug registration -----===//
//
// 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/EPCDebugObjectRegistrar.h"
#include "llvm/ExecutionEngine/Orc/Core.h"
#include "llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h"
#include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderGDB.h"
#include "llvm/Support/BinaryStreamWriter.h"
namespace llvm {
namespace orc {
Expected<std::unique_ptr<EPCDebugObjectRegistrar>> createJITLoaderGDBRegistrar(
ExecutionSession &ES,
std::optional<ExecutorAddr> RegistrationFunctionDylib) {
auto &EPC = ES.getExecutorProcessControl();
if (!RegistrationFunctionDylib) {
if (auto D = EPC.loadDylib(nullptr))
RegistrationFunctionDylib = *D;
else
return D.takeError();
}
SymbolStringPtr RegisterFn =
EPC.getTargetTriple().isOSBinFormatMachO()
? EPC.intern("_llvm_orc_registerJITLoaderGDBWrapper")
: EPC.intern("llvm_orc_registerJITLoaderGDBWrapper");
SymbolLookupSet RegistrationSymbols;
RegistrationSymbols.add(RegisterFn);
auto Result =
EPC.lookupSymbols({{*RegistrationFunctionDylib, RegistrationSymbols}});
if (!Result)
return Result.takeError();
assert(Result->size() == 1 && "Unexpected number of dylibs in result");
assert((*Result)[0].size() == 1 &&
"Unexpected number of addresses in result");
return std::make_unique<EPCDebugObjectRegistrar>(ES, (*Result)[0][0]);
}
Error EPCDebugObjectRegistrar::registerDebugObject(ExecutorAddrRange TargetMem,
bool AutoRegisterCode) {
return ES.callSPSWrapper<void(shared::SPSExecutorAddrRange, bool)>(
RegisterFn, TargetMem, AutoRegisterCode);
}
} // namespace orc
} // namespace llvm