115 lines · c
1//===-- int_endianness.h - configuration header for compiler-rt -----------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file is a configuration header for compiler-rt.10// This file is not part of the interface of this library.11//12//===----------------------------------------------------------------------===//13 14#ifndef INT_ENDIANNESS_H15#define INT_ENDIANNESS_H16 17#if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \18 defined(__ORDER_LITTLE_ENDIAN__)19 20// Clang and GCC provide built-in endianness definitions.21#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__22#define _YUGA_LITTLE_ENDIAN 023#define _YUGA_BIG_ENDIAN 124#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__25#define _YUGA_LITTLE_ENDIAN 126#define _YUGA_BIG_ENDIAN 027#endif // __BYTE_ORDER__28 29#else // Compilers other than Clang or GCC.30 31#if defined(__SVR4) && defined(__sun)32#include <sys/byteorder.h>33 34#if defined(_BIG_ENDIAN)35#define _YUGA_LITTLE_ENDIAN 036#define _YUGA_BIG_ENDIAN 137#elif defined(_LITTLE_ENDIAN)38#define _YUGA_LITTLE_ENDIAN 139#define _YUGA_BIG_ENDIAN 040#else // !_LITTLE_ENDIAN41#error "unknown endianness"42#endif // !_LITTLE_ENDIAN43 44#endif // Solaris45 46// ..47 48#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || \49 defined(__minix)50#include <sys/endian.h>51 52#if _BYTE_ORDER == _BIG_ENDIAN53#define _YUGA_LITTLE_ENDIAN 054#define _YUGA_BIG_ENDIAN 155#elif _BYTE_ORDER == _LITTLE_ENDIAN56#define _YUGA_LITTLE_ENDIAN 157#define _YUGA_BIG_ENDIAN 058#endif // _BYTE_ORDER59 60#endif // *BSD61 62#if defined(__OpenBSD__)63#include <machine/endian.h>64 65#if _BYTE_ORDER == _BIG_ENDIAN66#define _YUGA_LITTLE_ENDIAN 067#define _YUGA_BIG_ENDIAN 168#elif _BYTE_ORDER == _LITTLE_ENDIAN69#define _YUGA_LITTLE_ENDIAN 170#define _YUGA_BIG_ENDIAN 071#endif // _BYTE_ORDER72 73#endif // OpenBSD74 75// ..76 77// Mac OSX has __BIG_ENDIAN__ or __LITTLE_ENDIAN__ automatically set by the78// compiler (at least with GCC)79#if defined(__APPLE__) || defined(__ellcc__)80 81#ifdef __BIG_ENDIAN__82#if __BIG_ENDIAN__83#define _YUGA_LITTLE_ENDIAN 084#define _YUGA_BIG_ENDIAN 185#endif86#endif // __BIG_ENDIAN__87 88#ifdef __LITTLE_ENDIAN__89#if __LITTLE_ENDIAN__90#define _YUGA_LITTLE_ENDIAN 191#define _YUGA_BIG_ENDIAN 092#endif93#endif // __LITTLE_ENDIAN__94 95#endif // Mac OSX96 97// ..98 99#if defined(_WIN32)100 101#define _YUGA_LITTLE_ENDIAN 1102#define _YUGA_BIG_ENDIAN 0103 104#endif // Windows105 106#endif // Clang or GCC.107 108// .109 110#if !defined(_YUGA_LITTLE_ENDIAN) || !defined(_YUGA_BIG_ENDIAN)111#error Unable to determine endian112#endif // Check we found an endianness correctly.113 114#endif // INT_ENDIANNESS_H115