14cbfd2e7SGuillaume Chatelet #include "utils/UnitTest/Test.h"
24cbfd2e7SGuillaume Chatelet #include <src/string/memory_utils/address.h>
34cbfd2e7SGuillaume Chatelet
44cbfd2e7SGuillaume Chatelet namespace __llvm_libc {
54cbfd2e7SGuillaume Chatelet
TEST(LlvmLibcAddress,AliasAreAddresses)64cbfd2e7SGuillaume Chatelet TEST(LlvmLibcAddress, AliasAreAddresses) {
74cbfd2e7SGuillaume Chatelet ASSERT_TRUE(IsAddressType<SrcAddr<1>>::Value);
84cbfd2e7SGuillaume Chatelet ASSERT_TRUE(IsAddressType<DstAddr<1>>::Value);
94cbfd2e7SGuillaume Chatelet ASSERT_TRUE(IsAddressType<NtSrcAddr<1>>::Value);
104cbfd2e7SGuillaume Chatelet ASSERT_TRUE(IsAddressType<NtDstAddr<1>>::Value);
114cbfd2e7SGuillaume Chatelet }
124cbfd2e7SGuillaume Chatelet
TEST(LlvmLibcAddress,AliasHaveRightPermissions)134cbfd2e7SGuillaume Chatelet TEST(LlvmLibcAddress, AliasHaveRightPermissions) {
144cbfd2e7SGuillaume Chatelet ASSERT_TRUE(SrcAddr<1>::IS_READ);
154cbfd2e7SGuillaume Chatelet ASSERT_TRUE(NtSrcAddr<1>::IS_READ);
164cbfd2e7SGuillaume Chatelet ASSERT_TRUE(DstAddr<1>::IS_WRITE);
174cbfd2e7SGuillaume Chatelet ASSERT_TRUE(NtDstAddr<1>::IS_WRITE);
184cbfd2e7SGuillaume Chatelet }
194cbfd2e7SGuillaume Chatelet
TEST(LlvmLibcAddress,AliasHaveRightSemantic)204cbfd2e7SGuillaume Chatelet TEST(LlvmLibcAddress, AliasHaveRightSemantic) {
214cbfd2e7SGuillaume Chatelet ASSERT_EQ(SrcAddr<1>::TEMPORALITY, Temporality::TEMPORAL);
224cbfd2e7SGuillaume Chatelet ASSERT_EQ(DstAddr<1>::TEMPORALITY, Temporality::TEMPORAL);
234cbfd2e7SGuillaume Chatelet ASSERT_EQ(NtSrcAddr<1>::TEMPORALITY, Temporality::NON_TEMPORAL);
244cbfd2e7SGuillaume Chatelet ASSERT_EQ(NtDstAddr<1>::TEMPORALITY, Temporality::NON_TEMPORAL);
254cbfd2e7SGuillaume Chatelet }
264cbfd2e7SGuillaume Chatelet
TEST(LlvmLibcAddress,AliasHaveRightAlignment)274cbfd2e7SGuillaume Chatelet TEST(LlvmLibcAddress, AliasHaveRightAlignment) {
284cbfd2e7SGuillaume Chatelet ASSERT_EQ(SrcAddr<1>::ALIGNMENT, size_t(1));
294cbfd2e7SGuillaume Chatelet ASSERT_EQ(SrcAddr<4>::ALIGNMENT, size_t(4));
304cbfd2e7SGuillaume Chatelet }
314cbfd2e7SGuillaume Chatelet
TEST(LlvmLibcAddress,NarrowAlignment)324cbfd2e7SGuillaume Chatelet TEST(LlvmLibcAddress, NarrowAlignment) {
334cbfd2e7SGuillaume Chatelet // Address 8-byte aligned, offset by 8.
34*1e6c819dSMichael Jones ASSERT_EQ(offsetAddr<8>(SrcAddr<8>(nullptr)).ALIGNMENT, size_t(8));
354cbfd2e7SGuillaume Chatelet // Address 16-byte aligned, offset by 4.
36*1e6c819dSMichael Jones ASSERT_EQ(offsetAddr<4>(SrcAddr<16>(nullptr)).ALIGNMENT, size_t(4));
374cbfd2e7SGuillaume Chatelet // Address 4-byte aligned, offset by 16.
38*1e6c819dSMichael Jones ASSERT_EQ(offsetAddr<16>(SrcAddr<4>(nullptr)).ALIGNMENT, size_t(4));
394cbfd2e7SGuillaume Chatelet // Address 4-byte aligned, offset by 1.
40*1e6c819dSMichael Jones ASSERT_EQ(offsetAddr<1>(SrcAddr<4>(nullptr)).ALIGNMENT, size_t(1));
414cbfd2e7SGuillaume Chatelet // Address 4-byte aligned, offset by 2.
42*1e6c819dSMichael Jones ASSERT_EQ(offsetAddr<2>(SrcAddr<4>(nullptr)).ALIGNMENT, size_t(2));
434cbfd2e7SGuillaume Chatelet // Address 4-byte aligned, offset by 6.
44*1e6c819dSMichael Jones ASSERT_EQ(offsetAddr<6>(SrcAddr<4>(nullptr)).ALIGNMENT, size_t(2));
454cbfd2e7SGuillaume Chatelet // Address 4-byte aligned, offset by 10.
46*1e6c819dSMichael Jones ASSERT_EQ(offsetAddr<10>(SrcAddr<4>(nullptr)).ALIGNMENT, size_t(2));
474cbfd2e7SGuillaume Chatelet // Address 8-byte aligned, offset by 6.
48*1e6c819dSMichael Jones ASSERT_EQ(offsetAddr<6>(SrcAddr<8>(nullptr)).ALIGNMENT, size_t(2));
494cbfd2e7SGuillaume Chatelet }
504cbfd2e7SGuillaume Chatelet
TEST(LlvmLibcAddress,OffsetAddr)514cbfd2e7SGuillaume Chatelet TEST(LlvmLibcAddress, OffsetAddr) {
524cbfd2e7SGuillaume Chatelet ubyte a;
534cbfd2e7SGuillaume Chatelet SrcAddr<1> addr(&a);
544cbfd2e7SGuillaume Chatelet ASSERT_EQ((const void *)offsetAddr<4>(addr).ptr(), (const void *)(&a + 4));
554cbfd2e7SGuillaume Chatelet ASSERT_EQ((const void *)offsetAddr<32>(addr).ptr(), (const void *)(&a + 32));
564cbfd2e7SGuillaume Chatelet }
574cbfd2e7SGuillaume Chatelet
TEST(LlvmLibcAddress,AssumeAligned)584cbfd2e7SGuillaume Chatelet TEST(LlvmLibcAddress, AssumeAligned) {
594cbfd2e7SGuillaume Chatelet SrcAddr<16> addr(nullptr);
60*1e6c819dSMichael Jones ASSERT_EQ(offsetAddrAssumeAligned<8>(addr, 0).ALIGNMENT, size_t(8));
61*1e6c819dSMichael Jones ASSERT_EQ(offsetAddrAssumeAligned<1>(addr, 0).ALIGNMENT, size_t(1));
62*1e6c819dSMichael Jones ASSERT_EQ(offsetAddrMultiplesOf<4>(addr, 0).ALIGNMENT, size_t(4));
63*1e6c819dSMichael Jones ASSERT_EQ(offsetAddrMultiplesOf<32>(addr, 0).ALIGNMENT, size_t(16));
644cbfd2e7SGuillaume Chatelet }
654cbfd2e7SGuillaume Chatelet
TEST(LlvmLibcAddress,offsetAddrAssumeAligned)664cbfd2e7SGuillaume Chatelet TEST(LlvmLibcAddress, offsetAddrAssumeAligned) {
674cbfd2e7SGuillaume Chatelet ubyte a;
684cbfd2e7SGuillaume Chatelet SrcAddr<1> addr(&a);
694cbfd2e7SGuillaume Chatelet ASSERT_EQ((const void *)offsetAddrAssumeAligned<1>(addr, 17).ptr(),
704cbfd2e7SGuillaume Chatelet (const void *)(&a + 17));
714cbfd2e7SGuillaume Chatelet }
724cbfd2e7SGuillaume Chatelet
TEST(LlvmLibcAddress,offsetAddrMultiplesOf)734cbfd2e7SGuillaume Chatelet TEST(LlvmLibcAddress, offsetAddrMultiplesOf) {
744cbfd2e7SGuillaume Chatelet ubyte a;
754cbfd2e7SGuillaume Chatelet SrcAddr<1> addr(&a);
764cbfd2e7SGuillaume Chatelet ASSERT_EQ((const void *)offsetAddrMultiplesOf<4>(addr, 16).ptr(),
774cbfd2e7SGuillaume Chatelet (const void *)(&a + 16));
784cbfd2e7SGuillaume Chatelet }
794cbfd2e7SGuillaume Chatelet
804cbfd2e7SGuillaume Chatelet } // namespace __llvm_libc
81