xref: /freebsd-src/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/EPCDebugObjectRegistrar.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
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 
19fe6060f1SDimitry Andric Expected<std::unique_ptr<EPCDebugObjectRegistrar>>
20fe6060f1SDimitry Andric createJITLoaderGDBRegistrar(ExecutionSession &ES) {
21fe6060f1SDimitry Andric   auto &EPC = ES.getExecutorProcessControl();
22fe6060f1SDimitry Andric   auto ProcessHandle = EPC.loadDylib(nullptr);
23fe6060f1SDimitry Andric   if (!ProcessHandle)
24fe6060f1SDimitry Andric     return ProcessHandle.takeError();
25fe6060f1SDimitry Andric 
26fe6060f1SDimitry Andric   SymbolStringPtr RegisterFn =
27fe6060f1SDimitry Andric       EPC.getTargetTriple().isOSBinFormatMachO()
28fe6060f1SDimitry Andric           ? EPC.intern("_llvm_orc_registerJITLoaderGDBWrapper")
29fe6060f1SDimitry Andric           : EPC.intern("llvm_orc_registerJITLoaderGDBWrapper");
30fe6060f1SDimitry Andric 
31fe6060f1SDimitry Andric   SymbolLookupSet RegistrationSymbols;
32fe6060f1SDimitry Andric   RegistrationSymbols.add(RegisterFn);
33fe6060f1SDimitry Andric 
34fe6060f1SDimitry Andric   auto Result = EPC.lookupSymbols({{*ProcessHandle, RegistrationSymbols}});
35fe6060f1SDimitry Andric   if (!Result)
36fe6060f1SDimitry Andric     return Result.takeError();
37fe6060f1SDimitry Andric 
38fe6060f1SDimitry Andric   assert(Result->size() == 1 && "Unexpected number of dylibs in result");
39fe6060f1SDimitry Andric   assert((*Result)[0].size() == 1 &&
40fe6060f1SDimitry Andric          "Unexpected number of addresses in result");
41fe6060f1SDimitry Andric 
42349cc55cSDimitry Andric   return std::make_unique<EPCDebugObjectRegistrar>(
43349cc55cSDimitry Andric       ES, ExecutorAddr((*Result)[0][0]));
44fe6060f1SDimitry Andric }
45fe6060f1SDimitry Andric 
46349cc55cSDimitry Andric Error EPCDebugObjectRegistrar::registerDebugObject(
47349cc55cSDimitry Andric     ExecutorAddrRange TargetMem) {
48*81ad6265SDimitry Andric   return ES.callSPSWrapper<void(shared::SPSExecutorAddrRange)>(RegisterFn,
49*81ad6265SDimitry Andric                                                                TargetMem);
50fe6060f1SDimitry Andric }
51fe6060f1SDimitry Andric 
52fe6060f1SDimitry Andric } // namespace orc
53fe6060f1SDimitry Andric } // namespace llvm
54