xref: /aosp_15_r20/bionic/tests/bionic_allocator_test.cpp (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker /*
2*8d67ca89SAndroid Build Coastguard Worker  * Copyright (C) 2013 The Android Open Source Project
3*8d67ca89SAndroid Build Coastguard Worker  * All rights reserved.
4*8d67ca89SAndroid Build Coastguard Worker  *
5*8d67ca89SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
6*8d67ca89SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
7*8d67ca89SAndroid Build Coastguard Worker  * are met:
8*8d67ca89SAndroid Build Coastguard Worker  *  * Redistributions of source code must retain the above copyright
9*8d67ca89SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
10*8d67ca89SAndroid Build Coastguard Worker  *  * Redistributions in binary form must reproduce the above copyright
11*8d67ca89SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in
12*8d67ca89SAndroid Build Coastguard Worker  *    the documentation and/or other materials provided with the
13*8d67ca89SAndroid Build Coastguard Worker  *    distribution.
14*8d67ca89SAndroid Build Coastguard Worker  *
15*8d67ca89SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16*8d67ca89SAndroid Build Coastguard Worker  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17*8d67ca89SAndroid Build Coastguard Worker  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18*8d67ca89SAndroid Build Coastguard Worker  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19*8d67ca89SAndroid Build Coastguard Worker  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20*8d67ca89SAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21*8d67ca89SAndroid Build Coastguard Worker  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22*8d67ca89SAndroid Build Coastguard Worker  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23*8d67ca89SAndroid Build Coastguard Worker  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24*8d67ca89SAndroid Build Coastguard Worker  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25*8d67ca89SAndroid Build Coastguard Worker  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*8d67ca89SAndroid Build Coastguard Worker  * SUCH DAMAGE.
27*8d67ca89SAndroid Build Coastguard Worker  */
28*8d67ca89SAndroid Build Coastguard Worker 
29*8d67ca89SAndroid Build Coastguard Worker #include <stdlib.h>
30*8d67ca89SAndroid Build Coastguard Worker #include <string.h>
31*8d67ca89SAndroid Build Coastguard Worker #include <sys/mman.h>
32*8d67ca89SAndroid Build Coastguard Worker 
33*8d67ca89SAndroid Build Coastguard Worker #include <gtest/gtest.h>
34*8d67ca89SAndroid Build Coastguard Worker 
35*8d67ca89SAndroid Build Coastguard Worker #include "private/bionic_allocator.h"
36*8d67ca89SAndroid Build Coastguard Worker 
37*8d67ca89SAndroid Build Coastguard Worker #include <unistd.h>
38*8d67ca89SAndroid Build Coastguard Worker 
39*8d67ca89SAndroid Build Coastguard Worker namespace {
40*8d67ca89SAndroid Build Coastguard Worker 
41*8d67ca89SAndroid Build Coastguard Worker /*
42*8d67ca89SAndroid Build Coastguard Worker  * this one has size below allocator cap which is 2*sizeof(void*)
43*8d67ca89SAndroid Build Coastguard Worker  */
44*8d67ca89SAndroid Build Coastguard Worker struct test_struct_small {
45*8d67ca89SAndroid Build Coastguard Worker   char str[5];
46*8d67ca89SAndroid Build Coastguard Worker };
47*8d67ca89SAndroid Build Coastguard Worker 
48*8d67ca89SAndroid Build Coastguard Worker struct test_struct_large {
49*8d67ca89SAndroid Build Coastguard Worker   char str[1009];
50*8d67ca89SAndroid Build Coastguard Worker };
51*8d67ca89SAndroid Build Coastguard Worker 
52*8d67ca89SAndroid Build Coastguard Worker struct test_struct_huge {
53*8d67ca89SAndroid Build Coastguard Worker   char str[73939];
54*8d67ca89SAndroid Build Coastguard Worker };
55*8d67ca89SAndroid Build Coastguard Worker 
56*8d67ca89SAndroid Build Coastguard Worker struct test_struct_512 {
57*8d67ca89SAndroid Build Coastguard Worker   char str[503];
58*8d67ca89SAndroid Build Coastguard Worker };
59*8d67ca89SAndroid Build Coastguard Worker 
60*8d67ca89SAndroid Build Coastguard Worker };
61*8d67ca89SAndroid Build Coastguard Worker 
62*8d67ca89SAndroid Build Coastguard Worker static size_t kPageSize = sysconf(_SC_PAGE_SIZE);
63*8d67ca89SAndroid Build Coastguard Worker 
TEST(bionic_allocator,test_alloc_0)64*8d67ca89SAndroid Build Coastguard Worker TEST(bionic_allocator, test_alloc_0) {
65*8d67ca89SAndroid Build Coastguard Worker   BionicAllocator allocator;
66*8d67ca89SAndroid Build Coastguard Worker   void* ptr = allocator.alloc(0);
67*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(ptr != nullptr);
68*8d67ca89SAndroid Build Coastguard Worker   allocator.free(ptr);
69*8d67ca89SAndroid Build Coastguard Worker }
70*8d67ca89SAndroid Build Coastguard Worker 
TEST(bionic_allocator,test_free_nullptr)71*8d67ca89SAndroid Build Coastguard Worker TEST(bionic_allocator, test_free_nullptr) {
72*8d67ca89SAndroid Build Coastguard Worker   BionicAllocator allocator;
73*8d67ca89SAndroid Build Coastguard Worker   allocator.free(nullptr);
74*8d67ca89SAndroid Build Coastguard Worker }
75*8d67ca89SAndroid Build Coastguard Worker 
TEST(bionic_allocator,test_realloc)76*8d67ca89SAndroid Build Coastguard Worker TEST(bionic_allocator, test_realloc) {
77*8d67ca89SAndroid Build Coastguard Worker   BionicAllocator allocator;
78*8d67ca89SAndroid Build Coastguard Worker   uint32_t* array = reinterpret_cast<uint32_t*>(allocator.alloc(512));
79*8d67ca89SAndroid Build Coastguard Worker   const size_t array_size = 512 / sizeof(uint32_t);
80*8d67ca89SAndroid Build Coastguard Worker 
81*8d67ca89SAndroid Build Coastguard Worker   uint32_t model[1000];
82*8d67ca89SAndroid Build Coastguard Worker 
83*8d67ca89SAndroid Build Coastguard Worker   model[0] = 1;
84*8d67ca89SAndroid Build Coastguard Worker   model[1] = 1;
85*8d67ca89SAndroid Build Coastguard Worker 
86*8d67ca89SAndroid Build Coastguard Worker   for (size_t i = 2; i < 1000; ++i) {
87*8d67ca89SAndroid Build Coastguard Worker     model[i] = model[i - 1] + model[i - 2];
88*8d67ca89SAndroid Build Coastguard Worker   }
89*8d67ca89SAndroid Build Coastguard Worker 
90*8d67ca89SAndroid Build Coastguard Worker   memcpy(array, model, array_size);
91*8d67ca89SAndroid Build Coastguard Worker 
92*8d67ca89SAndroid Build Coastguard Worker   uint32_t* reallocated_ptr = reinterpret_cast<uint32_t*>(allocator.realloc(array, 1024));
93*8d67ca89SAndroid Build Coastguard Worker 
94*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(reallocated_ptr != nullptr);
95*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(reallocated_ptr != array);
96*8d67ca89SAndroid Build Coastguard Worker 
97*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(memcmp(reallocated_ptr, model, array_size) == 0);
98*8d67ca89SAndroid Build Coastguard Worker 
99*8d67ca89SAndroid Build Coastguard Worker   array = reallocated_ptr;
100*8d67ca89SAndroid Build Coastguard Worker 
101*8d67ca89SAndroid Build Coastguard Worker   memcpy(array, model, 2*array_size);
102*8d67ca89SAndroid Build Coastguard Worker 
103*8d67ca89SAndroid Build Coastguard Worker   reallocated_ptr = reinterpret_cast<uint32_t*>(allocator.realloc(array, 62));
104*8d67ca89SAndroid Build Coastguard Worker 
105*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(reallocated_ptr == array);
106*8d67ca89SAndroid Build Coastguard Worker 
107*8d67ca89SAndroid Build Coastguard Worker   reallocated_ptr = reinterpret_cast<uint32_t*>(allocator.realloc(array, 4000));
108*8d67ca89SAndroid Build Coastguard Worker 
109*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(reallocated_ptr != nullptr);
110*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(reallocated_ptr != array);
111*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(reallocated_ptr) % 16);
112*8d67ca89SAndroid Build Coastguard Worker 
113*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(memcmp(reallocated_ptr, model, array_size * 2) == 0);
114*8d67ca89SAndroid Build Coastguard Worker 
115*8d67ca89SAndroid Build Coastguard Worker   array = reallocated_ptr;
116*8d67ca89SAndroid Build Coastguard Worker 
117*8d67ca89SAndroid Build Coastguard Worker   memcpy(array, model, 4000);
118*8d67ca89SAndroid Build Coastguard Worker 
119*8d67ca89SAndroid Build Coastguard Worker   reallocated_ptr = reinterpret_cast<uint32_t*>(allocator.realloc(array, 64000));
120*8d67ca89SAndroid Build Coastguard Worker 
121*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(reallocated_ptr != nullptr);
122*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(reallocated_ptr != array);
123*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(reallocated_ptr) % 16);
124*8d67ca89SAndroid Build Coastguard Worker 
125*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(memcmp(reallocated_ptr, model, 4000) == 0);
126*8d67ca89SAndroid Build Coastguard Worker 
127*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, allocator.realloc(reallocated_ptr, 0));
128*8d67ca89SAndroid Build Coastguard Worker }
129*8d67ca89SAndroid Build Coastguard Worker 
TEST(bionic_allocator,test_small_smoke)130*8d67ca89SAndroid Build Coastguard Worker TEST(bionic_allocator, test_small_smoke) {
131*8d67ca89SAndroid Build Coastguard Worker   BionicAllocator allocator;
132*8d67ca89SAndroid Build Coastguard Worker 
133*8d67ca89SAndroid Build Coastguard Worker   uint8_t zeros[16];
134*8d67ca89SAndroid Build Coastguard Worker   memset(zeros, 0, sizeof(zeros));
135*8d67ca89SAndroid Build Coastguard Worker 
136*8d67ca89SAndroid Build Coastguard Worker   test_struct_small* ptr1 =
137*8d67ca89SAndroid Build Coastguard Worker       reinterpret_cast<test_struct_small*>(allocator.alloc(sizeof(test_struct_small)));
138*8d67ca89SAndroid Build Coastguard Worker   test_struct_small* ptr2 =
139*8d67ca89SAndroid Build Coastguard Worker       reinterpret_cast<test_struct_small*>(allocator.alloc(sizeof(test_struct_small)));
140*8d67ca89SAndroid Build Coastguard Worker 
141*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(ptr1 != nullptr);
142*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr1) % 16);
143*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(ptr2 != nullptr);
144*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr2) % 16);
145*8d67ca89SAndroid Build Coastguard Worker 
146*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(reinterpret_cast<uintptr_t>(ptr1)+16, reinterpret_cast<uintptr_t>(ptr2));
147*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(memcmp(ptr1, zeros, 16) == 0);
148*8d67ca89SAndroid Build Coastguard Worker 
149*8d67ca89SAndroid Build Coastguard Worker   allocator.free(ptr1);
150*8d67ca89SAndroid Build Coastguard Worker   allocator.free(ptr2);
151*8d67ca89SAndroid Build Coastguard Worker }
152*8d67ca89SAndroid Build Coastguard Worker 
TEST(bionic_allocator,test_huge_smoke)153*8d67ca89SAndroid Build Coastguard Worker TEST(bionic_allocator, test_huge_smoke) {
154*8d67ca89SAndroid Build Coastguard Worker   BionicAllocator allocator;
155*8d67ca89SAndroid Build Coastguard Worker 
156*8d67ca89SAndroid Build Coastguard Worker   // this should trigger proxy-to-mmap
157*8d67ca89SAndroid Build Coastguard Worker   test_struct_huge* ptr1 =
158*8d67ca89SAndroid Build Coastguard Worker       reinterpret_cast<test_struct_huge*>(allocator.alloc(sizeof(test_struct_huge)));
159*8d67ca89SAndroid Build Coastguard Worker   test_struct_huge* ptr2 =
160*8d67ca89SAndroid Build Coastguard Worker       reinterpret_cast<test_struct_huge*>(allocator.alloc(sizeof(test_struct_huge)));
161*8d67ca89SAndroid Build Coastguard Worker 
162*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(ptr1 != nullptr);
163*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr1) % 16);
164*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(ptr2 != nullptr);
165*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr2) % 16);
166*8d67ca89SAndroid Build Coastguard Worker 
167*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(
168*8d67ca89SAndroid Build Coastguard Worker       reinterpret_cast<uintptr_t>(ptr1)/kPageSize != reinterpret_cast<uintptr_t>(ptr2)/kPageSize);
169*8d67ca89SAndroid Build Coastguard Worker   allocator.free(ptr2);
170*8d67ca89SAndroid Build Coastguard Worker   allocator.free(ptr1);
171*8d67ca89SAndroid Build Coastguard Worker }
172*8d67ca89SAndroid Build Coastguard Worker 
TEST(bionic_allocator,test_large)173*8d67ca89SAndroid Build Coastguard Worker TEST(bionic_allocator, test_large) {
174*8d67ca89SAndroid Build Coastguard Worker   BionicAllocator allocator;
175*8d67ca89SAndroid Build Coastguard Worker 
176*8d67ca89SAndroid Build Coastguard Worker   test_struct_large* ptr1 =
177*8d67ca89SAndroid Build Coastguard Worker       reinterpret_cast<test_struct_large*>(allocator.alloc(sizeof(test_struct_large)));
178*8d67ca89SAndroid Build Coastguard Worker   test_struct_large* ptr2 =
179*8d67ca89SAndroid Build Coastguard Worker       reinterpret_cast<test_struct_large*>(allocator.alloc(1024));
180*8d67ca89SAndroid Build Coastguard Worker 
181*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(ptr1 != nullptr);
182*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr1) % 16);
183*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(ptr2 != nullptr);
184*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr2) % 16);
185*8d67ca89SAndroid Build Coastguard Worker 
186*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(reinterpret_cast<uintptr_t>(ptr1) + 1024, reinterpret_cast<uintptr_t>(ptr2));
187*8d67ca89SAndroid Build Coastguard Worker 
188*8d67ca89SAndroid Build Coastguard Worker   // let's allocate until we reach the next page.
189*8d67ca89SAndroid Build Coastguard Worker   size_t n = kPageSize / sizeof(test_struct_large) + 1 - 2;
190*8d67ca89SAndroid Build Coastguard Worker   test_struct_large* objects[n];
191*8d67ca89SAndroid Build Coastguard Worker 
192*8d67ca89SAndroid Build Coastguard Worker   for (size_t i = 0; i < n; ++i) {
193*8d67ca89SAndroid Build Coastguard Worker     test_struct_large* obj_ptr =
194*8d67ca89SAndroid Build Coastguard Worker         reinterpret_cast<test_struct_large*>(allocator.alloc(sizeof(test_struct_large)));
195*8d67ca89SAndroid Build Coastguard Worker     ASSERT_TRUE(obj_ptr != nullptr);
196*8d67ca89SAndroid Build Coastguard Worker     objects[i] = obj_ptr;
197*8d67ca89SAndroid Build Coastguard Worker   }
198*8d67ca89SAndroid Build Coastguard Worker 
199*8d67ca89SAndroid Build Coastguard Worker   test_struct_large* ptr_to_free =
200*8d67ca89SAndroid Build Coastguard Worker       reinterpret_cast<test_struct_large*>(allocator.alloc(sizeof(test_struct_large)));
201*8d67ca89SAndroid Build Coastguard Worker 
202*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(ptr_to_free != nullptr);
203*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr_to_free) % 16);
204*8d67ca89SAndroid Build Coastguard Worker 
205*8d67ca89SAndroid Build Coastguard Worker   allocator.free(ptr1);
206*8d67ca89SAndroid Build Coastguard Worker 
207*8d67ca89SAndroid Build Coastguard Worker   for (size_t i=0; i<n; ++i) {
208*8d67ca89SAndroid Build Coastguard Worker     allocator.free(objects[i]);
209*8d67ca89SAndroid Build Coastguard Worker   }
210*8d67ca89SAndroid Build Coastguard Worker 
211*8d67ca89SAndroid Build Coastguard Worker   allocator.free(ptr2);
212*8d67ca89SAndroid Build Coastguard Worker   allocator.free(ptr_to_free);
213*8d67ca89SAndroid Build Coastguard Worker }
214*8d67ca89SAndroid Build Coastguard Worker 
TEST(bionic_allocator,test_memalign_small)215*8d67ca89SAndroid Build Coastguard Worker TEST(bionic_allocator, test_memalign_small) {
216*8d67ca89SAndroid Build Coastguard Worker   BionicAllocator allocator;
217*8d67ca89SAndroid Build Coastguard Worker   void* ptr;
218*8d67ca89SAndroid Build Coastguard Worker 
219*8d67ca89SAndroid Build Coastguard Worker   // simple case
220*8d67ca89SAndroid Build Coastguard Worker   ptr = allocator.memalign(0x100, 0x100);
221*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(ptr != nullptr);
222*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr) % 0x100);
223*8d67ca89SAndroid Build Coastguard Worker   allocator.free(ptr);
224*8d67ca89SAndroid Build Coastguard Worker 
225*8d67ca89SAndroid Build Coastguard Worker   // small objects are automatically aligned to their size.
226*8d67ca89SAndroid Build Coastguard Worker   ptr = allocator.alloc(0x200);
227*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(ptr != nullptr);
228*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr) % 0x200);
229*8d67ca89SAndroid Build Coastguard Worker   allocator.free(ptr);
230*8d67ca89SAndroid Build Coastguard Worker 
231*8d67ca89SAndroid Build Coastguard Worker   // the size (0x10) is bumped up to the alignment (0x100)
232*8d67ca89SAndroid Build Coastguard Worker   ptr = allocator.memalign(0x100, 0x10);
233*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(ptr != nullptr);
234*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr) % 0x100);
235*8d67ca89SAndroid Build Coastguard Worker   allocator.free(ptr);
236*8d67ca89SAndroid Build Coastguard Worker }
237*8d67ca89SAndroid Build Coastguard Worker 
TEST(bionic_allocator,test_memalign_large)238*8d67ca89SAndroid Build Coastguard Worker TEST(bionic_allocator, test_memalign_large) {
239*8d67ca89SAndroid Build Coastguard Worker   BionicAllocator allocator;
240*8d67ca89SAndroid Build Coastguard Worker   void* ptr;
241*8d67ca89SAndroid Build Coastguard Worker   size_t alignment;
242*8d67ca89SAndroid Build Coastguard Worker 
243*8d67ca89SAndroid Build Coastguard Worker   // a large object with alignment < kPageSize
244*8d67ca89SAndroid Build Coastguard Worker   alignment = kPageSize >> 1;
245*8d67ca89SAndroid Build Coastguard Worker   ptr = allocator.memalign(alignment, 0x2000);
246*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(ptr != nullptr);
247*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr) % alignment);
248*8d67ca89SAndroid Build Coastguard Worker   allocator.free(ptr);
249*8d67ca89SAndroid Build Coastguard Worker 
250*8d67ca89SAndroid Build Coastguard Worker   // a large object with alignment == kPageSize
251*8d67ca89SAndroid Build Coastguard Worker   alignment = kPageSize;
252*8d67ca89SAndroid Build Coastguard Worker   ptr = allocator.memalign(alignment, 0x2000);
253*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(ptr != nullptr);
254*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr) % alignment);
255*8d67ca89SAndroid Build Coastguard Worker   allocator.free(ptr);
256*8d67ca89SAndroid Build Coastguard Worker 
257*8d67ca89SAndroid Build Coastguard Worker   // A large object with alignment > kPageSize is only guaranteed to have page
258*8d67ca89SAndroid Build Coastguard Worker   // alignment.
259*8d67ca89SAndroid Build Coastguard Worker   alignment = kPageSize << 1;
260*8d67ca89SAndroid Build Coastguard Worker   ptr = allocator.memalign(alignment, 0x4000);
261*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(ptr != nullptr);
262*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr) % kPageSize);
263*8d67ca89SAndroid Build Coastguard Worker   allocator.free(ptr);
264*8d67ca89SAndroid Build Coastguard Worker }
265