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
//===- 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