40#ifdef USE_LLVM_BACKPORT_SECTION_MEMORY_MANAGER
43#include <llvm/Support/MathExtras.h>
44#include <llvm/Support/Process.h>
58#if LLVM_VERSION_MAJOR < 16
76 static const size_t PageSize = sys::Process::getPageSizeEstimate();
121 sys::Memory::MF_READ | sys::Memory::MF_WRITE, ec);
183 MemoryGroup &
MemGroup = [&]() -> MemoryGroup & {
204 if (
FreeMB.PendingPrefixIndex == (
unsigned)-1) {
237 sys::Memory::MF_READ | sys::Memory::MF_WRITE, ec);
286 sys::Memory::MF_READ | sys::Memory::MF_EXEC);
314 static const size_t PageSize = sys::Process::getPageSizeEstimate();
329 Trimmed.allocatedSize() <=
M.allocatedSize());
337 for (sys::MemoryBlock &
MB :
MemGroup.PendingMem)
353 return FreeMB.Free.allocatedSize() == 0;
356 return std::error_code();
367 for (sys::MemoryBlock &
Block :
Group->AllocatedMem)
382 allocateMappedMemory(SectionMemoryManager::AllocationPurpose
Purpose,
384 unsigned Flags, std::error_code &
EC)
override {
388 std::error_code protectMappedMemory(
const sys::MemoryBlock &
Block,
389 unsigned Flags)
override {
390 return sys::Memory::protectMappedMemory(
Block,
Flags);
393 std::error_code releaseMappedMemory(sys::MemoryBlock &
M)
override {
394 return sys::Memory::releaseMappedMemory(
M);
404 OwnedMMapper = std::make_unique<DefaultMMapper>();
405 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