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