14a1a113aSNico Weber //===-- basic.cpp -----------------------------------------------*- C++ -*-===//
2a95edb9dSMitch Phillips //
3a95edb9dSMitch Phillips // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4a95edb9dSMitch Phillips // See https://llvm.org/LICENSE.txt for license information.
5a95edb9dSMitch Phillips // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a95edb9dSMitch Phillips //
7a95edb9dSMitch Phillips //===----------------------------------------------------------------------===//
8a95edb9dSMitch Phillips
9a95edb9dSMitch Phillips #include "gwp_asan/tests/harness.h"
10a95edb9dSMitch Phillips
TEST_F(CustomGuardedPoolAllocator,BasicAllocation)11a95edb9dSMitch Phillips TEST_F(CustomGuardedPoolAllocator, BasicAllocation) {
12a95edb9dSMitch Phillips InitNumSlots(1);
13a95edb9dSMitch Phillips void *Ptr = GPA.allocate(1);
14a95edb9dSMitch Phillips EXPECT_NE(nullptr, Ptr);
15a95edb9dSMitch Phillips EXPECT_TRUE(GPA.pointerIsMine(Ptr));
16a95edb9dSMitch Phillips EXPECT_EQ(1u, GPA.getSize(Ptr));
17a95edb9dSMitch Phillips GPA.deallocate(Ptr);
18a95edb9dSMitch Phillips }
19a95edb9dSMitch Phillips
TEST_F(DefaultGuardedPoolAllocator,NullptrIsNotMine)20a95edb9dSMitch Phillips TEST_F(DefaultGuardedPoolAllocator, NullptrIsNotMine) {
21a95edb9dSMitch Phillips EXPECT_FALSE(GPA.pointerIsMine(nullptr));
22a95edb9dSMitch Phillips }
23a95edb9dSMitch Phillips
TEST_F(CustomGuardedPoolAllocator,SizedAllocations)24a95edb9dSMitch Phillips TEST_F(CustomGuardedPoolAllocator, SizedAllocations) {
25a95edb9dSMitch Phillips InitNumSlots(1);
26a95edb9dSMitch Phillips
27a6258684SMitch Phillips std::size_t MaxAllocSize = GPA.getAllocatorState()->maximumAllocationSize();
28a95edb9dSMitch Phillips EXPECT_TRUE(MaxAllocSize > 0);
29a95edb9dSMitch Phillips
30a95edb9dSMitch Phillips for (unsigned AllocSize = 1; AllocSize <= MaxAllocSize; AllocSize <<= 1) {
31a95edb9dSMitch Phillips void *Ptr = GPA.allocate(AllocSize);
32a95edb9dSMitch Phillips EXPECT_NE(nullptr, Ptr);
33a95edb9dSMitch Phillips EXPECT_TRUE(GPA.pointerIsMine(Ptr));
34a95edb9dSMitch Phillips EXPECT_EQ(AllocSize, GPA.getSize(Ptr));
35a95edb9dSMitch Phillips GPA.deallocate(Ptr);
36a95edb9dSMitch Phillips }
37a95edb9dSMitch Phillips }
38a95edb9dSMitch Phillips
TEST_F(DefaultGuardedPoolAllocator,TooLargeAllocation)39a95edb9dSMitch Phillips TEST_F(DefaultGuardedPoolAllocator, TooLargeAllocation) {
40a6258684SMitch Phillips EXPECT_EQ(nullptr,
41a6258684SMitch Phillips GPA.allocate(GPA.getAllocatorState()->maximumAllocationSize() + 1));
42*3d8823b8SMitch Phillips EXPECT_EQ(nullptr, GPA.allocate(SIZE_MAX, 0));
43*3d8823b8SMitch Phillips EXPECT_EQ(nullptr, GPA.allocate(SIZE_MAX, 1));
44*3d8823b8SMitch Phillips EXPECT_EQ(nullptr, GPA.allocate(0, SIZE_MAX / 2));
45*3d8823b8SMitch Phillips EXPECT_EQ(nullptr, GPA.allocate(1, SIZE_MAX / 2));
46*3d8823b8SMitch Phillips EXPECT_EQ(nullptr, GPA.allocate(SIZE_MAX, SIZE_MAX / 2));
47*3d8823b8SMitch Phillips }
48*3d8823b8SMitch Phillips
TEST_F(DefaultGuardedPoolAllocator,ZeroSizeAndAlignmentAllocations)49*3d8823b8SMitch Phillips TEST_F(DefaultGuardedPoolAllocator, ZeroSizeAndAlignmentAllocations) {
50*3d8823b8SMitch Phillips void *P;
51*3d8823b8SMitch Phillips EXPECT_NE(nullptr, (P = GPA.allocate(0, 0)));
52*3d8823b8SMitch Phillips GPA.deallocate(P);
53*3d8823b8SMitch Phillips EXPECT_NE(nullptr, (P = GPA.allocate(1, 0)));
54*3d8823b8SMitch Phillips GPA.deallocate(P);
55*3d8823b8SMitch Phillips EXPECT_NE(nullptr, (P = GPA.allocate(0, 1)));
56*3d8823b8SMitch Phillips GPA.deallocate(P);
57*3d8823b8SMitch Phillips }
58*3d8823b8SMitch Phillips
TEST_F(DefaultGuardedPoolAllocator,NonPowerOfTwoAlignment)59*3d8823b8SMitch Phillips TEST_F(DefaultGuardedPoolAllocator, NonPowerOfTwoAlignment) {
60*3d8823b8SMitch Phillips EXPECT_EQ(nullptr, GPA.allocate(0, 3));
61*3d8823b8SMitch Phillips EXPECT_EQ(nullptr, GPA.allocate(1, 3));
62*3d8823b8SMitch Phillips EXPECT_EQ(nullptr, GPA.allocate(0, SIZE_MAX));
63*3d8823b8SMitch Phillips EXPECT_EQ(nullptr, GPA.allocate(1, SIZE_MAX));
64*3d8823b8SMitch Phillips }
65*3d8823b8SMitch Phillips
66*3d8823b8SMitch Phillips // Added multi-page slots? You'll need to expand this test.
TEST_F(DefaultGuardedPoolAllocator,TooBigForSinglePageSlots)67*3d8823b8SMitch Phillips TEST_F(DefaultGuardedPoolAllocator, TooBigForSinglePageSlots) {
68*3d8823b8SMitch Phillips EXPECT_EQ(nullptr, GPA.allocate(0x1001, 0));
69*3d8823b8SMitch Phillips EXPECT_EQ(nullptr, GPA.allocate(0x1001, 1));
70*3d8823b8SMitch Phillips EXPECT_EQ(nullptr, GPA.allocate(0x1001, 0x1000));
71*3d8823b8SMitch Phillips EXPECT_EQ(nullptr, GPA.allocate(1, 0x2000));
72*3d8823b8SMitch Phillips EXPECT_EQ(nullptr, GPA.allocate(0, 0x2000));
73a95edb9dSMitch Phillips }
74a95edb9dSMitch Phillips
TEST_F(CustomGuardedPoolAllocator,AllocAllSlots)75a95edb9dSMitch Phillips TEST_F(CustomGuardedPoolAllocator, AllocAllSlots) {
76a95edb9dSMitch Phillips constexpr unsigned kNumSlots = 128;
77a95edb9dSMitch Phillips InitNumSlots(kNumSlots);
78a95edb9dSMitch Phillips void *Ptrs[kNumSlots];
79a95edb9dSMitch Phillips for (unsigned i = 0; i < kNumSlots; ++i) {
80a95edb9dSMitch Phillips Ptrs[i] = GPA.allocate(1);
81a95edb9dSMitch Phillips EXPECT_NE(nullptr, Ptrs[i]);
82a95edb9dSMitch Phillips EXPECT_TRUE(GPA.pointerIsMine(Ptrs[i]));
83a95edb9dSMitch Phillips }
84a95edb9dSMitch Phillips
85a95edb9dSMitch Phillips // This allocation should fail as all the slots are used.
86a95edb9dSMitch Phillips void *Ptr = GPA.allocate(1);
87a95edb9dSMitch Phillips EXPECT_EQ(nullptr, Ptr);
88a95edb9dSMitch Phillips EXPECT_FALSE(GPA.pointerIsMine(nullptr));
89a95edb9dSMitch Phillips
90a95edb9dSMitch Phillips for (unsigned i = 0; i < kNumSlots; ++i)
91a95edb9dSMitch Phillips GPA.deallocate(Ptrs[i]);
92a95edb9dSMitch Phillips }
93