1 | //===-- Definition of macros from limits.h --------------------------------===// |
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 | #ifndef LLVM_LIBC_MACROS_LIMITS_MACROS_H |
10 | #define LLVM_LIBC_MACROS_LIMITS_MACROS_H |
11 | |
12 | // Define all C23 macro constants of limits.h |
13 | |
14 | #ifndef CHAR_BIT |
15 | #ifdef __CHAR_BIT__ |
16 | #define CHAR_BIT __CHAR_BIT__ |
17 | #else |
18 | #define CHAR_BIT 8 |
19 | #endif // __CHAR_BIT__ |
20 | #endif // CHAR_BIT |
21 | |
22 | // TODO: https://github.com/llvm/llvm-project/issues/79358 |
23 | // Define MB_LEN_MAX if missing. |
24 | // clang: MB_LEN_MAX = 1 - |
25 | // https://github.com/llvm/llvm-project/blob/main/clang/lib/Headers/limits.h#L64 |
26 | // glibc: MB_LEN_MAX = 16 - |
27 | // https://github.com/bminor/glibc/blob/master/include/limits.h#L32 |
28 | |
29 | // *_WIDTH macros |
30 | |
31 | #ifndef CHAR_WIDTH |
32 | #define CHAR_WIDTH CHAR_BIT |
33 | #endif // CHAR_WIDTH |
34 | |
35 | #ifndef SCHAR_WIDTH |
36 | #define SCHAR_WIDTH CHAR_BIT |
37 | #endif // SCHAR_WIDTH |
38 | |
39 | #ifndef UCHAR_WIDTH |
40 | #define UCHAR_WIDTH CHAR_BIT |
41 | #endif // UCHAR_WIDTH |
42 | |
43 | #ifndef SHRT_WIDTH |
44 | #ifdef __SHRT_WIDTH__ |
45 | #define SHRT_WIDTH __SHRT_WIDTH__ |
46 | #else |
47 | #define SHRT_WIDTH 16 |
48 | #endif // __SHRT_WIDTH__ |
49 | #endif // SHRT_WIDTH |
50 | |
51 | #ifndef USHRT_WIDTH |
52 | #define USHRT_WIDTH SHRT_WIDTH |
53 | #endif // USHRT_WIDTH |
54 | |
55 | #ifndef INT_WIDTH |
56 | #ifdef __INT_WIDTH__ |
57 | #define INT_WIDTH __INT_WIDTH__ |
58 | #else |
59 | #define INT_WIDTH 32 |
60 | #endif // __INT_WIDTH__ |
61 | #endif // INT_WIDTH |
62 | |
63 | #ifndef UINT_WIDTH |
64 | #define UINT_WIDTH INT_WIDTH |
65 | #endif // UINT_WIDTH |
66 | |
67 | #ifndef LONG_WIDTH |
68 | #ifdef __LONG_WIDTH__ |
69 | #define LONG_WIDTH __LONG_WIDTH__ |
70 | #elif defined(__WORDSIZE) |
71 | #define LONG_WIDTH __WORDSIZE |
72 | #else |
73 | // Use __SIZEOF_LONG__ * CHAR_BIT as backup. This is needed for clang-13 or |
74 | // before. |
75 | #define LONG_WIDTH (__SIZEOF_LONG__ * CHAR_BIT) |
76 | #endif // __LONG_WIDTH__ |
77 | #endif // LONG_WIDTH |
78 | |
79 | #ifndef ULONG_WIDTH |
80 | #define ULONG_WIDTH LONG_WIDTH |
81 | #endif // ULONG_WIDTH |
82 | |
83 | #ifndef LLONG_WIDTH |
84 | #ifdef __LLONG_WIDTH__ |
85 | #define LLONG_WIDTH __LLONG_WIDTH__ |
86 | #else |
87 | #define LLONG_WIDTH 64 |
88 | #endif // __LLONG_WIDTH__ |
89 | #endif // LLONG_WIDTH |
90 | |
91 | #ifndef ULLONG_WIDTH |
92 | #define ULLONG_WIDTH LLONG_WIDTH |
93 | #endif // ULLONG_WIDTH |
94 | |
95 | #ifndef BOOL_WIDTH |
96 | #ifdef __BOOL_WIDTH__ |
97 | #define BOOL_WIDTH __BOOL_WIDTH__ |
98 | #else |
99 | #define BOOL_WIDTH 1 |
100 | #endif // __BOOL_WIDTH__ |
101 | #endif // BOOL_WIDTH |
102 | |
103 | // *_MAX macros |
104 | |
105 | #ifndef SCHAR_MAX |
106 | #ifdef __SCHAR_MAX__ |
107 | #define SCHAR_MAX __SCHAR_MAX__ |
108 | #else |
109 | #define SCHAR_MAX 0x7f |
110 | #endif // __SCHAR_MAX__ |
111 | #endif // SCHAR_MAX |
112 | |
113 | #ifndef UCHAR_MAX |
114 | #define UCHAR_MAX (SCHAR_MAX * 2 + 1) |
115 | #endif // UCHAR_MAX |
116 | |
117 | // Check if char is unsigned. |
118 | #if !defined(__CHAR_UNSIGNED__) && ('\xff' > 0) |
119 | #define __CHAR_UNSIGNED__ |
120 | #endif |
121 | |
122 | #ifndef CHAR_MAX |
123 | #ifdef __CHAR_UNSIGNED__ |
124 | #define CHAR_MAX UCHAR_MAX |
125 | #else |
126 | #define CHAR_MAX SCHAR_MAX |
127 | #endif // __CHAR_UNSIGNED__ |
128 | #endif // CHAR_MAX |
129 | |
130 | #ifndef SHRT_MAX |
131 | #ifdef __SHRT_MAX__ |
132 | #define SHRT_MAX __SHRT_MAX__ |
133 | #else |
134 | #define SHRT_MAX 0x7fff |
135 | #endif // __SHRT_MAX__ |
136 | #endif // SHRT_MAX |
137 | |
138 | #ifndef USHRT_MAX |
139 | #define USHRT_MAX (SHRT_MAX * 2U + 1U) |
140 | #endif // USHRT_MAX |
141 | |
142 | #ifndef INT_MAX |
143 | #ifdef __INT_MAX__ |
144 | #define INT_MAX __INT_MAX__ |
145 | #else |
146 | #define INT_MAX (0 ^ (1 << (INT_WIDTH - 1))) |
147 | #endif // __INT_MAX__ |
148 | #endif // INT_MAX |
149 | |
150 | #ifndef UINT_MAX |
151 | #define UINT_MAX (~0U) |
152 | #endif // UINT_MAX |
153 | |
154 | #ifndef LONG_MAX |
155 | #ifdef __LONG_MAX__ |
156 | #define LONG_MAX __LONG_MAX__ |
157 | #else |
158 | #define LONG_MAX (0L ^ (1L << (LONG_WIDTH - 1))) |
159 | #endif // __LONG_MAX__ |
160 | #endif // LONG_MAX |
161 | |
162 | #ifndef ULONG_MAX |
163 | #define ULONG_MAX (~0UL) |
164 | #endif // ULONG_MAX |
165 | |
166 | #ifndef LLONG_MAX |
167 | #ifdef __LONG_LONG_MAX__ |
168 | #define LLONG_MAX __LONG_LONG_MAX__ |
169 | #else |
170 | #define LLONG_MAX (0LL ^ (1LL << (LLONG_WIDTH - 1))) |
171 | #endif // __LONG_LONG_MAX__ |
172 | #endif // LLONG_MAX |
173 | |
174 | #ifndef ULLONG_MAX |
175 | #define ULLONG_MAX (~0ULL) |
176 | #endif // ULLONG_MAX |
177 | |
178 | // *_MIN macros |
179 | |
180 | #ifndef SCHAR_MIN |
181 | #define SCHAR_MIN (-SCHAR_MAX - 1) |
182 | #endif // SCHAR_MIN |
183 | |
184 | #ifndef UCHAR_MIN |
185 | #define UCHAR_MIN 0 |
186 | #endif // UCHAR_MIN |
187 | |
188 | #ifndef CHAR_MIN |
189 | #ifdef __CHAR_UNSIGNED__ |
190 | #define CHAR_MIN UCHAR_MIN |
191 | #else |
192 | #define CHAR_MIN SCHAR_MIN |
193 | #endif // __CHAR_UNSIGNED__ |
194 | #endif // CHAR_MIN |
195 | |
196 | #ifndef SHRT_MIN |
197 | #define SHRT_MIN (-SHRT_MAX - 1) |
198 | #endif // SHRT_MIN |
199 | |
200 | #ifndef USHRT_MIN |
201 | #define USHRT_MIN 0U |
202 | #endif // USHRT_MIN |
203 | |
204 | #ifndef INT_MIN |
205 | #define INT_MIN (-INT_MAX - 1) |
206 | #endif // INT_MIN |
207 | |
208 | #ifndef UINT_MIN |
209 | #define UINT_MIN 0U |
210 | #endif // UINT_MIN |
211 | |
212 | #ifndef LONG_MIN |
213 | #define LONG_MIN (-LONG_MAX - 1L) |
214 | #endif // LONG_MIN |
215 | |
216 | #ifndef ULONG_MIN |
217 | #define ULONG_MIN 0UL |
218 | #endif // ULONG_MIN |
219 | |
220 | #ifndef LLONG_MIN |
221 | #define LLONG_MIN (-LLONG_MAX - 1LL) |
222 | #endif // LLONG_MIN |
223 | |
224 | #ifndef ULLONG_MIN |
225 | #define ULLONG_MIN 0ULL |
226 | #endif // ULLONG_MIN |
227 | |
228 | #endif // LLVM_LIBC_MACROS_LIMITS_MACROS_H |
229 | |