xref: /freebsd-src/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/EPCDebugObjectRegistrar.cpp (revision 1db9f3b21e39176dd5b67cf8ac378633b172463e)
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