blob: b4e1c8786d9de3343c627665c86ce952fb303407 [file] [log] [blame]
/* { dg-do run } */
typedef unsigned char uint8_t;
typedef unsigned int uint32_t;
#define __big_endian__ scalar_storage_order("big-endian")
#define __little_endian__ scalar_storage_order("little-endian")
typedef union
{
uint32_t val;
uint8_t v[4];
} __attribute__((__big_endian__)) upal_u32be_t;
typedef union
{
uint32_t val;
uint8_t v[4];
} __attribute__((__little_endian__)) upal_u32le_t;
static inline uint32_t native_to_big_endian(uint32_t t)
{
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
return t;
#else
return __builtin_bswap32(t);
#endif
}
static inline uint32_t native_to_little_endian(uint32_t t)
{
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
return __builtin_bswap32(t);
#else
return t;
#endif
}
#define test(p, p1, i) do { if (p[i] != p1[i]) __builtin_abort (); } while (0)
#define tests(p, p1) do { test(p, p1, 0); test(p, p1, 1); \
test(p, p1, 2); test(p, p1, 3); } while (0)
int main(void)
{
const uint32_t u = 0x12345678;
upal_u32be_t tempb;
__builtin_memcpy (&tempb, &u, sizeof(uint32_t));
uint32_t bu = tempb.val;
uint32_t b1u = native_to_big_endian(u);
tests (((uint8_t*)&bu), ((uint8_t*)&b1u));
upal_u32le_t templ;
__builtin_memcpy (&templ, &u, sizeof(uint32_t));
uint32_t lu = templ.val;
uint32_t l1u = native_to_little_endian(u);
tests (((uint8_t*)&lu), ((uint8_t*)&l1u));
return 0;
}