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(Arg: 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, Arg: 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, Arg&: 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 | |