1b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor//===---- RemoteMemoryManager.cpp - Recording memory manager --------------===//
2b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor//
3b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor//                     The LLVM Compiler Infrastructure
4b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor//
5b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor// This file is distributed under the University of Illinois Open Source
6b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor// License. See LICENSE.TXT for details.
7b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor//
8b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor//===----------------------------------------------------------------------===//
9b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor//
10b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor// This memory manager allocates local storage and keeps a record of each
11b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor// allocation. Iterators are provided for all data and code allocations.
12b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor//
13b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor//===----------------------------------------------------------------------===//
14b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor
15b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor#include "RemoteMemoryManager.h"
16b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor#include "llvm/ExecutionEngine/ExecutionEngine.h"
17b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor#include "llvm/ExecutionEngine/ObjectImage.h"
18b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor#include "llvm/Support/Debug.h"
19b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor#include "llvm/Support/Format.h"
20b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor
21b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylorusing namespace llvm;
22b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor
23dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "lli"
24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
25b868e9101c138016aad5bd910b67f40a3213d6fcAndrew KaylorRemoteMemoryManager::~RemoteMemoryManager() {
26b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  for (SmallVector<Allocation, 2>::iterator
27b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor         I = AllocatedSections.begin(), E = AllocatedSections.end();
28b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor       I != E; ++I)
29b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor    sys::Memory::releaseMappedMemory(I->MB);
30b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor}
31b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor
32b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kayloruint8_t *RemoteMemoryManager::
33b868e9101c138016aad5bd910b67f40a3213d6fcAndrew KaylorallocateCodeSection(uintptr_t Size, unsigned Alignment, unsigned SectionID,
34b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor                    StringRef SectionName) {
35b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // The recording memory manager is just a local copy of the remote target.
36b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // The alignment requirement is just stored here for later use. Regular
37b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // heap storage is sufficient here, but we're using mapped memory to work
38b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // around a bug in MCJIT.
39b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  sys::MemoryBlock Block = allocateSection(Size);
40e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor  // AllocatedSections will own this memory.
41b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  AllocatedSections.push_back( Allocation(Block, Alignment, true) );
42e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor  // UnmappedSections has the same information but does not own the memory.
43e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor  UnmappedSections.push_back( Allocation(Block, Alignment, true) );
44b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  return (uint8_t*)Block.base();
45b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor}
46b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor
47b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kayloruint8_t *RemoteMemoryManager::
48b868e9101c138016aad5bd910b67f40a3213d6fcAndrew KaylorallocateDataSection(uintptr_t Size, unsigned Alignment,
49b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor                    unsigned SectionID, StringRef SectionName,
50b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor                    bool IsReadOnly) {
51b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // The recording memory manager is just a local copy of the remote target.
52b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // The alignment requirement is just stored here for later use. Regular
53b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // heap storage is sufficient here, but we're using mapped memory to work
54b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // around a bug in MCJIT.
55b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  sys::MemoryBlock Block = allocateSection(Size);
56e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor  // AllocatedSections will own this memory.
57b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  AllocatedSections.push_back( Allocation(Block, Alignment, false) );
58e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor  // UnmappedSections has the same information but does not own the memory.
59e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor  UnmappedSections.push_back( Allocation(Block, Alignment, false) );
60b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  return (uint8_t*)Block.base();
61b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor}
62b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor
63b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylorsys::MemoryBlock RemoteMemoryManager::allocateSection(uintptr_t Size) {
64cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code ec;
65b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  sys::MemoryBlock MB = sys::Memory::allocateMappedMemory(Size,
66b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor                                                          &Near,
67b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor                                                          sys::Memory::MF_READ |
68b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor                                                          sys::Memory::MF_WRITE,
69b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor                                                          ec);
70b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  assert(!ec && MB.base());
71b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor
72b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // FIXME: This is part of a work around to keep sections near one another
73b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // when MCJIT performs relocations after code emission but before
74b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // the generated code is moved to the remote target.
75b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // Save this address as the basis for our next request
76b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  Near = MB;
77b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  return MB;
78b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor}
79b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor
80b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylorvoid RemoteMemoryManager::notifyObjectLoaded(ExecutionEngine *EE,
81b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor                                                const ObjectImage *Obj) {
82b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // The client should have called setRemoteTarget() before triggering any
83b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // code generation.
84b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  assert(Target);
85b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  if (!Target)
86b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor    return;
87b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor
88b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // FIXME: Make this function thread safe.
89b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor
90b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // Lay out our sections in order, with all the code sections first, then
91b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // all the data sections.
92b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  uint64_t CurOffset = 0;
93b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  unsigned MaxAlign = Target->getPageAlignment();
9436ea408903e4acafcb90650d94c9aa8e7484c1f5Andrew Kaylor  SmallVector<std::pair<Allocation, uint64_t>, 16> Offsets;
95b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  unsigned NumSections = UnmappedSections.size();
96b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // We're going to go through the list twice to separate code and data, but
97b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // it's a very small list, so that's OK.
98b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  for (size_t i = 0, e = NumSections; i != e; ++i) {
99e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor    Allocation &Section = UnmappedSections[i];
100e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor    if (Section.IsCode) {
101e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor      unsigned Size = Section.MB.size();
102e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor      unsigned Align = Section.Alignment;
103b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor      DEBUG(dbgs() << "code region: size " << Size
104b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor                  << ", alignment " << Align << "\n");
105b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor      // Align the current offset up to whatever is needed for the next
106b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor      // section.
107b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor      CurOffset = (CurOffset + Align - 1) / Align * Align;
108b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor      // Save off the address of the new section and allocate its space.
10936ea408903e4acafcb90650d94c9aa8e7484c1f5Andrew Kaylor      Offsets.push_back(std::pair<Allocation,uint64_t>(Section, CurOffset));
110b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor      CurOffset += Size;
111b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor    }
112b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  }
11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Adjust to keep code and data aligned on separate pages.
114b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  CurOffset = (CurOffset + MaxAlign - 1) / MaxAlign * MaxAlign;
115b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  for (size_t i = 0, e = NumSections; i != e; ++i) {
116e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor    Allocation &Section = UnmappedSections[i];
117e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor    if (!Section.IsCode) {
118e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor      unsigned Size = Section.MB.size();
119e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor      unsigned Align = Section.Alignment;
120b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor      DEBUG(dbgs() << "data region: size " << Size
121b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor                  << ", alignment " << Align << "\n");
122b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor      // Align the current offset up to whatever is needed for the next
123b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor      // section.
124b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor      CurOffset = (CurOffset + Align - 1) / Align * Align;
125b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor      // Save off the address of the new section and allocate its space.
12636ea408903e4acafcb90650d94c9aa8e7484c1f5Andrew Kaylor      Offsets.push_back(std::pair<Allocation,uint64_t>(Section, CurOffset));
127b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor      CurOffset += Size;
128b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor    }
129b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  }
130b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor
131b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // Allocate space in the remote target.
132b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  uint64_t RemoteAddr;
13336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (!Target->allocateSpace(CurOffset, MaxAlign, RemoteAddr))
134b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor    report_fatal_error(Target->getErrorMsg());
135b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor
136b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // Map the section addresses so relocations will get updated in the local
137b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // copies of the sections.
138b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  for (unsigned i = 0, e = Offsets.size(); i != e; ++i) {
139b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor    uint64_t Addr = RemoteAddr + Offsets[i].second;
140e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor    EE->mapSectionAddress(const_cast<void*>(Offsets[i].first.MB.base()), Addr);
141b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor
142e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor    DEBUG(dbgs() << "  Mapping local: " << Offsets[i].first.MB.base()
143b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor                 << " to remote: 0x" << format("%llx", Addr) << "\n");
144b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor
145b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor    MappedSections[Addr] = Offsets[i].first;
146b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  }
147b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor
148b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  UnmappedSections.clear();
149b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor}
150b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor
151b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylorbool RemoteMemoryManager::finalizeMemory(std::string *ErrMsg) {
152b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  // FIXME: Make this function thread safe.
153e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor  for (DenseMap<uint64_t, Allocation>::iterator
154b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor         I = MappedSections.begin(), E = MappedSections.end();
155b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor       I != E; ++I) {
156b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor    uint64_t RemoteAddr = I->first;
157e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor    const Allocation &Section = I->second;
158e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor    if (Section.IsCode) {
15936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if (!Target->loadCode(RemoteAddr, Section.MB.base(), Section.MB.size()))
16036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        report_fatal_error(Target->getErrorMsg());
161e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor      DEBUG(dbgs() << "  loading code: " << Section.MB.base()
162b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor            << " to remote: 0x" << format("%llx", RemoteAddr) << "\n");
163b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor    } else {
16436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if (!Target->loadData(RemoteAddr, Section.MB.base(), Section.MB.size()))
16536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        report_fatal_error(Target->getErrorMsg());
166e3fd646e178f92dbe2737a5230d73577090d9d0eAndrew Kaylor      DEBUG(dbgs() << "  loading data: " << Section.MB.base()
167b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor            << " to remote: 0x" << format("%llx", RemoteAddr) << "\n");
168b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor    }
169b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  }
170b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor
171b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  MappedSections.clear();
172b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor
173b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  return false;
174b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor}
175b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor
176b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylorvoid RemoteMemoryManager::setMemoryWritable() { llvm_unreachable("Unexpected!"); }
177b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylorvoid RemoteMemoryManager::setMemoryExecutable() { llvm_unreachable("Unexpected!"); }
178b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylorvoid RemoteMemoryManager::setPoisonMemory(bool poison) { llvm_unreachable("Unexpected!"); }
179b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylorvoid RemoteMemoryManager::AllocateGOT() { llvm_unreachable("Unexpected!"); }
180b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kayloruint8_t *RemoteMemoryManager::getGOTBase() const {
181b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  llvm_unreachable("Unexpected!");
182dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return nullptr;
183b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor}
184b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kayloruint8_t *RemoteMemoryManager::startFunctionBody(const Function *F, uintptr_t &ActualSize){
185b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  llvm_unreachable("Unexpected!");
186dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return nullptr;
187b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor}
188b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kayloruint8_t *RemoteMemoryManager::allocateStub(const GlobalValue* F, unsigned StubSize,
189b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor                                              unsigned Alignment) {
190b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  llvm_unreachable("Unexpected!");
191dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return nullptr;
192b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor}
193b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylorvoid RemoteMemoryManager::endFunctionBody(const Function *F, uint8_t *FunctionStart,
194b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor                                             uint8_t *FunctionEnd) {
195b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  llvm_unreachable("Unexpected!");
196b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor}
197b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kayloruint8_t *RemoteMemoryManager::allocateSpace(intptr_t Size, unsigned Alignment) {
198b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  llvm_unreachable("Unexpected!");
199dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return nullptr;
200b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor}
201b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kayloruint8_t *RemoteMemoryManager::allocateGlobal(uintptr_t Size, unsigned Alignment) {
202b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  llvm_unreachable("Unexpected!");
203dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return nullptr;
204b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor}
205b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylorvoid RemoteMemoryManager::deallocateFunctionBody(void *Body) {
206b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor  llvm_unreachable("Unexpected!");
207b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor}
208