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