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