1 //===--------------- SimpleExecutorDylibManager.h ---------------*- 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 // A simple dynamic library management class. Allows dynamic libraries to be
10 // loaded and searched.
11 //
12 // FIXME: The functionality in this file should be moved to the ORC runtime.
13 //
14 //===----------------------------------------------------------------------===//
15 
16 #ifndef LLVM_EXECUTIONENGINE_ORC_TARGETPROCESS_SIMPLEEXECUTORDYLIBMANAGER_H
17 #define LLVM_EXECUTIONENGINE_ORC_TARGETPROCESS_SIMPLEEXECUTORDYLIBMANAGER_H
18 
19 #include "llvm/ADT/DenseSet.h"
20 #include "llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h"
21 #include "llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h"
22 #include "llvm/ExecutionEngine/Orc/Shared/TargetProcessControlTypes.h"
23 #include "llvm/ExecutionEngine/Orc/Shared/WrapperFunctionUtils.h"
24 #include "llvm/ExecutionEngine/Orc/TargetProcess/ExecutorBootstrapService.h"
25 #include "llvm/Support/DynamicLibrary.h"
26 #include "llvm/Support/Error.h"
27 
28 #include <mutex>
29 
30 namespace llvm {
31 namespace orc {
32 namespace rt_bootstrap {
33 
34 /// Simple page-based allocator.
35 class SimpleExecutorDylibManager : public ExecutorBootstrapService {
36 public:
37   virtual ~SimpleExecutorDylibManager();
38 
39   Expected<tpctypes::DylibHandle> open(const std::string &Path, uint64_t Mode);
40   Expected<std::vector<ExecutorAddr>> lookup(tpctypes::DylibHandle H,
41                                              const RemoteSymbolLookupSet &L);
42 
43   Error shutdown() override;
44   void addBootstrapSymbols(StringMap<ExecutorAddr> &M) override;
45 
46 private:
47   using DylibSet = DenseSet<void *>;
48 
49   static llvm::orc::shared::CWrapperFunctionResult
50   openWrapper(const char *ArgData, size_t ArgSize);
51 
52   static llvm::orc::shared::CWrapperFunctionResult
53   lookupWrapper(const char *ArgData, size_t ArgSize);
54 
55   std::mutex M;
56   DylibSet Dylibs;
57 };
58 
59 } // end namespace rt_bootstrap
60 } // end namespace orc
61 } // end namespace llvm
62 
63 #endif // LLVM_EXECUTIONENGINE_ORC_TARGETPROCESS_SIMPLEEXECUTORDYLIBMANAGER_H
64