]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/c-family/c-cppbuiltin.c
Cleanup rs6000/t-ppccomm configurations (PR other/51022)
[thirdparty/gcc.git] / gcc / c-family / c-cppbuiltin.c
CommitLineData
cb60f38d 1/* Define builtin-in macros for the C family front ends.
10e48e39 2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
da1c7394 3 Free Software Foundation, Inc.
cb60f38d
NB
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9dcd6f09 9Software Foundation; either version 3, or (at your option) any later
cb60f38d
NB
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
9dcd6f09
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
cb60f38d
NB
20
21#include "config.h"
22#include "system.h"
23#include "coretypes.h"
24#include "tm.h"
25#include "tree.h"
a757585a 26#include "version.h"
cb60f38d 27#include "flags.h"
cb60f38d
NB
28#include "c-common.h"
29#include "c-pragma.h"
30#include "output.h"
f4ce02c5 31#include "debug.h" /* For dwarf2out_do_cfi_asm. */
f4ce02c5 32#include "tm_p.h" /* For TARGET_CPU_CPP_BUILTINS & friends. */
84b8b0e0 33#include "target.h"
677f3fa8 34#include "common/common-target.h"
8e680db5 35#include "cpp-id-data.h"
82a1c2fe 36#include "cppbuiltin.h"
cb60f38d 37
4e2e315f
NB
38#ifndef TARGET_OS_CPP_BUILTINS
39# define TARGET_OS_CPP_BUILTINS()
40#endif
41
42#ifndef TARGET_OBJFMT_CPP_BUILTINS
43# define TARGET_OBJFMT_CPP_BUILTINS()
44#endif
45
cb60f38d
NB
46#ifndef REGISTER_PREFIX
47#define REGISTER_PREFIX ""
48#endif
49
21282b1e 50/* Non-static as some targets don't use it. */
35b1a6fa 51void builtin_define_std (const char *) ATTRIBUTE_UNUSED;
35b1a6fa
AJ
52static void builtin_define_with_int_value (const char *, HOST_WIDE_INT);
53static void builtin_define_with_hex_fp_value (const char *, tree,
54 int, const char *,
264c41ed 55 const char *,
35b1a6fa 56 const char *);
85291069 57static void builtin_define_stdint_macros (void);
207bf79d
JM
58static void builtin_define_constants (const char *, tree);
59static void builtin_define_type_max (const char *, tree);
60static void builtin_define_type_minmax (const char *, const char *, tree);
024a85ae 61static void builtin_define_type_sizeof (const char *, tree);
b8698a0f 62static void builtin_define_float_constants (const char *,
1b1562a5 63 const char *,
264c41ed
CD
64 const char *,
65 const char *,
35b1a6fa 66 tree);
cb60f38d 67
0069111f
MM
68/* Return true if MODE provides a fast multiply/add (FMA) builtin function.
69 Originally this function used the fma optab, but that doesn't work with
70 -save-temps, so just rely on the HAVE_fma macros for the standard floating
71 point types. */
72
73static bool
74mode_has_fma (enum machine_mode mode)
75{
76 switch (mode)
77 {
78#ifdef HAVE_fmasf4
79 case SFmode:
80 return !!HAVE_fmasf4;
81#endif
82
83#ifdef HAVE_fmadf4
84 case DFmode:
85 return !!HAVE_fmadf4;
86#endif
87
88#ifdef HAVE_fmaxf4
89 case XFmode:
90 return !!HAVE_fmaxf4;
91#endif
92
93#ifdef HAVE_fmatf4
94 case TFmode:
95 return !!HAVE_fmatf4;
96#endif
97
98 default:
99 break;
100 }
101
102 return false;
103}
104
024a85ae
AK
105/* Define NAME with value TYPE size_unit. */
106static void
107builtin_define_type_sizeof (const char *name, tree type)
108{
109 builtin_define_with_int_value (name,
110 tree_low_cst (TYPE_SIZE_UNIT (type), 1));
111}
112
264c41ed
CD
113/* Define the float.h constants for TYPE using NAME_PREFIX, FP_SUFFIX,
114 and FP_CAST. */
cb60f38d 115static void
b8698a0f
L
116builtin_define_float_constants (const char *name_prefix,
117 const char *fp_suffix,
118 const char *fp_cast,
1b1562a5 119 const char *fma_suffix,
264c41ed 120 tree type)
cb60f38d
NB
121{
122 /* Used to convert radix-based values to base 10 values in several cases.
123
124 In the max_exp -> max_10_exp conversion for 128-bit IEEE, we need at
125 least 6 significant digits for correct results. Using the fraction
126 formed by (log(2)*1e6)/(log(10)*1e6) overflows a 32-bit integer as an
127 intermediate; perhaps someone can find a better approximation, in the
128 mean time, I suspect using doubles won't harm the bootstrap here. */
129
130 const double log10_2 = .30102999566398119521;
131 double log10_b;
132 const struct real_format *fmt;
8ce94e44 133 const struct real_format *ldfmt;
cb60f38d
NB
134
135 char name[64], buf[128];
136 int dig, min_10_exp, max_10_exp;
137 int decimal_dig;
2778d766 138 int type_decimal_dig;
cb60f38d 139
70a01792 140 fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
9a8ce21f 141 gcc_assert (fmt->b != 10);
8ce94e44
JM
142 ldfmt = REAL_MODE_FORMAT (TYPE_MODE (long_double_type_node));
143 gcc_assert (ldfmt->b != 10);
cb60f38d
NB
144
145 /* The radix of the exponent representation. */
146 if (type == float_type_node)
147 builtin_define_with_int_value ("__FLT_RADIX__", fmt->b);
4d8a8a0a 148 log10_b = log10_2;
cb60f38d
NB
149
150 /* The number of radix digits, p, in the floating-point significand. */
151 sprintf (name, "__%s_MANT_DIG__", name_prefix);
152 builtin_define_with_int_value (name, fmt->p);
153
154 /* The number of decimal digits, q, such that any floating-point number
155 with q decimal digits can be rounded into a floating-point number with
156 p radix b digits and back again without change to the q decimal digits,
157
158 p log10 b if b is a power of 10
35b1a6fa 159 floor((p - 1) log10 b) otherwise
cb60f38d
NB
160 */
161 dig = (fmt->p - 1) * log10_b;
162 sprintf (name, "__%s_DIG__", name_prefix);
163 builtin_define_with_int_value (name, dig);
164
165 /* The minimum negative int x such that b**(x-1) is a normalized float. */
166 sprintf (name, "__%s_MIN_EXP__", name_prefix);
167 sprintf (buf, "(%d)", fmt->emin);
168 builtin_define_with_value (name, buf, 0);
169
170 /* The minimum negative int x such that 10**x is a normalized float,
171
172 ceil (log10 (b ** (emin - 1)))
173 = ceil (log10 (b) * (emin - 1))
174
175 Recall that emin is negative, so the integer truncation calculates
176 the ceiling, not the floor, in this case. */
177 min_10_exp = (fmt->emin - 1) * log10_b;
178 sprintf (name, "__%s_MIN_10_EXP__", name_prefix);
179 sprintf (buf, "(%d)", min_10_exp);
180 builtin_define_with_value (name, buf, 0);
181
182 /* The maximum int x such that b**(x-1) is a representable float. */
183 sprintf (name, "__%s_MAX_EXP__", name_prefix);
184 builtin_define_with_int_value (name, fmt->emax);
185
186 /* The maximum int x such that 10**x is in the range of representable
187 finite floating-point numbers,
188
189 floor (log10((1 - b**-p) * b**emax))
190 = floor (log10(1 - b**-p) + log10(b**emax))
191 = floor (log10(1 - b**-p) + log10(b)*emax)
192
193 The safest thing to do here is to just compute this number. But since
194 we don't link cc1 with libm, we cannot. We could implement log10 here
195 a series expansion, but that seems too much effort because:
196
197 Note that the first term, for all extant p, is a number exceedingly close
198 to zero, but slightly negative. Note that the second term is an integer
199 scaling an irrational number, and that because of the floor we are only
200 interested in its integral portion.
201
202 In order for the first term to have any effect on the integral portion
203 of the second term, the second term has to be exceedingly close to an
204 integer itself (e.g. 123.000000000001 or something). Getting a result
205 that close to an integer requires that the irrational multiplicand have
206 a long series of zeros in its expansion, which doesn't occur in the
207 first 20 digits or so of log10(b).
208
209 Hand-waving aside, crunching all of the sets of constants above by hand
210 does not yield a case for which the first term is significant, which
211 in the end is all that matters. */
212 max_10_exp = fmt->emax * log10_b;
213 sprintf (name, "__%s_MAX_10_EXP__", name_prefix);
214 builtin_define_with_int_value (name, max_10_exp);
215
216 /* The number of decimal digits, n, such that any floating-point number
217 can be rounded to n decimal digits and back again without change to
35b1a6fa 218 the value.
cb60f38d
NB
219
220 p * log10(b) if b is a power of 10
221 ceil(1 + p * log10(b)) otherwise
222
223 The only macro we care about is this number for the widest supported
224 floating type, but we want this value for rendering constants below. */
225 {
8ce94e44
JM
226 double d_decimal_dig
227 = 1 + (fmt->p < ldfmt->p ? ldfmt->p : fmt->p) * log10_b;
cb60f38d
NB
228 decimal_dig = d_decimal_dig;
229 if (decimal_dig < d_decimal_dig)
230 decimal_dig++;
231 }
2778d766
JM
232 /* Similar, for this type rather than long double. */
233 {
234 double type_d_decimal_dig = 1 + fmt->p * log10_b;
235 type_decimal_dig = type_d_decimal_dig;
236 if (type_decimal_dig < type_d_decimal_dig)
237 type_decimal_dig++;
238 }
cb60f38d
NB
239 if (type == long_double_type_node)
240 builtin_define_with_int_value ("__DECIMAL_DIG__", decimal_dig);
2778d766
JM
241 else
242 {
243 sprintf (name, "__%s_DECIMAL_DIG__", name_prefix);
244 builtin_define_with_int_value (name, type_decimal_dig);
245 }
cb60f38d
NB
246
247 /* Since, for the supported formats, B is always a power of 2, we
248 construct the following numbers directly as a hexadecimal
249 constants. */
7faa1bbb 250 get_max_float (fmt, buf, sizeof (buf));
b8698a0f 251
cb60f38d 252 sprintf (name, "__%s_MAX__", name_prefix);
264c41ed 253 builtin_define_with_hex_fp_value (name, type, decimal_dig, buf, fp_suffix, fp_cast);
cb60f38d
NB
254
255 /* The minimum normalized positive floating-point number,
256 b**(emin-1). */
257 sprintf (name, "__%s_MIN__", name_prefix);
4d8a8a0a 258 sprintf (buf, "0x1p%d", fmt->emin - 1);
264c41ed 259 builtin_define_with_hex_fp_value (name, type, decimal_dig, buf, fp_suffix, fp_cast);
cb60f38d
NB
260
261 /* The difference between 1 and the least value greater than 1 that is
262 representable in the given floating point type, b**(1-p). */
263 sprintf (name, "__%s_EPSILON__", name_prefix);
59d7d767
GK
264 if (fmt->pnan < fmt->p)
265 /* This is an IBM extended double format, so 1.0 + any double is
266 representable precisely. */
4d8a8a0a 267 sprintf (buf, "0x1p%d", fmt->emin - fmt->p);
c22cacf3 268 else
4d8a8a0a 269 sprintf (buf, "0x1p%d", 1 - fmt->p);
264c41ed 270 builtin_define_with_hex_fp_value (name, type, decimal_dig, buf, fp_suffix, fp_cast);
cb60f38d
NB
271
272 /* For C++ std::numeric_limits<T>::denorm_min. The minimum denormalized
273 positive floating-point number, b**(emin-p). Zero for formats that
274 don't support denormals. */
275 sprintf (name, "__%s_DENORM_MIN__", name_prefix);
276 if (fmt->has_denorm)
277 {
4d8a8a0a 278 sprintf (buf, "0x1p%d", fmt->emin - fmt->p);
cb60f38d 279 builtin_define_with_hex_fp_value (name, type, decimal_dig,
264c41ed 280 buf, fp_suffix, fp_cast);
cb60f38d
NB
281 }
282 else
283 {
284 sprintf (buf, "0.0%s", fp_suffix);
285 builtin_define_with_value (name, buf, 0);
286 }
287
264c41ed
CD
288 sprintf (name, "__%s_HAS_DENORM__", name_prefix);
289 builtin_define_with_value (name, fmt->has_denorm ? "1" : "0", 0);
290
cb60f38d
NB
291 /* For C++ std::numeric_limits<T>::has_infinity. */
292 sprintf (name, "__%s_HAS_INFINITY__", name_prefix);
35b1a6fa 293 builtin_define_with_int_value (name,
cb60f38d
NB
294 MODE_HAS_INFINITIES (TYPE_MODE (type)));
295 /* For C++ std::numeric_limits<T>::has_quiet_NaN. We do not have a
296 predicate to distinguish a target that has both quiet and
297 signalling NaNs from a target that has only quiet NaNs or only
298 signalling NaNs, so we assume that a target that has any kind of
299 NaN has quiet NaNs. */
300 sprintf (name, "__%s_HAS_QUIET_NAN__", name_prefix);
301 builtin_define_with_int_value (name, MODE_HAS_NANS (TYPE_MODE (type)));
1b1562a5
MM
302
303 /* Note whether we have fast FMA. */
304 if (mode_has_fma (TYPE_MODE (type)))
305 {
306 sprintf (name, "__FP_FAST_FMA%s", fma_suffix);
307 builtin_define_with_int_value (name, 1);
308 }
cb60f38d
NB
309}
310
9a8ce21f
JG
311/* Define __DECx__ constants for TYPE using NAME_PREFIX and SUFFIX. */
312static void
b8698a0f
L
313builtin_define_decimal_float_constants (const char *name_prefix,
314 const char *suffix,
9a8ce21f
JG
315 tree type)
316{
317 const struct real_format *fmt;
318 char name[64], buf[128], *p;
319 int digits;
320
321 fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
322
323 /* The number of radix digits, p, in the significand. */
324 sprintf (name, "__%s_MANT_DIG__", name_prefix);
325 builtin_define_with_int_value (name, fmt->p);
326
327 /* The minimum negative int x such that b**(x-1) is a normalized float. */
328 sprintf (name, "__%s_MIN_EXP__", name_prefix);
329 sprintf (buf, "(%d)", fmt->emin);
330 builtin_define_with_value (name, buf, 0);
331
332 /* The maximum int x such that b**(x-1) is a representable float. */
333 sprintf (name, "__%s_MAX_EXP__", name_prefix);
334 builtin_define_with_int_value (name, fmt->emax);
335
336 /* Compute the minimum representable value. */
337 sprintf (name, "__%s_MIN__", name_prefix);
c52ec948 338 sprintf (buf, "1E%d%s", fmt->emin - 1, suffix);
b8698a0f 339 builtin_define_with_value (name, buf, 0);
9a8ce21f
JG
340
341 /* Compute the maximum representable value. */
342 sprintf (name, "__%s_MAX__", name_prefix);
343 p = buf;
344 for (digits = fmt->p; digits; digits--)
345 {
346 *p++ = '9';
347 if (digits == fmt->p)
348 *p++ = '.';
349 }
350 *p = 0;
c52ec948
JJ
351 /* fmt->p plus 1, to account for the decimal point and fmt->emax
352 minus 1 because the digits are nines, not 1.0. */
b8698a0f 353 sprintf (&buf[fmt->p + 1], "E%d%s", fmt->emax - 1, suffix);
9a8ce21f
JG
354 builtin_define_with_value (name, buf, 0);
355
356 /* Compute epsilon (the difference between 1 and least value greater
357 than 1 representable). */
358 sprintf (name, "__%s_EPSILON__", name_prefix);
359 sprintf (buf, "1E-%d%s", fmt->p - 1, suffix);
360 builtin_define_with_value (name, buf, 0);
361
c52ec948
JJ
362 /* Minimum subnormal positive decimal value. */
363 sprintf (name, "__%s_SUBNORMAL_MIN__", name_prefix);
9a8ce21f
JG
364 p = buf;
365 for (digits = fmt->p; digits > 1; digits--)
366 {
367 *p++ = '0';
368 if (digits == fmt->p)
369 *p++ = '.';
370 }
371 *p = 0;
b8698a0f 372 sprintf (&buf[fmt->p], "1E%d%s", fmt->emin - 1, suffix);
9a8ce21f
JG
373 builtin_define_with_value (name, buf, 0);
374}
375
0f996086
CF
376/* Define fixed-point constants for TYPE using NAME_PREFIX and SUFFIX. */
377
378static void
379builtin_define_fixed_point_constants (const char *name_prefix,
380 const char *suffix,
381 tree type)
382{
383 char name[64], buf[256], *new_buf;
384 int i, mod;
385
386 sprintf (name, "__%s_FBIT__", name_prefix);
387 builtin_define_with_int_value (name, TYPE_FBIT (type));
388
389 sprintf (name, "__%s_IBIT__", name_prefix);
390 builtin_define_with_int_value (name, TYPE_IBIT (type));
391
392 /* If there is no suffix, defines are for fixed-point modes.
393 We just return. */
394 if (strcmp (suffix, "") == 0)
395 return;
396
397 if (TYPE_UNSIGNED (type))
398 {
399 sprintf (name, "__%s_MIN__", name_prefix);
400 sprintf (buf, "0.0%s", suffix);
401 builtin_define_with_value (name, buf, 0);
402 }
403 else
404 {
405 sprintf (name, "__%s_MIN__", name_prefix);
406 if (ALL_ACCUM_MODE_P (TYPE_MODE (type)))
407 sprintf (buf, "(-0X1P%d%s-0X1P%d%s)", TYPE_IBIT (type) - 1, suffix,
408 TYPE_IBIT (type) - 1, suffix);
409 else
410 sprintf (buf, "(-0.5%s-0.5%s)", suffix, suffix);
411 builtin_define_with_value (name, buf, 0);
412 }
413
414 sprintf (name, "__%s_MAX__", name_prefix);
415 sprintf (buf, "0X");
416 new_buf = buf + 2;
417 mod = (TYPE_FBIT (type) + TYPE_IBIT (type)) % 4;
418 if (mod)
419 sprintf (new_buf++, "%x", (1 << mod) - 1);
420 for (i = 0; i < (TYPE_FBIT (type) + TYPE_IBIT (type)) / 4; i++)
421 sprintf (new_buf++, "F");
422 sprintf (new_buf, "P-%d%s", TYPE_FBIT (type), suffix);
423 builtin_define_with_value (name, buf, 0);
424
425 sprintf (name, "__%s_EPSILON__", name_prefix);
426 sprintf (buf, "0x1P-%d%s", TYPE_FBIT (type), suffix);
427 builtin_define_with_value (name, buf, 0);
428}
429
207bf79d 430/* Define macros used by <stdint.h>. */
85291069
JM
431static void
432builtin_define_stdint_macros (void)
433{
207bf79d
JM
434 builtin_define_type_max ("__INTMAX_MAX__", intmax_type_node);
435 builtin_define_constants ("__INTMAX_C", intmax_type_node);
436 builtin_define_type_max ("__UINTMAX_MAX__", uintmax_type_node);
437 builtin_define_constants ("__UINTMAX_C", uintmax_type_node);
438 if (sig_atomic_type_node)
439 builtin_define_type_minmax ("__SIG_ATOMIC_MIN__", "__SIG_ATOMIC_MAX__",
440 sig_atomic_type_node);
441 if (int8_type_node)
442 builtin_define_type_max ("__INT8_MAX__", int8_type_node);
443 if (int16_type_node)
444 builtin_define_type_max ("__INT16_MAX__", int16_type_node);
445 if (int32_type_node)
446 builtin_define_type_max ("__INT32_MAX__", int32_type_node);
447 if (int64_type_node)
448 builtin_define_type_max ("__INT64_MAX__", int64_type_node);
449 if (uint8_type_node)
450 builtin_define_type_max ("__UINT8_MAX__", uint8_type_node);
451 if (uint16_type_node)
452 builtin_define_type_max ("__UINT16_MAX__", uint16_type_node);
453 if (c_uint32_type_node)
454 builtin_define_type_max ("__UINT32_MAX__", c_uint32_type_node);
455 if (c_uint64_type_node)
456 builtin_define_type_max ("__UINT64_MAX__", c_uint64_type_node);
457 if (int_least8_type_node)
458 {
459 builtin_define_type_max ("__INT_LEAST8_MAX__", int_least8_type_node);
460 builtin_define_constants ("__INT8_C", int_least8_type_node);
461 }
462 if (int_least16_type_node)
463 {
464 builtin_define_type_max ("__INT_LEAST16_MAX__", int_least16_type_node);
465 builtin_define_constants ("__INT16_C", int_least16_type_node);
466 }
467 if (int_least32_type_node)
468 {
469 builtin_define_type_max ("__INT_LEAST32_MAX__", int_least32_type_node);
470 builtin_define_constants ("__INT32_C", int_least32_type_node);
471 }
472 if (int_least64_type_node)
473 {
474 builtin_define_type_max ("__INT_LEAST64_MAX__", int_least64_type_node);
475 builtin_define_constants ("__INT64_C", int_least64_type_node);
476 }
477 if (uint_least8_type_node)
478 {
479 builtin_define_type_max ("__UINT_LEAST8_MAX__", uint_least8_type_node);
480 builtin_define_constants ("__UINT8_C", uint_least8_type_node);
481 }
482 if (uint_least16_type_node)
483 {
484 builtin_define_type_max ("__UINT_LEAST16_MAX__", uint_least16_type_node);
485 builtin_define_constants ("__UINT16_C", uint_least16_type_node);
486 }
487 if (uint_least32_type_node)
488 {
489 builtin_define_type_max ("__UINT_LEAST32_MAX__", uint_least32_type_node);
490 builtin_define_constants ("__UINT32_C", uint_least32_type_node);
491 }
492 if (uint_least64_type_node)
493 {
494 builtin_define_type_max ("__UINT_LEAST64_MAX__", uint_least64_type_node);
495 builtin_define_constants ("__UINT64_C", uint_least64_type_node);
496 }
497 if (int_fast8_type_node)
498 builtin_define_type_max ("__INT_FAST8_MAX__", int_fast8_type_node);
499 if (int_fast16_type_node)
500 builtin_define_type_max ("__INT_FAST16_MAX__", int_fast16_type_node);
501 if (int_fast32_type_node)
502 builtin_define_type_max ("__INT_FAST32_MAX__", int_fast32_type_node);
503 if (int_fast64_type_node)
504 builtin_define_type_max ("__INT_FAST64_MAX__", int_fast64_type_node);
505 if (uint_fast8_type_node)
506 builtin_define_type_max ("__UINT_FAST8_MAX__", uint_fast8_type_node);
507 if (uint_fast16_type_node)
508 builtin_define_type_max ("__UINT_FAST16_MAX__", uint_fast16_type_node);
509 if (uint_fast32_type_node)
510 builtin_define_type_max ("__UINT_FAST32_MAX__", uint_fast32_type_node);
511 if (uint_fast64_type_node)
512 builtin_define_type_max ("__UINT_FAST64_MAX__", uint_fast64_type_node);
513 if (intptr_type_node)
514 builtin_define_type_max ("__INTPTR_MAX__", intptr_type_node);
515 if (uintptr_type_node)
516 builtin_define_type_max ("__UINTPTR_MAX__", uintptr_type_node);
85291069
JM
517}
518
ab442df7
MM
519/* Adjust the optimization macros when a #pragma GCC optimization is done to
520 reflect the current level. */
521void
522c_cpp_builtins_optimize_pragma (cpp_reader *pfile, tree prev_tree,
523 tree cur_tree)
524{
525 struct cl_optimization *prev = TREE_OPTIMIZATION (prev_tree);
526 struct cl_optimization *cur = TREE_OPTIMIZATION (cur_tree);
527 bool prev_fast_math;
528 bool cur_fast_math;
529
530 /* -undef turns off target-specific built-ins. */
531 if (flag_undef)
532 return;
533
534 /* Other target-independent built-ins determined by command-line
535 options. */
e3339d0f 536 if (!prev->x_optimize_size && cur->x_optimize_size)
ab442df7 537 cpp_define (pfile, "__OPTIMIZE_SIZE__");
e3339d0f 538 else if (prev->x_optimize_size && !cur->x_optimize_size)
ab442df7
MM
539 cpp_undef (pfile, "__OPTIMIZE_SIZE__");
540
e3339d0f 541 if (!prev->x_optimize && cur->x_optimize)
ab442df7 542 cpp_define (pfile, "__OPTIMIZE__");
e3339d0f 543 else if (prev->x_optimize && !cur->x_optimize)
ab442df7
MM
544 cpp_undef (pfile, "__OPTIMIZE__");
545
546 prev_fast_math = fast_math_flags_struct_set_p (prev);
547 cur_fast_math = fast_math_flags_struct_set_p (cur);
548 if (!prev_fast_math && cur_fast_math)
549 cpp_define (pfile, "__FAST_MATH__");
550 else if (prev_fast_math && !cur_fast_math)
551 cpp_undef (pfile, "__FAST_MATH__");
552
e3339d0f 553 if (!prev->x_flag_signaling_nans && cur->x_flag_signaling_nans)
ab442df7 554 cpp_define (pfile, "__SUPPORT_SNAN__");
e3339d0f 555 else if (prev->x_flag_signaling_nans && !cur->x_flag_signaling_nans)
ab442df7
MM
556 cpp_undef (pfile, "__SUPPORT_SNAN__");
557
e3339d0f 558 if (!prev->x_flag_finite_math_only && cur->x_flag_finite_math_only)
ab442df7
MM
559 {
560 cpp_undef (pfile, "__FINITE_MATH_ONLY__");
561 cpp_define (pfile, "__FINITE_MATH_ONLY__=1");
562 }
0e3fdb48 563 else if (prev->x_flag_finite_math_only && !cur->x_flag_finite_math_only)
ab442df7
MM
564 {
565 cpp_undef (pfile, "__FINITE_MATH_ONLY__");
566 cpp_define (pfile, "__FINITE_MATH_ONLY__=0");
567 }
568}
569
570
cb60f38d
NB
571/* Hook that registers front end and target-specific built-ins. */
572void
35b1a6fa 573c_cpp_builtins (cpp_reader *pfile)
cb60f38d
NB
574{
575 /* -undef turns off target-specific built-ins. */
576 if (flag_undef)
577 return;
578
82a1c2fe
FXC
579 define_language_independent_builtin_macros (pfile);
580
581 if (c_dialect_cxx ())
582 {
583 int major;
584 parse_basever (&major, NULL, NULL);
585 cpp_define_formatted (pfile, "__GNUG__=%d", major);
586 }
cb60f38d
NB
587
588 /* For stddef.h. They require macros defined in c-common.c. */
589 c_stddef_cpp_builtins ();
590
37fa72e9 591 if (c_dialect_cxx ())
cb60f38d 592 {
c22cacf3 593 if (flag_weak && SUPPORTS_ONE_ONLY)
cb60f38d
NB
594 cpp_define (pfile, "__GXX_WEAK__=1");
595 else
596 cpp_define (pfile, "__GXX_WEAK__=0");
cb60f38d
NB
597 if (warn_deprecated)
598 cpp_define (pfile, "__DEPRECATED");
ba551ec2
PC
599 if (flag_rtti)
600 cpp_define (pfile, "__GXX_RTTI");
c1ae8be5 601 if (cxx_dialect == cxx0x)
c573f4d5 602 cpp_define (pfile, "__GXX_EXPERIMENTAL_CXX0X__");
cb60f38d 603 }
6cd77c3f
RH
604 /* Note that we define this for C as well, so that we know if
605 __attribute__((cleanup)) will interface with EH. */
2288bdbb
RH
606 if (flag_exceptions)
607 cpp_define (pfile, "__EXCEPTIONS");
cb60f38d 608
e0a21ab9 609 /* Represents the C++ ABI version, always defined so it can be used while
cb60f38d 610 preprocessing C and assembler. */
57702a80
MM
611 if (flag_abi_version == 0)
612 /* Use a very large value so that:
613
c22cacf3 614 #if __GXX_ABI_VERSION >= <value for version X>
57702a80
MM
615
616 will work whether the user explicitly says "-fabi-version=x" or
617 "-fabi-version=0". Do not use INT_MAX because that will be
618 different from system to system. */
619 builtin_define_with_int_value ("__GXX_ABI_VERSION", 999999);
620 else if (flag_abi_version == 1)
1f838355 621 /* Due to a historical accident, this version had the value
57702a80
MM
622 "102". */
623 builtin_define_with_int_value ("__GXX_ABI_VERSION", 102);
624 else
e0a21ab9 625 /* Newer versions have values 1002, 1003, .... */
c22cacf3 626 builtin_define_with_int_value ("__GXX_ABI_VERSION",
57702a80 627 1000 + flag_abi_version);
cb60f38d
NB
628
629 /* libgcc needs to know this. */
677f3fa8 630 if (targetm_common.except_unwind_info (&global_options) == UI_SJLJ)
cb60f38d
NB
631 cpp_define (pfile, "__USING_SJLJ_EXCEPTIONS__");
632
207bf79d
JM
633 /* limits.h and stdint.h need to know these. */
634 builtin_define_type_max ("__SCHAR_MAX__", signed_char_type_node);
635 builtin_define_type_max ("__SHRT_MAX__", short_integer_type_node);
636 builtin_define_type_max ("__INT_MAX__", integer_type_node);
637 builtin_define_type_max ("__LONG_MAX__", long_integer_type_node);
638 builtin_define_type_max ("__LONG_LONG_MAX__", long_long_integer_type_node);
639 builtin_define_type_minmax ("__WCHAR_MIN__", "__WCHAR_MAX__",
640 underlying_wchar_type_node);
641 builtin_define_type_minmax ("__WINT_MIN__", "__WINT_MAX__", wint_type_node);
642 builtin_define_type_max ("__PTRDIFF_MAX__", ptrdiff_type_node);
643 builtin_define_type_max ("__SIZE_MAX__", size_type_node);
cb60f38d 644
207bf79d 645 /* stdint.h and the testsuite need to know these. */
85291069
JM
646 builtin_define_stdint_macros ();
647
82a1c2fe 648 /* float.h needs to know this. */
cb60f38d
NB
649 builtin_define_with_int_value ("__FLT_EVAL_METHOD__",
650 TARGET_FLT_EVAL_METHOD);
651
9a8ce21f
JG
652 /* And decfloat.h needs this. */
653 builtin_define_with_int_value ("__DEC_EVAL_METHOD__",
654 TARGET_DEC_EVAL_METHOD);
655
1b1562a5 656 builtin_define_float_constants ("FLT", "F", "%s", "F", float_type_node);
6ec637a4
JJ
657 /* Cast the double precision constants. This is needed when single
658 precision constants are specified or when pragma FLOAT_CONST_DECIMAL64
659 is used. The correct result is computed by the compiler when using
bb0a9581
NF
660 macros that include a cast. We use a different cast for C++ to avoid
661 problems with -Wold-style-cast. */
662 builtin_define_float_constants ("DBL", "L",
663 (c_dialect_cxx ()
664 ? "double(%s)"
665 : "((double)%s)"),
666 "", double_type_node);
1b1562a5
MM
667 builtin_define_float_constants ("LDBL", "L", "%s", "L",
668 long_double_type_node);
cb60f38d 669
9a8ce21f
JG
670 /* For decfloat.h. */
671 builtin_define_decimal_float_constants ("DEC32", "DF", dfloat32_type_node);
672 builtin_define_decimal_float_constants ("DEC64", "DD", dfloat64_type_node);
673 builtin_define_decimal_float_constants ("DEC128", "DL", dfloat128_type_node);
674
0f996086
CF
675 /* For fixed-point fibt, ibit, max, min, and epsilon. */
676 if (targetm.fixed_point_supported_p ())
677 {
678 builtin_define_fixed_point_constants ("SFRACT", "HR",
679 short_fract_type_node);
680 builtin_define_fixed_point_constants ("USFRACT", "UHR",
681 unsigned_short_fract_type_node);
682 builtin_define_fixed_point_constants ("FRACT", "R",
683 fract_type_node);
684 builtin_define_fixed_point_constants ("UFRACT", "UR",
685 unsigned_fract_type_node);
686 builtin_define_fixed_point_constants ("LFRACT", "LR",
687 long_fract_type_node);
688 builtin_define_fixed_point_constants ("ULFRACT", "ULR",
689 unsigned_long_fract_type_node);
690 builtin_define_fixed_point_constants ("LLFRACT", "LLR",
691 long_long_fract_type_node);
692 builtin_define_fixed_point_constants ("ULLFRACT", "ULLR",
693 unsigned_long_long_fract_type_node);
694 builtin_define_fixed_point_constants ("SACCUM", "HK",
695 short_accum_type_node);
696 builtin_define_fixed_point_constants ("USACCUM", "UHK",
697 unsigned_short_accum_type_node);
698 builtin_define_fixed_point_constants ("ACCUM", "K",
699 accum_type_node);
700 builtin_define_fixed_point_constants ("UACCUM", "UK",
701 unsigned_accum_type_node);
702 builtin_define_fixed_point_constants ("LACCUM", "LK",
703 long_accum_type_node);
704 builtin_define_fixed_point_constants ("ULACCUM", "ULK",
705 unsigned_long_accum_type_node);
706 builtin_define_fixed_point_constants ("LLACCUM", "LLK",
707 long_long_accum_type_node);
708 builtin_define_fixed_point_constants ("ULLACCUM", "ULLK",
709 unsigned_long_long_accum_type_node);
710
711 builtin_define_fixed_point_constants ("QQ", "", qq_type_node);
712 builtin_define_fixed_point_constants ("HQ", "", hq_type_node);
713 builtin_define_fixed_point_constants ("SQ", "", sq_type_node);
714 builtin_define_fixed_point_constants ("DQ", "", dq_type_node);
715 builtin_define_fixed_point_constants ("TQ", "", tq_type_node);
716 builtin_define_fixed_point_constants ("UQQ", "", uqq_type_node);
717 builtin_define_fixed_point_constants ("UHQ", "", uhq_type_node);
718 builtin_define_fixed_point_constants ("USQ", "", usq_type_node);
719 builtin_define_fixed_point_constants ("UDQ", "", udq_type_node);
720 builtin_define_fixed_point_constants ("UTQ", "", utq_type_node);
721 builtin_define_fixed_point_constants ("HA", "", ha_type_node);
722 builtin_define_fixed_point_constants ("SA", "", sa_type_node);
723 builtin_define_fixed_point_constants ("DA", "", da_type_node);
724 builtin_define_fixed_point_constants ("TA", "", ta_type_node);
725 builtin_define_fixed_point_constants ("UHA", "", uha_type_node);
726 builtin_define_fixed_point_constants ("USA", "", usa_type_node);
727 builtin_define_fixed_point_constants ("UDA", "", uda_type_node);
728 builtin_define_fixed_point_constants ("UTA", "", uta_type_node);
729 }
730
10e48e39
RO
731 /* For libgcc-internal use only. */
732 if (flag_building_libgcc)
733 /* For libgcc enable-execute-stack.c. */
734 builtin_define_with_int_value ("__LIBGCC_TRAMPOLINE_SIZE__",
735 TRAMPOLINE_SIZE);
736
cb60f38d
NB
737 /* For use in assembly language. */
738 builtin_define_with_value ("__REGISTER_PREFIX__", REGISTER_PREFIX, 0);
739 builtin_define_with_value ("__USER_LABEL_PREFIX__", user_label_prefix, 0);
740
741 /* Misc. */
da1c7394
ILT
742 if (flag_gnu89_inline)
743 cpp_define (pfile, "__GNUC_GNU_INLINE__");
744 else
745 cpp_define (pfile, "__GNUC_STDC_INLINE__");
746
e90acd93 747 if (flag_no_inline)
cb60f38d 748 cpp_define (pfile, "__NO_INLINE__");
cb60f38d
NB
749
750 if (flag_iso)
751 cpp_define (pfile, "__STRICT_ANSI__");
752
753 if (!flag_signed_char)
754 cpp_define (pfile, "__CHAR_UNSIGNED__");
755
8df83eae 756 if (c_dialect_cxx () && TYPE_UNSIGNED (wchar_type_node))
cb60f38d
NB
757 cpp_define (pfile, "__WCHAR_UNSIGNED__");
758
60c4429c
PB
759 /* Tell source code if the compiler makes sync_compare_and_swap
760 builtins available. */
86951993
AM
761#ifndef HAVE_sync_compare_and_swapqi
762#define HAVE_sync_compare_and_swapqi 0
763#endif
764#ifndef HAVE_atomic_compare_and_swapqi
765#define HAVE_atomic_compare_and_swapqi 0
60c4429c 766#endif
86951993
AM
767 if (HAVE_sync_compare_and_swapqi || HAVE_atomic_compare_and_swapqi)
768 cpp_define (pfile, "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
60c4429c 769
86951993
AM
770#ifndef HAVE_sync_compare_and_swaphi
771#define HAVE_sync_compare_and_swaphi 0
60c4429c 772#endif
86951993
AM
773#ifndef HAVE_atomic_compare_and_swaphi
774#define HAVE_atomic_compare_and_swaphi 0
775#endif
776 if (HAVE_sync_compare_and_swaphi || HAVE_atomic_compare_and_swaphi)
777 cpp_define (pfile, "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
60c4429c 778
86951993
AM
779#ifndef HAVE_sync_compare_and_swapsi
780#define HAVE_sync_compare_and_swapsi 0
781#endif
782#ifndef HAVE_atomic_compare_and_swapsi
783#define HAVE_atomic_compare_and_swapsi 0
60c4429c 784#endif
86951993
AM
785 if (HAVE_sync_compare_and_swapsi || HAVE_atomic_compare_and_swapsi)
786 cpp_define (pfile, "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
60c4429c 787
86951993
AM
788#ifndef HAVE_sync_compare_and_swapdi
789#define HAVE_sync_compare_and_swapdi 0
60c4429c 790#endif
86951993
AM
791#ifndef HAVE_atomic_compare_and_swapdi
792#define HAVE_atomic_compare_and_swapdi 0
793#endif
794 if (HAVE_sync_compare_and_swapdi || HAVE_atomic_compare_and_swapdi)
795 cpp_define (pfile, "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
60c4429c 796
86951993
AM
797#ifndef HAVE_sync_compare_and_swapti
798#define HAVE_sync_compare_and_swapti 0
799#endif
800#ifndef HAVE_atomic_compare_and_swapti
801#define HAVE_atomic_compare_and_swapti 0
60c4429c 802#endif
86951993
AM
803 if (HAVE_sync_compare_and_swapti || HAVE_atomic_compare_and_swapti)
804 cpp_define (pfile, "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
60c4429c 805
d4ea4622 806#ifdef DWARF2_UNWIND_INFO
058514b3 807 if (dwarf2out_do_cfi_asm ())
d4ea4622
RH
808 cpp_define (pfile, "__GCC_HAVE_DWARF2_CFI_ASM");
809#endif
810
cb60f38d 811 /* Make the choice of ObjC runtime visible to source code. */
37fa72e9 812 if (c_dialect_objc () && flag_next_runtime)
cb60f38d
NB
813 cpp_define (pfile, "__NEXT_RUNTIME__");
814
84b8b0e0 815 /* Show the availability of some target pragmas. */
c54d7dc9 816 cpp_define (pfile, "__PRAGMA_REDEFINE_EXTNAME");
84b8b0e0
ZW
817
818 if (targetm.handle_pragma_extern_prefix)
819 cpp_define (pfile, "__PRAGMA_EXTERN_PREFIX");
820
0ffb94cd
JW
821 /* Make the choice of the stack protector runtime visible to source code.
822 The macro names and values here were chosen for compatibility with an
823 earlier implementation, i.e. ProPolice. */
7d69de61
RH
824 if (flag_stack_protect == 2)
825 cpp_define (pfile, "__SSP_ALL__=2");
826 else if (flag_stack_protect == 1)
827 cpp_define (pfile, "__SSP__=1");
828
953ff289 829 if (flag_openmp)
20906c66 830 cpp_define (pfile, "_OPENMP=201107");
953ff289 831
a6766312
KT
832 if (int128_integer_type_node != NULL_TREE)
833 builtin_define_type_sizeof ("__SIZEOF_INT128__",
834 int128_integer_type_node);
024a85ae
AK
835 builtin_define_type_sizeof ("__SIZEOF_WCHAR_T__", wchar_type_node);
836 builtin_define_type_sizeof ("__SIZEOF_WINT_T__", wint_type_node);
837 builtin_define_type_sizeof ("__SIZEOF_PTRDIFF_T__",
838 unsigned_ptrdiff_type_node);
024a85ae 839
cb60f38d
NB
840 /* A straightforward target hook doesn't work, because of problems
841 linking that hook's body when part of non-C front ends. */
842# define preprocessing_asm_p() (cpp_get_options (pfile)->lang == CLK_ASM)
843# define preprocessing_trad_p() (cpp_get_options (pfile)->traditional)
844# define builtin_define(TXT) cpp_define (pfile, TXT)
845# define builtin_assert(TXT) cpp_assert (pfile, TXT)
846 TARGET_CPU_CPP_BUILTINS ();
847 TARGET_OS_CPP_BUILTINS ();
4e2e315f 848 TARGET_OBJFMT_CPP_BUILTINS ();
63c5b495
MM
849
850 /* Support the __declspec keyword by turning them into attributes.
851 Note that the current way we do this may result in a collision
852 with predefined attributes later on. This can be solved by using
853 one attribute, say __declspec__, and passing args to it. The
854 problem with that approach is that args are not accumulated: each
855 new appearance would clobber any existing args. */
856 if (TARGET_DECLSPEC)
857 builtin_define ("__declspec(x)=__attribute__((x))");
79b87c74 858
589dd995
JJ
859 /* If decimal floating point is supported, tell the user if the
860 alternate format (BID) is used instead of the standard (DPD)
861 format. */
862 if (ENABLE_DECIMAL_FLOAT && ENABLE_DECIMAL_BID_FORMAT)
863 cpp_define (pfile, "__DECIMAL_BID_FORMAT__");
cb60f38d
NB
864}
865
866/* Pass an object-like macro. If it doesn't lie in the user's
867 namespace, defines it unconditionally. Otherwise define a version
868 with two leading underscores, and another version with two leading
869 and trailing underscores, and define the original only if an ISO
870 standard was not nominated.
871
872 e.g. passing "unix" defines "__unix", "__unix__" and possibly
873 "unix". Passing "_mips" defines "__mips", "__mips__" and possibly
874 "_mips". */
21282b1e 875void
35b1a6fa 876builtin_define_std (const char *macro)
cb60f38d
NB
877{
878 size_t len = strlen (macro);
cceb1885 879 char *buff = (char *) alloca (len + 5);
cb60f38d
NB
880 char *p = buff + 2;
881 char *q = p + len;
882
883 /* prepend __ (or maybe just _) if in user's namespace. */
884 memcpy (p, macro, len + 1);
885 if (!( *p == '_' && (p[1] == '_' || ISUPPER (p[1]))))
886 {
887 if (*p != '_')
888 *--p = '_';
889 if (p[1] != '_')
890 *--p = '_';
891 }
892 cpp_define (parse_in, p);
893
894 /* If it was in user's namespace... */
895 if (p != buff + 2)
896 {
897 /* Define the macro with leading and following __. */
898 if (q[-1] != '_')
899 *q++ = '_';
900 if (q[-2] != '_')
901 *q++ = '_';
902 *q = '\0';
903 cpp_define (parse_in, p);
904
905 /* Finally, define the original macro if permitted. */
906 if (!flag_iso)
907 cpp_define (parse_in, macro);
908 }
909}
910
911/* Pass an object-like macro and a value to define it to. The third
912 parameter says whether or not to turn the value into a string
913 constant. */
914void
35b1a6fa 915builtin_define_with_value (const char *macro, const char *expansion, int is_str)
cb60f38d
NB
916{
917 char *buf;
918 size_t mlen = strlen (macro);
919 size_t elen = strlen (expansion);
920 size_t extra = 2; /* space for an = and a NUL */
921
922 if (is_str)
923 extra += 2; /* space for two quote marks */
924
cceb1885 925 buf = (char *) alloca (mlen + elen + extra);
cb60f38d
NB
926 if (is_str)
927 sprintf (buf, "%s=\"%s\"", macro, expansion);
928 else
929 sprintf (buf, "%s=%s", macro, expansion);
930
931 cpp_define (parse_in, buf);
932}
933
cb60f38d
NB
934
935/* Pass an object-like macro and an integer value to define it to. */
936static void
35b1a6fa 937builtin_define_with_int_value (const char *macro, HOST_WIDE_INT value)
cb60f38d
NB
938{
939 char *buf;
940 size_t mlen = strlen (macro);
941 size_t vlen = 18;
942 size_t extra = 2; /* space for = and NUL. */
943
cceb1885 944 buf = (char *) alloca (mlen + vlen + extra);
cb60f38d
NB
945 memcpy (buf, macro, mlen);
946 buf[mlen] = '=';
947 sprintf (buf + mlen + 1, HOST_WIDE_INT_PRINT_DEC, value);
948
949 cpp_define (parse_in, buf);
950}
951
8e680db5
JJ
952/* builtin_define_with_hex_fp_value is very expensive, so the following
953 array and function allows it to be done lazily when __DBL_MAX__
954 etc. is first used. */
955
5bca794b 956struct GTY(()) lazy_hex_fp_value_struct
8e680db5
JJ
957{
958 const char *hex_str;
959 cpp_macro *macro;
960 enum machine_mode mode;
961 int digits;
962 const char *fp_suffix;
5bca794b
JJ
963};
964static GTY(()) struct lazy_hex_fp_value_struct lazy_hex_fp_values[12];
965static GTY(()) int lazy_hex_fp_value_count;
8e680db5
JJ
966
967static bool
968lazy_hex_fp_value (cpp_reader *pfile ATTRIBUTE_UNUSED,
969 cpp_hashnode *node)
970{
971 REAL_VALUE_TYPE real;
972 char dec_str[64], buf1[256];
973 unsigned int idx;
974 if (node->value.builtin < BT_FIRST_USER
975 || (int) node->value.builtin >= BT_FIRST_USER + lazy_hex_fp_value_count)
976 return false;
977
978 idx = node->value.builtin - BT_FIRST_USER;
979 real_from_string (&real, lazy_hex_fp_values[idx].hex_str);
980 real_to_decimal_for_mode (dec_str, &real, sizeof (dec_str),
981 lazy_hex_fp_values[idx].digits, 0,
982 lazy_hex_fp_values[idx].mode);
983
984 sprintf (buf1, "%s%s", dec_str, lazy_hex_fp_values[idx].fp_suffix);
985 node->flags &= ~(NODE_BUILTIN | NODE_USED);
986 node->value.macro = lazy_hex_fp_values[idx].macro;
987 for (idx = 0; idx < node->value.macro->count; idx++)
988 if (node->value.macro->exp.tokens[idx].type == CPP_NUMBER)
989 break;
990 gcc_assert (idx < node->value.macro->count);
991 node->value.macro->exp.tokens[idx].val.str.len = strlen (buf1);
992 node->value.macro->exp.tokens[idx].val.str.text
5bca794b 993 = (const unsigned char *) ggc_strdup (buf1);
8e680db5
JJ
994 return true;
995}
996
cb60f38d
NB
997/* Pass an object-like macro a hexadecimal floating-point value. */
998static void
35b1a6fa 999builtin_define_with_hex_fp_value (const char *macro,
3e479de3 1000 tree type, int digits,
b8698a0f 1001 const char *hex_str,
264c41ed
CD
1002 const char *fp_suffix,
1003 const char *fp_cast)
cb60f38d
NB
1004{
1005 REAL_VALUE_TYPE real;
264c41ed 1006 char dec_str[64], buf1[256], buf2[256];
cb60f38d 1007
8e680db5
JJ
1008 /* This is very expensive, so if possible expand them lazily. */
1009 if (lazy_hex_fp_value_count < 12
1010 && flag_dump_macros == 0
1011 && !cpp_get_options (parse_in)->traditional)
1012 {
1013 struct cpp_hashnode *node;
1014 if (lazy_hex_fp_value_count == 0)
1015 cpp_get_callbacks (parse_in)->user_builtin_macro = lazy_hex_fp_value;
1016 sprintf (buf2, fp_cast, "1.1");
1017 sprintf (buf1, "%s=%s", macro, buf2);
1018 cpp_define (parse_in, buf1);
1019 node = C_CPP_HASHNODE (get_identifier (macro));
5bca794b
JJ
1020 lazy_hex_fp_values[lazy_hex_fp_value_count].hex_str
1021 = ggc_strdup (hex_str);
8e680db5
JJ
1022 lazy_hex_fp_values[lazy_hex_fp_value_count].mode = TYPE_MODE (type);
1023 lazy_hex_fp_values[lazy_hex_fp_value_count].digits = digits;
1024 lazy_hex_fp_values[lazy_hex_fp_value_count].fp_suffix = fp_suffix;
1025 lazy_hex_fp_values[lazy_hex_fp_value_count].macro = node->value.macro;
1026 node->flags |= NODE_BUILTIN;
b49cf425
JR
1027 node->value.builtin
1028 = (enum cpp_builtin_type) (BT_FIRST_USER + lazy_hex_fp_value_count);
8e680db5
JJ
1029 lazy_hex_fp_value_count++;
1030 return;
1031 }
1032
cb60f38d
NB
1033 /* Hex values are really cool and convenient, except that they're
1034 not supported in strict ISO C90 mode. First, the "p-" sequence
1035 is not valid as part of a preprocessor number. Second, we get a
1036 pedwarn from the preprocessor, which has no context, so we can't
1037 suppress the warning with __extension__.
1038
35b1a6fa 1039 So instead what we do is construct the number in hex (because
cb60f38d
NB
1040 it's easy to get the exact correct value), parse it as a real,
1041 then print it back out as decimal. */
1042
1043 real_from_string (&real, hex_str);
3e479de3
UW
1044 real_to_decimal_for_mode (dec_str, &real, sizeof (dec_str), digits, 0,
1045 TYPE_MODE (type));
cb60f38d 1046
264c41ed
CD
1047 /* Assemble the macro in the following fashion
1048 macro = fp_cast [dec_str fp_suffix] */
1049 sprintf (buf1, "%s%s", dec_str, fp_suffix);
1050 sprintf (buf2, fp_cast, buf1);
1051 sprintf (buf1, "%s=%s", macro, buf2);
b8698a0f 1052
264c41ed 1053 cpp_define (parse_in, buf1);
cb60f38d
NB
1054}
1055
207bf79d
JM
1056/* Return a string constant for the suffix for a value of type TYPE
1057 promoted according to the integer promotions. The type must be one
1058 of the standard integer type nodes. */
1059
1060static const char *
1061type_suffix (tree type)
1062{
1063 static const char *const suffixes[] = { "", "U", "L", "UL", "LL", "ULL" };
1064 int unsigned_suffix;
1065 int is_long;
1066
1067 if (type == long_long_integer_type_node
1068 || type == long_long_unsigned_type_node)
1069 is_long = 2;
1070 else if (type == long_integer_type_node
1071 || type == long_unsigned_type_node)
1072 is_long = 1;
1073 else if (type == integer_type_node
1074 || type == unsigned_type_node
1075 || type == short_integer_type_node
1076 || type == short_unsigned_type_node
1077 || type == signed_char_type_node
1078 || type == unsigned_char_type_node
1079 /* ??? "char" is not a signed or unsigned integer type and
1080 so is not permitted for the standard typedefs, but some
1081 systems use it anyway. */
1082 || type == char_type_node)
1083 is_long = 0;
1084 else
1085 gcc_unreachable ();
1086
1087 unsigned_suffix = TYPE_UNSIGNED (type);
1088 if (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))
1089 unsigned_suffix = 0;
1090 return suffixes[is_long * 2 + unsigned_suffix];
1091}
1092
1093/* Define MACRO as a <stdint.h> constant-suffix macro for TYPE. */
1094static void
1095builtin_define_constants (const char *macro, tree type)
1096{
1097 const char *suffix;
1098 char *buf;
1099
1100 suffix = type_suffix (type);
1101
1102 if (suffix[0] == 0)
1103 {
1104 buf = (char *) alloca (strlen (macro) + 6);
1105 sprintf (buf, "%s(c)=c", macro);
1106 }
1107 else
1108 {
1109 buf = (char *) alloca (strlen (macro) + 9 + strlen (suffix) + 1);
1110 sprintf (buf, "%s(c)=c ## %s", macro, suffix);
1111 }
1112
1113 cpp_define (parse_in, buf);
1114}
1115
1116/* Define MAX for TYPE based on the precision of the type. */
1117
1118static void
1119builtin_define_type_max (const char *macro, tree type)
1120{
1121 builtin_define_type_minmax (NULL, macro, type);
1122}
1123
1124/* Define MIN_MACRO (if not NULL) and MAX_MACRO for TYPE based on the
1125 precision of the type. */
cb60f38d
NB
1126
1127static void
207bf79d
JM
1128builtin_define_type_minmax (const char *min_macro, const char *max_macro,
1129 tree type)
cb60f38d
NB
1130{
1131 static const char *const values[]
1132 = { "127", "255",
1133 "32767", "65535",
1134 "2147483647", "4294967295",
1135 "9223372036854775807", "18446744073709551615",
1136 "170141183460469231731687303715884105727",
1137 "340282366920938463463374607431768211455" };
cb60f38d
NB
1138
1139 const char *value, *suffix;
1140 char *buf;
1141 size_t idx;
1142
1143 /* Pre-rendering the values mean we don't have to futz with printing a
1144 multi-word decimal value. There are also a very limited number of
1145 precisions that we support, so it's really a waste of time. */
1146 switch (TYPE_PRECISION (type))
1147 {
1148 case 8: idx = 0; break;
1149 case 16: idx = 2; break;
1150 case 32: idx = 4; break;
1151 case 64: idx = 6; break;
1152 case 128: idx = 8; break;
366de0ce 1153 default: gcc_unreachable ();
cb60f38d
NB
1154 }
1155
8df83eae 1156 value = values[idx + TYPE_UNSIGNED (type)];
207bf79d 1157 suffix = type_suffix (type);
cb60f38d 1158
207bf79d 1159 buf = (char *) alloca (strlen (max_macro) + 1 + strlen (value)
cceb1885 1160 + strlen (suffix) + 1);
207bf79d 1161 sprintf (buf, "%s=%s%s", max_macro, value, suffix);
cb60f38d
NB
1162
1163 cpp_define (parse_in, buf);
207bf79d
JM
1164
1165 if (min_macro)
1166 {
1167 if (TYPE_UNSIGNED (type))
1168 {
1169 buf = (char *) alloca (strlen (min_macro) + 2 + strlen (suffix) + 1);
1170 sprintf (buf, "%s=0%s", min_macro, suffix);
1171 }
1172 else
1173 {
1174 buf = (char *) alloca (strlen (min_macro) + 3
1175 + strlen (max_macro) + 6);
1176 sprintf (buf, "%s=(-%s - 1)", min_macro, max_macro);
1177 }
1178 cpp_define (parse_in, buf);
1179 }
cb60f38d 1180}
5bca794b
JJ
1181
1182#include "gt-c-family-c-cppbuiltin.h"