1 //===- EPCGenericJITLinkMemoryManager.h - EPC-based mem manager -*- 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 JITLinkMemoryManager by making remove calls via 10 // ExecutorProcessControl::callWrapperAsync. 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_EPCGENERICJITLINKMEMORYMANAGER_H 19 #define LLVM_EXECUTIONENGINE_ORC_EPCGENERICJITLINKMEMORYMANAGER_H 20 21 #include "llvm/ExecutionEngine/JITLink/JITLinkMemoryManager.h" 22 #include "llvm/ExecutionEngine/Orc/Core.h" 23 24 namespace llvm { 25 namespace orc { 26 27 class EPCGenericJITLinkMemoryManager : public jitlink::JITLinkMemoryManager { 28 public: 29 /// Function addresses for memory access. 30 struct SymbolAddrs { 31 ExecutorAddr Allocator; 32 ExecutorAddr Reserve; 33 ExecutorAddr Finalize; 34 ExecutorAddr Deallocate; 35 }; 36 37 /// Create an EPCGenericJITLinkMemoryManager instance from a given set of 38 /// function addrs. 39 EPCGenericJITLinkMemoryManager(ExecutorProcessControl &EPC, SymbolAddrs SAs) 40 : EPC(EPC), SAs(SAs) {} 41 42 void allocate(const jitlink::JITLinkDylib *JD, jitlink::LinkGraph &G, 43 OnAllocatedFunction OnAllocated) override; 44 45 // Use overloads from base class. 46 using JITLinkMemoryManager::allocate; 47 48 void deallocate(std::vector<FinalizedAlloc> Allocs, 49 OnDeallocatedFunction OnDeallocated) override; 50 51 // Use overloads from base class. 52 using JITLinkMemoryManager::deallocate; 53 54 private: 55 class InFlightAlloc; 56 57 void completeAllocation(ExecutorAddr AllocAddr, jitlink::BasicLayout BL, 58 OnAllocatedFunction OnAllocated); 59 60 ExecutorProcessControl &EPC; 61 SymbolAddrs SAs; 62 }; 63 64 namespace shared { 65 66 /// FIXME: This specialization should be moved into TargetProcessControlTypes.h 67 /// (or wherever those types get merged to) once ORC depends on JITLink. 68 template <> 69 class SPSSerializationTraits<SPSExecutorAddr, 70 jitlink::JITLinkMemoryManager::FinalizedAlloc> { 71 public: 72 static size_t size(const jitlink::JITLinkMemoryManager::FinalizedAlloc &FA) { 73 return SPSArgList<SPSExecutorAddr>::size(ExecutorAddr(FA.getAddress())); 74 } 75 76 static bool 77 serialize(SPSOutputBuffer &OB, 78 const jitlink::JITLinkMemoryManager::FinalizedAlloc &FA) { 79 return SPSArgList<SPSExecutorAddr>::serialize( 80 OB, ExecutorAddr(FA.getAddress())); 81 } 82 83 static bool deserialize(SPSInputBuffer &IB, 84 jitlink::JITLinkMemoryManager::FinalizedAlloc &FA) { 85 ExecutorAddr A; 86 if (!SPSArgList<SPSExecutorAddr>::deserialize(IB, A)) 87 return false; 88 FA = jitlink::JITLinkMemoryManager::FinalizedAlloc(A); 89 return true; 90 } 91 }; 92 93 } // end namespace shared 94 } // end namespace orc 95 } // end namespace llvm 96 97 #endif // LLVM_EXECUTIONENGINE_ORC_EPCGENERICJITLINKMEMORYMANAGER_H 98