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 24namespace llvm { 25namespace orc { 26 27class EPCGenericJITLinkMemoryManager : public jitlink::JITLinkMemoryManager { 28public: 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 54private: 55 class InFlightAlloc; 56 57 void completeAllocation(ExecutorAddr AllocAddr, jitlink::BasicLayout BL, 58 OnAllocatedFunction OnAllocated); 59 60 ExecutorProcessControl &EPC; 61 SymbolAddrs SAs; 62}; 63 64namespace 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. 68template <> 69class SPSSerializationTraits<SPSExecutorAddr, 70 jitlink::JITLinkMemoryManager::FinalizedAlloc> { 71public: 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