1 #include "utils/UnitTest/Test.h"
2 #include <src/string/memory_utils/address.h>
3 
4 namespace __llvm_libc {
5 
6 TEST(LlvmLibcAddress, AliasAreAddresses) {
7   ASSERT_TRUE(IsAddressType<SrcAddr<1>>::Value);
8   ASSERT_TRUE(IsAddressType<DstAddr<1>>::Value);
9   ASSERT_TRUE(IsAddressType<NtSrcAddr<1>>::Value);
10   ASSERT_TRUE(IsAddressType<NtDstAddr<1>>::Value);
11 }
12 
13 TEST(LlvmLibcAddress, AliasHaveRightPermissions) {
14   ASSERT_TRUE(SrcAddr<1>::IS_READ);
15   ASSERT_TRUE(NtSrcAddr<1>::IS_READ);
16   ASSERT_TRUE(DstAddr<1>::IS_WRITE);
17   ASSERT_TRUE(NtDstAddr<1>::IS_WRITE);
18 }
19 
20 TEST(LlvmLibcAddress, AliasHaveRightSemantic) {
21   ASSERT_EQ(SrcAddr<1>::TEMPORALITY, Temporality::TEMPORAL);
22   ASSERT_EQ(DstAddr<1>::TEMPORALITY, Temporality::TEMPORAL);
23   ASSERT_EQ(NtSrcAddr<1>::TEMPORALITY, Temporality::NON_TEMPORAL);
24   ASSERT_EQ(NtDstAddr<1>::TEMPORALITY, Temporality::NON_TEMPORAL);
25 }
26 
27 TEST(LlvmLibcAddress, AliasHaveRightAlignment) {
28   ASSERT_EQ(SrcAddr<1>::ALIGNMENT, size_t(1));
29   ASSERT_EQ(SrcAddr<4>::ALIGNMENT, size_t(4));
30 }
31 
32 TEST(LlvmLibcAddress, NarrowAlignment) {
33   // Address 8-byte aligned, offset by 8.
34   ASSERT_EQ(offsetAddr<8>(SrcAddr<8>(nullptr)).ALIGNMENT, size_t(8));
35   // Address 16-byte aligned, offset by 4.
36   ASSERT_EQ(offsetAddr<4>(SrcAddr<16>(nullptr)).ALIGNMENT, size_t(4));
37   // Address 4-byte aligned, offset by 16.
38   ASSERT_EQ(offsetAddr<16>(SrcAddr<4>(nullptr)).ALIGNMENT, size_t(4));
39   // Address 4-byte aligned, offset by 1.
40   ASSERT_EQ(offsetAddr<1>(SrcAddr<4>(nullptr)).ALIGNMENT, size_t(1));
41   // Address 4-byte aligned, offset by 2.
42   ASSERT_EQ(offsetAddr<2>(SrcAddr<4>(nullptr)).ALIGNMENT, size_t(2));
43   // Address 4-byte aligned, offset by 6.
44   ASSERT_EQ(offsetAddr<6>(SrcAddr<4>(nullptr)).ALIGNMENT, size_t(2));
45   // Address 4-byte aligned, offset by 10.
46   ASSERT_EQ(offsetAddr<10>(SrcAddr<4>(nullptr)).ALIGNMENT, size_t(2));
47   // Address 8-byte aligned, offset by 6.
48   ASSERT_EQ(offsetAddr<6>(SrcAddr<8>(nullptr)).ALIGNMENT, size_t(2));
49 }
50 
51 TEST(LlvmLibcAddress, OffsetAddr) {
52   ubyte a;
53   SrcAddr<1> addr(&a);
54   ASSERT_EQ((const void *)offsetAddr<4>(addr).ptr(), (const void *)(&a + 4));
55   ASSERT_EQ((const void *)offsetAddr<32>(addr).ptr(), (const void *)(&a + 32));
56 }
57 
58 TEST(LlvmLibcAddress, AssumeAligned) {
59   SrcAddr<16> addr(nullptr);
60   ASSERT_EQ(offsetAddrAssumeAligned<8>(addr, 0).ALIGNMENT, size_t(8));
61   ASSERT_EQ(offsetAddrAssumeAligned<1>(addr, 0).ALIGNMENT, size_t(1));
62   ASSERT_EQ(offsetAddrMultiplesOf<4>(addr, 0).ALIGNMENT, size_t(4));
63   ASSERT_EQ(offsetAddrMultiplesOf<32>(addr, 0).ALIGNMENT, size_t(16));
64 }
65 
66 TEST(LlvmLibcAddress, offsetAddrAssumeAligned) {
67   ubyte a;
68   SrcAddr<1> addr(&a);
69   ASSERT_EQ((const void *)offsetAddrAssumeAligned<1>(addr, 17).ptr(),
70             (const void *)(&a + 17));
71 }
72 
73 TEST(LlvmLibcAddress, offsetAddrMultiplesOf) {
74   ubyte a;
75   SrcAddr<1> addr(&a);
76   ASSERT_EQ((const void *)offsetAddrMultiplesOf<4>(addr, 16).ptr(),
77             (const void *)(&a + 16));
78 }
79 
80 } // namespace __llvm_libc
81