1*0e14a7fbSdp-arm /* ===-- int_endianness.h - configuration header for compiler-rt ------------=== 2*0e14a7fbSdp-arm * 3*0e14a7fbSdp-arm * The LLVM Compiler Infrastructure 4*0e14a7fbSdp-arm * 5*0e14a7fbSdp-arm * This file is dual licensed under the MIT and the University of Illinois Open 6*0e14a7fbSdp-arm * Source Licenses. See LICENSE.TXT for details. 7*0e14a7fbSdp-arm * 8*0e14a7fbSdp-arm * ===----------------------------------------------------------------------=== 9*0e14a7fbSdp-arm * 10*0e14a7fbSdp-arm * This file is a configuration header for compiler-rt. 11*0e14a7fbSdp-arm * This file is not part of the interface of this library. 12*0e14a7fbSdp-arm * 13*0e14a7fbSdp-arm * ===----------------------------------------------------------------------=== 14*0e14a7fbSdp-arm */ 15*0e14a7fbSdp-arm 16*0e14a7fbSdp-arm #ifndef INT_ENDIANNESS_H 17*0e14a7fbSdp-arm #define INT_ENDIANNESS_H 18*0e14a7fbSdp-arm 19*0e14a7fbSdp-arm #if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \ 20*0e14a7fbSdp-arm defined(__ORDER_LITTLE_ENDIAN__) 21*0e14a7fbSdp-arm 22*0e14a7fbSdp-arm /* Clang and GCC provide built-in endianness definitions. */ 23*0e14a7fbSdp-arm #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ 24*0e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 0 25*0e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 1 26*0e14a7fbSdp-arm #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 27*0e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 1 28*0e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 0 29*0e14a7fbSdp-arm #endif /* __BYTE_ORDER__ */ 30*0e14a7fbSdp-arm 31*0e14a7fbSdp-arm #else /* Compilers other than Clang or GCC. */ 32*0e14a7fbSdp-arm 33*0e14a7fbSdp-arm #if defined(__SVR4) && defined(__sun) 34*0e14a7fbSdp-arm #include <sys/byteorder.h> 35*0e14a7fbSdp-arm 36*0e14a7fbSdp-arm #if defined(_BIG_ENDIAN) 37*0e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 0 38*0e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 1 39*0e14a7fbSdp-arm #elif defined(_LITTLE_ENDIAN) 40*0e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 1 41*0e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 0 42*0e14a7fbSdp-arm #else /* !_LITTLE_ENDIAN */ 43*0e14a7fbSdp-arm #error "unknown endianness" 44*0e14a7fbSdp-arm #endif /* !_LITTLE_ENDIAN */ 45*0e14a7fbSdp-arm 46*0e14a7fbSdp-arm #endif /* Solaris and AuroraUX. */ 47*0e14a7fbSdp-arm 48*0e14a7fbSdp-arm /* .. */ 49*0e14a7fbSdp-arm 50*0e14a7fbSdp-arm #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || \ 51*0e14a7fbSdp-arm defined(__minix) 52*0e14a7fbSdp-arm #include <sys/endian.h> 53*0e14a7fbSdp-arm 54*0e14a7fbSdp-arm #if _BYTE_ORDER == _BIG_ENDIAN 55*0e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 0 56*0e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 1 57*0e14a7fbSdp-arm #elif _BYTE_ORDER == _LITTLE_ENDIAN 58*0e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 1 59*0e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 0 60*0e14a7fbSdp-arm #endif /* _BYTE_ORDER */ 61*0e14a7fbSdp-arm 62*0e14a7fbSdp-arm #endif /* *BSD */ 63*0e14a7fbSdp-arm 64*0e14a7fbSdp-arm #if defined(__OpenBSD__) || defined(__Bitrig__) 65*0e14a7fbSdp-arm #include <machine/endian.h> 66*0e14a7fbSdp-arm 67*0e14a7fbSdp-arm #if _BYTE_ORDER == _BIG_ENDIAN 68*0e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 0 69*0e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 1 70*0e14a7fbSdp-arm #elif _BYTE_ORDER == _LITTLE_ENDIAN 71*0e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 1 72*0e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 0 73*0e14a7fbSdp-arm #endif /* _BYTE_ORDER */ 74*0e14a7fbSdp-arm 75*0e14a7fbSdp-arm #endif /* OpenBSD and Bitrig. */ 76*0e14a7fbSdp-arm 77*0e14a7fbSdp-arm /* .. */ 78*0e14a7fbSdp-arm 79*0e14a7fbSdp-arm /* Mac OSX has __BIG_ENDIAN__ or __LITTLE_ENDIAN__ automatically set by the 80*0e14a7fbSdp-arm * compiler (at least with GCC) */ 81*0e14a7fbSdp-arm #if defined(__APPLE__) || defined(__ellcc__ ) 82*0e14a7fbSdp-arm 83*0e14a7fbSdp-arm #ifdef __BIG_ENDIAN__ 84*0e14a7fbSdp-arm #if __BIG_ENDIAN__ 85*0e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 0 86*0e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 1 87*0e14a7fbSdp-arm #endif 88*0e14a7fbSdp-arm #endif /* __BIG_ENDIAN__ */ 89*0e14a7fbSdp-arm 90*0e14a7fbSdp-arm #ifdef __LITTLE_ENDIAN__ 91*0e14a7fbSdp-arm #if __LITTLE_ENDIAN__ 92*0e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 1 93*0e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 0 94*0e14a7fbSdp-arm #endif 95*0e14a7fbSdp-arm #endif /* __LITTLE_ENDIAN__ */ 96*0e14a7fbSdp-arm 97*0e14a7fbSdp-arm #endif /* Mac OSX */ 98*0e14a7fbSdp-arm 99*0e14a7fbSdp-arm /* .. */ 100*0e14a7fbSdp-arm 101*0e14a7fbSdp-arm #if defined(_WIN32) 102*0e14a7fbSdp-arm 103*0e14a7fbSdp-arm #define _YUGA_LITTLE_ENDIAN 1 104*0e14a7fbSdp-arm #define _YUGA_BIG_ENDIAN 0 105*0e14a7fbSdp-arm 106*0e14a7fbSdp-arm #endif /* Windows */ 107*0e14a7fbSdp-arm 108*0e14a7fbSdp-arm #endif /* Clang or GCC. */ 109*0e14a7fbSdp-arm 110*0e14a7fbSdp-arm /* . */ 111*0e14a7fbSdp-arm 112*0e14a7fbSdp-arm #if !defined(_YUGA_LITTLE_ENDIAN) || !defined(_YUGA_BIG_ENDIAN) 113*0e14a7fbSdp-arm #error Unable to determine endian 114*0e14a7fbSdp-arm #endif /* Check we found an endianness correctly. */ 115*0e14a7fbSdp-arm 116*0e14a7fbSdp-arm #endif /* INT_ENDIANNESS_H */ 117