xref: /freebsd/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/EPCGenericDylibManager.cpp (revision 349cc55c9796c4596a5b9904cd3281af295f878f)
1*349cc55cSDimitry Andric //===------- EPCGenericDylibManager.cpp -- Dylib management via EPC -------===//
2*349cc55cSDimitry Andric //
3*349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*349cc55cSDimitry Andric //
7*349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
8*349cc55cSDimitry Andric 
9*349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h"
10*349cc55cSDimitry Andric 
11*349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Core.h"
12*349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
13*349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h"
14*349cc55cSDimitry Andric 
15*349cc55cSDimitry Andric namespace llvm {
16*349cc55cSDimitry Andric namespace orc {
17*349cc55cSDimitry Andric namespace shared {
18*349cc55cSDimitry Andric 
19*349cc55cSDimitry Andric template <>
20*349cc55cSDimitry Andric class SPSSerializationTraits<SPSRemoteSymbolLookupSetElement,
21*349cc55cSDimitry Andric                              SymbolLookupSet::value_type> {
22*349cc55cSDimitry Andric public:
23*349cc55cSDimitry Andric   static size_t size(const SymbolLookupSet::value_type &V) {
24*349cc55cSDimitry Andric     return SPSArgList<SPSString, bool>::size(
25*349cc55cSDimitry Andric         *V.first, V.second == SymbolLookupFlags::RequiredSymbol);
26*349cc55cSDimitry Andric   }
27*349cc55cSDimitry Andric 
28*349cc55cSDimitry Andric   static bool serialize(SPSOutputBuffer &OB,
29*349cc55cSDimitry Andric                         const SymbolLookupSet::value_type &V) {
30*349cc55cSDimitry Andric     return SPSArgList<SPSString, bool>::serialize(
31*349cc55cSDimitry Andric         OB, *V.first, V.second == SymbolLookupFlags::RequiredSymbol);
32*349cc55cSDimitry Andric   }
33*349cc55cSDimitry Andric };
34*349cc55cSDimitry Andric 
35*349cc55cSDimitry Andric template <>
36*349cc55cSDimitry Andric class TrivialSPSSequenceSerialization<SPSRemoteSymbolLookupSetElement,
37*349cc55cSDimitry Andric                                       SymbolLookupSet> {
38*349cc55cSDimitry Andric public:
39*349cc55cSDimitry Andric   static constexpr bool available = true;
40*349cc55cSDimitry Andric };
41*349cc55cSDimitry Andric 
42*349cc55cSDimitry Andric template <>
43*349cc55cSDimitry Andric class SPSSerializationTraits<SPSRemoteSymbolLookup,
44*349cc55cSDimitry Andric                              ExecutorProcessControl::LookupRequest> {
45*349cc55cSDimitry Andric   using MemberSerialization =
46*349cc55cSDimitry Andric       SPSArgList<SPSExecutorAddr, SPSRemoteSymbolLookupSet>;
47*349cc55cSDimitry Andric 
48*349cc55cSDimitry Andric public:
49*349cc55cSDimitry Andric   static size_t size(const ExecutorProcessControl::LookupRequest &LR) {
50*349cc55cSDimitry Andric     return MemberSerialization::size(ExecutorAddr(LR.Handle), LR.Symbols);
51*349cc55cSDimitry Andric   }
52*349cc55cSDimitry Andric 
53*349cc55cSDimitry Andric   static bool serialize(SPSOutputBuffer &OB,
54*349cc55cSDimitry Andric                         const ExecutorProcessControl::LookupRequest &LR) {
55*349cc55cSDimitry Andric     return MemberSerialization::serialize(OB, ExecutorAddr(LR.Handle),
56*349cc55cSDimitry Andric                                           LR.Symbols);
57*349cc55cSDimitry Andric   }
58*349cc55cSDimitry Andric };
59*349cc55cSDimitry Andric 
60*349cc55cSDimitry Andric } // end namespace shared
61*349cc55cSDimitry Andric 
62*349cc55cSDimitry Andric Expected<EPCGenericDylibManager>
63*349cc55cSDimitry Andric EPCGenericDylibManager::CreateWithDefaultBootstrapSymbols(
64*349cc55cSDimitry Andric     ExecutorProcessControl &EPC) {
65*349cc55cSDimitry Andric   SymbolAddrs SAs;
66*349cc55cSDimitry Andric   if (auto Err = EPC.getBootstrapSymbols(
67*349cc55cSDimitry Andric           {{SAs.Instance, rt::SimpleExecutorDylibManagerInstanceName},
68*349cc55cSDimitry Andric            {SAs.Open, rt::SimpleExecutorDylibManagerOpenWrapperName},
69*349cc55cSDimitry Andric            {SAs.Lookup, rt::SimpleExecutorDylibManagerLookupWrapperName}}))
70*349cc55cSDimitry Andric     return std::move(Err);
71*349cc55cSDimitry Andric   return EPCGenericDylibManager(EPC, std::move(SAs));
72*349cc55cSDimitry Andric }
73*349cc55cSDimitry Andric 
74*349cc55cSDimitry Andric Expected<tpctypes::DylibHandle> EPCGenericDylibManager::open(StringRef Path,
75*349cc55cSDimitry Andric                                                              uint64_t Mode) {
76*349cc55cSDimitry Andric   Expected<tpctypes::DylibHandle> H(0);
77*349cc55cSDimitry Andric   if (auto Err =
78*349cc55cSDimitry Andric           EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerOpenSignature>(
79*349cc55cSDimitry Andric               SAs.Open, H, SAs.Instance, Path, Mode))
80*349cc55cSDimitry Andric     return std::move(Err);
81*349cc55cSDimitry Andric   return H;
82*349cc55cSDimitry Andric }
83*349cc55cSDimitry Andric 
84*349cc55cSDimitry Andric Expected<std::vector<ExecutorAddr>>
85*349cc55cSDimitry Andric EPCGenericDylibManager::lookup(tpctypes::DylibHandle H,
86*349cc55cSDimitry Andric                                const SymbolLookupSet &Lookup) {
87*349cc55cSDimitry Andric   Expected<std::vector<ExecutorAddr>> Result((std::vector<ExecutorAddr>()));
88*349cc55cSDimitry Andric   if (auto Err =
89*349cc55cSDimitry Andric           EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerLookupSignature>(
90*349cc55cSDimitry Andric               SAs.Lookup, Result, SAs.Instance, H, Lookup))
91*349cc55cSDimitry Andric     return std::move(Err);
92*349cc55cSDimitry Andric   return Result;
93*349cc55cSDimitry Andric }
94*349cc55cSDimitry Andric 
95*349cc55cSDimitry Andric Expected<std::vector<ExecutorAddr>>
96*349cc55cSDimitry Andric EPCGenericDylibManager::lookup(tpctypes::DylibHandle H,
97*349cc55cSDimitry Andric                                const RemoteSymbolLookupSet &Lookup) {
98*349cc55cSDimitry Andric   Expected<std::vector<ExecutorAddr>> Result((std::vector<ExecutorAddr>()));
99*349cc55cSDimitry Andric   if (auto Err =
100*349cc55cSDimitry Andric           EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerLookupSignature>(
101*349cc55cSDimitry Andric               SAs.Lookup, Result, SAs.Instance, H, Lookup))
102*349cc55cSDimitry Andric     return std::move(Err);
103*349cc55cSDimitry Andric   return Result;
104*349cc55cSDimitry Andric }
105*349cc55cSDimitry Andric 
106*349cc55cSDimitry Andric } // end namespace orc
107*349cc55cSDimitry Andric } // end namespace llvm
108