xref: /freebsd-src/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/EPCDebugObjectRegistrar.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
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 
19*bdd1243dSDimitry Andric Expected<std::unique_ptr<EPCDebugObjectRegistrar>> createJITLoaderGDBRegistrar(
20*bdd1243dSDimitry Andric     ExecutionSession &ES,
21*bdd1243dSDimitry Andric     std::optional<ExecutorAddr> RegistrationFunctionDylib) {
22fe6060f1SDimitry Andric   auto &EPC = ES.getExecutorProcessControl();
23*bdd1243dSDimitry Andric 
24*bdd1243dSDimitry Andric   if (!RegistrationFunctionDylib) {
25*bdd1243dSDimitry Andric     if (auto D = EPC.loadDylib(nullptr))
26*bdd1243dSDimitry Andric       RegistrationFunctionDylib = *D;
27*bdd1243dSDimitry Andric     else
28*bdd1243dSDimitry Andric       return D.takeError();
29*bdd1243dSDimitry 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 
39*bdd1243dSDimitry Andric   auto Result =
40*bdd1243dSDimitry 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 
48349cc55cSDimitry Andric   return std::make_unique<EPCDebugObjectRegistrar>(
49349cc55cSDimitry Andric       ES, ExecutorAddr((*Result)[0][0]));
50fe6060f1SDimitry Andric }
51fe6060f1SDimitry Andric 
52349cc55cSDimitry Andric Error EPCDebugObjectRegistrar::registerDebugObject(
53349cc55cSDimitry Andric     ExecutorAddrRange TargetMem) {
5481ad6265SDimitry Andric   return ES.callSPSWrapper<void(shared::SPSExecutorAddrRange)>(RegisterFn,
5581ad6265SDimitry Andric                                                                TargetMem);
56fe6060f1SDimitry Andric }
57fe6060f1SDimitry Andric 
58fe6060f1SDimitry Andric } // namespace orc
59fe6060f1SDimitry Andric } // namespace llvm
60