From b5ca785d4c4579743fce42e9fdaaacd63192ecc3 Mon Sep 17 00:00:00 2001 From: Milan Bouchet-Valat Date: Sat, 27 Feb 2016 15:42:51 +0100 Subject: [PATCH] Avoid redefining endianness macros with some gcc versions _LITTLE_ENDIAN and _BIG_ENDIAN are built-in on some platforms/versions. Better use __ORDER_LITTLE_ENDIAN__, __ORDER_BIG_ENDIAN__ and __BYTE_ORDER__, which are standard for gcc and clang, and define them when they are missing. Also remove the special-case for FreeBSD, which is apprently not needed. --- src/fpmath.h | 53 ++++++++++++++------------------------ src/math_private.h | 4 +-- src/math_private_openbsd.h | 8 +++--- src/s_nan.c | 4 +-- 4 files changed, 27 insertions(+), 42 deletions(-) diff --git a/src/fpmath.h b/src/fpmath.h index 2b9afaa..58b5382 100644 --- a/src/fpmath.h +++ b/src/fpmath.h @@ -41,57 +41,42 @@ #include "powerpc_fpmath.h" #endif -#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) - /* Definitions provided directly by GCC and Clang. */ -#define _LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__ -#define _BIG_ENDIAN __ORDER_BIG_ENDIAN__ -#define _PDP_ENDIAN __ORDER_PDP_ENDIAN__ -#define _BYTE_ORDER __BYTE_ORDER__ +#if !(defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__)) -#elif defined(__GLIBC__) +#if defined(__GLIBC__) #include #include -#define _LITTLE_ENDIAN __LITTLE_ENDIAN -#define _BIG_ENDIAN __BIG_ENDIAN -#define _PDP_ENDIAN __PDP_ENDIAN -#define _BYTE_ORDER __BYTE_ORDER +#define __ORDER_LITTLE_ENDIAN__ __LITTLE_ENDIAN +#define __ORDER_BIG_ENDIAN__ __BIG_ENDIAN +#define __BYTE_ORDER__ __BYTE_ORDER #elif defined(__APPLE__) #include -#define _LITTLE_ENDIAN LITTLE_ENDIAN -#define _BIG_ENDIAN BIG_ENDIAN -#define _PDP_ENDIAN PDP_ENDIAN -#define _BYTE_ORDER BYTE_ORDER - -#elif defined(__FreeBSD__) - -#include +#define __ORDER_LITTLE_ENDIAN__ LITTLE_ENDIAN +#define __ORDER_BIG_ENDIAN__ BIG_ENDIAN +#define __BYTE_ORDER__ BYTE_ORDER #elif defined(_WIN32) -#define _LITTLE_ENDIAN 1234 -#define _BIG_ENDIAN 4321 -#define _PDP_ENDIAN 3412 -#define _BYTE_ORDER _LITTLE_ENDIAN -#define _FLOAT_WORD_ORDER _LITTLE_ENDIAN -#define LITTLE_ENDIAN _LITTLE_ENDIAN -#define BIG_ENDIAN _BIG_ENDIAN -#define PDP_ENDIAN _PDP_ENDIAN -#define BYTE_ORDER _BYTE_ORDER +#define __ORDER_LITTLE_ENDIAN__ 1234 +#define __ORDER_BIG_ENDIAN__ 4321 +#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ #endif -#ifndef _IEEE_WORD_ORDER -#define _IEEE_WORD_ORDER _BYTE_ORDER +#endif /* __BYTE_ORDER__, __ORDER_LITTLE_ENDIAN__ and __ORDER_BIG_ENDIAN__ */ + +#ifndef __FLOAT_WORD_ORDER__ +#define __FLOAT_WORD_ORDER__ __BYTE_ORDER__ #endif union IEEEf2bits { float f; struct { -#if _BYTE_ORDER == _LITTLE_ENDIAN +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ unsigned int man :23; unsigned int exp :8; unsigned int sign :1; @@ -109,14 +94,14 @@ union IEEEf2bits { union IEEEd2bits { double d; struct { -#if _BYTE_ORDER == _LITTLE_ENDIAN -#if _IEEE_WORD_ORDER == _LITTLE_ENDIAN +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#if __FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__ unsigned int manl :32; #endif unsigned int manh :20; unsigned int exp :11; unsigned int sign :1; -#if _IEEE_WORD_ORDER == _BIG_ENDIAN +#if __FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__ unsigned int manl :32; #endif #else /* _BIG_ENDIAN */ diff --git a/src/math_private.h b/src/math_private.h index daabcea..76a9ea2 100644 --- a/src/math_private.h +++ b/src/math_private.h @@ -43,7 +43,7 @@ * ints. */ -#if _IEEE_WORD_ORDER == _BIG_ENDIAN +#if __FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__ typedef union { @@ -61,7 +61,7 @@ typedef union #endif -#if _IEEE_WORD_ORDER == _LITTLE_ENDIAN +#if __FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__ typedef union { diff --git a/src/math_private_openbsd.h b/src/math_private_openbsd.h index 8a1774c..021670f 100644 --- a/src/math_private_openbsd.h +++ b/src/math_private_openbsd.h @@ -17,7 +17,7 @@ #ifndef _MATH_PRIVATE_OPENBSD_H_ #define _MATH_PRIVATE_OPENBSD_H_ -#if _IEEE_WORD_ORDER == _BIG_ENDIAN +#if __FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__ typedef union { @@ -36,7 +36,7 @@ typedef union #endif -#if _IEEE_WORD_ORDER == _LITTLE_ENDIAN +#if __FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__ typedef union { @@ -106,7 +106,7 @@ do { \ /* A union which permits us to convert between a long double and three 32 bit ints. */ -#if _IEEE_WORD_ORDER == _BIG_ENDIAN +#if __FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__ typedef union { @@ -124,7 +124,7 @@ typedef union #endif -#if _IEEE_WORD_ORDER == _LITTLE_ENDIAN +#if __FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__ typedef union { diff --git a/src/s_nan.c b/src/s_nan.c index 95f538e..2aa4c97 100644 --- a/src/s_nan.c +++ b/src/s_nan.c @@ -78,7 +78,7 @@ __scan_nan(u_int32_t *words, int num_words, const char *s) ; /* Scan backwards, filling in the bits in words[] as we go. */ -#if _BYTE_ORDER == _LITTLE_ENDIAN +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ for (bitpos = 0; bitpos < 32 * num_words; bitpos += 4) { #else for (bitpos = 32 * num_words - 4; bitpos >= 0; bitpos -= 4) { @@ -98,7 +98,7 @@ nan(const char *s) } u; __scan_nan(u.bits, 2, s); -#if _BYTE_ORDER == _LITTLE_ENDIAN +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ u.bits[1] |= 0x7ff80000; #else u.bits[0] |= 0x7ff80000;