xref: /openbsd-src/gnu/llvm/compiler-rt/lib/builtins/int_endianness.h (revision 810390e339a5425391477d5d41c78d7cab2424ac)
13cab2bb3Spatrick //===-- int_endianness.h - configuration header for compiler-rt -----------===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick //
93cab2bb3Spatrick // This file is a configuration header for compiler-rt.
103cab2bb3Spatrick // This file is not part of the interface of this library.
113cab2bb3Spatrick //
123cab2bb3Spatrick //===----------------------------------------------------------------------===//
133cab2bb3Spatrick 
143cab2bb3Spatrick #ifndef INT_ENDIANNESS_H
153cab2bb3Spatrick #define INT_ENDIANNESS_H
163cab2bb3Spatrick 
173cab2bb3Spatrick #if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) &&                \
183cab2bb3Spatrick     defined(__ORDER_LITTLE_ENDIAN__)
193cab2bb3Spatrick 
203cab2bb3Spatrick // Clang and GCC provide built-in endianness definitions.
213cab2bb3Spatrick #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
223cab2bb3Spatrick #define _YUGA_LITTLE_ENDIAN 0
233cab2bb3Spatrick #define _YUGA_BIG_ENDIAN 1
243cab2bb3Spatrick #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
253cab2bb3Spatrick #define _YUGA_LITTLE_ENDIAN 1
263cab2bb3Spatrick #define _YUGA_BIG_ENDIAN 0
273cab2bb3Spatrick #endif // __BYTE_ORDER__
283cab2bb3Spatrick 
293cab2bb3Spatrick #else // Compilers other than Clang or GCC.
303cab2bb3Spatrick 
313cab2bb3Spatrick #if defined(__SVR4) && defined(__sun)
323cab2bb3Spatrick #include <sys/byteorder.h>
333cab2bb3Spatrick 
343cab2bb3Spatrick #if defined(_BIG_ENDIAN)
353cab2bb3Spatrick #define _YUGA_LITTLE_ENDIAN 0
363cab2bb3Spatrick #define _YUGA_BIG_ENDIAN 1
373cab2bb3Spatrick #elif defined(_LITTLE_ENDIAN)
383cab2bb3Spatrick #define _YUGA_LITTLE_ENDIAN 1
393cab2bb3Spatrick #define _YUGA_BIG_ENDIAN 0
403cab2bb3Spatrick #else // !_LITTLE_ENDIAN
413cab2bb3Spatrick #error "unknown endianness"
423cab2bb3Spatrick #endif // !_LITTLE_ENDIAN
433cab2bb3Spatrick 
44*810390e3Srobert #endif // Solaris
453cab2bb3Spatrick 
463cab2bb3Spatrick // ..
473cab2bb3Spatrick 
483cab2bb3Spatrick #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) ||   \
493cab2bb3Spatrick     defined(__minix)
503cab2bb3Spatrick #include <sys/endian.h>
513cab2bb3Spatrick 
523cab2bb3Spatrick #if _BYTE_ORDER == _BIG_ENDIAN
533cab2bb3Spatrick #define _YUGA_LITTLE_ENDIAN 0
543cab2bb3Spatrick #define _YUGA_BIG_ENDIAN 1
553cab2bb3Spatrick #elif _BYTE_ORDER == _LITTLE_ENDIAN
563cab2bb3Spatrick #define _YUGA_LITTLE_ENDIAN 1
573cab2bb3Spatrick #define _YUGA_BIG_ENDIAN 0
583cab2bb3Spatrick #endif // _BYTE_ORDER
593cab2bb3Spatrick 
603cab2bb3Spatrick #endif // *BSD
613cab2bb3Spatrick 
623cab2bb3Spatrick #if defined(__OpenBSD__)
633cab2bb3Spatrick #include <machine/endian.h>
643cab2bb3Spatrick 
653cab2bb3Spatrick #if _BYTE_ORDER == _BIG_ENDIAN
663cab2bb3Spatrick #define _YUGA_LITTLE_ENDIAN 0
673cab2bb3Spatrick #define _YUGA_BIG_ENDIAN 1
683cab2bb3Spatrick #elif _BYTE_ORDER == _LITTLE_ENDIAN
693cab2bb3Spatrick #define _YUGA_LITTLE_ENDIAN 1
703cab2bb3Spatrick #define _YUGA_BIG_ENDIAN 0
713cab2bb3Spatrick #endif // _BYTE_ORDER
723cab2bb3Spatrick 
733cab2bb3Spatrick #endif // OpenBSD
743cab2bb3Spatrick 
753cab2bb3Spatrick // ..
763cab2bb3Spatrick 
773cab2bb3Spatrick // Mac OSX has __BIG_ENDIAN__ or __LITTLE_ENDIAN__ automatically set by the
783cab2bb3Spatrick // compiler (at least with GCC)
793cab2bb3Spatrick #if defined(__APPLE__) || defined(__ellcc__)
803cab2bb3Spatrick 
813cab2bb3Spatrick #ifdef __BIG_ENDIAN__
823cab2bb3Spatrick #if __BIG_ENDIAN__
833cab2bb3Spatrick #define _YUGA_LITTLE_ENDIAN 0
843cab2bb3Spatrick #define _YUGA_BIG_ENDIAN 1
853cab2bb3Spatrick #endif
863cab2bb3Spatrick #endif // __BIG_ENDIAN__
873cab2bb3Spatrick 
883cab2bb3Spatrick #ifdef __LITTLE_ENDIAN__
893cab2bb3Spatrick #if __LITTLE_ENDIAN__
903cab2bb3Spatrick #define _YUGA_LITTLE_ENDIAN 1
913cab2bb3Spatrick #define _YUGA_BIG_ENDIAN 0
923cab2bb3Spatrick #endif
933cab2bb3Spatrick #endif // __LITTLE_ENDIAN__
943cab2bb3Spatrick 
953cab2bb3Spatrick #endif // Mac OSX
963cab2bb3Spatrick 
973cab2bb3Spatrick // ..
983cab2bb3Spatrick 
993cab2bb3Spatrick #if defined(_WIN32)
1003cab2bb3Spatrick 
1013cab2bb3Spatrick #define _YUGA_LITTLE_ENDIAN 1
1023cab2bb3Spatrick #define _YUGA_BIG_ENDIAN 0
1033cab2bb3Spatrick 
1043cab2bb3Spatrick #endif // Windows
1053cab2bb3Spatrick 
1063cab2bb3Spatrick #endif // Clang or GCC.
1073cab2bb3Spatrick 
1083cab2bb3Spatrick // .
1093cab2bb3Spatrick 
1103cab2bb3Spatrick #if !defined(_YUGA_LITTLE_ENDIAN) || !defined(_YUGA_BIG_ENDIAN)
1113cab2bb3Spatrick #error Unable to determine endian
1123cab2bb3Spatrick #endif // Check we found an endianness correctly.
1133cab2bb3Spatrick 
1143cab2bb3Spatrick #endif // INT_ENDIANNESS_H
115