1fe6060f1SDimitry Andric //===----- EPCDebugObjectRegistrar.cpp - EPC-based debug registration -----===//
2fe6060f1SDimitry Andric //
3fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fe6060f1SDimitry Andric //
7fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
8fe6060f1SDimitry Andric
9fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/EPCDebugObjectRegistrar.h"
10fe6060f1SDimitry Andric
11fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/Core.h"
12fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h"
13fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderGDB.h"
14fe6060f1SDimitry Andric #include "llvm/Support/BinaryStreamWriter.h"
15fe6060f1SDimitry Andric
16fe6060f1SDimitry Andric namespace llvm {
17fe6060f1SDimitry Andric namespace orc {
18fe6060f1SDimitry Andric
createJITLoaderGDBRegistrar(ExecutionSession & ES,std::optional<ExecutorAddr> RegistrationFunctionDylib)19bdd1243dSDimitry Andric Expected<std::unique_ptr<EPCDebugObjectRegistrar>> createJITLoaderGDBRegistrar(
20bdd1243dSDimitry Andric ExecutionSession &ES,
21bdd1243dSDimitry Andric std::optional<ExecutorAddr> RegistrationFunctionDylib) {
22fe6060f1SDimitry Andric auto &EPC = ES.getExecutorProcessControl();
23bdd1243dSDimitry Andric
24bdd1243dSDimitry Andric if (!RegistrationFunctionDylib) {
25bdd1243dSDimitry Andric if (auto D = EPC.loadDylib(nullptr))
26bdd1243dSDimitry Andric RegistrationFunctionDylib = *D;
27bdd1243dSDimitry Andric else
28bdd1243dSDimitry Andric return D.takeError();
29bdd1243dSDimitry Andric }
30fe6060f1SDimitry Andric
31fe6060f1SDimitry Andric SymbolStringPtr RegisterFn =
32fe6060f1SDimitry Andric EPC.getTargetTriple().isOSBinFormatMachO()
33fe6060f1SDimitry Andric ? EPC.intern("_llvm_orc_registerJITLoaderGDBWrapper")
34fe6060f1SDimitry Andric : EPC.intern("llvm_orc_registerJITLoaderGDBWrapper");
35fe6060f1SDimitry Andric
36fe6060f1SDimitry Andric SymbolLookupSet RegistrationSymbols;
37fe6060f1SDimitry Andric RegistrationSymbols.add(RegisterFn);
38fe6060f1SDimitry Andric
39bdd1243dSDimitry Andric auto Result =
40bdd1243dSDimitry Andric EPC.lookupSymbols({{*RegistrationFunctionDylib, RegistrationSymbols}});
41fe6060f1SDimitry Andric if (!Result)
42fe6060f1SDimitry Andric return Result.takeError();
43fe6060f1SDimitry Andric
44fe6060f1SDimitry Andric assert(Result->size() == 1 && "Unexpected number of dylibs in result");
45fe6060f1SDimitry Andric assert((*Result)[0].size() == 1 &&
46fe6060f1SDimitry Andric "Unexpected number of addresses in result");
47fe6060f1SDimitry Andric
48*1db9f3b2SDimitry Andric ExecutorAddr RegisterAddr = (*Result)[0][0].getAddress();
49*1db9f3b2SDimitry Andric return std::make_unique<EPCDebugObjectRegistrar>(ES, RegisterAddr);
50fe6060f1SDimitry Andric }
51fe6060f1SDimitry Andric
registerDebugObject(ExecutorAddrRange TargetMem,bool AutoRegisterCode)5206c3fb27SDimitry Andric Error EPCDebugObjectRegistrar::registerDebugObject(ExecutorAddrRange TargetMem,
5306c3fb27SDimitry Andric bool AutoRegisterCode) {
5406c3fb27SDimitry Andric return ES.callSPSWrapper<void(shared::SPSExecutorAddrRange, bool)>(
5506c3fb27SDimitry Andric RegisterFn, TargetMem, AutoRegisterCode);
56fe6060f1SDimitry Andric }
57fe6060f1SDimitry Andric
58fe6060f1SDimitry Andric } // namespace orc
59fe6060f1SDimitry Andric } // namespace llvm
60