Make 'packed' have better cross platform functionality

This commit is contained in:
John Wellbelove 2024-12-16 14:58:16 +00:00
parent 84eea5bb1f
commit 05682930e1
4 changed files with 41 additions and 5 deletions

View File

@ -456,10 +456,18 @@ SOFTWARE.
//*************************************
// Determine if the ETL should use __attribute__((packed).
#if defined(ETL_COMPILER_CLANG) || defined(ETL_COMPILER_GCC) || defined(ETL_COMPILER_INTEL)
#define ETL_PACKED __attribute__((packed))
#if defined(ETL_COMPILER_CLANG) || defined(ETL_COMPILER_GCC) || defined(ETL_COMPILER_INTEL) || defined(ETL_COMPILER_ARM6)
#define ETL_PACKED __attribute__((packed))
#define ETL_END_PACKED
#define ETL_HAS_PACKED 1
#elif defined(ETL_COMPILER_MICROSOFT)
#define ETL_PACKED __pragma(pack(push, 1))
#define ETL_END_PACKED __pragma(pack(pop))
#define ETL_HAS_PACKED 1
#else
#define ETL_PACKED
#define ETL_END_PACKED
#define ETL_HAS_PACKED 0
#endif
//*************************************
@ -520,6 +528,7 @@ namespace etl
static ETL_CONSTANT bool has_mutable_array_view = (ETL_HAS_MUTABLE_ARRAY_VIEW == 1);
static ETL_CONSTANT bool has_ideque_repair = (ETL_HAS_IDEQUE_REPAIR == 1);
static ETL_CONSTANT bool has_virtual_messages = (ETL_HAS_VIRTUAL_MESSAGES == 1);
static ETL_CONSTANT bool has_packed = (ETL_HAS_PACKED == 1);
// Is...
static ETL_CONSTANT bool is_debug_build = (ETL_IS_DEBUG_BUILD == 1);

View File

@ -53,7 +53,7 @@ namespace etl
/// Contains all functionality that doesn't require the type.
//*************************************************************************
template <size_t Size_>
class unaligned_type_common
class ETL_PACKED unaligned_type_common
{
public:
@ -214,7 +214,7 @@ namespace etl
protected:
unsigned char storage[Size];
};
}; ETL_END_PACKED
template <size_t Size_>
ETL_CONSTANT size_t unaligned_type_common<Size_>::Size;
@ -729,7 +729,7 @@ namespace etl
}
}
};
};
}; ETL_END_PACKED
template <typename T, int Endian_>
ETL_CONSTANT int unaligned_type<T, Endian_>::Endian;

View File

@ -77,6 +77,7 @@ namespace
CHECK_EQUAL((ETL_HAS_IDEQUE_REPAIR == 1), etl::traits::has_ideque_repair);
CHECK_EQUAL((ETL_HAS_MUTABLE_ARRAY_VIEW == 1), etl::traits::has_mutable_array_view);
CHECK_EQUAL((ETL_HAS_VIRTUAL_MESSAGES == 1), etl::traits::has_virtual_messages);
CHECK_EQUAL((ETL_HAS_PACKED == 1), etl::traits::has_packed);
CHECK_EQUAL((ETL_IS_DEBUG_BUILD == 1), etl::traits::is_debug_build);
CHECK_EQUAL(__cplusplus, etl::traits::cplusplus);

View File

@ -666,5 +666,31 @@ namespace
CHECK_EQUAL(forward_like_call_type::ConstRValue, template_function_fl<TFL&&>(etl::move(u4)));
CHECK_EQUAL(forward_like_call_type::ConstRValue, template_function_fl<const TFL&&>(etl::move(u4)));
}
#if ETL_HAS_PACKED
//*********************************
TEST(test_packed)
{
struct Unpacked
{
uint32_t a = 0x12345678;
uint8_t b = 0x9A;
uint32_t c = 0x87654321;
};
struct ETL_PACKED Packed
{
uint32_t a = 0x12345678;
uint8_t b = 0x9A;
uint32_t c = 0x87654321;
}; ETL_END_PACKED
Unpacked unpacked;
Packed packed;
CHECK_TRUE(sizeof(unpacked) > sizeof(packed));
CHECK_EQUAL(9U, sizeof(packed));
}
#endif
};
}