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 whereever 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