1 //===------- EPCGenericDylibManager.cpp -- Dylib management via EPC -------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h"
11 #include "llvm/ExecutionEngine/Orc/Core.h"
12 #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
13 #include "llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h"
20 class SPSSerializationTraits
<SPSRemoteSymbolLookupSetElement
,
21 SymbolLookupSet::value_type
> {
23 static size_t size(const SymbolLookupSet::value_type
&V
) {
24 return SPSArgList
<SPSString
, bool>::size(
25 *V
.first
, V
.second
== SymbolLookupFlags::RequiredSymbol
);
28 static bool serialize(SPSOutputBuffer
&OB
,
29 const SymbolLookupSet::value_type
&V
) {
30 return SPSArgList
<SPSString
, bool>::serialize(
31 OB
, *V
.first
, V
.second
== SymbolLookupFlags::RequiredSymbol
);
36 class TrivialSPSSequenceSerialization
<SPSRemoteSymbolLookupSetElement
,
39 static constexpr bool available
= true;
43 class SPSSerializationTraits
<SPSRemoteSymbolLookup
,
44 DylibManager::LookupRequest
> {
45 using MemberSerialization
=
46 SPSArgList
<SPSExecutorAddr
, SPSRemoteSymbolLookupSet
>;
49 static size_t size(const DylibManager::LookupRequest
&LR
) {
50 return MemberSerialization::size(ExecutorAddr(LR
.Handle
), LR
.Symbols
);
53 static bool serialize(SPSOutputBuffer
&OB
,
54 const DylibManager::LookupRequest
&LR
) {
55 return MemberSerialization::serialize(OB
, ExecutorAddr(LR
.Handle
),
60 } // end namespace shared
62 Expected
<EPCGenericDylibManager
>
63 EPCGenericDylibManager::CreateWithDefaultBootstrapSymbols(
64 ExecutorProcessControl
&EPC
) {
66 if (auto Err
= EPC
.getBootstrapSymbols(
67 {{SAs
.Instance
, rt::SimpleExecutorDylibManagerInstanceName
},
68 {SAs
.Open
, rt::SimpleExecutorDylibManagerOpenWrapperName
},
69 {SAs
.Lookup
, rt::SimpleExecutorDylibManagerLookupWrapperName
}}))
70 return std::move(Err
);
71 return EPCGenericDylibManager(EPC
, std::move(SAs
));
74 Expected
<tpctypes::DylibHandle
> EPCGenericDylibManager::open(StringRef Path
,
76 Expected
<tpctypes::DylibHandle
> H((ExecutorAddr()));
78 EPC
.callSPSWrapper
<rt::SPSSimpleExecutorDylibManagerOpenSignature
>(
79 SAs
.Open
, H
, SAs
.Instance
, Path
, Mode
))
80 return std::move(Err
);
84 void EPCGenericDylibManager::lookupAsync(tpctypes::DylibHandle H
,
85 const SymbolLookupSet
&Lookup
,
86 SymbolLookupCompleteFn Complete
) {
87 EPC
.callSPSWrapperAsync
<rt::SPSSimpleExecutorDylibManagerLookupSignature
>(
89 [Complete
= std::move(Complete
)](
90 Error SerializationErr
,
91 Expected
<std::vector
<ExecutorSymbolDef
>> Result
) mutable {
92 if (SerializationErr
) {
93 cantFail(Result
.takeError());
94 Complete(std::move(SerializationErr
));
97 Complete(std::move(Result
));
99 SAs
.Instance
, H
, Lookup
);
102 void EPCGenericDylibManager::lookupAsync(tpctypes::DylibHandle H
,
103 const RemoteSymbolLookupSet
&Lookup
,
104 SymbolLookupCompleteFn Complete
) {
105 EPC
.callSPSWrapperAsync
<rt::SPSSimpleExecutorDylibManagerLookupSignature
>(
107 [Complete
= std::move(Complete
)](
108 Error SerializationErr
,
109 Expected
<std::vector
<ExecutorSymbolDef
>> Result
) mutable {
110 if (SerializationErr
) {
111 cantFail(Result
.takeError());
112 Complete(std::move(SerializationErr
));
115 Complete(std::move(Result
));
117 SAs
.Instance
, H
, Lookup
);
120 } // end namespace orc
121 } // end namespace llvm