1193326Sed/*===---- stdint.h - Standard header for sized integer types --------------===*\ 2193326Sed * 3353358Sdim * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim * See https://llvm.org/LICENSE.txt for license information. 5353358Sdim * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6193326Sed * 7193326Sed\*===----------------------------------------------------------------------===*/ 8193326Sed 9193326Sed#ifndef __CLANG_STDINT_H 10353358Sdim// AIX system headers need stdint.h to be re-enterable while _STD_TYPES_T 11353358Sdim// is defined until an inclusion of it without _STD_TYPES_T occurs, in which 12353358Sdim// case the header guard macro is defined. 13353358Sdim#if !defined(_AIX) || !defined(_STD_TYPES_T) || !defined(__STDC_HOSTED__) 14193326Sed#define __CLANG_STDINT_H 15353358Sdim#endif 16193326Sed 17193326Sed/* If we're hosted, fall back to the system's stdint.h, which might have 18193326Sed * additional definitions. 19193326Sed */ 20276479Sdim#if __STDC_HOSTED__ && __has_include_next(<stdint.h>) 21251662Sdim 22251662Sdim// C99 7.18.3 Limits of other integer types 23251662Sdim// 24251662Sdim// Footnote 219, 220: C++ implementations should define these macros only when 25251662Sdim// __STDC_LIMIT_MACROS is defined before <stdint.h> is included. 26251662Sdim// 27251662Sdim// Footnote 222: C++ implementations should define these macros only when 28251662Sdim// __STDC_CONSTANT_MACROS is defined before <stdint.h> is included. 29251662Sdim// 30251662Sdim// C++11 [cstdint.syn]p2: 31251662Sdim// 32251662Sdim// The macros defined by <cstdint> are provided unconditionally. In particular, 33251662Sdim// the symbols __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS (mentioned in 34251662Sdim// footnotes 219, 220, and 222 in the C standard) play no role in C++. 35251662Sdim// 36251662Sdim// C11 removed the problematic footnotes. 37251662Sdim// 38251662Sdim// Work around this inconsistency by always defining those macros in C++ mode, 39251662Sdim// so that a C library implementation which follows the C99 standard can be 40251662Sdim// used in C++. 41251662Sdim# ifdef __cplusplus 42251662Sdim# if !defined(__STDC_LIMIT_MACROS) 43251662Sdim# define __STDC_LIMIT_MACROS 44251662Sdim# define __STDC_LIMIT_MACROS_DEFINED_BY_CLANG 45251662Sdim# endif 46251662Sdim# if !defined(__STDC_CONSTANT_MACROS) 47251662Sdim# define __STDC_CONSTANT_MACROS 48251662Sdim# define __STDC_CONSTANT_MACROS_DEFINED_BY_CLANG 49251662Sdim# endif 50251662Sdim# endif 51251662Sdim 52193326Sed# include_next <stdint.h> 53251662Sdim 54251662Sdim# ifdef __STDC_LIMIT_MACROS_DEFINED_BY_CLANG 55251662Sdim# undef __STDC_LIMIT_MACROS 56251662Sdim# undef __STDC_LIMIT_MACROS_DEFINED_BY_CLANG 57251662Sdim# endif 58251662Sdim# ifdef __STDC_CONSTANT_MACROS_DEFINED_BY_CLANG 59251662Sdim# undef __STDC_CONSTANT_MACROS 60251662Sdim# undef __STDC_CONSTANT_MACROS_DEFINED_BY_CLANG 61251662Sdim# endif 62251662Sdim 63193326Sed#else 64193326Sed 65193326Sed/* C99 7.18.1.1 Exact-width integer types. 66193326Sed * C99 7.18.1.2 Minimum-width integer types. 67193326Sed * C99 7.18.1.3 Fastest minimum-width integer types. 68199482Srdivacky * 69296417Sdim * The standard requires that exact-width type be defined for 8-, 16-, 32-, and 70199482Srdivacky * 64-bit types if they are implemented. Other exact width types are optional. 71199482Srdivacky * This implementation defines an exact-width types for every integer width 72199482Srdivacky * that is represented in the standard integer types. 73199482Srdivacky * 74199482Srdivacky * The standard also requires minimum-width types be defined for 8-, 16-, 32-, 75199482Srdivacky * and 64-bit widths regardless of whether there are corresponding exact-width 76296417Sdim * types. 77199482Srdivacky * 78221345Sdim * To accommodate targets that are missing types that are exactly 8, 16, 32, or 79199482Srdivacky * 64 bits wide, this implementation takes an approach of cascading 80341825Sdim * redefinitions, redefining __int_leastN_t to successively smaller exact-width 81199482Srdivacky * types. It is therefore important that the types are defined in order of 82199482Srdivacky * descending widths. 83199482Srdivacky * 84199482Srdivacky * We currently assume that the minimum-width types and the fastest 85199482Srdivacky * minimum-width types are the same. This is allowed by the standard, but is 86199482Srdivacky * suboptimal. 87199482Srdivacky * 88199482Srdivacky * In violation of the standard, some targets do not implement a type that is 89296417Sdim * wide enough to represent all of the required widths (8-, 16-, 32-, 64-bit). 90221345Sdim * To accommodate these targets, a required minimum-width type is only 91199482Srdivacky * defined if there exists an exact-width type of equal or greater width. 92193326Sed */ 93193326Sed 94198954Srdivacky#ifdef __INT64_TYPE__ 95199482Srdivacky# ifndef __int8_t_defined /* glibc sys/types.h also defines int64_t*/ 96276479Sdimtypedef __INT64_TYPE__ int64_t; 97199482Srdivacky# endif /* __int8_t_defined */ 98276479Sdimtypedef __UINT64_TYPE__ uint64_t; 99199482Srdivacky# define __int_least64_t int64_t 100199482Srdivacky# define __uint_least64_t uint64_t 101199482Srdivacky# define __int_least32_t int64_t 102199482Srdivacky# define __uint_least32_t uint64_t 103199482Srdivacky# define __int_least16_t int64_t 104199482Srdivacky# define __uint_least16_t uint64_t 105199482Srdivacky# define __int_least8_t int64_t 106199482Srdivacky# define __uint_least8_t uint64_t 107199482Srdivacky#endif /* __INT64_TYPE__ */ 108193326Sed 109199482Srdivacky#ifdef __int_least64_t 110199482Srdivackytypedef __int_least64_t int_least64_t; 111199482Srdivackytypedef __uint_least64_t uint_least64_t; 112199482Srdivackytypedef __int_least64_t int_fast64_t; 113199482Srdivackytypedef __uint_least64_t uint_fast64_t; 114199482Srdivacky#endif /* __int_least64_t */ 115199482Srdivacky 116199482Srdivacky#ifdef __INT56_TYPE__ 117276479Sdimtypedef __INT56_TYPE__ int56_t; 118276479Sdimtypedef __UINT56_TYPE__ uint56_t; 119199482Srdivackytypedef int56_t int_least56_t; 120199482Srdivackytypedef uint56_t uint_least56_t; 121199482Srdivackytypedef int56_t int_fast56_t; 122199482Srdivackytypedef uint56_t uint_fast56_t; 123199482Srdivacky# define __int_least32_t int56_t 124199482Srdivacky# define __uint_least32_t uint56_t 125199482Srdivacky# define __int_least16_t int56_t 126199482Srdivacky# define __uint_least16_t uint56_t 127199482Srdivacky# define __int_least8_t int56_t 128199482Srdivacky# define __uint_least8_t uint56_t 129199482Srdivacky#endif /* __INT56_TYPE__ */ 130199482Srdivacky 131199482Srdivacky 132199482Srdivacky#ifdef __INT48_TYPE__ 133276479Sdimtypedef __INT48_TYPE__ int48_t; 134276479Sdimtypedef __UINT48_TYPE__ uint48_t; 135199482Srdivackytypedef int48_t int_least48_t; 136199482Srdivackytypedef uint48_t uint_least48_t; 137199482Srdivackytypedef int48_t int_fast48_t; 138199482Srdivackytypedef uint48_t uint_fast48_t; 139199482Srdivacky# define __int_least32_t int48_t 140199482Srdivacky# define __uint_least32_t uint48_t 141199482Srdivacky# define __int_least16_t int48_t 142199482Srdivacky# define __uint_least16_t uint48_t 143199482Srdivacky# define __int_least8_t int48_t 144199482Srdivacky# define __uint_least8_t uint48_t 145199482Srdivacky#endif /* __INT48_TYPE__ */ 146199482Srdivacky 147199482Srdivacky 148199482Srdivacky#ifdef __INT40_TYPE__ 149276479Sdimtypedef __INT40_TYPE__ int40_t; 150276479Sdimtypedef __UINT40_TYPE__ uint40_t; 151199482Srdivackytypedef int40_t int_least40_t; 152199482Srdivackytypedef uint40_t uint_least40_t; 153199482Srdivackytypedef int40_t int_fast40_t; 154199482Srdivackytypedef uint40_t uint_fast40_t; 155199482Srdivacky# define __int_least32_t int40_t 156199482Srdivacky# define __uint_least32_t uint40_t 157199482Srdivacky# define __int_least16_t int40_t 158199482Srdivacky# define __uint_least16_t uint40_t 159199482Srdivacky# define __int_least8_t int40_t 160199482Srdivacky# define __uint_least8_t uint40_t 161199482Srdivacky#endif /* __INT40_TYPE__ */ 162199482Srdivacky 163199482Srdivacky 164199482Srdivacky#ifdef __INT32_TYPE__ 165199482Srdivacky 166199482Srdivacky# ifndef __int8_t_defined /* glibc sys/types.h also defines int32_t*/ 167276479Sdimtypedef __INT32_TYPE__ int32_t; 168199482Srdivacky# endif /* __int8_t_defined */ 169199482Srdivacky 170199482Srdivacky# ifndef __uint32_t_defined /* more glibc compatibility */ 171199482Srdivacky# define __uint32_t_defined 172276479Sdimtypedef __UINT32_TYPE__ uint32_t; 173199482Srdivacky# endif /* __uint32_t_defined */ 174193326Sed 175199482Srdivacky# define __int_least32_t int32_t 176199482Srdivacky# define __uint_least32_t uint32_t 177199482Srdivacky# define __int_least16_t int32_t 178199482Srdivacky# define __uint_least16_t uint32_t 179199482Srdivacky# define __int_least8_t int32_t 180199482Srdivacky# define __uint_least8_t uint32_t 181199482Srdivacky#endif /* __INT32_TYPE__ */ 182198954Srdivacky 183199482Srdivacky#ifdef __int_least32_t 184199482Srdivackytypedef __int_least32_t int_least32_t; 185199482Srdivackytypedef __uint_least32_t uint_least32_t; 186199482Srdivackytypedef __int_least32_t int_fast32_t; 187199482Srdivackytypedef __uint_least32_t uint_fast32_t; 188199482Srdivacky#endif /* __int_least32_t */ 189199482Srdivacky 190199482Srdivacky#ifdef __INT24_TYPE__ 191276479Sdimtypedef __INT24_TYPE__ int24_t; 192276479Sdimtypedef __UINT24_TYPE__ uint24_t; 193199482Srdivackytypedef int24_t int_least24_t; 194199482Srdivackytypedef uint24_t uint_least24_t; 195199482Srdivackytypedef int24_t int_fast24_t; 196199482Srdivackytypedef uint24_t uint_fast24_t; 197199482Srdivacky# define __int_least16_t int24_t 198199482Srdivacky# define __uint_least16_t uint24_t 199199482Srdivacky# define __int_least8_t int24_t 200199482Srdivacky# define __uint_least8_t uint24_t 201199482Srdivacky#endif /* __INT24_TYPE__ */ 202199482Srdivacky 203199482Srdivacky#ifdef __INT16_TYPE__ 204199482Srdivacky#ifndef __int8_t_defined /* glibc sys/types.h also defines int16_t*/ 205276479Sdimtypedef __INT16_TYPE__ int16_t; 206199482Srdivacky#endif /* __int8_t_defined */ 207276479Sdimtypedef __UINT16_TYPE__ uint16_t; 208199482Srdivacky# define __int_least16_t int16_t 209199482Srdivacky# define __uint_least16_t uint16_t 210199482Srdivacky# define __int_least8_t int16_t 211199482Srdivacky# define __uint_least8_t uint16_t 212199482Srdivacky#endif /* __INT16_TYPE__ */ 213193326Sed 214199482Srdivacky#ifdef __int_least16_t 215199482Srdivackytypedef __int_least16_t int_least16_t; 216199482Srdivackytypedef __uint_least16_t uint_least16_t; 217199482Srdivackytypedef __int_least16_t int_fast16_t; 218199482Srdivackytypedef __uint_least16_t uint_fast16_t; 219199482Srdivacky#endif /* __int_least16_t */ 220193326Sed 221199482Srdivacky 222199482Srdivacky#ifdef __INT8_TYPE__ 223199482Srdivacky#ifndef __int8_t_defined /* glibc sys/types.h also defines int8_t*/ 224276479Sdimtypedef __INT8_TYPE__ int8_t; 225199482Srdivacky#endif /* __int8_t_defined */ 226276479Sdimtypedef __UINT8_TYPE__ uint8_t; 227199482Srdivacky# define __int_least8_t int8_t 228199482Srdivacky# define __uint_least8_t uint8_t 229199482Srdivacky#endif /* __INT8_TYPE__ */ 230198954Srdivacky 231199482Srdivacky#ifdef __int_least8_t 232199482Srdivackytypedef __int_least8_t int_least8_t; 233199482Srdivackytypedef __uint_least8_t uint_least8_t; 234199482Srdivackytypedef __int_least8_t int_fast8_t; 235199482Srdivackytypedef __uint_least8_t uint_fast8_t; 236199482Srdivacky#endif /* __int_least8_t */ 237199482Srdivacky 238198954Srdivacky/* prevent glibc sys/types.h from defining conflicting types */ 239296417Sdim#ifndef __int8_t_defined 240198954Srdivacky# define __int8_t_defined 241198954Srdivacky#endif /* __int8_t_defined */ 242198954Srdivacky 243193326Sed/* C99 7.18.1.4 Integer types capable of holding object pointers. 244193326Sed */ 245199512Srdivacky#define __stdint_join3(a,b,c) a ## b ## c 246199512Srdivacky 247207619Srdivacky#ifndef _INTPTR_T 248193326Sed#ifndef __intptr_t_defined 249321369Sdimtypedef __INTPTR_TYPE__ intptr_t; 250193326Sed#define __intptr_t_defined 251207619Srdivacky#define _INTPTR_T 252193326Sed#endif 253207619Srdivacky#endif 254207619Srdivacky 255207619Srdivacky#ifndef _UINTPTR_T 256321369Sdimtypedef __UINTPTR_TYPE__ uintptr_t; 257207619Srdivacky#define _UINTPTR_T 258207619Srdivacky#endif 259193326Sed 260193326Sed/* C99 7.18.1.5 Greatest-width integer types. 261193326Sed */ 262210299Sedtypedef __INTMAX_TYPE__ intmax_t; 263210299Sedtypedef __UINTMAX_TYPE__ uintmax_t; 264193326Sed 265198954Srdivacky/* C99 7.18.4 Macros for minimum-width integer constants. 266198954Srdivacky * 267199482Srdivacky * The standard requires that integer constant macros be defined for all the 268199482Srdivacky * minimum-width types defined above. As 8-, 16-, 32-, and 64-bit minimum-width 269296417Sdim * types are required, the corresponding integer constant macros are defined 270199482Srdivacky * here. This implementation also defines minimum-width types for every other 271296417Sdim * integer width that the target implements, so corresponding macros are 272199482Srdivacky * defined below, too. 273199482Srdivacky * 274199482Srdivacky * These macros are defined using the same successive-shrinking approach as 275199482Srdivacky * the type definitions above. It is likewise important that macros are defined 276199482Srdivacky * in order of decending width. 277199482Srdivacky * 278198954Srdivacky * Note that C++ should not check __STDC_CONSTANT_MACROS here, contrary to the 279198954Srdivacky * claims of the C standard (see C++ 18.3.1p2, [cstdint.syn]). 280198954Srdivacky */ 281198954Srdivacky 282199482Srdivacky#define __int_c_join(a, b) a ## b 283199482Srdivacky#define __int_c(v, suffix) __int_c_join(v, suffix) 284199482Srdivacky#define __uint_c(v, suffix) __int_c_join(v##U, suffix) 285199482Srdivacky 286199482Srdivacky 287198954Srdivacky#ifdef __INT64_TYPE__ 288199482Srdivacky# ifdef __INT64_C_SUFFIX__ 289199482Srdivacky# define __int64_c_suffix __INT64_C_SUFFIX__ 290199482Srdivacky# define __int32_c_suffix __INT64_C_SUFFIX__ 291199482Srdivacky# define __int16_c_suffix __INT64_C_SUFFIX__ 292199482Srdivacky# define __int8_c_suffix __INT64_C_SUFFIX__ 293199482Srdivacky# else 294199482Srdivacky# undef __int64_c_suffix 295199482Srdivacky# undef __int32_c_suffix 296199482Srdivacky# undef __int16_c_suffix 297199482Srdivacky# undef __int8_c_suffix 298199482Srdivacky# endif /* __INT64_C_SUFFIX__ */ 299199482Srdivacky#endif /* __INT64_TYPE__ */ 300198954Srdivacky 301199482Srdivacky#ifdef __int_least64_t 302199482Srdivacky# ifdef __int64_c_suffix 303199482Srdivacky# define INT64_C(v) __int_c(v, __int64_c_suffix) 304199482Srdivacky# define UINT64_C(v) __uint_c(v, __int64_c_suffix) 305199482Srdivacky# else 306199482Srdivacky# define INT64_C(v) v 307199482Srdivacky# define UINT64_C(v) v ## U 308199482Srdivacky# endif /* __int64_c_suffix */ 309199482Srdivacky#endif /* __int_least64_t */ 310198954Srdivacky 311199482Srdivacky 312199482Srdivacky#ifdef __INT56_TYPE__ 313199482Srdivacky# ifdef __INT56_C_SUFFIX__ 314199482Srdivacky# define INT56_C(v) __int_c(v, __INT56_C_SUFFIX__) 315199482Srdivacky# define UINT56_C(v) __uint_c(v, __INT56_C_SUFFIX__) 316199482Srdivacky# define __int32_c_suffix __INT56_C_SUFFIX__ 317199482Srdivacky# define __int16_c_suffix __INT56_C_SUFFIX__ 318199482Srdivacky# define __int8_c_suffix __INT56_C_SUFFIX__ 319199482Srdivacky# else 320199482Srdivacky# define INT56_C(v) v 321199482Srdivacky# define UINT56_C(v) v ## U 322199482Srdivacky# undef __int32_c_suffix 323199482Srdivacky# undef __int16_c_suffix 324199482Srdivacky# undef __int8_c_suffix 325199482Srdivacky# endif /* __INT56_C_SUFFIX__ */ 326199482Srdivacky#endif /* __INT56_TYPE__ */ 327199482Srdivacky 328199482Srdivacky 329199482Srdivacky#ifdef __INT48_TYPE__ 330199482Srdivacky# ifdef __INT48_C_SUFFIX__ 331199482Srdivacky# define INT48_C(v) __int_c(v, __INT48_C_SUFFIX__) 332199482Srdivacky# define UINT48_C(v) __uint_c(v, __INT48_C_SUFFIX__) 333199482Srdivacky# define __int32_c_suffix __INT48_C_SUFFIX__ 334199482Srdivacky# define __int16_c_suffix __INT48_C_SUFFIX__ 335199482Srdivacky# define __int8_c_suffix __INT48_C_SUFFIX__ 336199482Srdivacky# else 337199482Srdivacky# define INT48_C(v) v 338199482Srdivacky# define UINT48_C(v) v ## U 339199482Srdivacky# undef __int32_c_suffix 340199482Srdivacky# undef __int16_c_suffix 341199482Srdivacky# undef __int8_c_suffix 342199482Srdivacky# endif /* __INT48_C_SUFFIX__ */ 343199482Srdivacky#endif /* __INT48_TYPE__ */ 344199482Srdivacky 345199482Srdivacky 346199482Srdivacky#ifdef __INT40_TYPE__ 347199482Srdivacky# ifdef __INT40_C_SUFFIX__ 348199482Srdivacky# define INT40_C(v) __int_c(v, __INT40_C_SUFFIX__) 349199482Srdivacky# define UINT40_C(v) __uint_c(v, __INT40_C_SUFFIX__) 350199482Srdivacky# define __int32_c_suffix __INT40_C_SUFFIX__ 351199482Srdivacky# define __int16_c_suffix __INT40_C_SUFFIX__ 352199482Srdivacky# define __int8_c_suffix __INT40_C_SUFFIX__ 353199482Srdivacky# else 354199482Srdivacky# define INT40_C(v) v 355199482Srdivacky# define UINT40_C(v) v ## U 356199482Srdivacky# undef __int32_c_suffix 357199482Srdivacky# undef __int16_c_suffix 358199482Srdivacky# undef __int8_c_suffix 359199482Srdivacky# endif /* __INT40_C_SUFFIX__ */ 360199482Srdivacky#endif /* __INT40_TYPE__ */ 361199482Srdivacky 362199482Srdivacky 363199482Srdivacky#ifdef __INT32_TYPE__ 364199482Srdivacky# ifdef __INT32_C_SUFFIX__ 365199482Srdivacky# define __int32_c_suffix __INT32_C_SUFFIX__ 366199482Srdivacky# define __int16_c_suffix __INT32_C_SUFFIX__ 367199482Srdivacky# define __int8_c_suffix __INT32_C_SUFFIX__ 368199482Srdivacky#else 369199482Srdivacky# undef __int32_c_suffix 370199482Srdivacky# undef __int16_c_suffix 371199482Srdivacky# undef __int8_c_suffix 372199482Srdivacky# endif /* __INT32_C_SUFFIX__ */ 373199482Srdivacky#endif /* __INT32_TYPE__ */ 374199482Srdivacky 375199482Srdivacky#ifdef __int_least32_t 376199482Srdivacky# ifdef __int32_c_suffix 377199482Srdivacky# define INT32_C(v) __int_c(v, __int32_c_suffix) 378199482Srdivacky# define UINT32_C(v) __uint_c(v, __int32_c_suffix) 379199482Srdivacky# else 380199482Srdivacky# define INT32_C(v) v 381199482Srdivacky# define UINT32_C(v) v ## U 382199482Srdivacky# endif /* __int32_c_suffix */ 383199482Srdivacky#endif /* __int_least32_t */ 384199482Srdivacky 385199482Srdivacky 386199482Srdivacky#ifdef __INT24_TYPE__ 387199482Srdivacky# ifdef __INT24_C_SUFFIX__ 388199482Srdivacky# define INT24_C(v) __int_c(v, __INT24_C_SUFFIX__) 389199482Srdivacky# define UINT24_C(v) __uint_c(v, __INT24_C_SUFFIX__) 390199482Srdivacky# define __int16_c_suffix __INT24_C_SUFFIX__ 391199482Srdivacky# define __int8_c_suffix __INT24_C_SUFFIX__ 392199482Srdivacky# else 393199482Srdivacky# define INT24_C(v) v 394199482Srdivacky# define UINT24_C(v) v ## U 395199482Srdivacky# undef __int16_c_suffix 396199482Srdivacky# undef __int8_c_suffix 397199482Srdivacky# endif /* __INT24_C_SUFFIX__ */ 398199482Srdivacky#endif /* __INT24_TYPE__ */ 399199482Srdivacky 400199482Srdivacky 401199482Srdivacky#ifdef __INT16_TYPE__ 402199482Srdivacky# ifdef __INT16_C_SUFFIX__ 403199482Srdivacky# define __int16_c_suffix __INT16_C_SUFFIX__ 404199482Srdivacky# define __int8_c_suffix __INT16_C_SUFFIX__ 405199482Srdivacky#else 406199482Srdivacky# undef __int16_c_suffix 407199482Srdivacky# undef __int8_c_suffix 408199482Srdivacky# endif /* __INT16_C_SUFFIX__ */ 409199482Srdivacky#endif /* __INT16_TYPE__ */ 410199482Srdivacky 411199482Srdivacky#ifdef __int_least16_t 412199482Srdivacky# ifdef __int16_c_suffix 413199482Srdivacky# define INT16_C(v) __int_c(v, __int16_c_suffix) 414199482Srdivacky# define UINT16_C(v) __uint_c(v, __int16_c_suffix) 415199482Srdivacky# else 416199482Srdivacky# define INT16_C(v) v 417199482Srdivacky# define UINT16_C(v) v ## U 418199482Srdivacky# endif /* __int16_c_suffix */ 419199482Srdivacky#endif /* __int_least16_t */ 420199482Srdivacky 421199482Srdivacky 422199482Srdivacky#ifdef __INT8_TYPE__ 423199482Srdivacky# ifdef __INT8_C_SUFFIX__ 424199482Srdivacky# define __int8_c_suffix __INT8_C_SUFFIX__ 425199482Srdivacky#else 426199482Srdivacky# undef __int8_c_suffix 427199482Srdivacky# endif /* __INT8_C_SUFFIX__ */ 428199482Srdivacky#endif /* __INT8_TYPE__ */ 429199482Srdivacky 430199482Srdivacky#ifdef __int_least8_t 431199482Srdivacky# ifdef __int8_c_suffix 432199482Srdivacky# define INT8_C(v) __int_c(v, __int8_c_suffix) 433199482Srdivacky# define UINT8_C(v) __uint_c(v, __int8_c_suffix) 434199482Srdivacky# else 435199482Srdivacky# define INT8_C(v) v 436199482Srdivacky# define UINT8_C(v) v ## U 437199482Srdivacky# endif /* __int8_c_suffix */ 438199482Srdivacky#endif /* __int_least8_t */ 439199482Srdivacky 440199482Srdivacky 441296417Sdim/* C99 7.18.2.1 Limits of exact-width integer types. 442193326Sed * C99 7.18.2.2 Limits of minimum-width integer types. 443193326Sed * C99 7.18.2.3 Limits of fastest minimum-width integer types. 444193326Sed * 445199482Srdivacky * The presence of limit macros are completely optional in C99. This 446199482Srdivacky * implementation defines limits for all of the types (exact- and 447199482Srdivacky * minimum-width) that it defines above, using the limits of the minimum-width 448199482Srdivacky * type for any types that do not have exact-width representations. 449199482Srdivacky * 450199482Srdivacky * As in the type definitions, this section takes an approach of 451199482Srdivacky * successive-shrinking to determine which limits to use for the standard (8, 452199482Srdivacky * 16, 32, 64) bit widths when they don't have exact representations. It is 453341825Sdim * therefore important that the definitions be kept in order of decending 454199482Srdivacky * widths. 455199482Srdivacky * 456193326Sed * Note that C++ should not check __STDC_LIMIT_MACROS here, contrary to the 457193326Sed * claims of the C standard (see C++ 18.3.1p2, [cstdint.syn]). 458193326Sed */ 459193326Sed 460193326Sed#ifdef __INT64_TYPE__ 461199482Srdivacky# define INT64_MAX INT64_C( 9223372036854775807) 462199482Srdivacky# define INT64_MIN (-INT64_C( 9223372036854775807)-1) 463199482Srdivacky# define UINT64_MAX UINT64_C(18446744073709551615) 464199482Srdivacky# define __INT_LEAST64_MIN INT64_MIN 465199482Srdivacky# define __INT_LEAST64_MAX INT64_MAX 466199482Srdivacky# define __UINT_LEAST64_MAX UINT64_MAX 467199482Srdivacky# define __INT_LEAST32_MIN INT64_MIN 468199482Srdivacky# define __INT_LEAST32_MAX INT64_MAX 469199482Srdivacky# define __UINT_LEAST32_MAX UINT64_MAX 470199482Srdivacky# define __INT_LEAST16_MIN INT64_MIN 471199482Srdivacky# define __INT_LEAST16_MAX INT64_MAX 472199482Srdivacky# define __UINT_LEAST16_MAX UINT64_MAX 473199482Srdivacky# define __INT_LEAST8_MIN INT64_MIN 474199482Srdivacky# define __INT_LEAST8_MAX INT64_MAX 475199482Srdivacky# define __UINT_LEAST8_MAX UINT64_MAX 476199482Srdivacky#endif /* __INT64_TYPE__ */ 477193326Sed 478199482Srdivacky#ifdef __INT_LEAST64_MIN 479199482Srdivacky# define INT_LEAST64_MIN __INT_LEAST64_MIN 480199482Srdivacky# define INT_LEAST64_MAX __INT_LEAST64_MAX 481199482Srdivacky# define UINT_LEAST64_MAX __UINT_LEAST64_MAX 482199482Srdivacky# define INT_FAST64_MIN __INT_LEAST64_MIN 483199482Srdivacky# define INT_FAST64_MAX __INT_LEAST64_MAX 484199482Srdivacky# define UINT_FAST64_MAX __UINT_LEAST64_MAX 485199482Srdivacky#endif /* __INT_LEAST64_MIN */ 486198954Srdivacky 487198954Srdivacky 488199482Srdivacky#ifdef __INT56_TYPE__ 489199482Srdivacky# define INT56_MAX INT56_C(36028797018963967) 490199482Srdivacky# define INT56_MIN (-INT56_C(36028797018963967)-1) 491199482Srdivacky# define UINT56_MAX UINT56_C(72057594037927935) 492199482Srdivacky# define INT_LEAST56_MIN INT56_MIN 493199482Srdivacky# define INT_LEAST56_MAX INT56_MAX 494199482Srdivacky# define UINT_LEAST56_MAX UINT56_MAX 495199482Srdivacky# define INT_FAST56_MIN INT56_MIN 496199482Srdivacky# define INT_FAST56_MAX INT56_MAX 497199482Srdivacky# define UINT_FAST56_MAX UINT56_MAX 498199482Srdivacky# define __INT_LEAST32_MIN INT56_MIN 499199482Srdivacky# define __INT_LEAST32_MAX INT56_MAX 500199482Srdivacky# define __UINT_LEAST32_MAX UINT56_MAX 501199482Srdivacky# define __INT_LEAST16_MIN INT56_MIN 502199482Srdivacky# define __INT_LEAST16_MAX INT56_MAX 503199482Srdivacky# define __UINT_LEAST16_MAX UINT56_MAX 504199482Srdivacky# define __INT_LEAST8_MIN INT56_MIN 505199482Srdivacky# define __INT_LEAST8_MAX INT56_MAX 506199482Srdivacky# define __UINT_LEAST8_MAX UINT56_MAX 507199482Srdivacky#endif /* __INT56_TYPE__ */ 508198954Srdivacky 509199482Srdivacky 510199482Srdivacky#ifdef __INT48_TYPE__ 511199482Srdivacky# define INT48_MAX INT48_C(140737488355327) 512199482Srdivacky# define INT48_MIN (-INT48_C(140737488355327)-1) 513199482Srdivacky# define UINT48_MAX UINT48_C(281474976710655) 514199482Srdivacky# define INT_LEAST48_MIN INT48_MIN 515199482Srdivacky# define INT_LEAST48_MAX INT48_MAX 516199482Srdivacky# define UINT_LEAST48_MAX UINT48_MAX 517199482Srdivacky# define INT_FAST48_MIN INT48_MIN 518199482Srdivacky# define INT_FAST48_MAX INT48_MAX 519199482Srdivacky# define UINT_FAST48_MAX UINT48_MAX 520199482Srdivacky# define __INT_LEAST32_MIN INT48_MIN 521199482Srdivacky# define __INT_LEAST32_MAX INT48_MAX 522199482Srdivacky# define __UINT_LEAST32_MAX UINT48_MAX 523199482Srdivacky# define __INT_LEAST16_MIN INT48_MIN 524199482Srdivacky# define __INT_LEAST16_MAX INT48_MAX 525199482Srdivacky# define __UINT_LEAST16_MAX UINT48_MAX 526199482Srdivacky# define __INT_LEAST8_MIN INT48_MIN 527199482Srdivacky# define __INT_LEAST8_MAX INT48_MAX 528199482Srdivacky# define __UINT_LEAST8_MAX UINT48_MAX 529199482Srdivacky#endif /* __INT48_TYPE__ */ 530199482Srdivacky 531199482Srdivacky 532199482Srdivacky#ifdef __INT40_TYPE__ 533199482Srdivacky# define INT40_MAX INT40_C(549755813887) 534199482Srdivacky# define INT40_MIN (-INT40_C(549755813887)-1) 535199482Srdivacky# define UINT40_MAX UINT40_C(1099511627775) 536199482Srdivacky# define INT_LEAST40_MIN INT40_MIN 537199482Srdivacky# define INT_LEAST40_MAX INT40_MAX 538199482Srdivacky# define UINT_LEAST40_MAX UINT40_MAX 539199482Srdivacky# define INT_FAST40_MIN INT40_MIN 540199482Srdivacky# define INT_FAST40_MAX INT40_MAX 541199482Srdivacky# define UINT_FAST40_MAX UINT40_MAX 542199482Srdivacky# define __INT_LEAST32_MIN INT40_MIN 543199482Srdivacky# define __INT_LEAST32_MAX INT40_MAX 544199482Srdivacky# define __UINT_LEAST32_MAX UINT40_MAX 545199482Srdivacky# define __INT_LEAST16_MIN INT40_MIN 546199482Srdivacky# define __INT_LEAST16_MAX INT40_MAX 547199482Srdivacky# define __UINT_LEAST16_MAX UINT40_MAX 548199482Srdivacky# define __INT_LEAST8_MIN INT40_MIN 549199482Srdivacky# define __INT_LEAST8_MAX INT40_MAX 550199482Srdivacky# define __UINT_LEAST8_MAX UINT40_MAX 551199482Srdivacky#endif /* __INT40_TYPE__ */ 552199482Srdivacky 553199482Srdivacky 554199482Srdivacky#ifdef __INT32_TYPE__ 555199482Srdivacky# define INT32_MAX INT32_C(2147483647) 556199482Srdivacky# define INT32_MIN (-INT32_C(2147483647)-1) 557199482Srdivacky# define UINT32_MAX UINT32_C(4294967295) 558199482Srdivacky# define __INT_LEAST32_MIN INT32_MIN 559199482Srdivacky# define __INT_LEAST32_MAX INT32_MAX 560199482Srdivacky# define __UINT_LEAST32_MAX UINT32_MAX 561199482Srdivacky# define __INT_LEAST16_MIN INT32_MIN 562199482Srdivacky# define __INT_LEAST16_MAX INT32_MAX 563199482Srdivacky# define __UINT_LEAST16_MAX UINT32_MAX 564199482Srdivacky# define __INT_LEAST8_MIN INT32_MIN 565199482Srdivacky# define __INT_LEAST8_MAX INT32_MAX 566199482Srdivacky# define __UINT_LEAST8_MAX UINT32_MAX 567199482Srdivacky#endif /* __INT32_TYPE__ */ 568199482Srdivacky 569199482Srdivacky#ifdef __INT_LEAST32_MIN 570199482Srdivacky# define INT_LEAST32_MIN __INT_LEAST32_MIN 571199482Srdivacky# define INT_LEAST32_MAX __INT_LEAST32_MAX 572199482Srdivacky# define UINT_LEAST32_MAX __UINT_LEAST32_MAX 573199482Srdivacky# define INT_FAST32_MIN __INT_LEAST32_MIN 574199482Srdivacky# define INT_FAST32_MAX __INT_LEAST32_MAX 575199482Srdivacky# define UINT_FAST32_MAX __UINT_LEAST32_MAX 576199482Srdivacky#endif /* __INT_LEAST32_MIN */ 577199482Srdivacky 578199482Srdivacky 579199482Srdivacky#ifdef __INT24_TYPE__ 580199482Srdivacky# define INT24_MAX INT24_C(8388607) 581199482Srdivacky# define INT24_MIN (-INT24_C(8388607)-1) 582199482Srdivacky# define UINT24_MAX UINT24_C(16777215) 583199482Srdivacky# define INT_LEAST24_MIN INT24_MIN 584199482Srdivacky# define INT_LEAST24_MAX INT24_MAX 585199482Srdivacky# define UINT_LEAST24_MAX UINT24_MAX 586199482Srdivacky# define INT_FAST24_MIN INT24_MIN 587199482Srdivacky# define INT_FAST24_MAX INT24_MAX 588199482Srdivacky# define UINT_FAST24_MAX UINT24_MAX 589199482Srdivacky# define __INT_LEAST16_MIN INT24_MIN 590199482Srdivacky# define __INT_LEAST16_MAX INT24_MAX 591199482Srdivacky# define __UINT_LEAST16_MAX UINT24_MAX 592199482Srdivacky# define __INT_LEAST8_MIN INT24_MIN 593199482Srdivacky# define __INT_LEAST8_MAX INT24_MAX 594199482Srdivacky# define __UINT_LEAST8_MAX UINT24_MAX 595199482Srdivacky#endif /* __INT24_TYPE__ */ 596199482Srdivacky 597199482Srdivacky 598199482Srdivacky#ifdef __INT16_TYPE__ 599199482Srdivacky#define INT16_MAX INT16_C(32767) 600199482Srdivacky#define INT16_MIN (-INT16_C(32767)-1) 601199482Srdivacky#define UINT16_MAX UINT16_C(65535) 602199482Srdivacky# define __INT_LEAST16_MIN INT16_MIN 603199482Srdivacky# define __INT_LEAST16_MAX INT16_MAX 604199482Srdivacky# define __UINT_LEAST16_MAX UINT16_MAX 605199482Srdivacky# define __INT_LEAST8_MIN INT16_MIN 606199482Srdivacky# define __INT_LEAST8_MAX INT16_MAX 607199482Srdivacky# define __UINT_LEAST8_MAX UINT16_MAX 608199482Srdivacky#endif /* __INT16_TYPE__ */ 609199482Srdivacky 610199482Srdivacky#ifdef __INT_LEAST16_MIN 611199482Srdivacky# define INT_LEAST16_MIN __INT_LEAST16_MIN 612199482Srdivacky# define INT_LEAST16_MAX __INT_LEAST16_MAX 613199482Srdivacky# define UINT_LEAST16_MAX __UINT_LEAST16_MAX 614199482Srdivacky# define INT_FAST16_MIN __INT_LEAST16_MIN 615199482Srdivacky# define INT_FAST16_MAX __INT_LEAST16_MAX 616199482Srdivacky# define UINT_FAST16_MAX __UINT_LEAST16_MAX 617199482Srdivacky#endif /* __INT_LEAST16_MIN */ 618199482Srdivacky 619199482Srdivacky 620199482Srdivacky#ifdef __INT8_TYPE__ 621199482Srdivacky# define INT8_MAX INT8_C(127) 622199482Srdivacky# define INT8_MIN (-INT8_C(127)-1) 623199482Srdivacky# define UINT8_MAX UINT8_C(255) 624199482Srdivacky# define __INT_LEAST8_MIN INT8_MIN 625199482Srdivacky# define __INT_LEAST8_MAX INT8_MAX 626199482Srdivacky# define __UINT_LEAST8_MAX UINT8_MAX 627199482Srdivacky#endif /* __INT8_TYPE__ */ 628199482Srdivacky 629199482Srdivacky#ifdef __INT_LEAST8_MIN 630199482Srdivacky# define INT_LEAST8_MIN __INT_LEAST8_MIN 631199482Srdivacky# define INT_LEAST8_MAX __INT_LEAST8_MAX 632199482Srdivacky# define UINT_LEAST8_MAX __UINT_LEAST8_MAX 633199482Srdivacky# define INT_FAST8_MIN __INT_LEAST8_MIN 634199482Srdivacky# define INT_FAST8_MAX __INT_LEAST8_MAX 635199482Srdivacky# define UINT_FAST8_MAX __UINT_LEAST8_MAX 636199482Srdivacky#endif /* __INT_LEAST8_MIN */ 637199482Srdivacky 638221345Sdim/* Some utility macros */ 639221345Sdim#define __INTN_MIN(n) __stdint_join3( INT, n, _MIN) 640221345Sdim#define __INTN_MAX(n) __stdint_join3( INT, n, _MAX) 641221345Sdim#define __UINTN_MAX(n) __stdint_join3(UINT, n, _MAX) 642221345Sdim#define __INTN_C(n, v) __stdint_join3( INT, n, _C(v)) 643221345Sdim#define __UINTN_C(n, v) __stdint_join3(UINT, n, _C(v)) 644221345Sdim 645193326Sed/* C99 7.18.2.4 Limits of integer types capable of holding object pointers. */ 646193326Sed/* C99 7.18.3 Limits of other integer types. */ 647193326Sed 648321369Sdim#define INTPTR_MIN (-__INTPTR_MAX__-1) 649321369Sdim#define INTPTR_MAX __INTPTR_MAX__ 650321369Sdim#define UINTPTR_MAX __UINTPTR_MAX__ 651321369Sdim#define PTRDIFF_MIN (-__PTRDIFF_MAX__-1) 652321369Sdim#define PTRDIFF_MAX __PTRDIFF_MAX__ 653321369Sdim#define SIZE_MAX __SIZE_MAX__ 654199512Srdivacky 655251662Sdim/* ISO9899:2011 7.20 (C11 Annex K): Define RSIZE_MAX if __STDC_WANT_LIB_EXT1__ 656251662Sdim * is enabled. */ 657251662Sdim#if defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1 658251662Sdim#define RSIZE_MAX (SIZE_MAX >> 1) 659251662Sdim#endif 660251662Sdim 661193326Sed/* C99 7.18.2.5 Limits of greatest-width integer types. */ 662321369Sdim#define INTMAX_MIN (-__INTMAX_MAX__-1) 663321369Sdim#define INTMAX_MAX __INTMAX_MAX__ 664321369Sdim#define UINTMAX_MAX __UINTMAX_MAX__ 665193326Sed 666193326Sed/* C99 7.18.3 Limits of other integer types. */ 667199990Srdivacky#define SIG_ATOMIC_MIN __INTN_MIN(__SIG_ATOMIC_WIDTH__) 668199990Srdivacky#define SIG_ATOMIC_MAX __INTN_MAX(__SIG_ATOMIC_WIDTH__) 669221345Sdim#ifdef __WINT_UNSIGNED__ 670221345Sdim# define WINT_MIN __UINTN_C(__WINT_WIDTH__, 0) 671221345Sdim# define WINT_MAX __UINTN_MAX(__WINT_WIDTH__) 672221345Sdim#else 673221345Sdim# define WINT_MIN __INTN_MIN(__WINT_WIDTH__) 674221345Sdim# define WINT_MAX __INTN_MAX(__WINT_WIDTH__) 675221345Sdim#endif 676193326Sed 677193326Sed#ifndef WCHAR_MAX 678221345Sdim# define WCHAR_MAX __WCHAR_MAX__ 679193326Sed#endif 680193326Sed#ifndef WCHAR_MIN 681221345Sdim# if __WCHAR_MAX__ == __INTN_MAX(__WCHAR_WIDTH__) 682221345Sdim# define WCHAR_MIN __INTN_MIN(__WCHAR_WIDTH__) 683221345Sdim# else 684221345Sdim# define WCHAR_MIN __UINTN_C(__WCHAR_WIDTH__, 0) 685221345Sdim# endif 686193326Sed#endif 687193326Sed 688193326Sed/* 7.18.4.2 Macros for greatest-width integer constants. */ 689321369Sdim#define INTMAX_C(v) __int_c(v, __INTMAX_C_SUFFIX__) 690321369Sdim#define UINTMAX_C(v) __int_c(v, __UINTMAX_C_SUFFIX__) 691199990Srdivacky 692193326Sed#endif /* __STDC_HOSTED__ */ 693193326Sed#endif /* __CLANG_STDINT_H */ 694