- //===- EPCGenericJITLinkMemoryManager.h - EPC-based mem manager -*- C++ -*-===// 
- // 
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 
- // See https://llvm.org/LICENSE.txt for license information. 
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 
- // 
- //===----------------------------------------------------------------------===// 
- // 
- // Implements JITLinkMemoryManager by making remove calls via 
- // ExecutorProcessControl::callWrapperAsync. 
- // 
- // This simplifies the implementaton of new ExecutorProcessControl instances, 
- // as this implementation will always work (at the cost of some performance 
- // overhead for the calls). 
- // 
- //===----------------------------------------------------------------------===// 
-   
- #ifndef LLVM_EXECUTIONENGINE_ORC_EPCGENERICJITLINKMEMORYMANAGER_H 
- #define LLVM_EXECUTIONENGINE_ORC_EPCGENERICJITLINKMEMORYMANAGER_H 
-   
- #include "llvm/ExecutionEngine/JITLink/JITLinkMemoryManager.h" 
- #include "llvm/ExecutionEngine/Orc/Core.h" 
-   
- namespace llvm { 
- namespace orc { 
-   
- class EPCGenericJITLinkMemoryManager : public jitlink::JITLinkMemoryManager { 
- public: 
-   /// Function addresses for memory access. 
-   struct SymbolAddrs { 
-     ExecutorAddr Allocator; 
-     ExecutorAddr Reserve; 
-     ExecutorAddr Finalize; 
-     ExecutorAddr Deallocate; 
-   }; 
-   
-   /// Create an EPCGenericJITLinkMemoryManager instance from a given set of 
-   /// function addrs. 
-   EPCGenericJITLinkMemoryManager(ExecutorProcessControl &EPC, SymbolAddrs SAs) 
-       : EPC(EPC), SAs(SAs) {} 
-   
-   void allocate(const jitlink::JITLinkDylib *JD, jitlink::LinkGraph &G, 
-                 OnAllocatedFunction OnAllocated) override; 
-   
-   // Use overloads from base class. 
-   using JITLinkMemoryManager::allocate; 
-   
-   void deallocate(std::vector<FinalizedAlloc> Allocs, 
-                   OnDeallocatedFunction OnDeallocated) override; 
-   
-   // Use overloads from base class. 
-   using JITLinkMemoryManager::deallocate; 
-   
- private: 
-   class InFlightAlloc; 
-   
-   void completeAllocation(ExecutorAddr AllocAddr, jitlink::BasicLayout BL, 
-                           OnAllocatedFunction OnAllocated); 
-   
-   ExecutorProcessControl &EPC; 
-   SymbolAddrs SAs; 
- }; 
-   
- namespace shared { 
-   
- /// FIXME: This specialization should be moved into TargetProcessControlTypes.h 
- ///        (or whereever those types get merged to) once ORC depends on JITLink. 
- template <> 
- class SPSSerializationTraits<SPSExecutorAddr, 
-                              jitlink::JITLinkMemoryManager::FinalizedAlloc> { 
- public: 
-   static size_t size(const jitlink::JITLinkMemoryManager::FinalizedAlloc &FA) { 
-     return SPSArgList<SPSExecutorAddr>::size(ExecutorAddr(FA.getAddress())); 
-   } 
-   
-   static bool 
-   serialize(SPSOutputBuffer &OB, 
-             const jitlink::JITLinkMemoryManager::FinalizedAlloc &FA) { 
-     return SPSArgList<SPSExecutorAddr>::serialize( 
-         OB, ExecutorAddr(FA.getAddress())); 
-   } 
-   
-   static bool deserialize(SPSInputBuffer &IB, 
-                           jitlink::JITLinkMemoryManager::FinalizedAlloc &FA) { 
-     ExecutorAddr A; 
-     if (!SPSArgList<SPSExecutorAddr>::deserialize(IB, A)) 
-       return false; 
-     FA = jitlink::JITLinkMemoryManager::FinalizedAlloc(A); 
-     return true; 
-   } 
- }; 
-   
- } // end namespace shared 
- } // end namespace orc 
- } // end namespace llvm 
-   
- #endif // LLVM_EXECUTIONENGINE_ORC_EPCGENERICJITLINKMEMORYMANAGER_H 
-