33#ifdef USE_LLVM_BACKPORT_SECTION_MEMORY_MANAGER
36#include <llvm/Support/MathExtras.h>
37#include <llvm/Support/Process.h>
51#if LLVM_VERSION_MAJOR < 16
69 static const size_t PageSize = sys::Process::getPageSizeEstimate();
114 sys::Memory::MF_READ | sys::Memory::MF_WRITE, ec);
176 MemoryGroup &
MemGroup = [&]() -> MemoryGroup & {
197 if (
FreeMB.PendingPrefixIndex == (
unsigned)-1) {
230 sys::Memory::MF_READ | sys::Memory::MF_WRITE, ec);
279 sys::Memory::MF_READ | sys::Memory::MF_EXEC);
307 static const size_t PageSize = sys::Process::getPageSizeEstimate();
322 Trimmed.allocatedSize() <=
M.allocatedSize());
330 for (sys::MemoryBlock &
MB :
MemGroup.PendingMem)
346 return FreeMB.Free.allocatedSize() == 0;
349 return std::error_code();
360 for (sys::MemoryBlock &
Block :
Group->AllocatedMem)
375 allocateMappedMemory(SectionMemoryManager::AllocationPurpose
Purpose,
377 unsigned Flags, std::error_code &
EC)
override {
381 std::error_code protectMappedMemory(
const sys::MemoryBlock &
Block,
382 unsigned Flags)
override {
383 return sys::Memory::protectMappedMemory(
Block,
Flags);
386 std::error_code releaseMappedMemory(sys::MemoryBlock &
M)
override {
387 return sys::Memory::releaseMappedMemory(
M);
397 OwnedMMapper = std::make_unique<DefaultMMapper>();
398 MMapper = OwnedMMapper.get();
virtual sys::MemoryBlock allocateMappedMemory(AllocationPurpose Purpose, size_t NumBytes, const sys::MemoryBlock *const NearBlock, unsigned Flags, std::error_code &EC)=0
std::unique_ptr< MemoryMapper > OwnedMMapper
SectionMemoryManager(MemoryMapper *MM=nullptr, bool ReserveAlloc=false)
virtual void invalidateInstructionCache()
~SectionMemoryManager() override
virtual void reserveAllocationSpace(uintptr_t CodeSize, uint32_t CodeAlign, uintptr_t RODataSize, uint32_t RODataAlign, uintptr_t RWDataSize, uint32_t RWDataAlign) override
bool finalizeMemory(std::string *ErrMsg=nullptr) override
uint8_t * allocateSection(AllocationPurpose Purpose, uintptr_t Size, unsigned Alignment)
bool hasSpace(const MemoryGroup &MemGroup, uintptr_t Size) const
uint8_t * allocateDataSection(uintptr_t Size, unsigned Alignment, unsigned SectionID, StringRef SectionName, bool IsReadOnly) override
std::error_code applyMemoryGroupPermissions(MemoryGroup &MemGroup, unsigned Permissions)
uint8_t * allocateCodeSection(uintptr_t Size, unsigned Alignment, unsigned SectionID, StringRef SectionName) override
SmallVector< sys::MemoryBlock, 16 > AllocatedMem
SmallVector< FreeMemBlock, 16 > FreeMem