xref: /rk3399_ARM-atf/lib/compiler-rt/builtins/int_endianness.h (revision 8a6a9560b5dcccfb68064c0c8c9b4b47981c6ac7)
1*8a6a9560SDaniel Boulby //===-- int_endianness.h - configuration header for compiler-rt -----------===//
2*8a6a9560SDaniel Boulby //
3*8a6a9560SDaniel Boulby // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*8a6a9560SDaniel Boulby // See https://llvm.org/LICENSE.txt for license information.
5*8a6a9560SDaniel Boulby // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*8a6a9560SDaniel Boulby //
7*8a6a9560SDaniel Boulby //===----------------------------------------------------------------------===//
8*8a6a9560SDaniel Boulby //
9*8a6a9560SDaniel Boulby // This file is a configuration header for compiler-rt.
10*8a6a9560SDaniel Boulby // This file is not part of the interface of this library.
11*8a6a9560SDaniel Boulby //
12*8a6a9560SDaniel Boulby //===----------------------------------------------------------------------===//
130e14a7fbSdp-arm 
140e14a7fbSdp-arm #ifndef INT_ENDIANNESS_H
150e14a7fbSdp-arm #define INT_ENDIANNESS_H
160e14a7fbSdp-arm 
170e14a7fbSdp-arm #if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) &&                \
180e14a7fbSdp-arm     defined(__ORDER_LITTLE_ENDIAN__)
190e14a7fbSdp-arm 
20*8a6a9560SDaniel Boulby // Clang and GCC provide built-in endianness definitions.
210e14a7fbSdp-arm #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
220e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 0
230e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 1
240e14a7fbSdp-arm #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
250e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 1
260e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 0
27*8a6a9560SDaniel Boulby #endif // __BYTE_ORDER__
280e14a7fbSdp-arm 
29*8a6a9560SDaniel Boulby #else // Compilers other than Clang or GCC.
300e14a7fbSdp-arm 
310e14a7fbSdp-arm #if defined(__SVR4) && defined(__sun)
320e14a7fbSdp-arm #include <sys/byteorder.h>
330e14a7fbSdp-arm 
340e14a7fbSdp-arm #if defined(_BIG_ENDIAN)
350e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 0
360e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 1
370e14a7fbSdp-arm #elif defined(_LITTLE_ENDIAN)
380e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 1
390e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 0
40*8a6a9560SDaniel Boulby #else // !_LITTLE_ENDIAN
410e14a7fbSdp-arm #error "unknown endianness"
42*8a6a9560SDaniel Boulby #endif // !_LITTLE_ENDIAN
430e14a7fbSdp-arm 
44*8a6a9560SDaniel Boulby #endif // Solaris
450e14a7fbSdp-arm 
46*8a6a9560SDaniel Boulby // ..
470e14a7fbSdp-arm 
480e14a7fbSdp-arm #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) ||   \
490e14a7fbSdp-arm     defined(__minix)
500e14a7fbSdp-arm #include <sys/endian.h>
510e14a7fbSdp-arm 
520e14a7fbSdp-arm #if _BYTE_ORDER == _BIG_ENDIAN
530e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 0
540e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 1
550e14a7fbSdp-arm #elif _BYTE_ORDER == _LITTLE_ENDIAN
560e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 1
570e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 0
58*8a6a9560SDaniel Boulby #endif // _BYTE_ORDER
590e14a7fbSdp-arm 
60*8a6a9560SDaniel Boulby #endif // *BSD
610e14a7fbSdp-arm 
62*8a6a9560SDaniel Boulby #if defined(__OpenBSD__)
630e14a7fbSdp-arm #include <machine/endian.h>
640e14a7fbSdp-arm 
650e14a7fbSdp-arm #if _BYTE_ORDER == _BIG_ENDIAN
660e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 0
670e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 1
680e14a7fbSdp-arm #elif _BYTE_ORDER == _LITTLE_ENDIAN
690e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 1
700e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 0
71*8a6a9560SDaniel Boulby #endif // _BYTE_ORDER
720e14a7fbSdp-arm 
73*8a6a9560SDaniel Boulby #endif // OpenBSD
740e14a7fbSdp-arm 
75*8a6a9560SDaniel Boulby // ..
760e14a7fbSdp-arm 
77*8a6a9560SDaniel Boulby // Mac OSX has __BIG_ENDIAN__ or __LITTLE_ENDIAN__ automatically set by the
78*8a6a9560SDaniel Boulby // compiler (at least with GCC)
790e14a7fbSdp-arm #if defined(__APPLE__) || defined(__ellcc__)
800e14a7fbSdp-arm 
810e14a7fbSdp-arm #ifdef __BIG_ENDIAN__
820e14a7fbSdp-arm #if __BIG_ENDIAN__
830e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 0
840e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 1
850e14a7fbSdp-arm #endif
86*8a6a9560SDaniel Boulby #endif // __BIG_ENDIAN__
870e14a7fbSdp-arm 
880e14a7fbSdp-arm #ifdef __LITTLE_ENDIAN__
890e14a7fbSdp-arm #if __LITTLE_ENDIAN__
900e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 1
910e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 0
920e14a7fbSdp-arm #endif
93*8a6a9560SDaniel Boulby #endif // __LITTLE_ENDIAN__
940e14a7fbSdp-arm 
95*8a6a9560SDaniel Boulby #endif // Mac OSX
960e14a7fbSdp-arm 
97*8a6a9560SDaniel Boulby // ..
980e14a7fbSdp-arm 
990e14a7fbSdp-arm #if defined(_WIN32)
1000e14a7fbSdp-arm 
1010e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 1
1020e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 0
1030e14a7fbSdp-arm 
104*8a6a9560SDaniel Boulby #endif // Windows
1050e14a7fbSdp-arm 
106*8a6a9560SDaniel Boulby #endif // Clang or GCC.
1070e14a7fbSdp-arm 
108*8a6a9560SDaniel Boulby // .
1090e14a7fbSdp-arm 
1100e14a7fbSdp-arm #if !defined(_YUGA_LITTLE_ENDIAN) || !defined(_YUGA_BIG_ENDIAN)
1110e14a7fbSdp-arm #error Unable to determine endian
112*8a6a9560SDaniel Boulby #endif // Check we found an endianness correctly.
1130e14a7fbSdp-arm 
114*8a6a9560SDaniel Boulby #endif // INT_ENDIANNESS_H
115