1 //===---------------- SimpleExecutorMemoryManager.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 allocator class suitable for basic remote-JIT use.
10 //
11 // FIXME: The functionality in this file should be moved to the ORC runtime.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_EXECUTIONENGINE_ORC_TARGETPROCESS_SIMPLEEXECUTORMEMORYMANAGER_H
16 #define LLVM_EXECUTIONENGINE_ORC_TARGETPROCESS_SIMPLEEXECUTORMEMORYMANAGER_H
17 
18 #include "llvm/ADT/DenseMap.h"
19 #include "llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h"
20 #include "llvm/ExecutionEngine/Orc/Shared/TargetProcessControlTypes.h"
21 #include "llvm/ExecutionEngine/Orc/Shared/WrapperFunctionUtils.h"
22 #include "llvm/ExecutionEngine/Orc/TargetProcess/ExecutorBootstrapService.h"
23 #include "llvm/Support/Error.h"
24 
25 #include <mutex>
26 
27 namespace llvm {
28 namespace orc {
29 namespace rt_bootstrap {
30 
31 /// Simple page-based allocator.
32 class SimpleExecutorMemoryManager : public ExecutorBootstrapService {
33 public:
34   virtual ~SimpleExecutorMemoryManager();
35 
36   Expected<ExecutorAddr> allocate(uint64_t Size);
37   Error finalize(tpctypes::FinalizeRequest &FR);
38   Error deallocate(const std::vector<ExecutorAddr> &Bases);
39 
40   Error shutdown() override;
41   void addBootstrapSymbols(StringMap<ExecutorAddr> &M) override;
42 
43 private:
44   struct Allocation {
45     size_t Size = 0;
46     std::vector<shared::WrapperFunctionCall> DeallocationActions;
47   };
48 
49   using AllocationsMap = DenseMap<void *, Allocation>;
50 
51   Error deallocateImpl(void *Base, Allocation &A);
52 
53   static llvm::orc::shared::CWrapperFunctionResult
54   reserveWrapper(const char *ArgData, size_t ArgSize);
55 
56   static llvm::orc::shared::CWrapperFunctionResult
57   finalizeWrapper(const char *ArgData, size_t ArgSize);
58 
59   static llvm::orc::shared::CWrapperFunctionResult
60   deallocateWrapper(const char *ArgData, size_t ArgSize);
61 
62   std::mutex M;
63   AllocationsMap Allocations;
64 };
65 
66 } // end namespace rt_bootstrap
67 } // end namespace orc
68 } // end namespace llvm
69 
70 #endif // LLVM_EXECUTIONENGINE_ORC_TARGETPROCESS_SIMPLEEXECUTORMEMORYMANAGER_H
71