> I'm not aware of any reason those macros need to have decimal values. I'd > suggest removing the precomputed table and printing them in hex, which is > easy for values of any precision.
Here's an independent change that removes the decimal table and replaces it with generated hex values. I included the relevent output of gcc -E -dM also. Index: c-family/c-cppbuiltin.c =================================================================== --- c-family/c-cppbuiltin.c (revision 209391) +++ c-family/c-cppbuiltin.c (working copy) @@ -1285,45 +1295,71 @@ builtin_define_constants (const char *ma static void builtin_define_type_max (const char *macro, tree type) { builtin_define_type_minmax (NULL, macro, type); } +static void +print_bits_of_hex (char *buf, int bufsz, int count) +{ + gcc_assert (bufsz > 3); + *buf++ = '0'; + *buf++ = 'x'; + bufsz -= 2; + + gcc_assert (count > 0); + + switch (count % 4) { + case 0: + break; + case 1: + *buf++ = '1'; + bufsz --; + count -= 1; + break; + case 2: + *buf++ = '3'; + bufsz --; + count -= 2; + break; + case 3: + *buf++ = '7'; + bufsz --; + count -= 3; + break; + } + while (count >= 4) + { + gcc_assert (bufsz > 1); + *buf++ = 'f'; + bufsz --; + count -= 4; + } + gcc_assert (bufsz > 0); + *buf++ = 0; +} + /* Define MIN_MACRO (if not NULL) and MAX_MACRO for TYPE based on the precision of the type. */ static void builtin_define_type_minmax (const char *min_macro, const char *max_macro, tree type) { - static const char *const values[] - = { "127", "255", - "32767", "65535", - "2147483647", "4294967295", - "9223372036854775807", "18446744073709551615", - "170141183460469231731687303715884105727", - "340282366920938463463374607431768211455" }; + /* Allows bit sizes up to 128 bits. */ +#define PBOH_SZ (128/4+4) + char value[PBOH_SZ]; - const char *value, *suffix; + const char *suffix; char *buf; - size_t idx; + int bits; - /* Pre-rendering the values mean we don't have to futz with printing a - multi-word decimal value. There are also a very limited number of - precisions that we support, so it's really a waste of time. */ - switch (TYPE_PRECISION (type)) - { - case 8: idx = 0; break; - case 16: idx = 2; break; - case 32: idx = 4; break; - case 64: idx = 6; break; - case 128: idx = 8; break; - default: gcc_unreachable (); - } + bits = TYPE_PRECISION (type) + (TYPE_UNSIGNED (type) ? 0 : -1); + + print_bits_of_hex (value, PBOH_SZ, bits); - value = values[idx + TYPE_UNSIGNED (type)]; suffix = type_suffix (type); buf = (char *) alloca (strlen (max_macro) + 1 + strlen (value) + strlen (suffix) + 1); sprintf (buf, "%s=%s%s", max_macro, value, suffix); $ ./cc1 -quiet -E -dM dj.c | egrep -i '(min|max)' | grep 0x | sort #define __INT16_MAX__ 0x7fff #define __INT20_MAX__ 0x7ffffL #define __INT32_MAX__ 0x7fffffffL #define __INT64_MAX__ 0x7fffffffffffffffLL #define __INT8_MAX__ 0x7f #define __INTMAX_MAX__ 0x7fffffffffffffffLL #define __INTPTR_MAX__ 0x7fff #define __INT_FAST16_MAX__ 0x7fff #define __INT_FAST32_MAX__ 0x7fffffffL #define __INT_FAST64_MAX__ 0x7fffffffffffffffLL #define __INT_FAST8_MAX__ 0x7fff #define __INT_LEAST16_MAX__ 0x7fff #define __INT_LEAST32_MAX__ 0x7fffffffL #define __INT_LEAST64_MAX__ 0x7fffffffffffffffLL #define __INT_LEAST8_MAX__ 0x7f #define __INT_MAX__ 0x7fff #define __LONG_LONG_MAX__ 0x7fffffffffffffffLL #define __LONG_MAX__ 0x7fffffffL #define __PTRDIFF_MAX__ 0x7fff #define __SCHAR_MAX__ 0x7f #define __SHRT_MAX__ 0x7fff #define __SIG_ATOMIC_MAX__ 0x7fff #define __SIZE_MAX__ 0xffffU #define __UINT16_MAX__ 0xffffU #define __UINT20_MAX__ 0xfffffUL #define __UINT32_MAX__ 0xffffffffUL #define __UINT64_MAX__ 0xffffffffffffffffULL #define __UINT8_MAX__ 0xff #define __UINTMAX_MAX__ 0xffffffffffffffffULL #define __UINTPTR_MAX__ 0xffffU #define __UINT_FAST16_MAX__ 0xffffU #define __UINT_FAST32_MAX__ 0xffffffffUL #define __UINT_FAST64_MAX__ 0xffffffffffffffffULL #define __UINT_FAST8_MAX__ 0xffffU #define __UINT_LEAST16_MAX__ 0xffffU #define __UINT_LEAST32_MAX__ 0xffffffffUL #define __UINT_LEAST64_MAX__ 0xffffffffffffffffULL #define __UINT_LEAST8_MAX__ 0xff #define __WCHAR_MAX__ 0x7fffffffL #define __WINT_MAX__ 0xffffU