| //===----- 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, ExecutorAddr((*Result)[0][0])); | |
| } | |
| Error EPCDebugObjectRegistrar::registerDebugObject( | |
| ExecutorAddrRange TargetMem) { | |
| return ES.callSPSWrapper<void(shared::SPSExecutorAddrRange)>(RegisterFn, | |
| TargetMem); | |
| } | |
| } // namespace orc | |
| } // namespace llvm |