xref: /llvm-project/llvm/lib/ExecutionEngine/Orc/EPCGenericDylibManager.cpp (revision db21bd4fa9bf40a9f6e7713bf674dcfaa48d1d5b)
1a2c1cf09SLang Hames //===------- EPCGenericDylibManager.cpp -- Dylib management via EPC -------===//
2a2c1cf09SLang Hames //
3a2c1cf09SLang Hames // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4a2c1cf09SLang Hames // See https://llvm.org/LICENSE.txt for license information.
5a2c1cf09SLang Hames // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a2c1cf09SLang Hames //
7a2c1cf09SLang Hames //===----------------------------------------------------------------------===//
8a2c1cf09SLang Hames 
9a2c1cf09SLang Hames #include "llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h"
10a2c1cf09SLang Hames 
11a2c1cf09SLang Hames #include "llvm/ExecutionEngine/Orc/Core.h"
12a2c1cf09SLang Hames #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
13a2c1cf09SLang Hames #include "llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h"
14a2c1cf09SLang Hames 
15a2c1cf09SLang Hames namespace llvm {
16a2c1cf09SLang Hames namespace orc {
17a2c1cf09SLang Hames namespace shared {
18a2c1cf09SLang Hames 
19a2c1cf09SLang Hames template <>
20a2c1cf09SLang Hames class SPSSerializationTraits<SPSRemoteSymbolLookupSetElement,
21a2c1cf09SLang Hames                              SymbolLookupSet::value_type> {
22a2c1cf09SLang Hames public:
23a2c1cf09SLang Hames   static size_t size(const SymbolLookupSet::value_type &V) {
24a2c1cf09SLang Hames     return SPSArgList<SPSString, bool>::size(
25a2c1cf09SLang Hames         *V.first, V.second == SymbolLookupFlags::RequiredSymbol);
26a2c1cf09SLang Hames   }
27a2c1cf09SLang Hames 
28a2c1cf09SLang Hames   static bool serialize(SPSOutputBuffer &OB,
29a2c1cf09SLang Hames                         const SymbolLookupSet::value_type &V) {
30a2c1cf09SLang Hames     return SPSArgList<SPSString, bool>::serialize(
31a2c1cf09SLang Hames         OB, *V.first, V.second == SymbolLookupFlags::RequiredSymbol);
32a2c1cf09SLang Hames   }
33a2c1cf09SLang Hames };
34a2c1cf09SLang Hames 
35a2c1cf09SLang Hames template <>
36a2c1cf09SLang Hames class TrivialSPSSequenceSerialization<SPSRemoteSymbolLookupSetElement,
37a2c1cf09SLang Hames                                       SymbolLookupSet> {
38a2c1cf09SLang Hames public:
39a2c1cf09SLang Hames   static constexpr bool available = true;
40a2c1cf09SLang Hames };
41a2c1cf09SLang Hames 
42a2c1cf09SLang Hames template <>
43a2c1cf09SLang Hames class SPSSerializationTraits<SPSRemoteSymbolLookup,
44*db21bd4fSLang Hames                              DylibManager::LookupRequest> {
45a2c1cf09SLang Hames   using MemberSerialization =
46ef391df2SLang Hames       SPSArgList<SPSExecutorAddr, SPSRemoteSymbolLookupSet>;
47a2c1cf09SLang Hames 
48a2c1cf09SLang Hames public:
49*db21bd4fSLang Hames   static size_t size(const DylibManager::LookupRequest &LR) {
50ef391df2SLang Hames     return MemberSerialization::size(ExecutorAddr(LR.Handle), LR.Symbols);
51a2c1cf09SLang Hames   }
52a2c1cf09SLang Hames 
53a2c1cf09SLang Hames   static bool serialize(SPSOutputBuffer &OB,
54*db21bd4fSLang Hames                         const DylibManager::LookupRequest &LR) {
55ef391df2SLang Hames     return MemberSerialization::serialize(OB, ExecutorAddr(LR.Handle),
56a2c1cf09SLang Hames                                           LR.Symbols);
57a2c1cf09SLang Hames   }
58a2c1cf09SLang Hames };
59a2c1cf09SLang Hames 
60a2c1cf09SLang Hames } // end namespace shared
61a2c1cf09SLang Hames 
62a2c1cf09SLang Hames Expected<EPCGenericDylibManager>
63a2c1cf09SLang Hames EPCGenericDylibManager::CreateWithDefaultBootstrapSymbols(
64a2c1cf09SLang Hames     ExecutorProcessControl &EPC) {
65a2c1cf09SLang Hames   SymbolAddrs SAs;
66a2c1cf09SLang Hames   if (auto Err = EPC.getBootstrapSymbols(
67a2c1cf09SLang Hames           {{SAs.Instance, rt::SimpleExecutorDylibManagerInstanceName},
68a2c1cf09SLang Hames            {SAs.Open, rt::SimpleExecutorDylibManagerOpenWrapperName},
69a2c1cf09SLang Hames            {SAs.Lookup, rt::SimpleExecutorDylibManagerLookupWrapperName}}))
70a2c1cf09SLang Hames     return std::move(Err);
71a2c1cf09SLang Hames   return EPCGenericDylibManager(EPC, std::move(SAs));
72a2c1cf09SLang Hames }
73a2c1cf09SLang Hames 
74a2c1cf09SLang Hames Expected<tpctypes::DylibHandle> EPCGenericDylibManager::open(StringRef Path,
75a2c1cf09SLang Hames                                                              uint64_t Mode) {
766613f4afSLang Hames   Expected<tpctypes::DylibHandle> H((ExecutorAddr()));
77a2c1cf09SLang Hames   if (auto Err =
78a2c1cf09SLang Hames           EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerOpenSignature>(
7921a06254SLang Hames               SAs.Open, H, SAs.Instance, Path, Mode))
80a2c1cf09SLang Hames     return std::move(Err);
81a2c1cf09SLang Hames   return H;
82a2c1cf09SLang Hames }
83a2c1cf09SLang Hames 
8454226e23SBen Langmuir void EPCGenericDylibManager::lookupAsync(tpctypes::DylibHandle H,
8554226e23SBen Langmuir                                          const SymbolLookupSet &Lookup,
8654226e23SBen Langmuir                                          SymbolLookupCompleteFn Complete) {
8754226e23SBen Langmuir   EPC.callSPSWrapperAsync<rt::SPSSimpleExecutorDylibManagerLookupSignature>(
8854226e23SBen Langmuir       SAs.Lookup,
8954226e23SBen Langmuir       [Complete = std::move(Complete)](
9054226e23SBen Langmuir           Error SerializationErr,
9154226e23SBen Langmuir           Expected<std::vector<ExecutorSymbolDef>> Result) mutable {
9254226e23SBen Langmuir         if (SerializationErr) {
9354226e23SBen Langmuir           cantFail(Result.takeError());
9454226e23SBen Langmuir           Complete(std::move(SerializationErr));
95e7e13c6fSLang Hames           return;
9654226e23SBen Langmuir         }
9754226e23SBen Langmuir         Complete(std::move(Result));
9854226e23SBen Langmuir       },
9954226e23SBen Langmuir       SAs.Instance, H, Lookup);
100a2c1cf09SLang Hames }
101a2c1cf09SLang Hames 
10254226e23SBen Langmuir void EPCGenericDylibManager::lookupAsync(tpctypes::DylibHandle H,
10354226e23SBen Langmuir                                          const RemoteSymbolLookupSet &Lookup,
10454226e23SBen Langmuir                                          SymbolLookupCompleteFn Complete) {
10554226e23SBen Langmuir   EPC.callSPSWrapperAsync<rt::SPSSimpleExecutorDylibManagerLookupSignature>(
10654226e23SBen Langmuir       SAs.Lookup,
10754226e23SBen Langmuir       [Complete = std::move(Complete)](
10854226e23SBen Langmuir           Error SerializationErr,
10954226e23SBen Langmuir           Expected<std::vector<ExecutorSymbolDef>> Result) mutable {
11054226e23SBen Langmuir         if (SerializationErr) {
11154226e23SBen Langmuir           cantFail(Result.takeError());
11254226e23SBen Langmuir           Complete(std::move(SerializationErr));
113cbf1535cSLang Hames           return;
11454226e23SBen Langmuir         }
11554226e23SBen Langmuir         Complete(std::move(Result));
11654226e23SBen Langmuir       },
11754226e23SBen Langmuir       SAs.Instance, H, Lookup);
118a2c1cf09SLang Hames }
119a2c1cf09SLang Hames 
120a2c1cf09SLang Hames } // end namespace orc
121a2c1cf09SLang Hames } // end namespace llvm
122