xref: /freebsd-src/contrib/llvm-project/compiler-rt/lib/builtins/int_endianness.h (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
10b57cec5SDimitry Andric //===-- int_endianness.h - configuration header for compiler-rt -----------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file is a configuration header for compiler-rt.
100b57cec5SDimitry Andric // This file is not part of the interface of this library.
110b57cec5SDimitry Andric //
120b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
130b57cec5SDimitry Andric 
140b57cec5SDimitry Andric #ifndef INT_ENDIANNESS_H
150b57cec5SDimitry Andric #define INT_ENDIANNESS_H
160b57cec5SDimitry Andric 
170b57cec5SDimitry Andric #if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) &&                \
180b57cec5SDimitry Andric     defined(__ORDER_LITTLE_ENDIAN__)
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric // Clang and GCC provide built-in endianness definitions.
210b57cec5SDimitry Andric #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
220b57cec5SDimitry Andric #define _YUGA_LITTLE_ENDIAN 0
230b57cec5SDimitry Andric #define _YUGA_BIG_ENDIAN 1
240b57cec5SDimitry Andric #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
250b57cec5SDimitry Andric #define _YUGA_LITTLE_ENDIAN 1
260b57cec5SDimitry Andric #define _YUGA_BIG_ENDIAN 0
270b57cec5SDimitry Andric #endif // __BYTE_ORDER__
280b57cec5SDimitry Andric 
290b57cec5SDimitry Andric #else // Compilers other than Clang or GCC.
300b57cec5SDimitry Andric 
310b57cec5SDimitry Andric #if defined(__SVR4) && defined(__sun)
320b57cec5SDimitry Andric #include <sys/byteorder.h>
330b57cec5SDimitry Andric 
340b57cec5SDimitry Andric #if defined(_BIG_ENDIAN)
350b57cec5SDimitry Andric #define _YUGA_LITTLE_ENDIAN 0
360b57cec5SDimitry Andric #define _YUGA_BIG_ENDIAN 1
370b57cec5SDimitry Andric #elif defined(_LITTLE_ENDIAN)
380b57cec5SDimitry Andric #define _YUGA_LITTLE_ENDIAN 1
390b57cec5SDimitry Andric #define _YUGA_BIG_ENDIAN 0
400b57cec5SDimitry Andric #else // !_LITTLE_ENDIAN
410b57cec5SDimitry Andric #error "unknown endianness"
420b57cec5SDimitry Andric #endif // !_LITTLE_ENDIAN
430b57cec5SDimitry Andric 
44*81ad6265SDimitry Andric #endif // Solaris
450b57cec5SDimitry Andric 
460b57cec5SDimitry Andric // ..
470b57cec5SDimitry Andric 
480b57cec5SDimitry Andric #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) ||   \
490b57cec5SDimitry Andric     defined(__minix)
500b57cec5SDimitry Andric #include <sys/endian.h>
510b57cec5SDimitry Andric 
520b57cec5SDimitry Andric #if _BYTE_ORDER == _BIG_ENDIAN
530b57cec5SDimitry Andric #define _YUGA_LITTLE_ENDIAN 0
540b57cec5SDimitry Andric #define _YUGA_BIG_ENDIAN 1
550b57cec5SDimitry Andric #elif _BYTE_ORDER == _LITTLE_ENDIAN
560b57cec5SDimitry Andric #define _YUGA_LITTLE_ENDIAN 1
570b57cec5SDimitry Andric #define _YUGA_BIG_ENDIAN 0
580b57cec5SDimitry Andric #endif // _BYTE_ORDER
590b57cec5SDimitry Andric 
600b57cec5SDimitry Andric #endif // *BSD
610b57cec5SDimitry Andric 
620b57cec5SDimitry Andric #if defined(__OpenBSD__)
630b57cec5SDimitry Andric #include <machine/endian.h>
640b57cec5SDimitry Andric 
650b57cec5SDimitry Andric #if _BYTE_ORDER == _BIG_ENDIAN
660b57cec5SDimitry Andric #define _YUGA_LITTLE_ENDIAN 0
670b57cec5SDimitry Andric #define _YUGA_BIG_ENDIAN 1
680b57cec5SDimitry Andric #elif _BYTE_ORDER == _LITTLE_ENDIAN
690b57cec5SDimitry Andric #define _YUGA_LITTLE_ENDIAN 1
700b57cec5SDimitry Andric #define _YUGA_BIG_ENDIAN 0
710b57cec5SDimitry Andric #endif // _BYTE_ORDER
720b57cec5SDimitry Andric 
730b57cec5SDimitry Andric #endif // OpenBSD
740b57cec5SDimitry Andric 
750b57cec5SDimitry Andric // ..
760b57cec5SDimitry Andric 
770b57cec5SDimitry Andric // Mac OSX has __BIG_ENDIAN__ or __LITTLE_ENDIAN__ automatically set by the
780b57cec5SDimitry Andric // compiler (at least with GCC)
790b57cec5SDimitry Andric #if defined(__APPLE__) || defined(__ellcc__)
800b57cec5SDimitry Andric 
810b57cec5SDimitry Andric #ifdef __BIG_ENDIAN__
820b57cec5SDimitry Andric #if __BIG_ENDIAN__
830b57cec5SDimitry Andric #define _YUGA_LITTLE_ENDIAN 0
840b57cec5SDimitry Andric #define _YUGA_BIG_ENDIAN 1
850b57cec5SDimitry Andric #endif
860b57cec5SDimitry Andric #endif // __BIG_ENDIAN__
870b57cec5SDimitry Andric 
880b57cec5SDimitry Andric #ifdef __LITTLE_ENDIAN__
890b57cec5SDimitry Andric #if __LITTLE_ENDIAN__
900b57cec5SDimitry Andric #define _YUGA_LITTLE_ENDIAN 1
910b57cec5SDimitry Andric #define _YUGA_BIG_ENDIAN 0
920b57cec5SDimitry Andric #endif
930b57cec5SDimitry Andric #endif // __LITTLE_ENDIAN__
940b57cec5SDimitry Andric 
950b57cec5SDimitry Andric #endif // Mac OSX
960b57cec5SDimitry Andric 
970b57cec5SDimitry Andric // ..
980b57cec5SDimitry Andric 
990b57cec5SDimitry Andric #if defined(_WIN32)
1000b57cec5SDimitry Andric 
1010b57cec5SDimitry Andric #define _YUGA_LITTLE_ENDIAN 1
1020b57cec5SDimitry Andric #define _YUGA_BIG_ENDIAN 0
1030b57cec5SDimitry Andric 
1040b57cec5SDimitry Andric #endif // Windows
1050b57cec5SDimitry Andric 
1060b57cec5SDimitry Andric #endif // Clang or GCC.
1070b57cec5SDimitry Andric 
1080b57cec5SDimitry Andric // .
1090b57cec5SDimitry Andric 
1100b57cec5SDimitry Andric #if !defined(_YUGA_LITTLE_ENDIAN) || !defined(_YUGA_BIG_ENDIAN)
1110b57cec5SDimitry Andric #error Unable to determine endian
1120b57cec5SDimitry Andric #endif // Check we found an endianness correctly.
1130b57cec5SDimitry Andric 
1140b57cec5SDimitry Andric #endif // INT_ENDIANNESS_H
115