SectionMemoryManager.h revision 263508
1//===- SectionMemoryManager.h - Memory manager for MCJIT/RtDyld -*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file contains the declaration of a section-based memory manager used by 11// the MCJIT execution engine and RuntimeDyld. 12// 13//===----------------------------------------------------------------------===// 14 15#ifndef LLVM_EXECUTIONENGINE_SECTIONMEMORYMANAGER_H 16#define LLVM_EXECUTIONENGINE_SECTIONMEMORYMANAGER_H 17 18#include "llvm/ADT/SmallVector.h" 19#include "llvm/ExecutionEngine/RuntimeDyld.h" 20#include "llvm/Support/ErrorHandling.h" 21#include "llvm/Support/Memory.h" 22 23namespace llvm { 24 25/// This is a simple memory manager which implements the methods called by 26/// the RuntimeDyld class to allocate memory for section-based loading of 27/// objects, usually those generated by the MCJIT execution engine. 28/// 29/// This memory manager allocates all section memory as read-write. The 30/// RuntimeDyld will copy JITed section memory into these allocated blocks 31/// and perform any necessary linking and relocations. 32/// 33/// Any client using this memory manager MUST ensure that section-specific 34/// page permissions have been applied before attempting to execute functions 35/// in the JITed object. Permissions can be applied either by calling 36/// MCJIT::finalizeObject or by calling SectionMemoryManager::finalizeMemory 37/// directly. Clients of MCJIT should call MCJIT::finalizeObject. 38class SectionMemoryManager : public RTDyldMemoryManager { 39 SectionMemoryManager(const SectionMemoryManager&) LLVM_DELETED_FUNCTION; 40 void operator=(const SectionMemoryManager&) LLVM_DELETED_FUNCTION; 41 42public: 43 SectionMemoryManager() { } 44 virtual ~SectionMemoryManager(); 45 46 /// \brief Allocates a memory block of (at least) the given size suitable for 47 /// executable code. 48 /// 49 /// The value of \p Alignment must be a power of two. If \p Alignment is zero 50 /// a default alignment of 16 will be used. 51 virtual uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment, 52 unsigned SectionID, 53 StringRef SectionName); 54 55 /// \brief Allocates a memory block of (at least) the given size suitable for 56 /// executable code. 57 /// 58 /// The value of \p Alignment must be a power of two. If \p Alignment is zero 59 /// a default alignment of 16 will be used. 60 virtual uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment, 61 unsigned SectionID, 62 StringRef SectionName, 63 bool isReadOnly); 64 65 /// \brief Update section-specific memory permissions and other attributes. 66 /// 67 /// This method is called when object loading is complete and section page 68 /// permissions can be applied. It is up to the memory manager implementation 69 /// to decide whether or not to act on this method. The memory manager will 70 /// typically allocate all sections as read-write and then apply specific 71 /// permissions when this method is called. Code sections cannot be executed 72 /// until this function has been called. In addition, any cache coherency 73 /// operations needed to reliably use the memory are also performed. 74 /// 75 /// \returns true if an error occurred, false otherwise. 76 virtual bool finalizeMemory(std::string *ErrMsg = 0); 77 78 /// \brief Invalidate instruction cache for code sections. 79 /// 80 /// Some platforms with separate data cache and instruction cache require 81 /// explicit cache flush, otherwise JIT code manipulations (like resolved 82 /// relocations) will get to the data cache but not to the instruction cache. 83 /// 84 /// This method is called from finalizeMemory. 85 virtual void invalidateInstructionCache(); 86 87private: 88 struct MemoryGroup { 89 SmallVector<sys::MemoryBlock, 16> AllocatedMem; 90 SmallVector<sys::MemoryBlock, 16> FreeMem; 91 sys::MemoryBlock Near; 92 }; 93 94 uint8_t *allocateSection(MemoryGroup &MemGroup, uintptr_t Size, 95 unsigned Alignment); 96 97 error_code applyMemoryGroupPermissions(MemoryGroup &MemGroup, 98 unsigned Permissions); 99 100 MemoryGroup CodeMem; 101 MemoryGroup RWDataMem; 102 MemoryGroup RODataMem; 103}; 104 105} 106 107#endif // LLVM_EXECUTION_ENGINE_SECTION_MEMORY_MANAGER_H 108 109