• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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