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