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