1de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak//===- llvm/unittest/Support/AllocatorTest.cpp - BumpPtrAllocator tests ---===// 2de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// 3de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// The LLVM Compiler Infrastructure 4de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// 5de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// This file is distributed under the University of Illinois Open Source 6de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// License. See LICENSE.TXT for details. 7de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// 8de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak//===----------------------------------------------------------------------===// 9de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 10de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak#include "llvm/Support/Memory.h" 11de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak#include "llvm/Support/Process.h" 12de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak#include "gtest/gtest.h" 13de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak#include <cstdlib> 14de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 15de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszakusing namespace llvm; 16de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszakusing namespace sys; 17de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 18de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszaknamespace { 19de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 20de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszakclass MappedMemoryTest : public ::testing::TestWithParam<unsigned> { 21de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszakpublic: 22de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MappedMemoryTest() { 23de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak Flags = GetParam(); 24f5867ab7178784bc63a3deafcf4fb09260e4d19aChandler Carruth PageSize = sys::process::get_self()->page_size(); 25de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak } 26de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 27de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszakprotected: 28de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak // Adds RW flags to permit testing of the resulting memory 29de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak unsigned getTestableEquivalent(unsigned RequestedFlags) { 30de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak switch (RequestedFlags) { 31de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak case Memory::MF_READ: 32de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak case Memory::MF_WRITE: 33de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak case Memory::MF_READ|Memory::MF_WRITE: 34de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak return Memory::MF_READ|Memory::MF_WRITE; 35de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak case Memory::MF_READ|Memory::MF_EXEC: 36de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak case Memory::MF_READ|Memory::MF_WRITE|Memory::MF_EXEC: 37de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak case Memory::MF_EXEC: 38de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak return Memory::MF_READ|Memory::MF_WRITE|Memory::MF_EXEC; 39de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak } 40de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak // Default in case values are added to the enum, as required by some compilers 41de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak return Memory::MF_READ|Memory::MF_WRITE; 42de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak } 43de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 44de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak // Returns true if the memory blocks overlap 45de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak bool doesOverlap(MemoryBlock M1, MemoryBlock M2) { 46de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak if (M1.base() == M2.base()) 47de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak return true; 48de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 49de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak if (M1.base() > M2.base()) 50de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak return (unsigned char *)M2.base() + M2.size() > M1.base(); 51de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 52de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak return (unsigned char *)M1.base() + M1.size() > M2.base(); 53de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak } 54de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 55de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak unsigned Flags; 56de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak size_t PageSize; 57de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak}; 58de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 59de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub StaszakTEST_P(MappedMemoryTest, AllocAndRelease) { 60de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak error_code EC; 61de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M1 = Memory::allocateMappedMemory(sizeof(int), 0, Flags, EC); 62de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 63de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 64de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M1.base()); 65de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(sizeof(int), M1.size()); 66de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 67de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M1)); 68de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak} 69de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 70de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub StaszakTEST_P(MappedMemoryTest, MultipleAllocAndRelease) { 71de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak error_code EC; 72de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M1 = Memory::allocateMappedMemory(16, 0, Flags, EC); 73de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 74de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M2 = Memory::allocateMappedMemory(64, 0, Flags, EC); 75de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 76de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M3 = Memory::allocateMappedMemory(32, 0, Flags, EC); 77de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 78de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 79de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M1.base()); 80de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(16U, M1.size()); 81de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M2.base()); 82de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(64U, M2.size()); 83de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M3.base()); 84de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(32U, M3.size()); 85de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 86de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(doesOverlap(M1, M2)); 87de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(doesOverlap(M2, M3)); 88de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(doesOverlap(M1, M3)); 89de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 90de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M1)); 91de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M3)); 92de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M4 = Memory::allocateMappedMemory(16, 0, Flags, EC); 93de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 94de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M4.base()); 95de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(16U, M4.size()); 96de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M4)); 97de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M2)); 98de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak} 99de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 100de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub StaszakTEST_P(MappedMemoryTest, BasicWrite) { 101c4c14a7b4a14c30b4fc7b130eb003ea7e4449e41Akira Hatanaka // This test applies only to readable and writeable combinations 102c4c14a7b4a14c30b4fc7b130eb003ea7e4449e41Akira Hatanaka if (Flags && 103c4c14a7b4a14c30b4fc7b130eb003ea7e4449e41Akira Hatanaka !((Flags & Memory::MF_READ) && (Flags & Memory::MF_WRITE))) 104de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak return; 105de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 106de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak error_code EC; 107de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M1 = Memory::allocateMappedMemory(sizeof(int), 0, Flags, EC); 108de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 109de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 110de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M1.base()); 111de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(sizeof(int), M1.size()); 112de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 113de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak int *a = (int*)M1.base(); 114de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak *a = 1; 115de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(1, *a); 116de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 117de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M1)); 118de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak} 119de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 120de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub StaszakTEST_P(MappedMemoryTest, MultipleWrite) { 121c4c14a7b4a14c30b4fc7b130eb003ea7e4449e41Akira Hatanaka // This test applies only to readable and writeable combinations 122c4c14a7b4a14c30b4fc7b130eb003ea7e4449e41Akira Hatanaka if (Flags && 123c4c14a7b4a14c30b4fc7b130eb003ea7e4449e41Akira Hatanaka !((Flags & Memory::MF_READ) && (Flags & Memory::MF_WRITE))) 124de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak return; 125de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak error_code EC; 126de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M1 = Memory::allocateMappedMemory(sizeof(int), 0, Flags, EC); 127de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 128de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M2 = Memory::allocateMappedMemory(8 * sizeof(int), 0, Flags, EC); 129de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 130de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M3 = Memory::allocateMappedMemory(4 * sizeof(int), 0, Flags, EC); 131de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 132de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 133de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(doesOverlap(M1, M2)); 134de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(doesOverlap(M2, M3)); 135de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(doesOverlap(M1, M3)); 136de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 137de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M1.base()); 138de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(1U * sizeof(int), M1.size()); 139de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M2.base()); 140de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(8U * sizeof(int), M2.size()); 141de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M3.base()); 142de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(4U * sizeof(int), M3.size()); 143de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 144de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak int *x = (int*)M1.base(); 145de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak *x = 1; 146de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 147de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak int *y = (int*)M2.base(); 148de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak for (int i = 0; i < 8; i++) { 149de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak y[i] = i; 150de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak } 151de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 152de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak int *z = (int*)M3.base(); 153de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak *z = 42; 154de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 155de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(1, *x); 156de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(7, y[7]); 157de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(42, *z); 158de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 159de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M1)); 160de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M3)); 161de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 162de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M4 = Memory::allocateMappedMemory(64 * sizeof(int), 0, Flags, EC); 163de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 164de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M4.base()); 165de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(64U * sizeof(int), M4.size()); 166de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak x = (int*)M4.base(); 167de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak *x = 4; 168de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(4, *x); 169de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M4)); 170de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 171de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak // Verify that M2 remains unaffected by other activity 172de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak for (int i = 0; i < 8; i++) { 173de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(i, y[i]); 174de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak } 175de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M2)); 176de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak} 177de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 178de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub StaszakTEST_P(MappedMemoryTest, EnabledWrite) { 179de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak error_code EC; 180de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M1 = Memory::allocateMappedMemory(2 * sizeof(int), 0, Flags, EC); 181de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 182de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M2 = Memory::allocateMappedMemory(8 * sizeof(int), 0, Flags, EC); 183de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 184de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M3 = Memory::allocateMappedMemory(4 * sizeof(int), 0, Flags, EC); 185de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 186de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 187de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M1.base()); 188de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(2U * sizeof(int), M1.size()); 189de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M2.base()); 190de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(8U * sizeof(int), M2.size()); 191de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M3.base()); 192de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(4U * sizeof(int), M3.size()); 193de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 194de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::protectMappedMemory(M1, getTestableEquivalent(Flags))); 195de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::protectMappedMemory(M2, getTestableEquivalent(Flags))); 196de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::protectMappedMemory(M3, getTestableEquivalent(Flags))); 197de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 198de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(doesOverlap(M1, M2)); 199de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(doesOverlap(M2, M3)); 200de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(doesOverlap(M1, M3)); 201de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 202de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak int *x = (int*)M1.base(); 203de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak *x = 1; 204de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak int *y = (int*)M2.base(); 205de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak for (unsigned int i = 0; i < 8; i++) { 206de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak y[i] = i; 207de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak } 208de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak int *z = (int*)M3.base(); 209de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak *z = 42; 210de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 211de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(1, *x); 212de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(7, y[7]); 213de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(42, *z); 214de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 215de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M1)); 216de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M3)); 217de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(6, y[6]); 218de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 219de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M4 = Memory::allocateMappedMemory(16, 0, Flags, EC); 220de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 221de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M4.base()); 222de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(16U, M4.size()); 223de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), Memory::protectMappedMemory(M4, getTestableEquivalent(Flags))); 224de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak x = (int*)M4.base(); 225de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak *x = 4; 226de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(4, *x); 227de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M4)); 228de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M2)); 229de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak} 230de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 231de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub StaszakTEST_P(MappedMemoryTest, SuccessiveNear) { 232de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak error_code EC; 233de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M1 = Memory::allocateMappedMemory(16, 0, Flags, EC); 234de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 235de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M2 = Memory::allocateMappedMemory(64, &M1, Flags, EC); 236de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 237de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M3 = Memory::allocateMappedMemory(32, &M2, Flags, EC); 238de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 239de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 240de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M1.base()); 241de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(16U, M1.size()); 242de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M2.base()); 243de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(64U, M2.size()); 244de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M3.base()); 245de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(32U, M3.size()); 246de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 247de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(doesOverlap(M1, M2)); 248de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(doesOverlap(M2, M3)); 249de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(doesOverlap(M1, M3)); 250de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 251de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M1)); 252de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M3)); 253de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M2)); 254de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak} 255de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 256de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub StaszakTEST_P(MappedMemoryTest, DuplicateNear) { 257de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak error_code EC; 258de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock Near((void*)(3*PageSize), 16); 259de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M1 = Memory::allocateMappedMemory(16, &Near, Flags, EC); 260de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 261de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M2 = Memory::allocateMappedMemory(64, &Near, Flags, EC); 262de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 263de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M3 = Memory::allocateMappedMemory(32, &Near, Flags, EC); 264de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 265de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 266de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M1.base()); 267de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(16U, M1.size()); 268de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M2.base()); 269de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(64U, M2.size()); 270de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M3.base()); 271de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(32U, M3.size()); 272de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 273de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M1)); 274de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M3)); 275de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M2)); 276de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak} 277de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 278de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub StaszakTEST_P(MappedMemoryTest, ZeroNear) { 279de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak error_code EC; 280de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock Near(0, 0); 281de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M1 = Memory::allocateMappedMemory(16, &Near, Flags, EC); 282de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 283de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M2 = Memory::allocateMappedMemory(64, &Near, Flags, EC); 284de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 285de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M3 = Memory::allocateMappedMemory(32, &Near, Flags, EC); 286de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 287de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 288de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M1.base()); 289de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(16U, M1.size()); 290de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M2.base()); 291de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(64U, M2.size()); 292de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M3.base()); 293de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(32U, M3.size()); 294de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 295de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(doesOverlap(M1, M2)); 296de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(doesOverlap(M2, M3)); 297de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(doesOverlap(M1, M3)); 298de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 299de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M1)); 300de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M3)); 301de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M2)); 302de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak} 303de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 304de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub StaszakTEST_P(MappedMemoryTest, ZeroSizeNear) { 305de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak error_code EC; 306de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock Near((void*)(4*PageSize), 0); 307de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M1 = Memory::allocateMappedMemory(16, &Near, Flags, EC); 308de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 309de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M2 = Memory::allocateMappedMemory(64, &Near, Flags, EC); 310de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 311de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M3 = Memory::allocateMappedMemory(32, &Near, Flags, EC); 312de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 313de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 314de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M1.base()); 315de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(16U, M1.size()); 316de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M2.base()); 317de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(64U, M2.size()); 318de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M3.base()); 319de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(32U, M3.size()); 320de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 321de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(doesOverlap(M1, M2)); 322de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(doesOverlap(M2, M3)); 323de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(doesOverlap(M1, M3)); 324de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 325de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M1)); 326de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M3)); 327de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M2)); 328de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak} 329de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 330de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub StaszakTEST_P(MappedMemoryTest, UnalignedNear) { 331de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak error_code EC; 332de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock Near((void*)(2*PageSize+5), 0); 333de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBlock M1 = Memory::allocateMappedMemory(15, &Near, Flags, EC); 334de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_EQ(error_code::success(), EC); 335de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 336de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_NE((void*)0, M1.base()); 337de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_LE(sizeof(int), M1.size()); 338de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 339de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak EXPECT_FALSE(Memory::releaseMappedMemory(M1)); 340de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak} 341de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 342de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// Note that Memory::MF_WRITE is not supported exclusively across 343de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// operating systems and architectures and can imply MF_READ|MF_WRITE 344de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszakunsigned MemoryFlags[] = { 345de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak Memory::MF_READ, 346de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak Memory::MF_WRITE, 347de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak Memory::MF_READ|Memory::MF_WRITE, 348de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak Memory::MF_EXEC, 349de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak Memory::MF_READ|Memory::MF_EXEC, 350de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak Memory::MF_READ|Memory::MF_WRITE|Memory::MF_EXEC 351de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak }; 352de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 353de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub StaszakINSTANTIATE_TEST_CASE_P(AllocationTests, 354de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MappedMemoryTest, 355de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak ::testing::ValuesIn(MemoryFlags)); 356de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 357de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak} // anonymous namespace 358