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