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