1 //===- EPCGenericDylibManager.h -- Generic EPC Dylib management -*- C++ -*-===//
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 // Implements dylib loading and searching by making calls to
10 // ExecutorProcessControl::callWrapper.
11 //
12 // This simplifies the implementaton of new ExecutorProcessControl instances,
13 // as this implementation will always work (at the cost of some performance
14 // overhead for the calls).
15 //
16 //===----------------------------------------------------------------------===//
17 
18 #ifndef LLVM_EXECUTIONENGINE_ORC_EPCGENERICDYLIBMANAGER_H
19 #define LLVM_EXECUTIONENGINE_ORC_EPCGENERICDYLIBMANAGER_H
20 
21 #include "llvm/ExecutionEngine/Orc/ExecutorProcessControl.h"
22 #include "llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h"
23 
24 namespace llvm {
25 namespace orc {
26 
27 class SymbolLookupSet;
28 
29 class EPCGenericDylibManager {
30 public:
31   /// Function addresses for memory access.
32   struct SymbolAddrs {
33     ExecutorAddr Instance;
34     ExecutorAddr Open;
35     ExecutorAddr Lookup;
36   };
37 
38   /// Create an EPCGenericMemoryAccess instance from a given set of
39   /// function addrs.
40   static Expected<EPCGenericDylibManager>
41   CreateWithDefaultBootstrapSymbols(ExecutorProcessControl &EPC);
42 
43   /// Create an EPCGenericMemoryAccess instance from a given set of
44   /// function addrs.
45   EPCGenericDylibManager(ExecutorProcessControl &EPC, SymbolAddrs SAs)
46       : EPC(EPC), SAs(SAs) {}
47 
48   /// Loads the dylib with the given name.
49   Expected<tpctypes::DylibHandle> open(StringRef Path, uint64_t Mode);
50 
51   /// Looks up symbols within the given dylib.
52   Expected<std::vector<ExecutorAddr>> lookup(tpctypes::DylibHandle H,
53                                              const SymbolLookupSet &Lookup);
54 
55   /// Looks up symbols within the given dylib.
56   Expected<std::vector<ExecutorAddr>>
57   lookup(tpctypes::DylibHandle H, const RemoteSymbolLookupSet &Lookup);
58 
59 private:
60   ExecutorProcessControl &EPC;
61   SymbolAddrs SAs;
62 };
63 
64 } // end namespace orc
65 } // end namespace llvm
66 
67 #endif // LLVM_EXECUTIONENGINE_ORC_EPCGENERICDYLIBMANAGER_H
68