Exemple #1
0
llvm_error_code PystonMemoryManager::applyMemoryGroupPermissions(MemoryGroup& MemGroup, unsigned Permissions) {

    for (sys::MemoryBlock& MB : MemGroup.PendingMem) {
        llvm_error_code ec;
        ec = sys::Memory::protectMappedMemory(MB, Permissions);
        if (ec) {
            return ec;
        }
    }
    MemGroup.PendingMem.clear();

    // Now go through free blocks and trim any of them that don't span the entire
    // page because one of the pending blocks may have overlapped it.
    for (FreeMemBlock& FreeMB : MemGroup.FreeMem) {
        FreeMB.Free = trimBlockToPageSize(FreeMB.Free);
        // We cleared the PendingMem list, so all these pointers are now invalid
        FreeMB.PendingPrefixIndex = (unsigned)-1;
    }

    // Remove all blocks which are now empty
    MemGroup.FreeMem.erase(remove_if(MemGroup.FreeMem, [](FreeMemBlock& FreeMB) { return FreeMB.Free.size() == 0; }),
                           MemGroup.FreeMem.end());

#if LLVMREV < 209952
    return llvm_error_code::success();
#else
    return llvm_error_code();
#endif
}
Exemple #2
0
llvm_error_code PystonMemoryManager::applyMemoryGroupPermissions(MemoryGroup& MemGroup, unsigned Permissions) {

    for (int i = 0, e = MemGroup.AllocatedMem.size(); i != e; ++i) {
        llvm_error_code ec;
        ec = sys::Memory::protectMappedMemory(MemGroup.AllocatedMem[i], Permissions);
        if (ec) {
            return ec;
        }
    }

#if LLVMREV < 209952
    return llvm_error_code::success();
#else
    return llvm_error_code();
#endif
}