1119815Smarcel/* ===-- int_endianness.h - configuration header for compiler-rt ------------=== 2119815Smarcel * 3119815Smarcel * The LLVM Compiler Infrastructure 4119815Smarcel * 5119815Smarcel * This file is dual licensed under the MIT and the University of Illinois Open 6119815Smarcel * Source Licenses. See LICENSE.TXT for details. 7119815Smarcel * 8119815Smarcel * ===----------------------------------------------------------------------=== 9119815Smarcel * 10119815Smarcel * This file is a configuration header for compiler-rt. 11119815Smarcel * This file is not part of the interface of this library. 12119815Smarcel * 13119815Smarcel * ===----------------------------------------------------------------------=== 14119815Smarcel */ 15119815Smarcel 16119815Smarcel#ifndef INT_ENDIANNESS_H 17119815Smarcel#define INT_ENDIANNESS_H 18119815Smarcel 19119815Smarcel#if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \ 20119815Smarcel defined(__ORDER_LITTLE_ENDIAN__) 21119815Smarcel 22119815Smarcel/* Clang and GCC provide built-in endianness definitions. */ 23119815Smarcel#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ 24119815Smarcel#define _YUGA_LITTLE_ENDIAN 0 25119815Smarcel#define _YUGA_BIG_ENDIAN 1 26119815Smarcel#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 27119815Smarcel#define _YUGA_LITTLE_ENDIAN 1 28119815Smarcel#define _YUGA_BIG_ENDIAN 0 29119815Smarcel#endif /* __BYTE_ORDER__ */ 30119815Smarcel 31119815Smarcel#else /* Compilers other than Clang or GCC. */ 32119815Smarcel 33119815Smarcel#if defined(__SVR4) && defined(__sun) 34119815Smarcel#include <sys/byteorder.h> 35119815Smarcel 36119815Smarcel#if defined(_BIG_ENDIAN) 37119815Smarcel#define _YUGA_LITTLE_ENDIAN 0 38119815Smarcel#define _YUGA_BIG_ENDIAN 1 39119815Smarcel#elif defined(_LITTLE_ENDIAN) 40119866Smarcel#define _YUGA_LITTLE_ENDIAN 1 41119866Smarcel#define _YUGA_BIG_ENDIAN 0 42119866Smarcel#else /* !_LITTLE_ENDIAN */ 43119866Smarcel#error "unknown endianness" 44119866Smarcel#endif /* !_LITTLE_ENDIAN */ 45119866Smarcel 46119866Smarcel#endif /* Solaris and AuroraUX. */ 47119815Smarcel 48119815Smarcel/* .. */ 49119815Smarcel 50119815Smarcel#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || \ 51119815Smarcel defined(__minix) 52119815Smarcel#include <sys/endian.h> 53119815Smarcel 54119815Smarcel#if _BYTE_ORDER == _BIG_ENDIAN 55119815Smarcel#define _YUGA_LITTLE_ENDIAN 0 56119815Smarcel#define _YUGA_BIG_ENDIAN 1 57119815Smarcel#elif _BYTE_ORDER == _LITTLE_ENDIAN 58119815Smarcel#define _YUGA_LITTLE_ENDIAN 1 59119815Smarcel#define _YUGA_BIG_ENDIAN 0 60119815Smarcel#endif /* _BYTE_ORDER */ 61119815Smarcel 62119815Smarcel#endif /* *BSD */ 63119815Smarcel 64119815Smarcel#if defined(__OpenBSD__) || defined(__Bitrig__) 65119815Smarcel#include <machine/endian.h> 66119815Smarcel 67119815Smarcel#if _BYTE_ORDER == _BIG_ENDIAN 68119815Smarcel#define _YUGA_LITTLE_ENDIAN 0 69119815Smarcel#define _YUGA_BIG_ENDIAN 1 70119815Smarcel#elif _BYTE_ORDER == _LITTLE_ENDIAN 71119815Smarcel#define _YUGA_LITTLE_ENDIAN 1 72119815Smarcel#define _YUGA_BIG_ENDIAN 0 73119815Smarcel#endif /* _BYTE_ORDER */ 74119815Smarcel 75119815Smarcel#endif /* OpenBSD and Bitrig. */ 76119815Smarcel 77119815Smarcel/* .. */ 78120378Snyan 79119815Smarcel/* Mac OSX has __BIG_ENDIAN__ or __LITTLE_ENDIAN__ automatically set by the 80120376Snyan * compiler (at least with GCC) */ 81120381Snyan#if defined(__APPLE__) || defined(__ellcc__ ) 82119815Smarcel 83119815Smarcel#ifdef __BIG_ENDIAN__ 84119815Smarcel#if __BIG_ENDIAN__ 85119815Smarcel#define _YUGA_LITTLE_ENDIAN 0 86119815Smarcel#define _YUGA_BIG_ENDIAN 1 87119815Smarcel#endif 88119815Smarcel#endif /* __BIG_ENDIAN__ */ 89119815Smarcel 90119815Smarcel#ifdef __LITTLE_ENDIAN__ 91119815Smarcel#if __LITTLE_ENDIAN__ 92119815Smarcel#define _YUGA_LITTLE_ENDIAN 1 93119815Smarcel#define _YUGA_BIG_ENDIAN 0 94119815Smarcel#endif 95#endif /* __LITTLE_ENDIAN__ */ 96 97#endif /* Mac OSX */ 98 99/* .. */ 100 101#if defined(_WIN32) 102 103#define _YUGA_LITTLE_ENDIAN 1 104#define _YUGA_BIG_ENDIAN 0 105 106#endif /* Windows */ 107 108#endif /* Clang or GCC. */ 109 110/* . */ 111 112#if !defined(_YUGA_LITTLE_ENDIAN) || !defined(_YUGA_BIG_ENDIAN) 113#error Unable to determine endian 114#endif /* Check we found an endianness correctly. */ 115 116#endif /* INT_ENDIANNESS_H */ 117