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
20namespace llvm {
21namespace orc {
22
23class MapperJITLinkMemoryManager : public jitlink::JITLinkMemoryManager {
24public:
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
49private:
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
72