xref: /freebsd-src/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/EPCDebugObjectRegistrar.cpp (revision fe6060f10f634930ff71b7c50291ddc610da2475)
1*fe6060f1SDimitry Andric //===----- EPCDebugObjectRegistrar.cpp - EPC-based debug registration -----===//
2*fe6060f1SDimitry Andric //
3*fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*fe6060f1SDimitry Andric //
7*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
8*fe6060f1SDimitry Andric 
9*fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/EPCDebugObjectRegistrar.h"
10*fe6060f1SDimitry Andric 
11*fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/Core.h"
12*fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h"
13*fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderGDB.h"
14*fe6060f1SDimitry Andric #include "llvm/Support/BinaryStreamWriter.h"
15*fe6060f1SDimitry Andric 
16*fe6060f1SDimitry Andric namespace llvm {
17*fe6060f1SDimitry Andric namespace orc {
18*fe6060f1SDimitry Andric 
19*fe6060f1SDimitry Andric Expected<std::unique_ptr<EPCDebugObjectRegistrar>>
20*fe6060f1SDimitry Andric createJITLoaderGDBRegistrar(ExecutionSession &ES) {
21*fe6060f1SDimitry Andric   auto &EPC = ES.getExecutorProcessControl();
22*fe6060f1SDimitry Andric   auto ProcessHandle = EPC.loadDylib(nullptr);
23*fe6060f1SDimitry Andric   if (!ProcessHandle)
24*fe6060f1SDimitry Andric     return ProcessHandle.takeError();
25*fe6060f1SDimitry Andric 
26*fe6060f1SDimitry Andric   SymbolStringPtr RegisterFn =
27*fe6060f1SDimitry Andric       EPC.getTargetTriple().isOSBinFormatMachO()
28*fe6060f1SDimitry Andric           ? EPC.intern("_llvm_orc_registerJITLoaderGDBWrapper")
29*fe6060f1SDimitry Andric           : EPC.intern("llvm_orc_registerJITLoaderGDBWrapper");
30*fe6060f1SDimitry Andric 
31*fe6060f1SDimitry Andric   SymbolLookupSet RegistrationSymbols;
32*fe6060f1SDimitry Andric   RegistrationSymbols.add(RegisterFn);
33*fe6060f1SDimitry Andric 
34*fe6060f1SDimitry Andric   auto Result = EPC.lookupSymbols({{*ProcessHandle, RegistrationSymbols}});
35*fe6060f1SDimitry Andric   if (!Result)
36*fe6060f1SDimitry Andric     return Result.takeError();
37*fe6060f1SDimitry Andric 
38*fe6060f1SDimitry Andric   assert(Result->size() == 1 && "Unexpected number of dylibs in result");
39*fe6060f1SDimitry Andric   assert((*Result)[0].size() == 1 &&
40*fe6060f1SDimitry Andric          "Unexpected number of addresses in result");
41*fe6060f1SDimitry Andric 
42*fe6060f1SDimitry Andric   return std::make_unique<EPCDebugObjectRegistrar>(ES, (*Result)[0][0]);
43*fe6060f1SDimitry Andric }
44*fe6060f1SDimitry Andric 
45*fe6060f1SDimitry Andric Error EPCDebugObjectRegistrar::registerDebugObject(sys::MemoryBlock TargetMem) {
46*fe6060f1SDimitry Andric   return ES.callSPSWrapper<void(SPSExecutorAddress, uint64_t)>(
47*fe6060f1SDimitry Andric       RegisterFn, ExecutorAddress::fromPtr(TargetMem.base()),
48*fe6060f1SDimitry Andric       static_cast<uint64_t>(TargetMem.allocatedSize()));
49*fe6060f1SDimitry Andric }
50*fe6060f1SDimitry Andric 
51*fe6060f1SDimitry Andric } // namespace orc
52*fe6060f1SDimitry Andric } // namespace llvm
53