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