blob: f85f3dc3128f50d72a038fe02aac689fc842ebe6 [file] [log] [blame]
Jakub Staszak0c4468b2012-11-14 20:18:34 +00001//===- llvm/unittest/Support/AllocatorTest.cpp - BumpPtrAllocator tests ---===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/Support/Memory.h"
11#include "llvm/Support/Process.h"
Jakub Staszak0c4468b2012-11-14 20:18:34 +000012#include "gtest/gtest.h"
13#include <cstdlib>
14
15using namespace llvm;
16using namespace sys;
17
18namespace {
19
20class MappedMemoryTest : public ::testing::TestWithParam<unsigned> {
21public:
22 MappedMemoryTest() {
23 Flags = GetParam();
Chandler Carruthacd64be2012-12-31 23:31:56 +000024 PageSize = sys::process::get_self()->page_size();
Jakub Staszak0c4468b2012-11-14 20:18:34 +000025 }
26
27protected:
28 // Adds RW flags to permit testing of the resulting memory
29 unsigned getTestableEquivalent(unsigned RequestedFlags) {
30 switch (RequestedFlags) {
31 case Memory::MF_READ:
32 case Memory::MF_WRITE:
33 case Memory::MF_READ|Memory::MF_WRITE:
34 return Memory::MF_READ|Memory::MF_WRITE;
35 case Memory::MF_READ|Memory::MF_EXEC:
36 case Memory::MF_READ|Memory::MF_WRITE|Memory::MF_EXEC:
37 case Memory::MF_EXEC:
38 return Memory::MF_READ|Memory::MF_WRITE|Memory::MF_EXEC;
39 }
40 // Default in case values are added to the enum, as required by some compilers
41 return Memory::MF_READ|Memory::MF_WRITE;
42 }
43
44 // Returns true if the memory blocks overlap
45 bool doesOverlap(MemoryBlock M1, MemoryBlock M2) {
46 if (M1.base() == M2.base())
47 return true;
48
49 if (M1.base() > M2.base())
50 return (unsigned char *)M2.base() + M2.size() > M1.base();
51
52 return (unsigned char *)M1.base() + M1.size() > M2.base();
53 }
54
55 unsigned Flags;
56 size_t PageSize;
57};
58
59TEST_P(MappedMemoryTest, AllocAndRelease) {
60 error_code EC;
Craig Topper66f09ad2014-06-08 22:29:17 +000061 MemoryBlock M1 = Memory::allocateMappedMemory(sizeof(int), nullptr, Flags,EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +000062 EXPECT_EQ(error_code(), EC);
Jakub Staszak0c4468b2012-11-14 20:18:34 +000063
Craig Topper66f09ad2014-06-08 22:29:17 +000064 EXPECT_NE((void*)nullptr, M1.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +000065 EXPECT_LE(sizeof(int), M1.size());
66
67 EXPECT_FALSE(Memory::releaseMappedMemory(M1));
68}
69
70TEST_P(MappedMemoryTest, MultipleAllocAndRelease) {
71 error_code EC;
Craig Topper66f09ad2014-06-08 22:29:17 +000072 MemoryBlock M1 = Memory::allocateMappedMemory(16, nullptr, Flags, EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +000073 EXPECT_EQ(error_code(), EC);
Craig Topper66f09ad2014-06-08 22:29:17 +000074 MemoryBlock M2 = Memory::allocateMappedMemory(64, nullptr, Flags, EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +000075 EXPECT_EQ(error_code(), EC);
Craig Topper66f09ad2014-06-08 22:29:17 +000076 MemoryBlock M3 = Memory::allocateMappedMemory(32, nullptr, Flags, EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +000077 EXPECT_EQ(error_code(), EC);
Jakub Staszak0c4468b2012-11-14 20:18:34 +000078
Craig Topper66f09ad2014-06-08 22:29:17 +000079 EXPECT_NE((void*)nullptr, M1.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +000080 EXPECT_LE(16U, M1.size());
Craig Topper66f09ad2014-06-08 22:29:17 +000081 EXPECT_NE((void*)nullptr, M2.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +000082 EXPECT_LE(64U, M2.size());
Craig Topper66f09ad2014-06-08 22:29:17 +000083 EXPECT_NE((void*)nullptr, M3.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +000084 EXPECT_LE(32U, M3.size());
85
86 EXPECT_FALSE(doesOverlap(M1, M2));
87 EXPECT_FALSE(doesOverlap(M2, M3));
88 EXPECT_FALSE(doesOverlap(M1, M3));
89
90 EXPECT_FALSE(Memory::releaseMappedMemory(M1));
91 EXPECT_FALSE(Memory::releaseMappedMemory(M3));
Craig Topper66f09ad2014-06-08 22:29:17 +000092 MemoryBlock M4 = Memory::allocateMappedMemory(16, nullptr, Flags, EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +000093 EXPECT_EQ(error_code(), EC);
Craig Topper66f09ad2014-06-08 22:29:17 +000094 EXPECT_NE((void*)nullptr, M4.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +000095 EXPECT_LE(16U, M4.size());
96 EXPECT_FALSE(Memory::releaseMappedMemory(M4));
97 EXPECT_FALSE(Memory::releaseMappedMemory(M2));
98}
99
100TEST_P(MappedMemoryTest, BasicWrite) {
Akira Hatanaka4b11df02012-12-05 22:43:07 +0000101 // This test applies only to readable and writeable combinations
102 if (Flags &&
103 !((Flags & Memory::MF_READ) && (Flags & Memory::MF_WRITE)))
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000104 return;
105
106 error_code EC;
Craig Topper66f09ad2014-06-08 22:29:17 +0000107 MemoryBlock M1 = Memory::allocateMappedMemory(sizeof(int), nullptr, Flags,EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000108 EXPECT_EQ(error_code(), EC);
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000109
Craig Topper66f09ad2014-06-08 22:29:17 +0000110 EXPECT_NE((void*)nullptr, M1.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000111 EXPECT_LE(sizeof(int), M1.size());
112
113 int *a = (int*)M1.base();
114 *a = 1;
115 EXPECT_EQ(1, *a);
116
117 EXPECT_FALSE(Memory::releaseMappedMemory(M1));
118}
119
120TEST_P(MappedMemoryTest, MultipleWrite) {
Akira Hatanaka4b11df02012-12-05 22:43:07 +0000121 // This test applies only to readable and writeable combinations
122 if (Flags &&
123 !((Flags & Memory::MF_READ) && (Flags & Memory::MF_WRITE)))
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000124 return;
125 error_code EC;
Craig Topper66f09ad2014-06-08 22:29:17 +0000126 MemoryBlock M1 = Memory::allocateMappedMemory(sizeof(int), nullptr, Flags,
127 EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000128 EXPECT_EQ(error_code(), EC);
Craig Topper66f09ad2014-06-08 22:29:17 +0000129 MemoryBlock M2 = Memory::allocateMappedMemory(8 * sizeof(int), nullptr, Flags,
130 EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000131 EXPECT_EQ(error_code(), EC);
Craig Topper66f09ad2014-06-08 22:29:17 +0000132 MemoryBlock M3 = Memory::allocateMappedMemory(4 * sizeof(int), nullptr, Flags,
133 EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000134 EXPECT_EQ(error_code(), EC);
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000135
136 EXPECT_FALSE(doesOverlap(M1, M2));
137 EXPECT_FALSE(doesOverlap(M2, M3));
138 EXPECT_FALSE(doesOverlap(M1, M3));
139
Craig Topper66f09ad2014-06-08 22:29:17 +0000140 EXPECT_NE((void*)nullptr, M1.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000141 EXPECT_LE(1U * sizeof(int), M1.size());
Craig Topper66f09ad2014-06-08 22:29:17 +0000142 EXPECT_NE((void*)nullptr, M2.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000143 EXPECT_LE(8U * sizeof(int), M2.size());
Craig Topper66f09ad2014-06-08 22:29:17 +0000144 EXPECT_NE((void*)nullptr, M3.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000145 EXPECT_LE(4U * sizeof(int), M3.size());
146
147 int *x = (int*)M1.base();
148 *x = 1;
149
150 int *y = (int*)M2.base();
151 for (int i = 0; i < 8; i++) {
152 y[i] = i;
153 }
154
155 int *z = (int*)M3.base();
156 *z = 42;
157
158 EXPECT_EQ(1, *x);
159 EXPECT_EQ(7, y[7]);
160 EXPECT_EQ(42, *z);
161
162 EXPECT_FALSE(Memory::releaseMappedMemory(M1));
163 EXPECT_FALSE(Memory::releaseMappedMemory(M3));
164
Craig Topper66f09ad2014-06-08 22:29:17 +0000165 MemoryBlock M4 = Memory::allocateMappedMemory(64 * sizeof(int), nullptr,
166 Flags, EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000167 EXPECT_EQ(error_code(), EC);
Craig Topper66f09ad2014-06-08 22:29:17 +0000168 EXPECT_NE((void*)nullptr, M4.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000169 EXPECT_LE(64U * sizeof(int), M4.size());
170 x = (int*)M4.base();
171 *x = 4;
172 EXPECT_EQ(4, *x);
173 EXPECT_FALSE(Memory::releaseMappedMemory(M4));
174
175 // Verify that M2 remains unaffected by other activity
176 for (int i = 0; i < 8; i++) {
177 EXPECT_EQ(i, y[i]);
178 }
179 EXPECT_FALSE(Memory::releaseMappedMemory(M2));
180}
181
182TEST_P(MappedMemoryTest, EnabledWrite) {
183 error_code EC;
Craig Topper66f09ad2014-06-08 22:29:17 +0000184 MemoryBlock M1 = Memory::allocateMappedMemory(2 * sizeof(int), nullptr, Flags,
185 EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000186 EXPECT_EQ(error_code(), EC);
Craig Topper66f09ad2014-06-08 22:29:17 +0000187 MemoryBlock M2 = Memory::allocateMappedMemory(8 * sizeof(int), nullptr, Flags,
188 EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000189 EXPECT_EQ(error_code(), EC);
Craig Topper66f09ad2014-06-08 22:29:17 +0000190 MemoryBlock M3 = Memory::allocateMappedMemory(4 * sizeof(int), nullptr, Flags,
191 EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000192 EXPECT_EQ(error_code(), EC);
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000193
Craig Topper66f09ad2014-06-08 22:29:17 +0000194 EXPECT_NE((void*)nullptr, M1.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000195 EXPECT_LE(2U * sizeof(int), M1.size());
Craig Topper66f09ad2014-06-08 22:29:17 +0000196 EXPECT_NE((void*)nullptr, M2.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000197 EXPECT_LE(8U * sizeof(int), M2.size());
Craig Topper66f09ad2014-06-08 22:29:17 +0000198 EXPECT_NE((void*)nullptr, M3.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000199 EXPECT_LE(4U * sizeof(int), M3.size());
200
201 EXPECT_FALSE(Memory::protectMappedMemory(M1, getTestableEquivalent(Flags)));
202 EXPECT_FALSE(Memory::protectMappedMemory(M2, getTestableEquivalent(Flags)));
203 EXPECT_FALSE(Memory::protectMappedMemory(M3, getTestableEquivalent(Flags)));
204
205 EXPECT_FALSE(doesOverlap(M1, M2));
206 EXPECT_FALSE(doesOverlap(M2, M3));
207 EXPECT_FALSE(doesOverlap(M1, M3));
208
209 int *x = (int*)M1.base();
210 *x = 1;
211 int *y = (int*)M2.base();
212 for (unsigned int i = 0; i < 8; i++) {
213 y[i] = i;
214 }
215 int *z = (int*)M3.base();
216 *z = 42;
217
218 EXPECT_EQ(1, *x);
219 EXPECT_EQ(7, y[7]);
220 EXPECT_EQ(42, *z);
221
222 EXPECT_FALSE(Memory::releaseMappedMemory(M1));
223 EXPECT_FALSE(Memory::releaseMappedMemory(M3));
224 EXPECT_EQ(6, y[6]);
225
Craig Topper66f09ad2014-06-08 22:29:17 +0000226 MemoryBlock M4 = Memory::allocateMappedMemory(16, nullptr, Flags, EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000227 EXPECT_EQ(error_code(), EC);
Craig Topper66f09ad2014-06-08 22:29:17 +0000228 EXPECT_NE((void*)nullptr, M4.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000229 EXPECT_LE(16U, M4.size());
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000230 EXPECT_EQ(error_code(), Memory::protectMappedMemory(M4, getTestableEquivalent(Flags)));
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000231 x = (int*)M4.base();
232 *x = 4;
233 EXPECT_EQ(4, *x);
234 EXPECT_FALSE(Memory::releaseMappedMemory(M4));
235 EXPECT_FALSE(Memory::releaseMappedMemory(M2));
236}
237
238TEST_P(MappedMemoryTest, SuccessiveNear) {
239 error_code EC;
Craig Topper66f09ad2014-06-08 22:29:17 +0000240 MemoryBlock M1 = Memory::allocateMappedMemory(16, nullptr, Flags, EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000241 EXPECT_EQ(error_code(), EC);
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000242 MemoryBlock M2 = Memory::allocateMappedMemory(64, &M1, Flags, EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000243 EXPECT_EQ(error_code(), EC);
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000244 MemoryBlock M3 = Memory::allocateMappedMemory(32, &M2, Flags, EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000245 EXPECT_EQ(error_code(), EC);
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000246
Craig Topper66f09ad2014-06-08 22:29:17 +0000247 EXPECT_NE((void*)nullptr, M1.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000248 EXPECT_LE(16U, M1.size());
Craig Topper66f09ad2014-06-08 22:29:17 +0000249 EXPECT_NE((void*)nullptr, M2.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000250 EXPECT_LE(64U, M2.size());
Craig Topper66f09ad2014-06-08 22:29:17 +0000251 EXPECT_NE((void*)nullptr, M3.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000252 EXPECT_LE(32U, M3.size());
253
254 EXPECT_FALSE(doesOverlap(M1, M2));
255 EXPECT_FALSE(doesOverlap(M2, M3));
256 EXPECT_FALSE(doesOverlap(M1, M3));
257
258 EXPECT_FALSE(Memory::releaseMappedMemory(M1));
259 EXPECT_FALSE(Memory::releaseMappedMemory(M3));
260 EXPECT_FALSE(Memory::releaseMappedMemory(M2));
261}
262
263TEST_P(MappedMemoryTest, DuplicateNear) {
264 error_code EC;
265 MemoryBlock Near((void*)(3*PageSize), 16);
266 MemoryBlock M1 = Memory::allocateMappedMemory(16, &Near, Flags, EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000267 EXPECT_EQ(error_code(), EC);
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000268 MemoryBlock M2 = Memory::allocateMappedMemory(64, &Near, Flags, EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000269 EXPECT_EQ(error_code(), EC);
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000270 MemoryBlock M3 = Memory::allocateMappedMemory(32, &Near, Flags, EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000271 EXPECT_EQ(error_code(), EC);
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000272
Craig Topper66f09ad2014-06-08 22:29:17 +0000273 EXPECT_NE((void*)nullptr, M1.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000274 EXPECT_LE(16U, M1.size());
Craig Topper66f09ad2014-06-08 22:29:17 +0000275 EXPECT_NE((void*)nullptr, M2.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000276 EXPECT_LE(64U, M2.size());
Craig Topper66f09ad2014-06-08 22:29:17 +0000277 EXPECT_NE((void*)nullptr, M3.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000278 EXPECT_LE(32U, M3.size());
279
280 EXPECT_FALSE(Memory::releaseMappedMemory(M1));
281 EXPECT_FALSE(Memory::releaseMappedMemory(M3));
282 EXPECT_FALSE(Memory::releaseMappedMemory(M2));
283}
284
285TEST_P(MappedMemoryTest, ZeroNear) {
286 error_code EC;
Craig Topper66f09ad2014-06-08 22:29:17 +0000287 MemoryBlock Near(nullptr, 0);
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000288 MemoryBlock M1 = Memory::allocateMappedMemory(16, &Near, Flags, EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000289 EXPECT_EQ(error_code(), EC);
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000290 MemoryBlock M2 = Memory::allocateMappedMemory(64, &Near, Flags, EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000291 EXPECT_EQ(error_code(), EC);
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000292 MemoryBlock M3 = Memory::allocateMappedMemory(32, &Near, Flags, EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000293 EXPECT_EQ(error_code(), EC);
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000294
Craig Topper66f09ad2014-06-08 22:29:17 +0000295 EXPECT_NE((void*)nullptr, M1.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000296 EXPECT_LE(16U, M1.size());
Craig Topper66f09ad2014-06-08 22:29:17 +0000297 EXPECT_NE((void*)nullptr, M2.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000298 EXPECT_LE(64U, M2.size());
Craig Topper66f09ad2014-06-08 22:29:17 +0000299 EXPECT_NE((void*)nullptr, M3.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000300 EXPECT_LE(32U, M3.size());
301
302 EXPECT_FALSE(doesOverlap(M1, M2));
303 EXPECT_FALSE(doesOverlap(M2, M3));
304 EXPECT_FALSE(doesOverlap(M1, M3));
305
306 EXPECT_FALSE(Memory::releaseMappedMemory(M1));
307 EXPECT_FALSE(Memory::releaseMappedMemory(M3));
308 EXPECT_FALSE(Memory::releaseMappedMemory(M2));
309}
310
311TEST_P(MappedMemoryTest, ZeroSizeNear) {
312 error_code EC;
313 MemoryBlock Near((void*)(4*PageSize), 0);
314 MemoryBlock M1 = Memory::allocateMappedMemory(16, &Near, Flags, EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000315 EXPECT_EQ(error_code(), EC);
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000316 MemoryBlock M2 = Memory::allocateMappedMemory(64, &Near, Flags, EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000317 EXPECT_EQ(error_code(), EC);
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000318 MemoryBlock M3 = Memory::allocateMappedMemory(32, &Near, Flags, EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000319 EXPECT_EQ(error_code(), EC);
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000320
Craig Topper66f09ad2014-06-08 22:29:17 +0000321 EXPECT_NE((void*)nullptr, M1.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000322 EXPECT_LE(16U, M1.size());
Craig Topper66f09ad2014-06-08 22:29:17 +0000323 EXPECT_NE((void*)nullptr, M2.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000324 EXPECT_LE(64U, M2.size());
Craig Topper66f09ad2014-06-08 22:29:17 +0000325 EXPECT_NE((void*)nullptr, M3.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000326 EXPECT_LE(32U, M3.size());
327
328 EXPECT_FALSE(doesOverlap(M1, M2));
329 EXPECT_FALSE(doesOverlap(M2, M3));
330 EXPECT_FALSE(doesOverlap(M1, M3));
331
332 EXPECT_FALSE(Memory::releaseMappedMemory(M1));
333 EXPECT_FALSE(Memory::releaseMappedMemory(M3));
334 EXPECT_FALSE(Memory::releaseMappedMemory(M2));
335}
336
337TEST_P(MappedMemoryTest, UnalignedNear) {
338 error_code EC;
339 MemoryBlock Near((void*)(2*PageSize+5), 0);
340 MemoryBlock M1 = Memory::allocateMappedMemory(15, &Near, Flags, EC);
Rafael Espindola03bddfe2014-05-31 01:37:45 +0000341 EXPECT_EQ(error_code(), EC);
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000342
Craig Topper66f09ad2014-06-08 22:29:17 +0000343 EXPECT_NE((void*)nullptr, M1.base());
Jakub Staszak0c4468b2012-11-14 20:18:34 +0000344 EXPECT_LE(sizeof(int), M1.size());
345
346 EXPECT_FALSE(Memory::releaseMappedMemory(M1));
347}
348
349// Note that Memory::MF_WRITE is not supported exclusively across
350// operating systems and architectures and can imply MF_READ|MF_WRITE
351unsigned MemoryFlags[] = {
352 Memory::MF_READ,
353 Memory::MF_WRITE,
354 Memory::MF_READ|Memory::MF_WRITE,
355 Memory::MF_EXEC,
356 Memory::MF_READ|Memory::MF_EXEC,
357 Memory::MF_READ|Memory::MF_WRITE|Memory::MF_EXEC
358 };
359
360INSTANTIATE_TEST_CASE_P(AllocationTests,
361 MappedMemoryTest,
362 ::testing::ValuesIn(MemoryFlags));
363
364} // anonymous namespace