1349cc55cSDimitry Andric //===------- EPCGenericDylibManager.cpp -- Dylib management via EPC -------===//
2349cc55cSDimitry Andric //
3349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6349cc55cSDimitry Andric //
7349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
8349cc55cSDimitry Andric
9349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h"
10349cc55cSDimitry Andric
11349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Core.h"
12349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
13349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h"
14349cc55cSDimitry Andric
15349cc55cSDimitry Andric namespace llvm {
16349cc55cSDimitry Andric namespace orc {
17349cc55cSDimitry Andric namespace shared {
18349cc55cSDimitry Andric
19349cc55cSDimitry Andric template <>
20349cc55cSDimitry Andric class SPSSerializationTraits<SPSRemoteSymbolLookupSetElement,
21349cc55cSDimitry Andric SymbolLookupSet::value_type> {
22349cc55cSDimitry Andric public:
size(const SymbolLookupSet::value_type & V)23349cc55cSDimitry Andric static size_t size(const SymbolLookupSet::value_type &V) {
24349cc55cSDimitry Andric return SPSArgList<SPSString, bool>::size(
25349cc55cSDimitry Andric *V.first, V.second == SymbolLookupFlags::RequiredSymbol);
26349cc55cSDimitry Andric }
27349cc55cSDimitry Andric
serialize(SPSOutputBuffer & OB,const SymbolLookupSet::value_type & V)28349cc55cSDimitry Andric static bool serialize(SPSOutputBuffer &OB,
29349cc55cSDimitry Andric const SymbolLookupSet::value_type &V) {
30349cc55cSDimitry Andric return SPSArgList<SPSString, bool>::serialize(
31349cc55cSDimitry Andric OB, *V.first, V.second == SymbolLookupFlags::RequiredSymbol);
32349cc55cSDimitry Andric }
33349cc55cSDimitry Andric };
34349cc55cSDimitry Andric
35349cc55cSDimitry Andric template <>
36349cc55cSDimitry Andric class TrivialSPSSequenceSerialization<SPSRemoteSymbolLookupSetElement,
37349cc55cSDimitry Andric SymbolLookupSet> {
38349cc55cSDimitry Andric public:
39349cc55cSDimitry Andric static constexpr bool available = true;
40349cc55cSDimitry Andric };
41349cc55cSDimitry Andric
42349cc55cSDimitry Andric template <>
43349cc55cSDimitry Andric class SPSSerializationTraits<SPSRemoteSymbolLookup,
44349cc55cSDimitry Andric ExecutorProcessControl::LookupRequest> {
45349cc55cSDimitry Andric using MemberSerialization =
46349cc55cSDimitry Andric SPSArgList<SPSExecutorAddr, SPSRemoteSymbolLookupSet>;
47349cc55cSDimitry Andric
48349cc55cSDimitry Andric public:
size(const ExecutorProcessControl::LookupRequest & LR)49349cc55cSDimitry Andric static size_t size(const ExecutorProcessControl::LookupRequest &LR) {
50349cc55cSDimitry Andric return MemberSerialization::size(ExecutorAddr(LR.Handle), LR.Symbols);
51349cc55cSDimitry Andric }
52349cc55cSDimitry Andric
serialize(SPSOutputBuffer & OB,const ExecutorProcessControl::LookupRequest & LR)53349cc55cSDimitry Andric static bool serialize(SPSOutputBuffer &OB,
54349cc55cSDimitry Andric const ExecutorProcessControl::LookupRequest &LR) {
55349cc55cSDimitry Andric return MemberSerialization::serialize(OB, ExecutorAddr(LR.Handle),
56349cc55cSDimitry Andric LR.Symbols);
57349cc55cSDimitry Andric }
58349cc55cSDimitry Andric };
59349cc55cSDimitry Andric
60349cc55cSDimitry Andric } // end namespace shared
61349cc55cSDimitry Andric
62349cc55cSDimitry Andric Expected<EPCGenericDylibManager>
CreateWithDefaultBootstrapSymbols(ExecutorProcessControl & EPC)63349cc55cSDimitry Andric EPCGenericDylibManager::CreateWithDefaultBootstrapSymbols(
64349cc55cSDimitry Andric ExecutorProcessControl &EPC) {
65349cc55cSDimitry Andric SymbolAddrs SAs;
66349cc55cSDimitry Andric if (auto Err = EPC.getBootstrapSymbols(
67349cc55cSDimitry Andric {{SAs.Instance, rt::SimpleExecutorDylibManagerInstanceName},
68349cc55cSDimitry Andric {SAs.Open, rt::SimpleExecutorDylibManagerOpenWrapperName},
69349cc55cSDimitry Andric {SAs.Lookup, rt::SimpleExecutorDylibManagerLookupWrapperName}}))
70349cc55cSDimitry Andric return std::move(Err);
71349cc55cSDimitry Andric return EPCGenericDylibManager(EPC, std::move(SAs));
72349cc55cSDimitry Andric }
73349cc55cSDimitry Andric
open(StringRef Path,uint64_t Mode)74349cc55cSDimitry Andric Expected<tpctypes::DylibHandle> EPCGenericDylibManager::open(StringRef Path,
75349cc55cSDimitry Andric uint64_t Mode) {
76bdd1243dSDimitry Andric Expected<tpctypes::DylibHandle> H((ExecutorAddr()));
77349cc55cSDimitry Andric if (auto Err =
78349cc55cSDimitry Andric EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerOpenSignature>(
79349cc55cSDimitry Andric SAs.Open, H, SAs.Instance, Path, Mode))
80349cc55cSDimitry Andric return std::move(Err);
81349cc55cSDimitry Andric return H;
82349cc55cSDimitry Andric }
83349cc55cSDimitry Andric
lookupAsync(tpctypes::DylibHandle H,const SymbolLookupSet & Lookup,SymbolLookupCompleteFn Complete)84*0fca6ea1SDimitry Andric void EPCGenericDylibManager::lookupAsync(tpctypes::DylibHandle H,
85*0fca6ea1SDimitry Andric const SymbolLookupSet &Lookup,
86*0fca6ea1SDimitry Andric SymbolLookupCompleteFn Complete) {
87*0fca6ea1SDimitry Andric EPC.callSPSWrapperAsync<rt::SPSSimpleExecutorDylibManagerLookupSignature>(
88*0fca6ea1SDimitry Andric SAs.Lookup,
89*0fca6ea1SDimitry Andric [Complete = std::move(Complete)](
90*0fca6ea1SDimitry Andric Error SerializationErr,
91*0fca6ea1SDimitry Andric Expected<std::vector<ExecutorSymbolDef>> Result) mutable {
92*0fca6ea1SDimitry Andric if (SerializationErr) {
93*0fca6ea1SDimitry Andric cantFail(Result.takeError());
94*0fca6ea1SDimitry Andric Complete(std::move(SerializationErr));
95*0fca6ea1SDimitry Andric return;
96*0fca6ea1SDimitry Andric }
97*0fca6ea1SDimitry Andric Complete(std::move(Result));
98*0fca6ea1SDimitry Andric },
99*0fca6ea1SDimitry Andric SAs.Instance, H, Lookup);
100349cc55cSDimitry Andric }
101349cc55cSDimitry Andric
lookupAsync(tpctypes::DylibHandle H,const RemoteSymbolLookupSet & Lookup,SymbolLookupCompleteFn Complete)102*0fca6ea1SDimitry Andric void EPCGenericDylibManager::lookupAsync(tpctypes::DylibHandle H,
103*0fca6ea1SDimitry Andric const RemoteSymbolLookupSet &Lookup,
104*0fca6ea1SDimitry Andric SymbolLookupCompleteFn Complete) {
105*0fca6ea1SDimitry Andric EPC.callSPSWrapperAsync<rt::SPSSimpleExecutorDylibManagerLookupSignature>(
106*0fca6ea1SDimitry Andric SAs.Lookup,
107*0fca6ea1SDimitry Andric [Complete = std::move(Complete)](
108*0fca6ea1SDimitry Andric Error SerializationErr,
109*0fca6ea1SDimitry Andric Expected<std::vector<ExecutorSymbolDef>> Result) mutable {
110*0fca6ea1SDimitry Andric if (SerializationErr) {
111*0fca6ea1SDimitry Andric cantFail(Result.takeError());
112*0fca6ea1SDimitry Andric Complete(std::move(SerializationErr));
113*0fca6ea1SDimitry Andric return;
114*0fca6ea1SDimitry Andric }
115*0fca6ea1SDimitry Andric Complete(std::move(Result));
116*0fca6ea1SDimitry Andric },
117*0fca6ea1SDimitry Andric SAs.Instance, H, Lookup);
118349cc55cSDimitry Andric }
119349cc55cSDimitry Andric
120349cc55cSDimitry Andric } // end namespace orc
121349cc55cSDimitry Andric } // end namespace llvm
122