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