Skip to content

Commit b5ca785

Browse files
committed
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.
1 parent 949c530 commit b5ca785

File tree

4 files changed

+27
-42
lines changed

4 files changed

+27
-42
lines changed

src/fpmath.h

Lines changed: 19 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -41,57 +41,42 @@
4141
#include "powerpc_fpmath.h"
4242
#endif
4343

44-
#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__)
45-
4644
/* Definitions provided directly by GCC and Clang. */
47-
#define _LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__
48-
#define _BIG_ENDIAN __ORDER_BIG_ENDIAN__
49-
#define _PDP_ENDIAN __ORDER_PDP_ENDIAN__
50-
#define _BYTE_ORDER __BYTE_ORDER__
45+
#if !(defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__))
5146

52-
#elif defined(__GLIBC__)
47+
#if defined(__GLIBC__)
5348

5449
#include <features.h>
5550
#include <endian.h>
56-
#define _LITTLE_ENDIAN __LITTLE_ENDIAN
57-
#define _BIG_ENDIAN __BIG_ENDIAN
58-
#define _PDP_ENDIAN __PDP_ENDIAN
59-
#define _BYTE_ORDER __BYTE_ORDER
51+
#define __ORDER_LITTLE_ENDIAN__ __LITTLE_ENDIAN
52+
#define __ORDER_BIG_ENDIAN__ __BIG_ENDIAN
53+
#define __BYTE_ORDER__ __BYTE_ORDER
6054

6155
#elif defined(__APPLE__)
6256

6357
#include <machine/endian.h>
64-
#define _LITTLE_ENDIAN LITTLE_ENDIAN
65-
#define _BIG_ENDIAN BIG_ENDIAN
66-
#define _PDP_ENDIAN PDP_ENDIAN
67-
#define _BYTE_ORDER BYTE_ORDER
68-
69-
#elif defined(__FreeBSD__)
70-
71-
#include <machine/endian.h>
58+
#define __ORDER_LITTLE_ENDIAN__ LITTLE_ENDIAN
59+
#define __ORDER_BIG_ENDIAN__ BIG_ENDIAN
60+
#define __BYTE_ORDER__ BYTE_ORDER
7261

7362
#elif defined(_WIN32)
7463

75-
#define _LITTLE_ENDIAN 1234
76-
#define _BIG_ENDIAN 4321
77-
#define _PDP_ENDIAN 3412
78-
#define _BYTE_ORDER _LITTLE_ENDIAN
79-
#define _FLOAT_WORD_ORDER _LITTLE_ENDIAN
80-
#define LITTLE_ENDIAN _LITTLE_ENDIAN
81-
#define BIG_ENDIAN _BIG_ENDIAN
82-
#define PDP_ENDIAN _PDP_ENDIAN
83-
#define BYTE_ORDER _BYTE_ORDER
64+
#define __ORDER_LITTLE_ENDIAN__ 1234
65+
#define __ORDER_BIG_ENDIAN__ 4321
66+
#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
8467

8568
#endif
8669

87-
#ifndef _IEEE_WORD_ORDER
88-
#define _IEEE_WORD_ORDER _BYTE_ORDER
70+
#endif /* __BYTE_ORDER__, __ORDER_LITTLE_ENDIAN__ and __ORDER_BIG_ENDIAN__ */
71+
72+
#ifndef __FLOAT_WORD_ORDER__
73+
#define __FLOAT_WORD_ORDER__ __BYTE_ORDER__
8974
#endif
9075

9176
union IEEEf2bits {
9277
float f;
9378
struct {
94-
#if _BYTE_ORDER == _LITTLE_ENDIAN
79+
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
9580
unsigned int man :23;
9681
unsigned int exp :8;
9782
unsigned int sign :1;
@@ -109,14 +94,14 @@ union IEEEf2bits {
10994
union IEEEd2bits {
11095
double d;
11196
struct {
112-
#if _BYTE_ORDER == _LITTLE_ENDIAN
113-
#if _IEEE_WORD_ORDER == _LITTLE_ENDIAN
97+
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
98+
#if __FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__
11499
unsigned int manl :32;
115100
#endif
116101
unsigned int manh :20;
117102
unsigned int exp :11;
118103
unsigned int sign :1;
119-
#if _IEEE_WORD_ORDER == _BIG_ENDIAN
104+
#if __FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__
120105
unsigned int manl :32;
121106
#endif
122107
#else /* _BIG_ENDIAN */

src/math_private.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
* ints.
4444
*/
4545

46-
#if _IEEE_WORD_ORDER == _BIG_ENDIAN
46+
#if __FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__
4747

4848
typedef union
4949
{
@@ -61,7 +61,7 @@ typedef union
6161

6262
#endif
6363

64-
#if _IEEE_WORD_ORDER == _LITTLE_ENDIAN
64+
#if __FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__
6565

6666
typedef union
6767
{

src/math_private_openbsd.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
#ifndef _MATH_PRIVATE_OPENBSD_H_
1818
#define _MATH_PRIVATE_OPENBSD_H_
1919

20-
#if _IEEE_WORD_ORDER == _BIG_ENDIAN
20+
#if __FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__
2121

2222
typedef union
2323
{
@@ -36,7 +36,7 @@ typedef union
3636

3737
#endif
3838

39-
#if _IEEE_WORD_ORDER == _LITTLE_ENDIAN
39+
#if __FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__
4040

4141
typedef union
4242
{
@@ -106,7 +106,7 @@ do { \
106106
/* A union which permits us to convert between a long double and
107107
three 32 bit ints. */
108108

109-
#if _IEEE_WORD_ORDER == _BIG_ENDIAN
109+
#if __FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__
110110

111111
typedef union
112112
{
@@ -124,7 +124,7 @@ typedef union
124124

125125
#endif
126126

127-
#if _IEEE_WORD_ORDER == _LITTLE_ENDIAN
127+
#if __FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__
128128

129129
typedef union
130130
{

src/s_nan.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ __scan_nan(u_int32_t *words, int num_words, const char *s)
7878
;
7979

8080
/* Scan backwards, filling in the bits in words[] as we go. */
81-
#if _BYTE_ORDER == _LITTLE_ENDIAN
81+
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
8282
for (bitpos = 0; bitpos < 32 * num_words; bitpos += 4) {
8383
#else
8484
for (bitpos = 32 * num_words - 4; bitpos >= 0; bitpos -= 4) {
@@ -98,7 +98,7 @@ nan(const char *s)
9898
} u;
9999

100100
__scan_nan(u.bits, 2, s);
101-
#if _BYTE_ORDER == _LITTLE_ENDIAN
101+
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
102102
u.bits[1] |= 0x7ff80000;
103103
#else
104104
u.bits[0] |= 0x7ff80000;

0 commit comments

Comments
 (0)