1 //===------- EPCGenericDylibManager.cpp -- Dylib management via EPC -------===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h"
10 
11 #include "llvm/ExecutionEngine/Orc/Core.h"
12 #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
13 #include "llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h"
14 
15 namespace llvm {
16 namespace orc {
17 namespace shared {
18 
19 template <>
20 class SPSSerializationTraits<SPSRemoteSymbolLookupSetElement,
21                              SymbolLookupSet::value_type> {
22 public:
23   static size_t size(const SymbolLookupSet::value_type &V) {
24     return SPSArgList<SPSString, bool>::size(
25         *V.first, V.second == SymbolLookupFlags::RequiredSymbol);
26   }
27 
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);
32   }
33 };
34 
35 template <>
36 class TrivialSPSSequenceSerialization<SPSRemoteSymbolLookupSetElement,
37                                       SymbolLookupSet> {
38 public:
39   static constexpr bool available = true;
40 };
41 
42 template <>
43 class SPSSerializationTraits<SPSRemoteSymbolLookup,
44                              ExecutorProcessControl::LookupRequest> {
45   using MemberSerialization =
46       SPSArgList<SPSExecutorAddr, SPSRemoteSymbolLookupSet>;
47 
48 public:
49   static size_t size(const ExecutorProcessControl::LookupRequest &LR) {
50     return MemberSerialization::size(ExecutorAddr(LR.Handle), LR.Symbols);
51   }
52 
53   static bool serialize(SPSOutputBuffer &OB,
54                         const ExecutorProcessControl::LookupRequest &LR) {
55     return MemberSerialization::serialize(OB, ExecutorAddr(LR.Handle),
56                                           LR.Symbols);
57   }
58 };
59 
60 } // end namespace shared
61 
62 Expected<EPCGenericDylibManager>
63 EPCGenericDylibManager::CreateWithDefaultBootstrapSymbols(
64     ExecutorProcessControl &EPC) {
65   SymbolAddrs SAs;
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));
72 }
73 
74 Expected<tpctypes::DylibHandle> EPCGenericDylibManager::open(StringRef Path,
75                                                              uint64_t Mode) {
76   Expected<tpctypes::DylibHandle> H(0);
77   if (auto Err =
78           EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerOpenSignature>(
79               SAs.Open, H, SAs.Instance, Path, Mode))
80     return std::move(Err);
81   return H;
82 }
83 
84 Expected<std::vector<ExecutorAddr>>
85 EPCGenericDylibManager::lookup(tpctypes::DylibHandle H,
86                                const SymbolLookupSet &Lookup) {
87   Expected<std::vector<ExecutorAddr>> Result((std::vector<ExecutorAddr>()));
88   if (auto Err =
89           EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerLookupSignature>(
90               SAs.Lookup, Result, SAs.Instance, H, Lookup))
91     return std::move(Err);
92   return Result;
93 }
94 
95 Expected<std::vector<ExecutorAddr>>
96 EPCGenericDylibManager::lookup(tpctypes::DylibHandle H,
97                                const RemoteSymbolLookupSet &Lookup) {
98   Expected<std::vector<ExecutorAddr>> Result((std::vector<ExecutorAddr>()));
99   if (auto Err =
100           EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerLookupSignature>(
101               SAs.Lookup, Result, SAs.Instance, H, Lookup))
102     return std::move(Err);
103   return Result;
104 }
105 
106 } // end namespace orc
107 } // end namespace llvm
108