]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/MapperJITLinkMemoryManager.h
Merge llvm-project main llvmorg-17-init-19304-gd0b54bb50e51
[FreeBSD/FreeBSD.git] / contrib / llvm-project / llvm / include / llvm / ExecutionEngine / Orc / MapperJITLinkMemoryManager.h
1 //===--------------- MapperJITLinkMemoryManager.h -*- 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 using MemoryMapper
10 //
11 //===----------------------------------------------------------------------===//
12
13 #ifndef LLVM_EXECUTIONENGINE_ORC_MAPPERJITLINKMEMORYMANAGER_H
14 #define LLVM_EXECUTIONENGINE_ORC_MAPPERJITLINKMEMORYMANAGER_H
15
16 #include "llvm/ADT/IntervalMap.h"
17 #include "llvm/ExecutionEngine/JITLink/JITLinkMemoryManager.h"
18 #include "llvm/ExecutionEngine/Orc/MemoryMapper.h"
19
20 namespace llvm {
21 namespace orc {
22
23 class MapperJITLinkMemoryManager : public jitlink::JITLinkMemoryManager {
24 public:
25   MapperJITLinkMemoryManager(size_t ReservationGranularity,
26                              std::unique_ptr<MemoryMapper> Mapper);
27
28   template <class MemoryMapperType, class... Args>
29   static Expected<std::unique_ptr<MapperJITLinkMemoryManager>>
30   CreateWithMapper(size_t ReservationGranularity, Args &&...A) {
31     auto Mapper = MemoryMapperType::Create(std::forward<Args>(A)...);
32     if (!Mapper)
33       return Mapper.takeError();
34
35     return std::make_unique<MapperJITLinkMemoryManager>(ReservationGranularity,
36                                                         std::move(*Mapper));
37   }
38
39   void allocate(const jitlink::JITLinkDylib *JD, jitlink::LinkGraph &G,
40                 OnAllocatedFunction OnAllocated) override;
41   // synchronous overload
42   using JITLinkMemoryManager::allocate;
43
44   void deallocate(std::vector<FinalizedAlloc> Allocs,
45                   OnDeallocatedFunction OnDeallocated) override;
46   // synchronous overload
47   using JITLinkMemoryManager::deallocate;
48
49 private:
50   class InFlightAlloc;
51
52   std::mutex Mutex;
53
54   // We reserve multiples of this from the executor address space
55   size_t ReservationUnits;
56
57   // Ranges that have been reserved in executor but not yet allocated
58   using AvailableMemoryMap = IntervalMap<ExecutorAddr, bool>;
59   AvailableMemoryMap::Allocator AMAllocator;
60   IntervalMap<ExecutorAddr, bool> AvailableMemory;
61
62   // Ranges that have been reserved in executor and already allocated
63   DenseMap<ExecutorAddr, ExecutorAddrDiff> UsedMemory;
64
65   std::unique_ptr<MemoryMapper> Mapper;
66 };
67
68 } // end namespace orc
69 } // end namespace llvm
70
71 #endif // LLVM_EXECUTIONENGINE_ORC_MAPPERJITLINKMEMORYMANAGER_H