]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/compiler-rt/lib/builtins/int_endianness.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm-project / compiler-rt / lib / builtins / int_endianness.h
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-exception
6 //
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_H
15 #define INT_ENDIANNESS_H
16
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 0
23 #define _YUGA_BIG_ENDIAN 1
24 #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
25 #define _YUGA_LITTLE_ENDIAN 1
26 #define _YUGA_BIG_ENDIAN 0
27 #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 0
36 #define _YUGA_BIG_ENDIAN 1
37 #elif defined(_LITTLE_ENDIAN)
38 #define _YUGA_LITTLE_ENDIAN 1
39 #define _YUGA_BIG_ENDIAN 0
40 #else // !_LITTLE_ENDIAN
41 #error "unknown endianness"
42 #endif // !_LITTLE_ENDIAN
43
44 #endif // Solaris and AuroraUX.
45
46 // ..
47
48 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) ||   \
49     defined(__minix)
50 #include <sys/endian.h>
51
52 #if _BYTE_ORDER == _BIG_ENDIAN
53 #define _YUGA_LITTLE_ENDIAN 0
54 #define _YUGA_BIG_ENDIAN 1
55 #elif _BYTE_ORDER == _LITTLE_ENDIAN
56 #define _YUGA_LITTLE_ENDIAN 1
57 #define _YUGA_BIG_ENDIAN 0
58 #endif // _BYTE_ORDER
59
60 #endif // *BSD
61
62 #if defined(__OpenBSD__)
63 #include <machine/endian.h>
64
65 #if _BYTE_ORDER == _BIG_ENDIAN
66 #define _YUGA_LITTLE_ENDIAN 0
67 #define _YUGA_BIG_ENDIAN 1
68 #elif _BYTE_ORDER == _LITTLE_ENDIAN
69 #define _YUGA_LITTLE_ENDIAN 1
70 #define _YUGA_BIG_ENDIAN 0
71 #endif // _BYTE_ORDER
72
73 #endif // OpenBSD
74
75 // ..
76
77 // Mac OSX has __BIG_ENDIAN__ or __LITTLE_ENDIAN__ automatically set by the
78 // 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 0
84 #define _YUGA_BIG_ENDIAN 1
85 #endif
86 #endif // __BIG_ENDIAN__
87
88 #ifdef __LITTLE_ENDIAN__
89 #if __LITTLE_ENDIAN__
90 #define _YUGA_LITTLE_ENDIAN 1
91 #define _YUGA_BIG_ENDIAN 0
92 #endif
93 #endif // __LITTLE_ENDIAN__
94
95 #endif // Mac OSX
96
97 // ..
98
99 #if defined(_WIN32)
100
101 #define _YUGA_LITTLE_ENDIAN 1
102 #define _YUGA_BIG_ENDIAN 0
103
104 #endif // Windows
105
106 #endif // Clang or GCC.
107
108 // .
109
110 #if !defined(_YUGA_LITTLE_ENDIAN) || !defined(_YUGA_BIG_ENDIAN)
111 #error Unable to determine endian
112 #endif // Check we found an endianness correctly.
113
114 #endif // INT_ENDIANNESS_H