xref: /openbsd-src/gnu/llvm/compiler-rt/lib/gwp_asan/tests/alignment.cpp (revision 810390e339a5425391477d5d41c78d7cab2424ac)
13cab2bb3Spatrick //===-- alignment.cpp -------------------------------------------*- C++ -*-===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick 
9d89ec533Spatrick #include "gwp_asan/guarded_pool_allocator.h"
103cab2bb3Spatrick #include "gwp_asan/tests/harness.h"
113cab2bb3Spatrick 
12d89ec533Spatrick class AlignmentTestGPA : public gwp_asan::GuardedPoolAllocator {
13d89ec533Spatrick public:
getRequiredBackingSize(size_t Size,size_t Alignment,size_t PageSize)14d89ec533Spatrick   static size_t getRequiredBackingSize(size_t Size, size_t Alignment,
15d89ec533Spatrick                                        size_t PageSize) {
16d89ec533Spatrick     return GuardedPoolAllocator::getRequiredBackingSize(Size, Alignment,
17d89ec533Spatrick                                                         PageSize);
18d89ec533Spatrick   }
alignUp(uintptr_t Ptr,size_t Alignment)19d89ec533Spatrick   static uintptr_t alignUp(uintptr_t Ptr, size_t Alignment) {
20d89ec533Spatrick     return GuardedPoolAllocator::alignUp(Ptr, Alignment);
21d89ec533Spatrick   }
alignDown(uintptr_t Ptr,size_t Alignment)22d89ec533Spatrick   static uintptr_t alignDown(uintptr_t Ptr, size_t Alignment) {
23d89ec533Spatrick     return GuardedPoolAllocator::alignDown(Ptr, Alignment);
24d89ec533Spatrick   }
253cab2bb3Spatrick };
263cab2bb3Spatrick 
27d89ec533Spatrick // Global assumptions for these tests:
28d89ec533Spatrick //   1. Page size is 0x1000.
29d89ec533Spatrick //   2. All tests assume a slot is multipage, between 0x4000 - 0x8000. While we
30d89ec533Spatrick //      don't use multipage slots right now, this tests more boundary conditions
31d89ec533Spatrick //      and allows us to add this feature at a later date without rewriting the
32d89ec533Spatrick //      alignment functionality.
33d89ec533Spatrick // These aren't actual requirements of the allocator - but just simplifies the
34d89ec533Spatrick // numerics of the testing.
TEST(AlignmentTest,LeftAlignedAllocs)35d89ec533Spatrick TEST(AlignmentTest, LeftAlignedAllocs) {
36d89ec533Spatrick   // Alignment < Page Size.
37*810390e3Srobert   EXPECT_EQ(0x4000u, AlignmentTestGPA::alignUp(
38d89ec533Spatrick                          /* Ptr */ 0x4000, /* Alignment */ 0x1));
39d89ec533Spatrick   // Alignment == Page Size.
40*810390e3Srobert   EXPECT_EQ(0x4000u, AlignmentTestGPA::alignUp(
41d89ec533Spatrick                          /* Ptr */ 0x4000, /* Alignment */ 0x1000));
42d89ec533Spatrick   // Alignment > Page Size.
43*810390e3Srobert   EXPECT_EQ(0x4000u, AlignmentTestGPA::alignUp(
44d89ec533Spatrick                          /* Ptr */ 0x4000, /* Alignment */ 0x4000));
451f9cb04fSpatrick }
463cab2bb3Spatrick 
TEST(AlignmentTest,SingleByteAllocs)47d89ec533Spatrick TEST(AlignmentTest, SingleByteAllocs) {
48d89ec533Spatrick   // Alignment < Page Size.
49*810390e3Srobert   EXPECT_EQ(0x1u,
50d89ec533Spatrick             AlignmentTestGPA::getRequiredBackingSize(
51d89ec533Spatrick                 /* Size */ 0x1, /* Alignment */ 0x1, /* PageSize */ 0x1000));
52*810390e3Srobert   EXPECT_EQ(0x7fffu, AlignmentTestGPA::alignDown(
53d89ec533Spatrick                          /* Ptr */ 0x8000 - 0x1, /* Alignment */ 0x1));
543cab2bb3Spatrick 
55d89ec533Spatrick   // Alignment == Page Size.
56*810390e3Srobert   EXPECT_EQ(0x1u,
57d89ec533Spatrick             AlignmentTestGPA::getRequiredBackingSize(
58d89ec533Spatrick                 /* Size */ 0x1, /* Alignment */ 0x1000, /* PageSize */ 0x1000));
59*810390e3Srobert   EXPECT_EQ(0x7000u, AlignmentTestGPA::alignDown(
60d89ec533Spatrick                          /* Ptr */ 0x8000 - 0x1, /* Alignment */ 0x1000));
61d89ec533Spatrick 
62d89ec533Spatrick   // Alignment > Page Size.
63*810390e3Srobert   EXPECT_EQ(0x3001u,
64d89ec533Spatrick             AlignmentTestGPA::getRequiredBackingSize(
65d89ec533Spatrick                 /* Size */ 0x1, /* Alignment */ 0x4000, /* PageSize */ 0x1000));
66*810390e3Srobert   EXPECT_EQ(0x4000u, AlignmentTestGPA::alignDown(
67d89ec533Spatrick                          /* Ptr */ 0x8000 - 0x1, /* Alignment */ 0x4000));
681f9cb04fSpatrick }
691f9cb04fSpatrick 
TEST(AlignmentTest,PageSizedAllocs)70d89ec533Spatrick TEST(AlignmentTest, PageSizedAllocs) {
71d89ec533Spatrick   // Alignment < Page Size.
72*810390e3Srobert   EXPECT_EQ(0x1000u,
73d89ec533Spatrick             AlignmentTestGPA::getRequiredBackingSize(
74d89ec533Spatrick                 /* Size */ 0x1000, /* Alignment */ 0x1, /* PageSize */ 0x1000));
75*810390e3Srobert   EXPECT_EQ(0x7000u, AlignmentTestGPA::alignDown(
76d89ec533Spatrick                          /* Ptr */ 0x8000 - 0x1000, /* Alignment */ 0x1));
77d89ec533Spatrick 
78d89ec533Spatrick   // Alignment == Page Size.
79*810390e3Srobert   EXPECT_EQ(0x1000u, AlignmentTestGPA::getRequiredBackingSize(
80d89ec533Spatrick                          /* Size */ 0x1000, /* Alignment */ 0x1000,
81d89ec533Spatrick                          /* PageSize */ 0x1000));
82*810390e3Srobert   EXPECT_EQ(0x7000u, AlignmentTestGPA::alignDown(
83d89ec533Spatrick                          /* Ptr */ 0x8000 - 0x1000, /* Alignment */ 0x1000));
84d89ec533Spatrick 
85d89ec533Spatrick   // Alignment > Page Size.
86*810390e3Srobert   EXPECT_EQ(0x4000u, AlignmentTestGPA::getRequiredBackingSize(
87d89ec533Spatrick                          /* Size */ 0x1000, /* Alignment */ 0x4000,
88d89ec533Spatrick                          /* PageSize */ 0x1000));
89*810390e3Srobert   EXPECT_EQ(0x4000u, AlignmentTestGPA::alignDown(
90d89ec533Spatrick                          /* Ptr */ 0x8000 - 0x1000, /* Alignment */ 0x4000));
913cab2bb3Spatrick }
92d89ec533Spatrick 
TEST(AlignmentTest,MoreThanPageAllocs)93d89ec533Spatrick TEST(AlignmentTest, MoreThanPageAllocs) {
94d89ec533Spatrick   // Alignment < Page Size.
95*810390e3Srobert   EXPECT_EQ(0x2fffu,
96d89ec533Spatrick             AlignmentTestGPA::getRequiredBackingSize(
97d89ec533Spatrick                 /* Size */ 0x2fff, /* Alignment */ 0x1, /* PageSize */ 0x1000));
98*810390e3Srobert   EXPECT_EQ(0x5001u, AlignmentTestGPA::alignDown(
99d89ec533Spatrick                          /* Ptr */ 0x8000 - 0x2fff, /* Alignment */ 0x1));
100d89ec533Spatrick 
101d89ec533Spatrick   // Alignment == Page Size.
102*810390e3Srobert   EXPECT_EQ(0x2fffu, AlignmentTestGPA::getRequiredBackingSize(
103d89ec533Spatrick                          /* Size */ 0x2fff, /* Alignment */ 0x1000,
104d89ec533Spatrick                          /* PageSize */ 0x1000));
105*810390e3Srobert   EXPECT_EQ(0x5000u, AlignmentTestGPA::alignDown(
106d89ec533Spatrick                          /* Ptr */ 0x8000 - 0x2fff, /* Alignment */ 0x1000));
107d89ec533Spatrick 
108d89ec533Spatrick   // Alignment > Page Size.
109*810390e3Srobert   EXPECT_EQ(0x5fffu, AlignmentTestGPA::getRequiredBackingSize(
110d89ec533Spatrick                          /* Size */ 0x2fff, /* Alignment */ 0x4000,
111d89ec533Spatrick                          /* PageSize */ 0x1000));
112*810390e3Srobert   EXPECT_EQ(0x4000u, AlignmentTestGPA::alignDown(
113d89ec533Spatrick                          /* Ptr */ 0x8000 - 0x2fff, /* Alignment */ 0x4000));
1143cab2bb3Spatrick }
115