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