blob: fe9361ba573e53347fa9b84497e0e5a99417bdad [file] [log] [blame]
#include "utils/UnitTest/Test.h"
#include <src/string/memory_utils/address.h>
namespace __llvm_libc {
TEST(LlvmLibcAddress, AliasAreAddresses) {
ASSERT_TRUE(IsAddressType<SrcAddr<1>>::value);
ASSERT_TRUE(IsAddressType<DstAddr<1>>::value);
ASSERT_TRUE(IsAddressType<NtSrcAddr<1>>::value);
ASSERT_TRUE(IsAddressType<NtDstAddr<1>>::value);
}
TEST(LlvmLibcAddress, AliasHaveRightPermissions) {
ASSERT_TRUE(SrcAddr<1>::IS_READ);
ASSERT_TRUE(NtSrcAddr<1>::IS_READ);
ASSERT_TRUE(DstAddr<1>::IS_WRITE);
ASSERT_TRUE(NtDstAddr<1>::IS_WRITE);
}
TEST(LlvmLibcAddress, AliasHaveRightSemantic) {
ASSERT_EQ(SrcAddr<1>::TEMPORALITY, Temporality::TEMPORAL);
ASSERT_EQ(DstAddr<1>::TEMPORALITY, Temporality::TEMPORAL);
ASSERT_EQ(NtSrcAddr<1>::TEMPORALITY, Temporality::NON_TEMPORAL);
ASSERT_EQ(NtDstAddr<1>::TEMPORALITY, Temporality::NON_TEMPORAL);
}
TEST(LlvmLibcAddress, AliasHaveRightAlignment) {
ASSERT_EQ(SrcAddr<1>::ALIGNMENT, size_t(1));
ASSERT_EQ(SrcAddr<4>::ALIGNMENT, size_t(4));
}
TEST(LlvmLibcAddress, NarrowAlignment) {
// Address 8-byte aligned, offset by 8.
ASSERT_EQ(offsetAddr<8>(SrcAddr<8>(nullptr)).ALIGNMENT, size_t(8));
// Address 16-byte aligned, offset by 4.
ASSERT_EQ(offsetAddr<4>(SrcAddr<16>(nullptr)).ALIGNMENT, size_t(4));
// Address 4-byte aligned, offset by 16.
ASSERT_EQ(offsetAddr<16>(SrcAddr<4>(nullptr)).ALIGNMENT, size_t(4));
// Address 4-byte aligned, offset by 1.
ASSERT_EQ(offsetAddr<1>(SrcAddr<4>(nullptr)).ALIGNMENT, size_t(1));
// Address 4-byte aligned, offset by 2.
ASSERT_EQ(offsetAddr<2>(SrcAddr<4>(nullptr)).ALIGNMENT, size_t(2));
// Address 4-byte aligned, offset by 6.
ASSERT_EQ(offsetAddr<6>(SrcAddr<4>(nullptr)).ALIGNMENT, size_t(2));
// Address 4-byte aligned, offset by 10.
ASSERT_EQ(offsetAddr<10>(SrcAddr<4>(nullptr)).ALIGNMENT, size_t(2));
// Address 8-byte aligned, offset by 6.
ASSERT_EQ(offsetAddr<6>(SrcAddr<8>(nullptr)).ALIGNMENT, size_t(2));
}
TEST(LlvmLibcAddress, OffsetAddr) {
ubyte a;
SrcAddr<1> addr(&a);
ASSERT_EQ((const void *)offsetAddr<4>(addr).ptr(), (const void *)(&a + 4));
ASSERT_EQ((const void *)offsetAddr<32>(addr).ptr(), (const void *)(&a + 32));
}
TEST(LlvmLibcAddress, AssumeAligned) {
SrcAddr<16> addr(nullptr);
ASSERT_EQ(offsetAddrAssumeAligned<8>(addr, 0).ALIGNMENT, size_t(8));
ASSERT_EQ(offsetAddrAssumeAligned<1>(addr, 0).ALIGNMENT, size_t(1));
ASSERT_EQ(offsetAddrMultiplesOf<4>(addr, 0).ALIGNMENT, size_t(4));
ASSERT_EQ(offsetAddrMultiplesOf<32>(addr, 0).ALIGNMENT, size_t(16));
}
TEST(LlvmLibcAddress, offsetAddrAssumeAligned) {
ubyte a;
SrcAddr<1> addr(&a);
ASSERT_EQ((const void *)offsetAddrAssumeAligned<1>(addr, 17).ptr(),
(const void *)(&a + 17));
}
TEST(LlvmLibcAddress, offsetAddrMultiplesOf) {
ubyte a;
SrcAddr<1> addr(&a);
ASSERT_EQ((const void *)offsetAddrMultiplesOf<4>(addr, 16).ptr(),
(const void *)(&a + 16));
}
} // namespace __llvm_libc