14a1a113aSNico Weber //===-- alignment.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
93d8823b8SMitch Phillips #include "gwp_asan/guarded_pool_allocator.h"
10a95edb9dSMitch Phillips #include "gwp_asan/tests/harness.h"
11a95edb9dSMitch Phillips
123d8823b8SMitch Phillips class AlignmentTestGPA : public gwp_asan::GuardedPoolAllocator {
133d8823b8SMitch Phillips public:
getRequiredBackingSize(size_t Size,size_t Alignment,size_t PageSize)143d8823b8SMitch Phillips static size_t getRequiredBackingSize(size_t Size, size_t Alignment,
153d8823b8SMitch Phillips size_t PageSize) {
163d8823b8SMitch Phillips return GuardedPoolAllocator::getRequiredBackingSize(Size, Alignment,
173d8823b8SMitch Phillips PageSize);
183d8823b8SMitch Phillips }
alignUp(uintptr_t Ptr,size_t Alignment)193d8823b8SMitch Phillips static uintptr_t alignUp(uintptr_t Ptr, size_t Alignment) {
203d8823b8SMitch Phillips return GuardedPoolAllocator::alignUp(Ptr, Alignment);
213d8823b8SMitch Phillips }
alignDown(uintptr_t Ptr,size_t Alignment)223d8823b8SMitch Phillips static uintptr_t alignDown(uintptr_t Ptr, size_t Alignment) {
233d8823b8SMitch Phillips return GuardedPoolAllocator::alignDown(Ptr, Alignment);
243d8823b8SMitch Phillips }
25a95edb9dSMitch Phillips };
26a95edb9dSMitch Phillips
273d8823b8SMitch Phillips // Global assumptions for these tests:
283d8823b8SMitch Phillips // 1. Page size is 0x1000.
293d8823b8SMitch Phillips // 2. All tests assume a slot is multipage, between 0x4000 - 0x8000. While we
303d8823b8SMitch Phillips // don't use multipage slots right now, this tests more boundary conditions
313d8823b8SMitch Phillips // and allows us to add this feature at a later date without rewriting the
323d8823b8SMitch Phillips // alignment functionality.
333d8823b8SMitch Phillips // These aren't actual requirements of the allocator - but just simplifies the
343d8823b8SMitch Phillips // numerics of the testing.
TEST(AlignmentTest,LeftAlignedAllocs)353d8823b8SMitch Phillips TEST(AlignmentTest, LeftAlignedAllocs) {
363d8823b8SMitch Phillips // Alignment < Page Size.
37*6176fda3SDavid Blaikie EXPECT_EQ(0x4000u, AlignmentTestGPA::alignUp(
383d8823b8SMitch Phillips /* Ptr */ 0x4000, /* Alignment */ 0x1));
393d8823b8SMitch Phillips // Alignment == Page Size.
40*6176fda3SDavid Blaikie EXPECT_EQ(0x4000u, AlignmentTestGPA::alignUp(
413d8823b8SMitch Phillips /* Ptr */ 0x4000, /* Alignment */ 0x1000));
423d8823b8SMitch Phillips // Alignment > Page Size.
43*6176fda3SDavid Blaikie EXPECT_EQ(0x4000u, AlignmentTestGPA::alignUp(
443d8823b8SMitch Phillips /* Ptr */ 0x4000, /* Alignment */ 0x4000));
455f2a74c8SMitch Phillips }
46a95edb9dSMitch Phillips
TEST(AlignmentTest,SingleByteAllocs)473d8823b8SMitch Phillips TEST(AlignmentTest, SingleByteAllocs) {
483d8823b8SMitch Phillips // Alignment < Page Size.
49*6176fda3SDavid Blaikie EXPECT_EQ(0x1u,
503d8823b8SMitch Phillips AlignmentTestGPA::getRequiredBackingSize(
513d8823b8SMitch Phillips /* Size */ 0x1, /* Alignment */ 0x1, /* PageSize */ 0x1000));
52*6176fda3SDavid Blaikie EXPECT_EQ(0x7fffu, AlignmentTestGPA::alignDown(
533d8823b8SMitch Phillips /* Ptr */ 0x8000 - 0x1, /* Alignment */ 0x1));
54a95edb9dSMitch Phillips
553d8823b8SMitch Phillips // Alignment == Page Size.
56*6176fda3SDavid Blaikie EXPECT_EQ(0x1u,
573d8823b8SMitch Phillips AlignmentTestGPA::getRequiredBackingSize(
583d8823b8SMitch Phillips /* Size */ 0x1, /* Alignment */ 0x1000, /* PageSize */ 0x1000));
59*6176fda3SDavid Blaikie EXPECT_EQ(0x7000u, AlignmentTestGPA::alignDown(
603d8823b8SMitch Phillips /* Ptr */ 0x8000 - 0x1, /* Alignment */ 0x1000));
613d8823b8SMitch Phillips
623d8823b8SMitch Phillips // Alignment > Page Size.
63*6176fda3SDavid Blaikie EXPECT_EQ(0x3001u,
643d8823b8SMitch Phillips AlignmentTestGPA::getRequiredBackingSize(
653d8823b8SMitch Phillips /* Size */ 0x1, /* Alignment */ 0x4000, /* PageSize */ 0x1000));
66*6176fda3SDavid Blaikie EXPECT_EQ(0x4000u, AlignmentTestGPA::alignDown(
673d8823b8SMitch Phillips /* Ptr */ 0x8000 - 0x1, /* Alignment */ 0x4000));
685f2a74c8SMitch Phillips }
695f2a74c8SMitch Phillips
TEST(AlignmentTest,PageSizedAllocs)703d8823b8SMitch Phillips TEST(AlignmentTest, PageSizedAllocs) {
713d8823b8SMitch Phillips // Alignment < Page Size.
72*6176fda3SDavid Blaikie EXPECT_EQ(0x1000u,
733d8823b8SMitch Phillips AlignmentTestGPA::getRequiredBackingSize(
743d8823b8SMitch Phillips /* Size */ 0x1000, /* Alignment */ 0x1, /* PageSize */ 0x1000));
75*6176fda3SDavid Blaikie EXPECT_EQ(0x7000u, AlignmentTestGPA::alignDown(
763d8823b8SMitch Phillips /* Ptr */ 0x8000 - 0x1000, /* Alignment */ 0x1));
773d8823b8SMitch Phillips
783d8823b8SMitch Phillips // Alignment == Page Size.
79*6176fda3SDavid Blaikie EXPECT_EQ(0x1000u, AlignmentTestGPA::getRequiredBackingSize(
803d8823b8SMitch Phillips /* Size */ 0x1000, /* Alignment */ 0x1000,
813d8823b8SMitch Phillips /* PageSize */ 0x1000));
82*6176fda3SDavid Blaikie EXPECT_EQ(0x7000u, AlignmentTestGPA::alignDown(
833d8823b8SMitch Phillips /* Ptr */ 0x8000 - 0x1000, /* Alignment */ 0x1000));
843d8823b8SMitch Phillips
853d8823b8SMitch Phillips // Alignment > Page Size.
86*6176fda3SDavid Blaikie EXPECT_EQ(0x4000u, AlignmentTestGPA::getRequiredBackingSize(
873d8823b8SMitch Phillips /* Size */ 0x1000, /* Alignment */ 0x4000,
883d8823b8SMitch Phillips /* PageSize */ 0x1000));
89*6176fda3SDavid Blaikie EXPECT_EQ(0x4000u, AlignmentTestGPA::alignDown(
903d8823b8SMitch Phillips /* Ptr */ 0x8000 - 0x1000, /* Alignment */ 0x4000));
91a95edb9dSMitch Phillips }
923d8823b8SMitch Phillips
TEST(AlignmentTest,MoreThanPageAllocs)933d8823b8SMitch Phillips TEST(AlignmentTest, MoreThanPageAllocs) {
943d8823b8SMitch Phillips // Alignment < Page Size.
95*6176fda3SDavid Blaikie EXPECT_EQ(0x2fffu,
963d8823b8SMitch Phillips AlignmentTestGPA::getRequiredBackingSize(
973d8823b8SMitch Phillips /* Size */ 0x2fff, /* Alignment */ 0x1, /* PageSize */ 0x1000));
98*6176fda3SDavid Blaikie EXPECT_EQ(0x5001u, AlignmentTestGPA::alignDown(
993d8823b8SMitch Phillips /* Ptr */ 0x8000 - 0x2fff, /* Alignment */ 0x1));
1003d8823b8SMitch Phillips
1013d8823b8SMitch Phillips // Alignment == Page Size.
102*6176fda3SDavid Blaikie EXPECT_EQ(0x2fffu, AlignmentTestGPA::getRequiredBackingSize(
1033d8823b8SMitch Phillips /* Size */ 0x2fff, /* Alignment */ 0x1000,
1043d8823b8SMitch Phillips /* PageSize */ 0x1000));
105*6176fda3SDavid Blaikie EXPECT_EQ(0x5000u, AlignmentTestGPA::alignDown(
1063d8823b8SMitch Phillips /* Ptr */ 0x8000 - 0x2fff, /* Alignment */ 0x1000));
1073d8823b8SMitch Phillips
1083d8823b8SMitch Phillips // Alignment > Page Size.
109*6176fda3SDavid Blaikie EXPECT_EQ(0x5fffu, AlignmentTestGPA::getRequiredBackingSize(
1103d8823b8SMitch Phillips /* Size */ 0x2fff, /* Alignment */ 0x4000,
1113d8823b8SMitch Phillips /* PageSize */ 0x1000));
112*6176fda3SDavid Blaikie EXPECT_EQ(0x4000u, AlignmentTestGPA::alignDown(
1133d8823b8SMitch Phillips /* Ptr */ 0x8000 - 0x2fff, /* Alignment */ 0x4000));
114a95edb9dSMitch Phillips }
115