Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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