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:
size(const SymbolLookupSet::value_type & V)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
serialize(SPSOutputBuffer & OB,const SymbolLookupSet::value_type & V)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,
44a2c1cf09SLang Hames ExecutorProcessControl::LookupRequest> {
45a2c1cf09SLang Hames using MemberSerialization =
46ef391df2SLang Hames SPSArgList<SPSExecutorAddr, SPSRemoteSymbolLookupSet>;
47a2c1cf09SLang Hames
48a2c1cf09SLang Hames public:
size(const ExecutorProcessControl::LookupRequest & LR)49a2c1cf09SLang Hames static size_t size(const ExecutorProcessControl::LookupRequest &LR) {
50ef391df2SLang Hames return MemberSerialization::size(ExecutorAddr(LR.Handle), LR.Symbols);
51a2c1cf09SLang Hames }
52a2c1cf09SLang Hames
serialize(SPSOutputBuffer & OB,const ExecutorProcessControl::LookupRequest & LR)53a2c1cf09SLang Hames static bool serialize(SPSOutputBuffer &OB,
54a2c1cf09SLang Hames const ExecutorProcessControl::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>
CreateWithDefaultBootstrapSymbols(ExecutorProcessControl & EPC)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
open(StringRef Path,uint64_t Mode)74a2c1cf09SLang Hames Expected<tpctypes::DylibHandle> EPCGenericDylibManager::open(StringRef Path,
75a2c1cf09SLang Hames uint64_t Mode) {
76a2c1cf09SLang Hames Expected<tpctypes::DylibHandle> H(0);
77a2c1cf09SLang Hames if (auto Err =
78a2c1cf09SLang Hames EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerOpenSignature>(
79*21a06254SLang Hames SAs.Open, H, SAs.Instance, Path, Mode))
80a2c1cf09SLang Hames return std::move(Err);
81a2c1cf09SLang Hames return H;
82a2c1cf09SLang Hames }
83a2c1cf09SLang Hames
84ef391df2SLang Hames Expected<std::vector<ExecutorAddr>>
lookup(tpctypes::DylibHandle H,const SymbolLookupSet & Lookup)85a2c1cf09SLang Hames EPCGenericDylibManager::lookup(tpctypes::DylibHandle H,
86a2c1cf09SLang Hames const SymbolLookupSet &Lookup) {
87ef391df2SLang Hames Expected<std::vector<ExecutorAddr>> Result((std::vector<ExecutorAddr>()));
88a2c1cf09SLang Hames if (auto Err =
89a2c1cf09SLang Hames EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerLookupSignature>(
90*21a06254SLang Hames SAs.Lookup, Result, SAs.Instance, H, Lookup))
91a2c1cf09SLang Hames return std::move(Err);
92a2c1cf09SLang Hames return Result;
93a2c1cf09SLang Hames }
94a2c1cf09SLang Hames
95ef391df2SLang Hames Expected<std::vector<ExecutorAddr>>
lookup(tpctypes::DylibHandle H,const RemoteSymbolLookupSet & Lookup)96a2c1cf09SLang Hames EPCGenericDylibManager::lookup(tpctypes::DylibHandle H,
97a2c1cf09SLang Hames const RemoteSymbolLookupSet &Lookup) {
98ef391df2SLang Hames Expected<std::vector<ExecutorAddr>> Result((std::vector<ExecutorAddr>()));
99a2c1cf09SLang Hames if (auto Err =
100a2c1cf09SLang Hames EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerLookupSignature>(
101*21a06254SLang Hames SAs.Lookup, Result, SAs.Instance, H, Lookup))
102a2c1cf09SLang Hames return std::move(Err);
103a2c1cf09SLang Hames return Result;
104a2c1cf09SLang Hames }
105a2c1cf09SLang Hames
106a2c1cf09SLang Hames } // end namespace orc
107a2c1cf09SLang Hames } // end namespace llvm
108