annotate gcc/c-family/c-cppbuiltin.c @ 132:d34655255c78

update gcc-8.2
author mir3636
date Thu, 25 Oct 2018 10:21:07 +0900
parents 84e7813d76e9
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 /* Define builtin-in macros for the C family front ends.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 Copyright (C) 2002-2018 Free Software Foundation, Inc.
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 This file is part of GCC.
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 GCC is free software; you can redistribute it and/or modify it under
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 the terms of the GNU General Public License as published by the Free
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 Software Foundation; either version 3, or (at your option) any later
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 version.
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 for more details.
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 along with GCC; see the file COPYING3. If not see
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 <http://www.gnu.org/licenses/>. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 #include "config.h"
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 #include "system.h"
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 #include "coretypes.h"
111
kono
parents: 68
diff changeset
23 #include "target.h"
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 #include "c-common.h"
111
kono
parents: 68
diff changeset
25 #include "memmodel.h"
kono
parents: 68
diff changeset
26 #include "tm_p.h" /* For TARGET_CPU_CPP_BUILTINS & friends. */
kono
parents: 68
diff changeset
27 #include "stringpool.h"
kono
parents: 68
diff changeset
28 #include "stor-layout.h"
kono
parents: 68
diff changeset
29 #include "flags.h"
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 #include "c-pragma.h"
111
kono
parents: 68
diff changeset
31 #include "output.h" /* For user_label_prefix. */
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 #include "debug.h" /* For dwarf2out_do_cfi_asm. */
111
kono
parents: 68
diff changeset
33 #include "common/common-target.h"
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 #include "cppbuiltin.h"
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 #ifndef TARGET_OS_CPP_BUILTINS
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 # define TARGET_OS_CPP_BUILTINS()
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 #endif
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 #ifndef TARGET_OBJFMT_CPP_BUILTINS
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 # define TARGET_OBJFMT_CPP_BUILTINS()
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 #endif
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 #ifndef REGISTER_PREFIX
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 #define REGISTER_PREFIX ""
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 #endif
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 /* Non-static as some targets don't use it. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 static void builtin_define_with_hex_fp_value (const char *, tree,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 int, const char *,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 const char *,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 const char *);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 static void builtin_define_stdint_macros (void);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 static void builtin_define_constants (const char *, tree);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 static void builtin_define_type_max (const char *, tree);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 static void builtin_define_type_minmax (const char *, const char *, tree);
111
kono
parents: 68
diff changeset
57 static void builtin_define_type_width (const char *, tree, tree);
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 static void builtin_define_float_constants (const char *,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 const char *,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 const char *,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 const char *,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 tree);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 /* Return true if MODE provides a fast multiply/add (FMA) builtin function.
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 Originally this function used the fma optab, but that doesn't work with
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 -save-temps, so just rely on the HAVE_fma macros for the standard floating
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 point types. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 static bool
111
kono
parents: 68
diff changeset
70 mode_has_fma (machine_mode mode)
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 switch (mode)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 #ifdef HAVE_fmasf4
111
kono
parents: 68
diff changeset
75 case E_SFmode:
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 return !!HAVE_fmasf4;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 #endif
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 #ifdef HAVE_fmadf4
111
kono
parents: 68
diff changeset
80 case E_DFmode:
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 return !!HAVE_fmadf4;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 #endif
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
84 #ifdef HAVE_fmakf4 /* PowerPC if long double != __float128. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
85 case E_KFmode:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
86 return !!HAVE_fmakf4;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
87 #endif
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
88
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 #ifdef HAVE_fmaxf4
111
kono
parents: 68
diff changeset
90 case E_XFmode:
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 return !!HAVE_fmaxf4;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 #endif
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 #ifdef HAVE_fmatf4
111
kono
parents: 68
diff changeset
95 case E_TFmode:
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 return !!HAVE_fmatf4;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 #endif
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 default:
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 break;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 return false;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 /* Define NAME with value TYPE size_unit. */
111
kono
parents: 68
diff changeset
107 void
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 builtin_define_type_sizeof (const char *name, tree type)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 builtin_define_with_int_value (name,
111
kono
parents: 68
diff changeset
111 tree_to_uhwi (TYPE_SIZE_UNIT (type)));
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 /* Define the float.h constants for TYPE using NAME_PREFIX, FP_SUFFIX,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 and FP_CAST. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 static void
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 builtin_define_float_constants (const char *name_prefix,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 const char *fp_suffix,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 const char *fp_cast,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 const char *fma_suffix,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 tree type)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 /* Used to convert radix-based values to base 10 values in several cases.
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 In the max_exp -> max_10_exp conversion for 128-bit IEEE, we need at
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 least 6 significant digits for correct results. Using the fraction
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 formed by (log(2)*1e6)/(log(10)*1e6) overflows a 32-bit integer as an
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 intermediate; perhaps someone can find a better approximation, in the
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 mean time, I suspect using doubles won't harm the bootstrap here. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 const double log10_2 = .30102999566398119521;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 double log10_b;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 const struct real_format *fmt;
111
kono
parents: 68
diff changeset
134 const struct real_format *widefmt;
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 char name[64], buf[128];
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 int dig, min_10_exp, max_10_exp;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 int decimal_dig;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 int type_decimal_dig;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 gcc_assert (fmt->b != 10);
111
kono
parents: 68
diff changeset
143 widefmt = REAL_MODE_FORMAT (TYPE_MODE (long_double_type_node));
kono
parents: 68
diff changeset
144 gcc_assert (widefmt->b != 10);
kono
parents: 68
diff changeset
145 for (int i = 0; i < NUM_FLOATN_NX_TYPES; i++)
kono
parents: 68
diff changeset
146 {
kono
parents: 68
diff changeset
147 tree wtype = FLOATN_NX_TYPE_NODE (i);
kono
parents: 68
diff changeset
148 if (wtype != NULL_TREE)
kono
parents: 68
diff changeset
149 {
kono
parents: 68
diff changeset
150 const struct real_format *wfmt
kono
parents: 68
diff changeset
151 = REAL_MODE_FORMAT (TYPE_MODE (wtype));
kono
parents: 68
diff changeset
152 gcc_assert (wfmt->b != 10);
kono
parents: 68
diff changeset
153 if (wfmt->p > widefmt->p)
kono
parents: 68
diff changeset
154 widefmt = wfmt;
kono
parents: 68
diff changeset
155 }
kono
parents: 68
diff changeset
156 }
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 /* The radix of the exponent representation. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 if (type == float_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 builtin_define_with_int_value ("__FLT_RADIX__", fmt->b);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 log10_b = log10_2;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 /* The number of radix digits, p, in the floating-point significand. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 sprintf (name, "__%s_MANT_DIG__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 builtin_define_with_int_value (name, fmt->p);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 /* The number of decimal digits, q, such that any floating-point number
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 with q decimal digits can be rounded into a floating-point number with
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 p radix b digits and back again without change to the q decimal digits,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 p log10 b if b is a power of 10
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 floor((p - 1) log10 b) otherwise
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 dig = (fmt->p - 1) * log10_b;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 sprintf (name, "__%s_DIG__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 builtin_define_with_int_value (name, dig);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
177
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 /* The minimum negative int x such that b**(x-1) is a normalized float. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 sprintf (name, "__%s_MIN_EXP__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 sprintf (buf, "(%d)", fmt->emin);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 builtin_define_with_value (name, buf, 0);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 /* The minimum negative int x such that 10**x is a normalized float,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 ceil (log10 (b ** (emin - 1)))
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 = ceil (log10 (b) * (emin - 1))
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 Recall that emin is negative, so the integer truncation calculates
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 the ceiling, not the floor, in this case. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 min_10_exp = (fmt->emin - 1) * log10_b;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 sprintf (name, "__%s_MIN_10_EXP__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 sprintf (buf, "(%d)", min_10_exp);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 builtin_define_with_value (name, buf, 0);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 /* The maximum int x such that b**(x-1) is a representable float. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 sprintf (name, "__%s_MAX_EXP__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 builtin_define_with_int_value (name, fmt->emax);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 /* The maximum int x such that 10**x is in the range of representable
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 finite floating-point numbers,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
201
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 floor (log10((1 - b**-p) * b**emax))
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 = floor (log10(1 - b**-p) + log10(b**emax))
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 = floor (log10(1 - b**-p) + log10(b)*emax)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 The safest thing to do here is to just compute this number. But since
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 we don't link cc1 with libm, we cannot. We could implement log10 here
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 a series expansion, but that seems too much effort because:
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 Note that the first term, for all extant p, is a number exceedingly close
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 to zero, but slightly negative. Note that the second term is an integer
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 scaling an irrational number, and that because of the floor we are only
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 interested in its integral portion.
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 In order for the first term to have any effect on the integral portion
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 of the second term, the second term has to be exceedingly close to an
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 integer itself (e.g. 123.000000000001 or something). Getting a result
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 that close to an integer requires that the irrational multiplicand have
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 a long series of zeros in its expansion, which doesn't occur in the
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 first 20 digits or so of log10(b).
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
221
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 Hand-waving aside, crunching all of the sets of constants above by hand
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 does not yield a case for which the first term is significant, which
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 in the end is all that matters. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 max_10_exp = fmt->emax * log10_b;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 sprintf (name, "__%s_MAX_10_EXP__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 builtin_define_with_int_value (name, max_10_exp);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
228
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 /* The number of decimal digits, n, such that any floating-point number
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 can be rounded to n decimal digits and back again without change to
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 the value.
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
232
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 p * log10(b) if b is a power of 10
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 ceil(1 + p * log10(b)) otherwise
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
235
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 The only macro we care about is this number for the widest supported
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 floating type, but we want this value for rendering constants below. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 double d_decimal_dig
111
kono
parents: 68
diff changeset
240 = 1 + (fmt->p < widefmt->p ? widefmt->p : fmt->p) * log10_b;
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 decimal_dig = d_decimal_dig;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 if (decimal_dig < d_decimal_dig)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
243 decimal_dig++;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 /* Similar, for this type rather than long double. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 double type_d_decimal_dig = 1 + fmt->p * log10_b;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 type_decimal_dig = type_d_decimal_dig;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 if (type_decimal_dig < type_d_decimal_dig)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
250 type_decimal_dig++;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 }
111
kono
parents: 68
diff changeset
252 /* Define __DECIMAL_DIG__ to the value for long double to be
kono
parents: 68
diff changeset
253 compatible with C99 and C11; see DR#501 and N2108. */
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 if (type == long_double_type_node)
111
kono
parents: 68
diff changeset
255 builtin_define_with_int_value ("__DECIMAL_DIG__", type_decimal_dig);
kono
parents: 68
diff changeset
256 sprintf (name, "__%s_DECIMAL_DIG__", name_prefix);
kono
parents: 68
diff changeset
257 builtin_define_with_int_value (name, type_decimal_dig);
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
258
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
259 /* Since, for the supported formats, B is always a power of 2, we
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 construct the following numbers directly as a hexadecimal
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
261 constants. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
262 get_max_float (fmt, buf, sizeof (buf));
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
263
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
264 sprintf (name, "__%s_MAX__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
265 builtin_define_with_hex_fp_value (name, type, decimal_dig, buf, fp_suffix, fp_cast);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
266
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
267 /* The minimum normalized positive floating-point number,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
268 b**(emin-1). */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
269 sprintf (name, "__%s_MIN__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
270 sprintf (buf, "0x1p%d", fmt->emin - 1);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
271 builtin_define_with_hex_fp_value (name, type, decimal_dig, buf, fp_suffix, fp_cast);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
272
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
273 /* The difference between 1 and the least value greater than 1 that is
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
274 representable in the given floating point type, b**(1-p). */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
275 sprintf (name, "__%s_EPSILON__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
276 if (fmt->pnan < fmt->p)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
277 /* This is an IBM extended double format, so 1.0 + any double is
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
278 representable precisely. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
279 sprintf (buf, "0x1p%d", fmt->emin - fmt->p);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
280 else
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
281 sprintf (buf, "0x1p%d", 1 - fmt->p);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
282 builtin_define_with_hex_fp_value (name, type, decimal_dig, buf, fp_suffix, fp_cast);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
283
111
kono
parents: 68
diff changeset
284 /* For C++ std::numeric_limits<T>::denorm_min and C11 *_TRUE_MIN.
kono
parents: 68
diff changeset
285 The minimum denormalized positive floating-point number, b**(emin-p).
kono
parents: 68
diff changeset
286 The minimum normalized positive floating-point number for formats
kono
parents: 68
diff changeset
287 that don't support denormals. */
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
288 sprintf (name, "__%s_DENORM_MIN__", name_prefix);
111
kono
parents: 68
diff changeset
289 sprintf (buf, "0x1p%d", fmt->emin - (fmt->has_denorm ? fmt->p : 1));
kono
parents: 68
diff changeset
290 builtin_define_with_hex_fp_value (name, type, decimal_dig,
kono
parents: 68
diff changeset
291 buf, fp_suffix, fp_cast);
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
292
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
293 sprintf (name, "__%s_HAS_DENORM__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
294 builtin_define_with_value (name, fmt->has_denorm ? "1" : "0", 0);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
295
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
296 /* For C++ std::numeric_limits<T>::has_infinity. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
297 sprintf (name, "__%s_HAS_INFINITY__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
298 builtin_define_with_int_value (name,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
299 MODE_HAS_INFINITIES (TYPE_MODE (type)));
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
300 /* For C++ std::numeric_limits<T>::has_quiet_NaN. We do not have a
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
301 predicate to distinguish a target that has both quiet and
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
302 signalling NaNs from a target that has only quiet NaNs or only
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
303 signalling NaNs, so we assume that a target that has any kind of
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
304 NaN has quiet NaNs. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
305 sprintf (name, "__%s_HAS_QUIET_NAN__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
306 builtin_define_with_int_value (name, MODE_HAS_NANS (TYPE_MODE (type)));
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
307
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
308 /* Note whether we have fast FMA. */
111
kono
parents: 68
diff changeset
309 if (mode_has_fma (TYPE_MODE (type)) && fma_suffix != NULL)
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
310 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
311 sprintf (name, "__FP_FAST_FMA%s", fma_suffix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
312 builtin_define_with_int_value (name, 1);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
313 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
314 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
315
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
316 /* Define __DECx__ constants for TYPE using NAME_PREFIX and SUFFIX. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
317 static void
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
318 builtin_define_decimal_float_constants (const char *name_prefix,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
319 const char *suffix,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
320 tree type)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
321 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
322 const struct real_format *fmt;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
323 char name[64], buf[128], *p;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
324 int digits;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
325
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
326 fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
327
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
328 /* The number of radix digits, p, in the significand. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
329 sprintf (name, "__%s_MANT_DIG__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
330 builtin_define_with_int_value (name, fmt->p);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
331
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
332 /* The minimum negative int x such that b**(x-1) is a normalized float. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
333 sprintf (name, "__%s_MIN_EXP__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
334 sprintf (buf, "(%d)", fmt->emin);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
335 builtin_define_with_value (name, buf, 0);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
336
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
337 /* The maximum int x such that b**(x-1) is a representable float. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
338 sprintf (name, "__%s_MAX_EXP__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
339 builtin_define_with_int_value (name, fmt->emax);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
340
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
341 /* Compute the minimum representable value. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
342 sprintf (name, "__%s_MIN__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
343 sprintf (buf, "1E%d%s", fmt->emin - 1, suffix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
344 builtin_define_with_value (name, buf, 0);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
345
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
346 /* Compute the maximum representable value. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
347 sprintf (name, "__%s_MAX__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
348 p = buf;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
349 for (digits = fmt->p; digits; digits--)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
350 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
351 *p++ = '9';
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
352 if (digits == fmt->p)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
353 *p++ = '.';
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
354 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
355 *p = 0;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
356 /* fmt->p plus 1, to account for the decimal point and fmt->emax
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
357 minus 1 because the digits are nines, not 1.0. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
358 sprintf (&buf[fmt->p + 1], "E%d%s", fmt->emax - 1, suffix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
359 builtin_define_with_value (name, buf, 0);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
360
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
361 /* Compute epsilon (the difference between 1 and least value greater
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
362 than 1 representable). */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
363 sprintf (name, "__%s_EPSILON__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
364 sprintf (buf, "1E-%d%s", fmt->p - 1, suffix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
365 builtin_define_with_value (name, buf, 0);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
366
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
367 /* Minimum subnormal positive decimal value. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
368 sprintf (name, "__%s_SUBNORMAL_MIN__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
369 p = buf;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
370 for (digits = fmt->p; digits > 1; digits--)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
371 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
372 *p++ = '0';
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
373 if (digits == fmt->p)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
374 *p++ = '.';
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
375 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
376 *p = 0;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
377 sprintf (&buf[fmt->p], "1E%d%s", fmt->emin - 1, suffix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
378 builtin_define_with_value (name, buf, 0);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
379 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
380
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
381 /* Define fixed-point constants for TYPE using NAME_PREFIX and SUFFIX. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
382
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
383 static void
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
384 builtin_define_fixed_point_constants (const char *name_prefix,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
385 const char *suffix,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
386 tree type)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
387 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
388 char name[64], buf[256], *new_buf;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
389 int i, mod;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
390
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
391 sprintf (name, "__%s_FBIT__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
392 builtin_define_with_int_value (name, TYPE_FBIT (type));
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
393
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
394 sprintf (name, "__%s_IBIT__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
395 builtin_define_with_int_value (name, TYPE_IBIT (type));
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
396
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
397 /* If there is no suffix, defines are for fixed-point modes.
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
398 We just return. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
399 if (strcmp (suffix, "") == 0)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
400 return;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
401
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
402 if (TYPE_UNSIGNED (type))
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
403 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
404 sprintf (name, "__%s_MIN__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
405 sprintf (buf, "0.0%s", suffix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
406 builtin_define_with_value (name, buf, 0);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
407 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
408 else
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
409 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
410 sprintf (name, "__%s_MIN__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
411 if (ALL_ACCUM_MODE_P (TYPE_MODE (type)))
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
412 sprintf (buf, "(-0X1P%d%s-0X1P%d%s)", TYPE_IBIT (type) - 1, suffix,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
413 TYPE_IBIT (type) - 1, suffix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
414 else
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
415 sprintf (buf, "(-0.5%s-0.5%s)", suffix, suffix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
416 builtin_define_with_value (name, buf, 0);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
417 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
418
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
419 sprintf (name, "__%s_MAX__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
420 sprintf (buf, "0X");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
421 new_buf = buf + 2;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
422 mod = (TYPE_FBIT (type) + TYPE_IBIT (type)) % 4;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
423 if (mod)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
424 sprintf (new_buf++, "%x", (1 << mod) - 1);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
425 for (i = 0; i < (TYPE_FBIT (type) + TYPE_IBIT (type)) / 4; i++)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
426 sprintf (new_buf++, "F");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
427 sprintf (new_buf, "P-%d%s", TYPE_FBIT (type), suffix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
428 builtin_define_with_value (name, buf, 0);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
429
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
430 sprintf (name, "__%s_EPSILON__", name_prefix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
431 sprintf (buf, "0x1P-%d%s", TYPE_FBIT (type), suffix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
432 builtin_define_with_value (name, buf, 0);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
433 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
434
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
435 /* Define macros used by <stdint.h>. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
436 static void
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
437 builtin_define_stdint_macros (void)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
438 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
439 builtin_define_type_max ("__INTMAX_MAX__", intmax_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
440 builtin_define_constants ("__INTMAX_C", intmax_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
441 builtin_define_type_max ("__UINTMAX_MAX__", uintmax_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
442 builtin_define_constants ("__UINTMAX_C", uintmax_type_node);
111
kono
parents: 68
diff changeset
443 builtin_define_type_width ("__INTMAX_WIDTH__", intmax_type_node,
kono
parents: 68
diff changeset
444 uintmax_type_node);
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
445 if (sig_atomic_type_node)
111
kono
parents: 68
diff changeset
446 {
kono
parents: 68
diff changeset
447 builtin_define_type_minmax ("__SIG_ATOMIC_MIN__", "__SIG_ATOMIC_MAX__",
kono
parents: 68
diff changeset
448 sig_atomic_type_node);
kono
parents: 68
diff changeset
449 builtin_define_type_width ("__SIG_ATOMIC_WIDTH__", sig_atomic_type_node,
kono
parents: 68
diff changeset
450 NULL_TREE);
kono
parents: 68
diff changeset
451 }
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
452 if (int8_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
453 builtin_define_type_max ("__INT8_MAX__", int8_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
454 if (int16_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
455 builtin_define_type_max ("__INT16_MAX__", int16_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
456 if (int32_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
457 builtin_define_type_max ("__INT32_MAX__", int32_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
458 if (int64_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
459 builtin_define_type_max ("__INT64_MAX__", int64_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
460 if (uint8_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
461 builtin_define_type_max ("__UINT8_MAX__", uint8_type_node);
111
kono
parents: 68
diff changeset
462 if (c_uint16_type_node)
kono
parents: 68
diff changeset
463 builtin_define_type_max ("__UINT16_MAX__", c_uint16_type_node);
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
464 if (c_uint32_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
465 builtin_define_type_max ("__UINT32_MAX__", c_uint32_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
466 if (c_uint64_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
467 builtin_define_type_max ("__UINT64_MAX__", c_uint64_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
468 if (int_least8_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
469 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
470 builtin_define_type_max ("__INT_LEAST8_MAX__", int_least8_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
471 builtin_define_constants ("__INT8_C", int_least8_type_node);
111
kono
parents: 68
diff changeset
472 builtin_define_type_width ("__INT_LEAST8_WIDTH__", int_least8_type_node,
kono
parents: 68
diff changeset
473 uint_least8_type_node);
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
474 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
475 if (int_least16_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
476 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
477 builtin_define_type_max ("__INT_LEAST16_MAX__", int_least16_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
478 builtin_define_constants ("__INT16_C", int_least16_type_node);
111
kono
parents: 68
diff changeset
479 builtin_define_type_width ("__INT_LEAST16_WIDTH__",
kono
parents: 68
diff changeset
480 int_least16_type_node,
kono
parents: 68
diff changeset
481 uint_least16_type_node);
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
482 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
483 if (int_least32_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
484 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
485 builtin_define_type_max ("__INT_LEAST32_MAX__", int_least32_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
486 builtin_define_constants ("__INT32_C", int_least32_type_node);
111
kono
parents: 68
diff changeset
487 builtin_define_type_width ("__INT_LEAST32_WIDTH__",
kono
parents: 68
diff changeset
488 int_least32_type_node,
kono
parents: 68
diff changeset
489 uint_least32_type_node);
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
490 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
491 if (int_least64_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
492 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
493 builtin_define_type_max ("__INT_LEAST64_MAX__", int_least64_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
494 builtin_define_constants ("__INT64_C", int_least64_type_node);
111
kono
parents: 68
diff changeset
495 builtin_define_type_width ("__INT_LEAST64_WIDTH__",
kono
parents: 68
diff changeset
496 int_least64_type_node,
kono
parents: 68
diff changeset
497 uint_least64_type_node);
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
498 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
499 if (uint_least8_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
500 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
501 builtin_define_type_max ("__UINT_LEAST8_MAX__", uint_least8_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
502 builtin_define_constants ("__UINT8_C", uint_least8_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
503 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
504 if (uint_least16_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
505 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
506 builtin_define_type_max ("__UINT_LEAST16_MAX__", uint_least16_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
507 builtin_define_constants ("__UINT16_C", uint_least16_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
508 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
509 if (uint_least32_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
510 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
511 builtin_define_type_max ("__UINT_LEAST32_MAX__", uint_least32_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
512 builtin_define_constants ("__UINT32_C", uint_least32_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
513 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
514 if (uint_least64_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
515 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
516 builtin_define_type_max ("__UINT_LEAST64_MAX__", uint_least64_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
517 builtin_define_constants ("__UINT64_C", uint_least64_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
518 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
519 if (int_fast8_type_node)
111
kono
parents: 68
diff changeset
520 {
kono
parents: 68
diff changeset
521 builtin_define_type_max ("__INT_FAST8_MAX__", int_fast8_type_node);
kono
parents: 68
diff changeset
522 builtin_define_type_width ("__INT_FAST8_WIDTH__", int_fast8_type_node,
kono
parents: 68
diff changeset
523 uint_fast8_type_node);
kono
parents: 68
diff changeset
524 }
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
525 if (int_fast16_type_node)
111
kono
parents: 68
diff changeset
526 {
kono
parents: 68
diff changeset
527 builtin_define_type_max ("__INT_FAST16_MAX__", int_fast16_type_node);
kono
parents: 68
diff changeset
528 builtin_define_type_width ("__INT_FAST16_WIDTH__", int_fast16_type_node,
kono
parents: 68
diff changeset
529 uint_fast16_type_node);
kono
parents: 68
diff changeset
530 }
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
531 if (int_fast32_type_node)
111
kono
parents: 68
diff changeset
532 {
kono
parents: 68
diff changeset
533 builtin_define_type_max ("__INT_FAST32_MAX__", int_fast32_type_node);
kono
parents: 68
diff changeset
534 builtin_define_type_width ("__INT_FAST32_WIDTH__", int_fast32_type_node,
kono
parents: 68
diff changeset
535 uint_fast32_type_node);
kono
parents: 68
diff changeset
536 }
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
537 if (int_fast64_type_node)
111
kono
parents: 68
diff changeset
538 {
kono
parents: 68
diff changeset
539 builtin_define_type_max ("__INT_FAST64_MAX__", int_fast64_type_node);
kono
parents: 68
diff changeset
540 builtin_define_type_width ("__INT_FAST64_WIDTH__", int_fast64_type_node,
kono
parents: 68
diff changeset
541 uint_fast64_type_node);
kono
parents: 68
diff changeset
542 }
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
543 if (uint_fast8_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
544 builtin_define_type_max ("__UINT_FAST8_MAX__", uint_fast8_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
545 if (uint_fast16_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
546 builtin_define_type_max ("__UINT_FAST16_MAX__", uint_fast16_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
547 if (uint_fast32_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
548 builtin_define_type_max ("__UINT_FAST32_MAX__", uint_fast32_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
549 if (uint_fast64_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
550 builtin_define_type_max ("__UINT_FAST64_MAX__", uint_fast64_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
551 if (intptr_type_node)
111
kono
parents: 68
diff changeset
552 {
kono
parents: 68
diff changeset
553 builtin_define_type_max ("__INTPTR_MAX__", intptr_type_node);
kono
parents: 68
diff changeset
554 builtin_define_type_width ("__INTPTR_WIDTH__", intptr_type_node,
kono
parents: 68
diff changeset
555 uintptr_type_node);
kono
parents: 68
diff changeset
556 }
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
557 if (uintptr_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
558 builtin_define_type_max ("__UINTPTR_MAX__", uintptr_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
559 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
560
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
561 /* Adjust the optimization macros when a #pragma GCC optimization is done to
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
562 reflect the current level. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
563 void
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
564 c_cpp_builtins_optimize_pragma (cpp_reader *pfile, tree prev_tree,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
565 tree cur_tree)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
566 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
567 struct cl_optimization *prev = TREE_OPTIMIZATION (prev_tree);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
568 struct cl_optimization *cur = TREE_OPTIMIZATION (cur_tree);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
569 bool prev_fast_math;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
570 bool cur_fast_math;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
571
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
572 /* -undef turns off target-specific built-ins. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
573 if (flag_undef)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
574 return;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
575
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
576 /* Other target-independent built-ins determined by command-line
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
577 options. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
578 if (!prev->x_optimize_size && cur->x_optimize_size)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
579 cpp_define (pfile, "__OPTIMIZE_SIZE__");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
580 else if (prev->x_optimize_size && !cur->x_optimize_size)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
581 cpp_undef (pfile, "__OPTIMIZE_SIZE__");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
582
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
583 if (!prev->x_optimize && cur->x_optimize)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
584 cpp_define (pfile, "__OPTIMIZE__");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
585 else if (prev->x_optimize && !cur->x_optimize)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
586 cpp_undef (pfile, "__OPTIMIZE__");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
587
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
588 prev_fast_math = fast_math_flags_struct_set_p (prev);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
589 cur_fast_math = fast_math_flags_struct_set_p (cur);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
590 if (!prev_fast_math && cur_fast_math)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
591 cpp_define (pfile, "__FAST_MATH__");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
592 else if (prev_fast_math && !cur_fast_math)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
593 cpp_undef (pfile, "__FAST_MATH__");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
594
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
595 if (!prev->x_flag_signaling_nans && cur->x_flag_signaling_nans)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
596 cpp_define (pfile, "__SUPPORT_SNAN__");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
597 else if (prev->x_flag_signaling_nans && !cur->x_flag_signaling_nans)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
598 cpp_undef (pfile, "__SUPPORT_SNAN__");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
599
111
kono
parents: 68
diff changeset
600 if (!prev->x_flag_errno_math && cur->x_flag_errno_math)
kono
parents: 68
diff changeset
601 cpp_undef (pfile, "__NO_MATH_ERRNO__");
kono
parents: 68
diff changeset
602 else if (prev->x_flag_errno_math && !cur->x_flag_errno_math)
kono
parents: 68
diff changeset
603 cpp_define (pfile, "__NO_MATH_ERRNO__");
kono
parents: 68
diff changeset
604
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
605 if (!prev->x_flag_finite_math_only && cur->x_flag_finite_math_only)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
606 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
607 cpp_undef (pfile, "__FINITE_MATH_ONLY__");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
608 cpp_define (pfile, "__FINITE_MATH_ONLY__=1");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
609 }
111
kono
parents: 68
diff changeset
610 else if (prev->x_flag_finite_math_only && !cur->x_flag_finite_math_only)
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
611 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
612 cpp_undef (pfile, "__FINITE_MATH_ONLY__");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
613 cpp_define (pfile, "__FINITE_MATH_ONLY__=0");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
614 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
615 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
616
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
617
111
kono
parents: 68
diff changeset
618 /* This function will emit cpp macros to indicate the presence of various lock
kono
parents: 68
diff changeset
619 free atomic operations. */
kono
parents: 68
diff changeset
620
kono
parents: 68
diff changeset
621 static void
kono
parents: 68
diff changeset
622 cpp_atomic_builtins (cpp_reader *pfile)
kono
parents: 68
diff changeset
623 {
kono
parents: 68
diff changeset
624 /* Set a flag for each size of object that compare and swap exists for up to
kono
parents: 68
diff changeset
625 a 16 byte object. */
kono
parents: 68
diff changeset
626 #define SWAP_LIMIT 17
kono
parents: 68
diff changeset
627 bool have_swap[SWAP_LIMIT];
kono
parents: 68
diff changeset
628 unsigned int psize;
kono
parents: 68
diff changeset
629
kono
parents: 68
diff changeset
630 /* Clear the map of sizes compare_and swap exists for. */
kono
parents: 68
diff changeset
631 memset (have_swap, 0, sizeof (have_swap));
kono
parents: 68
diff changeset
632
kono
parents: 68
diff changeset
633 /* Tell source code if the compiler makes sync_compare_and_swap
kono
parents: 68
diff changeset
634 builtins available. */
kono
parents: 68
diff changeset
635 #ifndef HAVE_sync_compare_and_swapqi
kono
parents: 68
diff changeset
636 #define HAVE_sync_compare_and_swapqi 0
kono
parents: 68
diff changeset
637 #endif
kono
parents: 68
diff changeset
638 #ifndef HAVE_atomic_compare_and_swapqi
kono
parents: 68
diff changeset
639 #define HAVE_atomic_compare_and_swapqi 0
kono
parents: 68
diff changeset
640 #endif
kono
parents: 68
diff changeset
641
kono
parents: 68
diff changeset
642 if (HAVE_sync_compare_and_swapqi || HAVE_atomic_compare_and_swapqi)
kono
parents: 68
diff changeset
643 {
kono
parents: 68
diff changeset
644 cpp_define (pfile, "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
kono
parents: 68
diff changeset
645 have_swap[1] = true;
kono
parents: 68
diff changeset
646 }
kono
parents: 68
diff changeset
647
kono
parents: 68
diff changeset
648 #ifndef HAVE_sync_compare_and_swaphi
kono
parents: 68
diff changeset
649 #define HAVE_sync_compare_and_swaphi 0
kono
parents: 68
diff changeset
650 #endif
kono
parents: 68
diff changeset
651 #ifndef HAVE_atomic_compare_and_swaphi
kono
parents: 68
diff changeset
652 #define HAVE_atomic_compare_and_swaphi 0
kono
parents: 68
diff changeset
653 #endif
kono
parents: 68
diff changeset
654 if (HAVE_sync_compare_and_swaphi || HAVE_atomic_compare_and_swaphi)
kono
parents: 68
diff changeset
655 {
kono
parents: 68
diff changeset
656 cpp_define (pfile, "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
kono
parents: 68
diff changeset
657 have_swap[2] = true;
kono
parents: 68
diff changeset
658 }
kono
parents: 68
diff changeset
659
kono
parents: 68
diff changeset
660 #ifndef HAVE_sync_compare_and_swapsi
kono
parents: 68
diff changeset
661 #define HAVE_sync_compare_and_swapsi 0
kono
parents: 68
diff changeset
662 #endif
kono
parents: 68
diff changeset
663 #ifndef HAVE_atomic_compare_and_swapsi
kono
parents: 68
diff changeset
664 #define HAVE_atomic_compare_and_swapsi 0
kono
parents: 68
diff changeset
665 #endif
kono
parents: 68
diff changeset
666 if (HAVE_sync_compare_and_swapsi || HAVE_atomic_compare_and_swapsi)
kono
parents: 68
diff changeset
667 {
kono
parents: 68
diff changeset
668 cpp_define (pfile, "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
kono
parents: 68
diff changeset
669 have_swap[4] = true;
kono
parents: 68
diff changeset
670 }
kono
parents: 68
diff changeset
671
kono
parents: 68
diff changeset
672 #ifndef HAVE_sync_compare_and_swapdi
kono
parents: 68
diff changeset
673 #define HAVE_sync_compare_and_swapdi 0
kono
parents: 68
diff changeset
674 #endif
kono
parents: 68
diff changeset
675 #ifndef HAVE_atomic_compare_and_swapdi
kono
parents: 68
diff changeset
676 #define HAVE_atomic_compare_and_swapdi 0
kono
parents: 68
diff changeset
677 #endif
kono
parents: 68
diff changeset
678 if (HAVE_sync_compare_and_swapdi || HAVE_atomic_compare_and_swapdi)
kono
parents: 68
diff changeset
679 {
kono
parents: 68
diff changeset
680 cpp_define (pfile, "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
kono
parents: 68
diff changeset
681 have_swap[8] = true;
kono
parents: 68
diff changeset
682 }
kono
parents: 68
diff changeset
683
kono
parents: 68
diff changeset
684 #ifndef HAVE_sync_compare_and_swapti
kono
parents: 68
diff changeset
685 #define HAVE_sync_compare_and_swapti 0
kono
parents: 68
diff changeset
686 #endif
kono
parents: 68
diff changeset
687 #ifndef HAVE_atomic_compare_and_swapti
kono
parents: 68
diff changeset
688 #define HAVE_atomic_compare_and_swapti 0
kono
parents: 68
diff changeset
689 #endif
kono
parents: 68
diff changeset
690 if (HAVE_sync_compare_and_swapti || HAVE_atomic_compare_and_swapti)
kono
parents: 68
diff changeset
691 {
kono
parents: 68
diff changeset
692 cpp_define (pfile, "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
kono
parents: 68
diff changeset
693 have_swap[16] = true;
kono
parents: 68
diff changeset
694 }
kono
parents: 68
diff changeset
695
kono
parents: 68
diff changeset
696 /* Tell the source code about various types. These map to the C++11 and C11
kono
parents: 68
diff changeset
697 macros where 2 indicates lock-free always, and 1 indicates sometimes
kono
parents: 68
diff changeset
698 lock free. */
kono
parents: 68
diff changeset
699 #define SIZEOF_NODE(T) (tree_to_uhwi (TYPE_SIZE_UNIT (T)))
kono
parents: 68
diff changeset
700 #define SWAP_INDEX(T) ((SIZEOF_NODE (T) < SWAP_LIMIT) ? SIZEOF_NODE (T) : 0)
kono
parents: 68
diff changeset
701 builtin_define_with_int_value ("__GCC_ATOMIC_BOOL_LOCK_FREE",
kono
parents: 68
diff changeset
702 (have_swap[SWAP_INDEX (boolean_type_node)]? 2 : 1));
kono
parents: 68
diff changeset
703 builtin_define_with_int_value ("__GCC_ATOMIC_CHAR_LOCK_FREE",
kono
parents: 68
diff changeset
704 (have_swap[SWAP_INDEX (signed_char_type_node)]? 2 : 1));
kono
parents: 68
diff changeset
705 builtin_define_with_int_value ("__GCC_ATOMIC_CHAR16_T_LOCK_FREE",
kono
parents: 68
diff changeset
706 (have_swap[SWAP_INDEX (char16_type_node)]? 2 : 1));
kono
parents: 68
diff changeset
707 builtin_define_with_int_value ("__GCC_ATOMIC_CHAR32_T_LOCK_FREE",
kono
parents: 68
diff changeset
708 (have_swap[SWAP_INDEX (char32_type_node)]? 2 : 1));
kono
parents: 68
diff changeset
709 builtin_define_with_int_value ("__GCC_ATOMIC_WCHAR_T_LOCK_FREE",
kono
parents: 68
diff changeset
710 (have_swap[SWAP_INDEX (wchar_type_node)]? 2 : 1));
kono
parents: 68
diff changeset
711 builtin_define_with_int_value ("__GCC_ATOMIC_SHORT_LOCK_FREE",
kono
parents: 68
diff changeset
712 (have_swap[SWAP_INDEX (short_integer_type_node)]? 2 : 1));
kono
parents: 68
diff changeset
713 builtin_define_with_int_value ("__GCC_ATOMIC_INT_LOCK_FREE",
kono
parents: 68
diff changeset
714 (have_swap[SWAP_INDEX (integer_type_node)]? 2 : 1));
kono
parents: 68
diff changeset
715 builtin_define_with_int_value ("__GCC_ATOMIC_LONG_LOCK_FREE",
kono
parents: 68
diff changeset
716 (have_swap[SWAP_INDEX (long_integer_type_node)]? 2 : 1));
kono
parents: 68
diff changeset
717 builtin_define_with_int_value ("__GCC_ATOMIC_LLONG_LOCK_FREE",
kono
parents: 68
diff changeset
718 (have_swap[SWAP_INDEX (long_long_integer_type_node)]? 2 : 1));
kono
parents: 68
diff changeset
719
kono
parents: 68
diff changeset
720 /* If we're dealing with a "set" value that doesn't exactly correspond
kono
parents: 68
diff changeset
721 to a boolean truth value, let the library work around that. */
kono
parents: 68
diff changeset
722 builtin_define_with_int_value ("__GCC_ATOMIC_TEST_AND_SET_TRUEVAL",
kono
parents: 68
diff changeset
723 targetm.atomic_test_and_set_trueval);
kono
parents: 68
diff changeset
724
kono
parents: 68
diff changeset
725 /* ptr_type_node can't be used here since ptr_mode is only set when
kono
parents: 68
diff changeset
726 toplev calls backend_init which is not done with -E or pch. */
kono
parents: 68
diff changeset
727 psize = POINTER_SIZE_UNITS;
kono
parents: 68
diff changeset
728 if (psize >= SWAP_LIMIT)
kono
parents: 68
diff changeset
729 psize = 0;
kono
parents: 68
diff changeset
730 builtin_define_with_int_value ("__GCC_ATOMIC_POINTER_LOCK_FREE",
kono
parents: 68
diff changeset
731 (have_swap[psize]? 2 : 1));
kono
parents: 68
diff changeset
732 }
kono
parents: 68
diff changeset
733
kono
parents: 68
diff changeset
734 /* Return TRUE if the implicit excess precision in which the back-end will
kono
parents: 68
diff changeset
735 compute floating-point calculations is not more than the explicit
kono
parents: 68
diff changeset
736 excess precision that the front-end will apply under
kono
parents: 68
diff changeset
737 -fexcess-precision=[standard|fast].
kono
parents: 68
diff changeset
738
kono
parents: 68
diff changeset
739 More intuitively, return TRUE if the excess precision proposed by the
kono
parents: 68
diff changeset
740 front-end is the excess precision that will actually be used. */
kono
parents: 68
diff changeset
741
kono
parents: 68
diff changeset
742 static bool
kono
parents: 68
diff changeset
743 c_cpp_flt_eval_method_iec_559 (void)
kono
parents: 68
diff changeset
744 {
kono
parents: 68
diff changeset
745 enum excess_precision_type front_end_ept
kono
parents: 68
diff changeset
746 = (flag_excess_precision_cmdline == EXCESS_PRECISION_STANDARD
kono
parents: 68
diff changeset
747 ? EXCESS_PRECISION_TYPE_STANDARD
kono
parents: 68
diff changeset
748 : EXCESS_PRECISION_TYPE_FAST);
kono
parents: 68
diff changeset
749
kono
parents: 68
diff changeset
750 enum flt_eval_method back_end
kono
parents: 68
diff changeset
751 = targetm.c.excess_precision (EXCESS_PRECISION_TYPE_IMPLICIT);
kono
parents: 68
diff changeset
752
kono
parents: 68
diff changeset
753 enum flt_eval_method front_end
kono
parents: 68
diff changeset
754 = targetm.c.excess_precision (front_end_ept);
kono
parents: 68
diff changeset
755
kono
parents: 68
diff changeset
756 return excess_precision_mode_join (front_end, back_end) == front_end;
kono
parents: 68
diff changeset
757 }
kono
parents: 68
diff changeset
758
kono
parents: 68
diff changeset
759 /* Return the value for __GCC_IEC_559. */
kono
parents: 68
diff changeset
760 static int
kono
parents: 68
diff changeset
761 cpp_iec_559_value (void)
kono
parents: 68
diff changeset
762 {
kono
parents: 68
diff changeset
763 /* The default is support for IEEE 754-2008. */
kono
parents: 68
diff changeset
764 int ret = 2;
kono
parents: 68
diff changeset
765
kono
parents: 68
diff changeset
766 /* float and double must be binary32 and binary64. If they are but
kono
parents: 68
diff changeset
767 with reversed NaN convention, at most IEEE 754-1985 is
kono
parents: 68
diff changeset
768 supported. */
kono
parents: 68
diff changeset
769 const struct real_format *ffmt
kono
parents: 68
diff changeset
770 = REAL_MODE_FORMAT (TYPE_MODE (float_type_node));
kono
parents: 68
diff changeset
771 const struct real_format *dfmt
kono
parents: 68
diff changeset
772 = REAL_MODE_FORMAT (TYPE_MODE (double_type_node));
kono
parents: 68
diff changeset
773 if (!ffmt->qnan_msb_set || !dfmt->qnan_msb_set)
kono
parents: 68
diff changeset
774 ret = 1;
kono
parents: 68
diff changeset
775 if (ffmt->b != 2
kono
parents: 68
diff changeset
776 || ffmt->p != 24
kono
parents: 68
diff changeset
777 || ffmt->pnan != 24
kono
parents: 68
diff changeset
778 || ffmt->emin != -125
kono
parents: 68
diff changeset
779 || ffmt->emax != 128
kono
parents: 68
diff changeset
780 || ffmt->signbit_rw != 31
kono
parents: 68
diff changeset
781 || ffmt->round_towards_zero
kono
parents: 68
diff changeset
782 || !ffmt->has_sign_dependent_rounding
kono
parents: 68
diff changeset
783 || !ffmt->has_nans
kono
parents: 68
diff changeset
784 || !ffmt->has_inf
kono
parents: 68
diff changeset
785 || !ffmt->has_denorm
kono
parents: 68
diff changeset
786 || !ffmt->has_signed_zero
kono
parents: 68
diff changeset
787 || dfmt->b != 2
kono
parents: 68
diff changeset
788 || dfmt->p != 53
kono
parents: 68
diff changeset
789 || dfmt->pnan != 53
kono
parents: 68
diff changeset
790 || dfmt->emin != -1021
kono
parents: 68
diff changeset
791 || dfmt->emax != 1024
kono
parents: 68
diff changeset
792 || dfmt->signbit_rw != 63
kono
parents: 68
diff changeset
793 || dfmt->round_towards_zero
kono
parents: 68
diff changeset
794 || !dfmt->has_sign_dependent_rounding
kono
parents: 68
diff changeset
795 || !dfmt->has_nans
kono
parents: 68
diff changeset
796 || !dfmt->has_inf
kono
parents: 68
diff changeset
797 || !dfmt->has_denorm
kono
parents: 68
diff changeset
798 || !dfmt->has_signed_zero)
kono
parents: 68
diff changeset
799 ret = 0;
kono
parents: 68
diff changeset
800
kono
parents: 68
diff changeset
801 /* In strict C standards conformance mode, consider a back-end providing
kono
parents: 68
diff changeset
802 more implicit excess precision than the explicit excess precision
kono
parents: 68
diff changeset
803 the front-end options would require to mean a lack of IEEE 754
kono
parents: 68
diff changeset
804 support. For C++, and outside strict conformance mode, do not consider
kono
parents: 68
diff changeset
805 this to mean a lack of IEEE 754 support. */
kono
parents: 68
diff changeset
806
kono
parents: 68
diff changeset
807 if (flag_iso
kono
parents: 68
diff changeset
808 && !c_dialect_cxx ()
kono
parents: 68
diff changeset
809 && !c_cpp_flt_eval_method_iec_559 ())
kono
parents: 68
diff changeset
810 ret = 0;
kono
parents: 68
diff changeset
811
kono
parents: 68
diff changeset
812 if (flag_iso
kono
parents: 68
diff changeset
813 && !c_dialect_cxx ()
kono
parents: 68
diff changeset
814 && flag_fp_contract_mode == FP_CONTRACT_FAST)
kono
parents: 68
diff changeset
815 ret = 0;
kono
parents: 68
diff changeset
816
kono
parents: 68
diff changeset
817 /* Various options are contrary to IEEE 754 semantics. */
kono
parents: 68
diff changeset
818 if (flag_unsafe_math_optimizations
kono
parents: 68
diff changeset
819 || flag_associative_math
kono
parents: 68
diff changeset
820 || flag_reciprocal_math
kono
parents: 68
diff changeset
821 || flag_finite_math_only
kono
parents: 68
diff changeset
822 || !flag_signed_zeros
kono
parents: 68
diff changeset
823 || flag_single_precision_constant)
kono
parents: 68
diff changeset
824 ret = 0;
kono
parents: 68
diff changeset
825
kono
parents: 68
diff changeset
826 /* If the target does not support IEEE 754 exceptions and rounding
kono
parents: 68
diff changeset
827 modes, consider IEEE 754 support to be absent. */
kono
parents: 68
diff changeset
828 if (!targetm.float_exceptions_rounding_supported_p ())
kono
parents: 68
diff changeset
829 ret = 0;
kono
parents: 68
diff changeset
830
kono
parents: 68
diff changeset
831 return ret;
kono
parents: 68
diff changeset
832 }
kono
parents: 68
diff changeset
833
kono
parents: 68
diff changeset
834 /* Return the value for __GCC_IEC_559_COMPLEX. */
kono
parents: 68
diff changeset
835 static int
kono
parents: 68
diff changeset
836 cpp_iec_559_complex_value (void)
kono
parents: 68
diff changeset
837 {
kono
parents: 68
diff changeset
838 /* The value is no bigger than that of __GCC_IEC_559. */
kono
parents: 68
diff changeset
839 int ret = cpp_iec_559_value ();
kono
parents: 68
diff changeset
840
kono
parents: 68
diff changeset
841 /* Some options are contrary to the required default state of the
kono
parents: 68
diff changeset
842 CX_LIMITED_RANGE pragma. */
kono
parents: 68
diff changeset
843 if (flag_complex_method != 2)
kono
parents: 68
diff changeset
844 ret = 0;
kono
parents: 68
diff changeset
845
kono
parents: 68
diff changeset
846 return ret;
kono
parents: 68
diff changeset
847 }
kono
parents: 68
diff changeset
848
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
849 /* Hook that registers front end and target-specific built-ins. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
850 void
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
851 c_cpp_builtins (cpp_reader *pfile)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
852 {
111
kono
parents: 68
diff changeset
853 int i;
kono
parents: 68
diff changeset
854
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
855 /* -undef turns off target-specific built-ins. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
856 if (flag_undef)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
857 return;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
858
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
859 define_language_independent_builtin_macros (pfile);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
860
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
861 if (c_dialect_cxx ())
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
862 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
863 int major;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
864 parse_basever (&major, NULL, NULL);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
865 cpp_define_formatted (pfile, "__GNUG__=%d", major);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
866 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
867
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
868 /* For stddef.h. They require macros defined in c-common.c. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
869 c_stddef_cpp_builtins ();
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
870
111
kono
parents: 68
diff changeset
871 /* Set include test macros for all C/C++ (not for just C++11 etc.)
kono
parents: 68
diff changeset
872 The builtins __has_include__ and __has_include_next__ are defined
kono
parents: 68
diff changeset
873 in libcpp. */
kono
parents: 68
diff changeset
874 cpp_define (pfile, "__has_include(STR)=__has_include__(STR)");
kono
parents: 68
diff changeset
875 cpp_define (pfile, "__has_include_next(STR)=__has_include_next__(STR)");
kono
parents: 68
diff changeset
876
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
877 if (c_dialect_cxx ())
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
878 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
879 if (flag_weak && SUPPORTS_ONE_ONLY)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
880 cpp_define (pfile, "__GXX_WEAK__=1");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
881 else
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
882 cpp_define (pfile, "__GXX_WEAK__=0");
111
kono
parents: 68
diff changeset
883
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
884 if (warn_deprecated)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
885 cpp_define (pfile, "__DEPRECATED");
111
kono
parents: 68
diff changeset
886
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
887 if (flag_rtti)
111
kono
parents: 68
diff changeset
888 {
kono
parents: 68
diff changeset
889 cpp_define (pfile, "__GXX_RTTI");
kono
parents: 68
diff changeset
890 cpp_define (pfile, "__cpp_rtti=199711");
kono
parents: 68
diff changeset
891 }
kono
parents: 68
diff changeset
892
kono
parents: 68
diff changeset
893 if (cxx_dialect >= cxx11)
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
894 cpp_define (pfile, "__GXX_EXPERIMENTAL_CXX0X__");
111
kono
parents: 68
diff changeset
895
kono
parents: 68
diff changeset
896 /* Binary literals have been allowed in g++ before C++11
kono
parents: 68
diff changeset
897 and were standardized for C++14. */
kono
parents: 68
diff changeset
898 if (!pedantic || cxx_dialect > cxx11)
kono
parents: 68
diff changeset
899 cpp_define (pfile, "__cpp_binary_literals=201304");
kono
parents: 68
diff changeset
900
kono
parents: 68
diff changeset
901 /* Similarly for hexadecimal floating point literals and C++17. */
kono
parents: 68
diff changeset
902 if (!pedantic || cpp_get_options (parse_in)->extended_numbers)
kono
parents: 68
diff changeset
903 cpp_define (pfile, "__cpp_hex_float=201603");
kono
parents: 68
diff changeset
904
kono
parents: 68
diff changeset
905 /* Arrays of runtime bound were removed from C++14, but we still
kono
parents: 68
diff changeset
906 support GNU VLAs. Let's define this macro to a low number
kono
parents: 68
diff changeset
907 (corresponding to the initial test release of GNU C++) if we won't
kono
parents: 68
diff changeset
908 complain about use of VLAs. */
kono
parents: 68
diff changeset
909 if (c_dialect_cxx ()
kono
parents: 68
diff changeset
910 && (pedantic ? warn_vla == 0 : warn_vla <= 0))
kono
parents: 68
diff changeset
911 cpp_define (pfile, "__cpp_runtime_arrays=198712");
kono
parents: 68
diff changeset
912
kono
parents: 68
diff changeset
913 if (cxx_dialect >= cxx11)
kono
parents: 68
diff changeset
914 {
kono
parents: 68
diff changeset
915 /* Set feature test macros for C++11. */
kono
parents: 68
diff changeset
916 if (cxx_dialect <= cxx14)
kono
parents: 68
diff changeset
917 cpp_define (pfile, "__cpp_unicode_characters=200704");
kono
parents: 68
diff changeset
918 cpp_define (pfile, "__cpp_raw_strings=200710");
kono
parents: 68
diff changeset
919 cpp_define (pfile, "__cpp_unicode_literals=200710");
kono
parents: 68
diff changeset
920 cpp_define (pfile, "__cpp_user_defined_literals=200809");
kono
parents: 68
diff changeset
921 cpp_define (pfile, "__cpp_lambdas=200907");
kono
parents: 68
diff changeset
922 if (cxx_dialect == cxx11)
kono
parents: 68
diff changeset
923 cpp_define (pfile, "__cpp_constexpr=200704");
kono
parents: 68
diff changeset
924 if (cxx_dialect <= cxx14)
kono
parents: 68
diff changeset
925 cpp_define (pfile, "__cpp_range_based_for=200907");
kono
parents: 68
diff changeset
926 if (cxx_dialect <= cxx14)
kono
parents: 68
diff changeset
927 cpp_define (pfile, "__cpp_static_assert=200410");
kono
parents: 68
diff changeset
928 cpp_define (pfile, "__cpp_decltype=200707");
kono
parents: 68
diff changeset
929 cpp_define (pfile, "__cpp_attributes=200809");
kono
parents: 68
diff changeset
930 cpp_define (pfile, "__cpp_rvalue_reference=200610");
kono
parents: 68
diff changeset
931 cpp_define (pfile, "__cpp_rvalue_references=200610");
kono
parents: 68
diff changeset
932 cpp_define (pfile, "__cpp_variadic_templates=200704");
kono
parents: 68
diff changeset
933 cpp_define (pfile, "__cpp_initializer_lists=200806");
kono
parents: 68
diff changeset
934 cpp_define (pfile, "__cpp_delegating_constructors=200604");
kono
parents: 68
diff changeset
935 cpp_define (pfile, "__cpp_nsdmi=200809");
kono
parents: 68
diff changeset
936 if (!flag_new_inheriting_ctors)
kono
parents: 68
diff changeset
937 cpp_define (pfile, "__cpp_inheriting_constructors=200802");
kono
parents: 68
diff changeset
938 else
kono
parents: 68
diff changeset
939 cpp_define (pfile, "__cpp_inheriting_constructors=201511");
kono
parents: 68
diff changeset
940 cpp_define (pfile, "__cpp_ref_qualifiers=200710");
kono
parents: 68
diff changeset
941 cpp_define (pfile, "__cpp_alias_templates=200704");
kono
parents: 68
diff changeset
942 }
kono
parents: 68
diff changeset
943 if (cxx_dialect > cxx11)
kono
parents: 68
diff changeset
944 {
kono
parents: 68
diff changeset
945 /* Set feature test macros for C++14. */
kono
parents: 68
diff changeset
946 cpp_define (pfile, "__cpp_return_type_deduction=201304");
kono
parents: 68
diff changeset
947 cpp_define (pfile, "__cpp_init_captures=201304");
kono
parents: 68
diff changeset
948 cpp_define (pfile, "__cpp_generic_lambdas=201304");
kono
parents: 68
diff changeset
949 if (cxx_dialect <= cxx14)
kono
parents: 68
diff changeset
950 cpp_define (pfile, "__cpp_constexpr=201304");
kono
parents: 68
diff changeset
951 cpp_define (pfile, "__cpp_decltype_auto=201304");
kono
parents: 68
diff changeset
952 cpp_define (pfile, "__cpp_aggregate_nsdmi=201304");
kono
parents: 68
diff changeset
953 cpp_define (pfile, "__cpp_variable_templates=201304");
kono
parents: 68
diff changeset
954 cpp_define (pfile, "__cpp_digit_separators=201309");
kono
parents: 68
diff changeset
955 }
kono
parents: 68
diff changeset
956 if (cxx_dialect > cxx14)
kono
parents: 68
diff changeset
957 {
kono
parents: 68
diff changeset
958 /* Set feature test macros for C++1z. */
kono
parents: 68
diff changeset
959 cpp_define (pfile, "__cpp_unicode_characters=201411");
kono
parents: 68
diff changeset
960 cpp_define (pfile, "__cpp_static_assert=201411");
kono
parents: 68
diff changeset
961 cpp_define (pfile, "__cpp_namespace_attributes=201411");
kono
parents: 68
diff changeset
962 cpp_define (pfile, "__cpp_enumerator_attributes=201411");
kono
parents: 68
diff changeset
963 cpp_define (pfile, "__cpp_nested_namespace_definitions=201411");
kono
parents: 68
diff changeset
964 cpp_define (pfile, "__cpp_fold_expressions=201603");
kono
parents: 68
diff changeset
965 cpp_define (pfile, "__cpp_nontype_template_args=201411");
kono
parents: 68
diff changeset
966 cpp_define (pfile, "__cpp_range_based_for=201603");
kono
parents: 68
diff changeset
967 cpp_define (pfile, "__cpp_constexpr=201603");
kono
parents: 68
diff changeset
968 cpp_define (pfile, "__cpp_if_constexpr=201606");
kono
parents: 68
diff changeset
969 cpp_define (pfile, "__cpp_capture_star_this=201603");
kono
parents: 68
diff changeset
970 cpp_define (pfile, "__cpp_inline_variables=201606");
kono
parents: 68
diff changeset
971 cpp_define (pfile, "__cpp_aggregate_bases=201603");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
972 cpp_define (pfile, "__cpp_deduction_guides=201703");
111
kono
parents: 68
diff changeset
973 cpp_define (pfile, "__cpp_noexcept_function_type=201510");
kono
parents: 68
diff changeset
974 cpp_define (pfile, "__cpp_template_auto=201606");
kono
parents: 68
diff changeset
975 cpp_define (pfile, "__cpp_structured_bindings=201606");
kono
parents: 68
diff changeset
976 cpp_define (pfile, "__cpp_variadic_using=201611");
kono
parents: 68
diff changeset
977 }
kono
parents: 68
diff changeset
978 if (flag_concepts)
kono
parents: 68
diff changeset
979 cpp_define (pfile, "__cpp_concepts=201507");
kono
parents: 68
diff changeset
980 if (flag_tm)
kono
parents: 68
diff changeset
981 /* Use a value smaller than the 201505 specified in
kono
parents: 68
diff changeset
982 the TS, since we don't yet support atomic_cancel. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
983 cpp_define (pfile, "__cpp_transactional_memory=201500");
111
kono
parents: 68
diff changeset
984 if (flag_sized_deallocation)
kono
parents: 68
diff changeset
985 cpp_define (pfile, "__cpp_sized_deallocation=201309");
kono
parents: 68
diff changeset
986 if (aligned_new_threshold)
kono
parents: 68
diff changeset
987 {
kono
parents: 68
diff changeset
988 cpp_define (pfile, "__cpp_aligned_new=201606");
kono
parents: 68
diff changeset
989 cpp_define_formatted (pfile, "__STDCPP_DEFAULT_NEW_ALIGNMENT__=%d",
kono
parents: 68
diff changeset
990 aligned_new_threshold);
kono
parents: 68
diff changeset
991 }
kono
parents: 68
diff changeset
992 if (flag_new_ttp)
kono
parents: 68
diff changeset
993 cpp_define (pfile, "__cpp_template_template_args=201611");
kono
parents: 68
diff changeset
994 if (flag_threadsafe_statics)
kono
parents: 68
diff changeset
995 cpp_define (pfile, "__cpp_threadsafe_static_init=200806");
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
996 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
997 /* Note that we define this for C as well, so that we know if
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
998 __attribute__((cleanup)) will interface with EH. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
999 if (flag_exceptions)
111
kono
parents: 68
diff changeset
1000 {
kono
parents: 68
diff changeset
1001 cpp_define (pfile, "__EXCEPTIONS");
kono
parents: 68
diff changeset
1002 if (c_dialect_cxx ())
kono
parents: 68
diff changeset
1003 cpp_define (pfile, "__cpp_exceptions=199711");
kono
parents: 68
diff changeset
1004 }
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1005
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1006 /* Represents the C++ ABI version, always defined so it can be used while
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1007 preprocessing C and assembler. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1008 if (flag_abi_version == 0)
111
kono
parents: 68
diff changeset
1009 /* We should have set this to something real in c_common_post_options. */
kono
parents: 68
diff changeset
1010 gcc_unreachable ();
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1011 else if (flag_abi_version == 1)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1012 /* Due to a historical accident, this version had the value
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1013 "102". */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1014 builtin_define_with_int_value ("__GXX_ABI_VERSION", 102);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1015 else
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1016 /* Newer versions have values 1002, 1003, .... */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1017 builtin_define_with_int_value ("__GXX_ABI_VERSION",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1018 1000 + flag_abi_version);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1019
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1020 /* libgcc needs to know this. */
111
kono
parents: 68
diff changeset
1021 if (targetm_common.except_unwind_info (&global_options) == UI_SJLJ)
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1022 cpp_define (pfile, "__USING_SJLJ_EXCEPTIONS__");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1023
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1024 /* limits.h and stdint.h need to know these. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1025 builtin_define_type_max ("__SCHAR_MAX__", signed_char_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1026 builtin_define_type_max ("__SHRT_MAX__", short_integer_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1027 builtin_define_type_max ("__INT_MAX__", integer_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1028 builtin_define_type_max ("__LONG_MAX__", long_integer_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1029 builtin_define_type_max ("__LONG_LONG_MAX__", long_long_integer_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1030 builtin_define_type_minmax ("__WCHAR_MIN__", "__WCHAR_MAX__",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1031 underlying_wchar_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1032 builtin_define_type_minmax ("__WINT_MIN__", "__WINT_MAX__", wint_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1033 builtin_define_type_max ("__PTRDIFF_MAX__", ptrdiff_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1034 builtin_define_type_max ("__SIZE_MAX__", size_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1035
111
kono
parents: 68
diff changeset
1036 /* These are needed for TS 18661-1. */
kono
parents: 68
diff changeset
1037 builtin_define_type_width ("__SCHAR_WIDTH__", signed_char_type_node,
kono
parents: 68
diff changeset
1038 unsigned_char_type_node);
kono
parents: 68
diff changeset
1039 builtin_define_type_width ("__SHRT_WIDTH__", short_integer_type_node,
kono
parents: 68
diff changeset
1040 short_unsigned_type_node);
kono
parents: 68
diff changeset
1041 builtin_define_type_width ("__INT_WIDTH__", integer_type_node,
kono
parents: 68
diff changeset
1042 unsigned_type_node);
kono
parents: 68
diff changeset
1043 builtin_define_type_width ("__LONG_WIDTH__", long_integer_type_node,
kono
parents: 68
diff changeset
1044 long_unsigned_type_node);
kono
parents: 68
diff changeset
1045 builtin_define_type_width ("__LONG_LONG_WIDTH__",
kono
parents: 68
diff changeset
1046 long_long_integer_type_node,
kono
parents: 68
diff changeset
1047 long_long_unsigned_type_node);
kono
parents: 68
diff changeset
1048 builtin_define_type_width ("__WCHAR_WIDTH__", underlying_wchar_type_node,
kono
parents: 68
diff changeset
1049 NULL_TREE);
kono
parents: 68
diff changeset
1050 builtin_define_type_width ("__WINT_WIDTH__", wint_type_node, NULL_TREE);
kono
parents: 68
diff changeset
1051 builtin_define_type_width ("__PTRDIFF_WIDTH__", ptrdiff_type_node, NULL_TREE);
kono
parents: 68
diff changeset
1052 builtin_define_type_width ("__SIZE_WIDTH__", size_type_node, NULL_TREE);
kono
parents: 68
diff changeset
1053
kono
parents: 68
diff changeset
1054 if (c_dialect_cxx ())
kono
parents: 68
diff changeset
1055 for (i = 0; i < NUM_INT_N_ENTS; i ++)
kono
parents: 68
diff changeset
1056 if (int_n_enabled_p[i])
kono
parents: 68
diff changeset
1057 {
kono
parents: 68
diff changeset
1058 char buf[35+20+20];
kono
parents: 68
diff changeset
1059
kono
parents: 68
diff changeset
1060 /* These are used to configure the C++ library. */
kono
parents: 68
diff changeset
1061
kono
parents: 68
diff changeset
1062 if (!flag_iso || int_n_data[i].bitsize == POINTER_SIZE)
kono
parents: 68
diff changeset
1063 {
kono
parents: 68
diff changeset
1064 sprintf (buf, "__GLIBCXX_TYPE_INT_N_%d=__int%d", i, int_n_data[i].bitsize);
kono
parents: 68
diff changeset
1065 cpp_define (parse_in, buf);
kono
parents: 68
diff changeset
1066
kono
parents: 68
diff changeset
1067 sprintf (buf, "__GLIBCXX_BITSIZE_INT_N_%d=%d", i, int_n_data[i].bitsize);
kono
parents: 68
diff changeset
1068 cpp_define (parse_in, buf);
kono
parents: 68
diff changeset
1069 }
kono
parents: 68
diff changeset
1070 }
kono
parents: 68
diff changeset
1071
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1072 /* stdint.h and the testsuite need to know these. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1073 builtin_define_stdint_macros ();
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1074
111
kono
parents: 68
diff changeset
1075 /* Provide information for library headers to determine whether to
kono
parents: 68
diff changeset
1076 define macros such as __STDC_IEC_559__ and
kono
parents: 68
diff changeset
1077 __STDC_IEC_559_COMPLEX__. */
kono
parents: 68
diff changeset
1078 builtin_define_with_int_value ("__GCC_IEC_559", cpp_iec_559_value ());
kono
parents: 68
diff changeset
1079 builtin_define_with_int_value ("__GCC_IEC_559_COMPLEX",
kono
parents: 68
diff changeset
1080 cpp_iec_559_complex_value ());
kono
parents: 68
diff changeset
1081
kono
parents: 68
diff changeset
1082 /* float.h needs these to correctly set FLT_EVAL_METHOD
kono
parents: 68
diff changeset
1083
kono
parents: 68
diff changeset
1084 We define two values:
kono
parents: 68
diff changeset
1085
kono
parents: 68
diff changeset
1086 __FLT_EVAL_METHOD__
kono
parents: 68
diff changeset
1087 Which, depending on the value given for
kono
parents: 68
diff changeset
1088 -fpermitted-flt-eval-methods, may be limited to only those values
kono
parents: 68
diff changeset
1089 for FLT_EVAL_METHOD defined in C99/C11.
kono
parents: 68
diff changeset
1090
kono
parents: 68
diff changeset
1091 __FLT_EVAL_METHOD_TS_18661_3__
kono
parents: 68
diff changeset
1092 Which always permits the values for FLT_EVAL_METHOD defined in
kono
parents: 68
diff changeset
1093 ISO/IEC TS 18661-3. */
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1094 builtin_define_with_int_value ("__FLT_EVAL_METHOD__",
111
kono
parents: 68
diff changeset
1095 c_flt_eval_method (true));
kono
parents: 68
diff changeset
1096 builtin_define_with_int_value ("__FLT_EVAL_METHOD_TS_18661_3__",
kono
parents: 68
diff changeset
1097 c_flt_eval_method (false));
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1098
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1099 /* And decfloat.h needs this. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1100 builtin_define_with_int_value ("__DEC_EVAL_METHOD__",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1101 TARGET_DEC_EVAL_METHOD);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1102
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1103 builtin_define_float_constants ("FLT", "F", "%s", "F", float_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1104 /* Cast the double precision constants. This is needed when single
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1105 precision constants are specified or when pragma FLOAT_CONST_DECIMAL64
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1106 is used. The correct result is computed by the compiler when using
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1107 macros that include a cast. We use a different cast for C++ to avoid
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1108 problems with -Wold-style-cast. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1109 builtin_define_float_constants ("DBL", "L",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1110 (c_dialect_cxx ()
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1111 ? "double(%s)"
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1112 : "((double)%s)"),
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1113 "", double_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1114 builtin_define_float_constants ("LDBL", "L", "%s", "L",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1115 long_double_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1116
111
kono
parents: 68
diff changeset
1117 for (int i = 0; i < NUM_FLOATN_NX_TYPES; i++)
kono
parents: 68
diff changeset
1118 {
kono
parents: 68
diff changeset
1119 if (FLOATN_NX_TYPE_NODE (i) == NULL_TREE)
kono
parents: 68
diff changeset
1120 continue;
kono
parents: 68
diff changeset
1121 char prefix[20], csuffix[20];
kono
parents: 68
diff changeset
1122 sprintf (prefix, "FLT%d%s", floatn_nx_types[i].n,
kono
parents: 68
diff changeset
1123 floatn_nx_types[i].extended ? "X" : "");
kono
parents: 68
diff changeset
1124 sprintf (csuffix, "F%d%s", floatn_nx_types[i].n,
kono
parents: 68
diff changeset
1125 floatn_nx_types[i].extended ? "x" : "");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1126 builtin_define_float_constants (prefix, ggc_strdup (csuffix), "%s",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1127 csuffix, FLOATN_NX_TYPE_NODE (i));
111
kono
parents: 68
diff changeset
1128 }
kono
parents: 68
diff changeset
1129
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1130 /* For decfloat.h. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1131 builtin_define_decimal_float_constants ("DEC32", "DF", dfloat32_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1132 builtin_define_decimal_float_constants ("DEC64", "DD", dfloat64_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1133 builtin_define_decimal_float_constants ("DEC128", "DL", dfloat128_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1134
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1135 /* For fixed-point fibt, ibit, max, min, and epsilon. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1136 if (targetm.fixed_point_supported_p ())
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1137 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1138 builtin_define_fixed_point_constants ("SFRACT", "HR",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1139 short_fract_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1140 builtin_define_fixed_point_constants ("USFRACT", "UHR",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1141 unsigned_short_fract_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1142 builtin_define_fixed_point_constants ("FRACT", "R",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1143 fract_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1144 builtin_define_fixed_point_constants ("UFRACT", "UR",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1145 unsigned_fract_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1146 builtin_define_fixed_point_constants ("LFRACT", "LR",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1147 long_fract_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1148 builtin_define_fixed_point_constants ("ULFRACT", "ULR",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1149 unsigned_long_fract_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1150 builtin_define_fixed_point_constants ("LLFRACT", "LLR",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1151 long_long_fract_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1152 builtin_define_fixed_point_constants ("ULLFRACT", "ULLR",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1153 unsigned_long_long_fract_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1154 builtin_define_fixed_point_constants ("SACCUM", "HK",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1155 short_accum_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1156 builtin_define_fixed_point_constants ("USACCUM", "UHK",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1157 unsigned_short_accum_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1158 builtin_define_fixed_point_constants ("ACCUM", "K",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1159 accum_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1160 builtin_define_fixed_point_constants ("UACCUM", "UK",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1161 unsigned_accum_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1162 builtin_define_fixed_point_constants ("LACCUM", "LK",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1163 long_accum_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1164 builtin_define_fixed_point_constants ("ULACCUM", "ULK",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1165 unsigned_long_accum_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1166 builtin_define_fixed_point_constants ("LLACCUM", "LLK",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1167 long_long_accum_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1168 builtin_define_fixed_point_constants ("ULLACCUM", "ULLK",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1169 unsigned_long_long_accum_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1170
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1171 builtin_define_fixed_point_constants ("QQ", "", qq_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1172 builtin_define_fixed_point_constants ("HQ", "", hq_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1173 builtin_define_fixed_point_constants ("SQ", "", sq_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1174 builtin_define_fixed_point_constants ("DQ", "", dq_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1175 builtin_define_fixed_point_constants ("TQ", "", tq_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1176 builtin_define_fixed_point_constants ("UQQ", "", uqq_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1177 builtin_define_fixed_point_constants ("UHQ", "", uhq_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1178 builtin_define_fixed_point_constants ("USQ", "", usq_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1179 builtin_define_fixed_point_constants ("UDQ", "", udq_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1180 builtin_define_fixed_point_constants ("UTQ", "", utq_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1181 builtin_define_fixed_point_constants ("HA", "", ha_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1182 builtin_define_fixed_point_constants ("SA", "", sa_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1183 builtin_define_fixed_point_constants ("DA", "", da_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1184 builtin_define_fixed_point_constants ("TA", "", ta_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1185 builtin_define_fixed_point_constants ("UHA", "", uha_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1186 builtin_define_fixed_point_constants ("USA", "", usa_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1187 builtin_define_fixed_point_constants ("UDA", "", uda_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1188 builtin_define_fixed_point_constants ("UTA", "", uta_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1189 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1190
111
kono
parents: 68
diff changeset
1191 /* For libgcc-internal use only. */
kono
parents: 68
diff changeset
1192 if (flag_building_libgcc)
kono
parents: 68
diff changeset
1193 {
kono
parents: 68
diff changeset
1194 /* Properties of floating-point modes for libgcc2.c. */
kono
parents: 68
diff changeset
1195 opt_scalar_float_mode mode_iter;
kono
parents: 68
diff changeset
1196 FOR_EACH_MODE_IN_CLASS (mode_iter, MODE_FLOAT)
kono
parents: 68
diff changeset
1197 {
kono
parents: 68
diff changeset
1198 scalar_float_mode mode = mode_iter.require ();
kono
parents: 68
diff changeset
1199 const char *name = GET_MODE_NAME (mode);
kono
parents: 68
diff changeset
1200 char *macro_name
kono
parents: 68
diff changeset
1201 = (char *) alloca (strlen (name)
kono
parents: 68
diff changeset
1202 + sizeof ("__LIBGCC__MANT_DIG__"));
kono
parents: 68
diff changeset
1203 sprintf (macro_name, "__LIBGCC_%s_MANT_DIG__", name);
kono
parents: 68
diff changeset
1204 builtin_define_with_int_value (macro_name,
kono
parents: 68
diff changeset
1205 REAL_MODE_FORMAT (mode)->p);
kono
parents: 68
diff changeset
1206 if (!targetm.scalar_mode_supported_p (mode)
kono
parents: 68
diff changeset
1207 || !targetm.libgcc_floating_mode_supported_p (mode))
kono
parents: 68
diff changeset
1208 continue;
kono
parents: 68
diff changeset
1209 macro_name = (char *) alloca (strlen (name)
kono
parents: 68
diff changeset
1210 + sizeof ("__LIBGCC_HAS__MODE__"));
kono
parents: 68
diff changeset
1211 sprintf (macro_name, "__LIBGCC_HAS_%s_MODE__", name);
kono
parents: 68
diff changeset
1212 cpp_define (pfile, macro_name);
kono
parents: 68
diff changeset
1213 macro_name = (char *) alloca (strlen (name)
kono
parents: 68
diff changeset
1214 + sizeof ("__LIBGCC__FUNC_EXT__"));
kono
parents: 68
diff changeset
1215 sprintf (macro_name, "__LIBGCC_%s_FUNC_EXT__", name);
kono
parents: 68
diff changeset
1216 char suffix[20] = "";
kono
parents: 68
diff changeset
1217 if (mode == TYPE_MODE (double_type_node))
kono
parents: 68
diff changeset
1218 ; /* Empty suffix correct. */
kono
parents: 68
diff changeset
1219 else if (mode == TYPE_MODE (float_type_node))
kono
parents: 68
diff changeset
1220 suffix[0] = 'f';
kono
parents: 68
diff changeset
1221 else if (mode == TYPE_MODE (long_double_type_node))
kono
parents: 68
diff changeset
1222 suffix[0] = 'l';
kono
parents: 68
diff changeset
1223 else
kono
parents: 68
diff changeset
1224 {
kono
parents: 68
diff changeset
1225 bool found_suffix = false;
kono
parents: 68
diff changeset
1226 for (int i = 0; i < NUM_FLOATN_NX_TYPES; i++)
kono
parents: 68
diff changeset
1227 if (FLOATN_NX_TYPE_NODE (i) != NULL_TREE
kono
parents: 68
diff changeset
1228 && mode == TYPE_MODE (FLOATN_NX_TYPE_NODE (i)))
kono
parents: 68
diff changeset
1229 {
kono
parents: 68
diff changeset
1230 sprintf (suffix, "f%d%s", floatn_nx_types[i].n,
kono
parents: 68
diff changeset
1231 floatn_nx_types[i].extended ? "x" : "");
kono
parents: 68
diff changeset
1232 found_suffix = true;
kono
parents: 68
diff changeset
1233 break;
kono
parents: 68
diff changeset
1234 }
kono
parents: 68
diff changeset
1235 gcc_assert (found_suffix);
kono
parents: 68
diff changeset
1236 }
kono
parents: 68
diff changeset
1237 builtin_define_with_value (macro_name, suffix, 0);
kono
parents: 68
diff changeset
1238
kono
parents: 68
diff changeset
1239 /* The way __LIBGCC_*_EXCESS_PRECISION__ is used is about
kono
parents: 68
diff changeset
1240 eliminating excess precision from results assigned to
kono
parents: 68
diff changeset
1241 variables - meaning it should be about the implicit excess
kono
parents: 68
diff changeset
1242 precision only. */
kono
parents: 68
diff changeset
1243 bool excess_precision = false;
kono
parents: 68
diff changeset
1244 machine_mode float16_type_mode = (float16_type_node
kono
parents: 68
diff changeset
1245 ? TYPE_MODE (float16_type_node)
kono
parents: 68
diff changeset
1246 : VOIDmode);
kono
parents: 68
diff changeset
1247 switch (targetm.c.excess_precision
kono
parents: 68
diff changeset
1248 (EXCESS_PRECISION_TYPE_IMPLICIT))
kono
parents: 68
diff changeset
1249 {
kono
parents: 68
diff changeset
1250 case FLT_EVAL_METHOD_UNPREDICTABLE:
kono
parents: 68
diff changeset
1251 case FLT_EVAL_METHOD_PROMOTE_TO_LONG_DOUBLE:
kono
parents: 68
diff changeset
1252 excess_precision = (mode == float16_type_mode
kono
parents: 68
diff changeset
1253 || mode == TYPE_MODE (float_type_node)
kono
parents: 68
diff changeset
1254 || mode == TYPE_MODE (double_type_node));
kono
parents: 68
diff changeset
1255 break;
kono
parents: 68
diff changeset
1256
kono
parents: 68
diff changeset
1257 case FLT_EVAL_METHOD_PROMOTE_TO_DOUBLE:
kono
parents: 68
diff changeset
1258 excess_precision = (mode == float16_type_mode
kono
parents: 68
diff changeset
1259 || mode == TYPE_MODE (float_type_node));
kono
parents: 68
diff changeset
1260 break;
kono
parents: 68
diff changeset
1261 case FLT_EVAL_METHOD_PROMOTE_TO_FLOAT:
kono
parents: 68
diff changeset
1262 excess_precision = mode == float16_type_mode;
kono
parents: 68
diff changeset
1263 break;
kono
parents: 68
diff changeset
1264 case FLT_EVAL_METHOD_PROMOTE_TO_FLOAT16:
kono
parents: 68
diff changeset
1265 excess_precision = false;
kono
parents: 68
diff changeset
1266 break;
kono
parents: 68
diff changeset
1267 default:
kono
parents: 68
diff changeset
1268 gcc_unreachable ();
kono
parents: 68
diff changeset
1269 }
kono
parents: 68
diff changeset
1270 macro_name = (char *) alloca (strlen (name)
kono
parents: 68
diff changeset
1271 + sizeof ("__LIBGCC__EXCESS_"
kono
parents: 68
diff changeset
1272 "PRECISION__"));
kono
parents: 68
diff changeset
1273 sprintf (macro_name, "__LIBGCC_%s_EXCESS_PRECISION__", name);
kono
parents: 68
diff changeset
1274 builtin_define_with_int_value (macro_name, excess_precision);
kono
parents: 68
diff changeset
1275 }
kono
parents: 68
diff changeset
1276
kono
parents: 68
diff changeset
1277 /* For libgcc crtstuff.c and libgcc2.c. */
kono
parents: 68
diff changeset
1278 builtin_define_with_int_value ("__LIBGCC_EH_TABLES_CAN_BE_READ_ONLY__",
kono
parents: 68
diff changeset
1279 EH_TABLES_CAN_BE_READ_ONLY);
kono
parents: 68
diff changeset
1280 #ifdef EH_FRAME_SECTION_NAME
kono
parents: 68
diff changeset
1281 builtin_define_with_value ("__LIBGCC_EH_FRAME_SECTION_NAME__",
kono
parents: 68
diff changeset
1282 EH_FRAME_SECTION_NAME, 1);
kono
parents: 68
diff changeset
1283 #endif
kono
parents: 68
diff changeset
1284 #ifdef CTORS_SECTION_ASM_OP
kono
parents: 68
diff changeset
1285 builtin_define_with_value ("__LIBGCC_CTORS_SECTION_ASM_OP__",
kono
parents: 68
diff changeset
1286 CTORS_SECTION_ASM_OP, 1);
kono
parents: 68
diff changeset
1287 #endif
kono
parents: 68
diff changeset
1288 #ifdef DTORS_SECTION_ASM_OP
kono
parents: 68
diff changeset
1289 builtin_define_with_value ("__LIBGCC_DTORS_SECTION_ASM_OP__",
kono
parents: 68
diff changeset
1290 DTORS_SECTION_ASM_OP, 1);
kono
parents: 68
diff changeset
1291 #endif
kono
parents: 68
diff changeset
1292 #ifdef TEXT_SECTION_ASM_OP
kono
parents: 68
diff changeset
1293 builtin_define_with_value ("__LIBGCC_TEXT_SECTION_ASM_OP__",
kono
parents: 68
diff changeset
1294 TEXT_SECTION_ASM_OP, 1);
kono
parents: 68
diff changeset
1295 #endif
kono
parents: 68
diff changeset
1296 #ifdef INIT_SECTION_ASM_OP
kono
parents: 68
diff changeset
1297 builtin_define_with_value ("__LIBGCC_INIT_SECTION_ASM_OP__",
kono
parents: 68
diff changeset
1298 INIT_SECTION_ASM_OP, 1);
kono
parents: 68
diff changeset
1299 #endif
kono
parents: 68
diff changeset
1300 #ifdef INIT_ARRAY_SECTION_ASM_OP
kono
parents: 68
diff changeset
1301 /* Despite the name of this target macro, the expansion is not
kono
parents: 68
diff changeset
1302 actually used, and may be empty rather than a string
kono
parents: 68
diff changeset
1303 constant. */
kono
parents: 68
diff changeset
1304 cpp_define (pfile, "__LIBGCC_INIT_ARRAY_SECTION_ASM_OP__");
kono
parents: 68
diff changeset
1305 #endif
kono
parents: 68
diff changeset
1306
kono
parents: 68
diff changeset
1307 /* For libgcc enable-execute-stack.c. */
kono
parents: 68
diff changeset
1308 builtin_define_with_int_value ("__LIBGCC_TRAMPOLINE_SIZE__",
kono
parents: 68
diff changeset
1309 TRAMPOLINE_SIZE);
kono
parents: 68
diff changeset
1310
kono
parents: 68
diff changeset
1311 /* For libgcc generic-morestack.c and unwinder code. */
kono
parents: 68
diff changeset
1312 if (STACK_GROWS_DOWNWARD)
kono
parents: 68
diff changeset
1313 cpp_define (pfile, "__LIBGCC_STACK_GROWS_DOWNWARD__");
kono
parents: 68
diff changeset
1314
kono
parents: 68
diff changeset
1315 /* For libgcc unwinder code. */
kono
parents: 68
diff changeset
1316 #ifdef DONT_USE_BUILTIN_SETJMP
kono
parents: 68
diff changeset
1317 cpp_define (pfile, "__LIBGCC_DONT_USE_BUILTIN_SETJMP__");
kono
parents: 68
diff changeset
1318 #endif
kono
parents: 68
diff changeset
1319 #ifdef DWARF_ALT_FRAME_RETURN_COLUMN
kono
parents: 68
diff changeset
1320 builtin_define_with_int_value ("__LIBGCC_DWARF_ALT_FRAME_RETURN_COLUMN__",
kono
parents: 68
diff changeset
1321 DWARF_ALT_FRAME_RETURN_COLUMN);
kono
parents: 68
diff changeset
1322 #endif
kono
parents: 68
diff changeset
1323 builtin_define_with_int_value ("__LIBGCC_DWARF_FRAME_REGISTERS__",
kono
parents: 68
diff changeset
1324 DWARF_FRAME_REGISTERS);
kono
parents: 68
diff changeset
1325 #ifdef EH_RETURN_STACKADJ_RTX
kono
parents: 68
diff changeset
1326 cpp_define (pfile, "__LIBGCC_EH_RETURN_STACKADJ_RTX__");
kono
parents: 68
diff changeset
1327 #endif
kono
parents: 68
diff changeset
1328 #ifdef JMP_BUF_SIZE
kono
parents: 68
diff changeset
1329 builtin_define_with_int_value ("__LIBGCC_JMP_BUF_SIZE__",
kono
parents: 68
diff changeset
1330 JMP_BUF_SIZE);
kono
parents: 68
diff changeset
1331 #endif
kono
parents: 68
diff changeset
1332 builtin_define_with_int_value ("__LIBGCC_STACK_POINTER_REGNUM__",
kono
parents: 68
diff changeset
1333 STACK_POINTER_REGNUM);
kono
parents: 68
diff changeset
1334
kono
parents: 68
diff changeset
1335 /* For libgcov. */
kono
parents: 68
diff changeset
1336 builtin_define_with_int_value ("__LIBGCC_VTABLE_USES_DESCRIPTORS__",
kono
parents: 68
diff changeset
1337 TARGET_VTABLE_USES_DESCRIPTORS);
kono
parents: 68
diff changeset
1338 }
kono
parents: 68
diff changeset
1339
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1340 /* For use in assembly language. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1341 builtin_define_with_value ("__REGISTER_PREFIX__", REGISTER_PREFIX, 0);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1342 builtin_define_with_value ("__USER_LABEL_PREFIX__", user_label_prefix, 0);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1343
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1344 /* Misc. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1345 if (flag_gnu89_inline)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1346 cpp_define (pfile, "__GNUC_GNU_INLINE__");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1347 else
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1348 cpp_define (pfile, "__GNUC_STDC_INLINE__");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1349
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1350 if (flag_no_inline)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1351 cpp_define (pfile, "__NO_INLINE__");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1352
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1353 if (flag_iso)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1354 cpp_define (pfile, "__STRICT_ANSI__");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1355
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1356 if (!flag_signed_char)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1357 cpp_define (pfile, "__CHAR_UNSIGNED__");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1358
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1359 if (c_dialect_cxx () && TYPE_UNSIGNED (wchar_type_node))
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1360 cpp_define (pfile, "__WCHAR_UNSIGNED__");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1361
111
kono
parents: 68
diff changeset
1362 cpp_atomic_builtins (pfile);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1363
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1364 /* Show support for __builtin_speculation_safe_value () if the target
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1365 has been updated to fully support it. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1366 if (targetm.have_speculation_safe_value (false))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1367 cpp_define (pfile, "__HAVE_SPECULATION_SAFE_VALUE");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1368
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1369 #ifdef DWARF2_UNWIND_INFO
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1370 if (dwarf2out_do_cfi_asm ())
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1371 cpp_define (pfile, "__GCC_HAVE_DWARF2_CFI_ASM");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1372 #endif
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1373
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1374 /* Make the choice of ObjC runtime visible to source code. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1375 if (c_dialect_objc () && flag_next_runtime)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1376 cpp_define (pfile, "__NEXT_RUNTIME__");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1377
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1378 /* Show the availability of some target pragmas. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1379 cpp_define (pfile, "__PRAGMA_REDEFINE_EXTNAME");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1380
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1381 /* Make the choice of the stack protector runtime visible to source code.
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1382 The macro names and values here were chosen for compatibility with an
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1383 earlier implementation, i.e. ProPolice. */
111
kono
parents: 68
diff changeset
1384 if (flag_stack_protect == 4)
kono
parents: 68
diff changeset
1385 cpp_define (pfile, "__SSP_EXPLICIT__=4");
kono
parents: 68
diff changeset
1386 if (flag_stack_protect == 3)
kono
parents: 68
diff changeset
1387 cpp_define (pfile, "__SSP_STRONG__=3");
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1388 if (flag_stack_protect == 2)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1389 cpp_define (pfile, "__SSP_ALL__=2");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1390 else if (flag_stack_protect == 1)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1391 cpp_define (pfile, "__SSP__=1");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1392
111
kono
parents: 68
diff changeset
1393 if (flag_openacc)
kono
parents: 68
diff changeset
1394 cpp_define (pfile, "_OPENACC=201306");
kono
parents: 68
diff changeset
1395
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1396 if (flag_openmp)
111
kono
parents: 68
diff changeset
1397 cpp_define (pfile, "_OPENMP=201511");
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1398
111
kono
parents: 68
diff changeset
1399 for (i = 0; i < NUM_INT_N_ENTS; i ++)
kono
parents: 68
diff changeset
1400 if (int_n_enabled_p[i])
kono
parents: 68
diff changeset
1401 {
kono
parents: 68
diff changeset
1402 char buf[15+20];
kono
parents: 68
diff changeset
1403 sprintf(buf, "__SIZEOF_INT%d__", int_n_data[i].bitsize);
kono
parents: 68
diff changeset
1404 builtin_define_type_sizeof (buf,
kono
parents: 68
diff changeset
1405 int_n_trees[i].signed_type);
kono
parents: 68
diff changeset
1406 }
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1407 builtin_define_type_sizeof ("__SIZEOF_WCHAR_T__", wchar_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1408 builtin_define_type_sizeof ("__SIZEOF_WINT_T__", wint_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1409 builtin_define_type_sizeof ("__SIZEOF_PTRDIFF_T__",
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1410 unsigned_ptrdiff_type_node);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1411
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1412 /* A straightforward target hook doesn't work, because of problems
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1413 linking that hook's body when part of non-C front ends. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1414 # define preprocessing_asm_p() (cpp_get_options (pfile)->lang == CLK_ASM)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1415 # define preprocessing_trad_p() (cpp_get_options (pfile)->traditional)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1416 # define builtin_define(TXT) cpp_define (pfile, TXT)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1417 # define builtin_assert(TXT) cpp_assert (pfile, TXT)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1418 TARGET_CPU_CPP_BUILTINS ();
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1419 TARGET_OS_CPP_BUILTINS ();
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1420 TARGET_OBJFMT_CPP_BUILTINS ();
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1421
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1422 /* Support the __declspec keyword by turning them into attributes.
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1423 Note that the current way we do this may result in a collision
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1424 with predefined attributes later on. This can be solved by using
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1425 one attribute, say __declspec__, and passing args to it. The
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1426 problem with that approach is that args are not accumulated: each
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1427 new appearance would clobber any existing args. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1428 if (TARGET_DECLSPEC)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1429 builtin_define ("__declspec(x)=__attribute__((x))");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1430
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1431 /* If decimal floating point is supported, tell the user if the
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1432 alternate format (BID) is used instead of the standard (DPD)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1433 format. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1434 if (ENABLE_DECIMAL_FLOAT && ENABLE_DECIMAL_BID_FORMAT)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1435 cpp_define (pfile, "__DECIMAL_BID_FORMAT__");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1436 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1437
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1438 /* Pass an object-like macro. If it doesn't lie in the user's
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1439 namespace, defines it unconditionally. Otherwise define a version
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1440 with two leading underscores, and another version with two leading
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1441 and trailing underscores, and define the original only if an ISO
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1442 standard was not nominated.
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1443
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1444 e.g. passing "unix" defines "__unix", "__unix__" and possibly
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1445 "unix". Passing "_mips" defines "__mips", "__mips__" and possibly
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1446 "_mips". */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1447 void
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1448 builtin_define_std (const char *macro)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1449 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1450 size_t len = strlen (macro);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1451 char *buff = (char *) alloca (len + 5);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1452 char *p = buff + 2;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1453 char *q = p + len;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1454
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1455 /* prepend __ (or maybe just _) if in user's namespace. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1456 memcpy (p, macro, len + 1);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1457 if (!( *p == '_' && (p[1] == '_' || ISUPPER (p[1]))))
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1458 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1459 if (*p != '_')
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1460 *--p = '_';
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1461 if (p[1] != '_')
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1462 *--p = '_';
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1463 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1464 cpp_define (parse_in, p);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1465
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1466 /* If it was in user's namespace... */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1467 if (p != buff + 2)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1468 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1469 /* Define the macro with leading and following __. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1470 if (q[-1] != '_')
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1471 *q++ = '_';
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1472 if (q[-2] != '_')
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1473 *q++ = '_';
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1474 *q = '\0';
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1475 cpp_define (parse_in, p);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1476
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1477 /* Finally, define the original macro if permitted. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1478 if (!flag_iso)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1479 cpp_define (parse_in, macro);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1480 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1481 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1482
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1483 /* Pass an object-like macro and a value to define it to. The third
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1484 parameter says whether or not to turn the value into a string
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1485 constant. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1486 void
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1487 builtin_define_with_value (const char *macro, const char *expansion, int is_str)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1488 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1489 char *buf;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1490 size_t mlen = strlen (macro);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1491 size_t elen = strlen (expansion);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1492 size_t extra = 2; /* space for an = and a NUL */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1493
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1494 if (is_str)
111
kono
parents: 68
diff changeset
1495 {
kono
parents: 68
diff changeset
1496 char *quoted_expansion = (char *) alloca (elen * 4 + 1);
kono
parents: 68
diff changeset
1497 const char *p;
kono
parents: 68
diff changeset
1498 char *q;
kono
parents: 68
diff changeset
1499 extra += 2; /* space for two quote marks */
kono
parents: 68
diff changeset
1500 for (p = expansion, q = quoted_expansion; *p; p++)
kono
parents: 68
diff changeset
1501 {
kono
parents: 68
diff changeset
1502 switch (*p)
kono
parents: 68
diff changeset
1503 {
kono
parents: 68
diff changeset
1504 case '\n':
kono
parents: 68
diff changeset
1505 *q++ = '\\';
kono
parents: 68
diff changeset
1506 *q++ = 'n';
kono
parents: 68
diff changeset
1507 break;
kono
parents: 68
diff changeset
1508
kono
parents: 68
diff changeset
1509 case '\t':
kono
parents: 68
diff changeset
1510 *q++ = '\\';
kono
parents: 68
diff changeset
1511 *q++ = 't';
kono
parents: 68
diff changeset
1512 break;
kono
parents: 68
diff changeset
1513
kono
parents: 68
diff changeset
1514 case '\\':
kono
parents: 68
diff changeset
1515 *q++ = '\\';
kono
parents: 68
diff changeset
1516 *q++ = '\\';
kono
parents: 68
diff changeset
1517 break;
kono
parents: 68
diff changeset
1518
kono
parents: 68
diff changeset
1519 case '"':
kono
parents: 68
diff changeset
1520 *q++ = '\\';
kono
parents: 68
diff changeset
1521 *q++ = '"';
kono
parents: 68
diff changeset
1522 break;
kono
parents: 68
diff changeset
1523
kono
parents: 68
diff changeset
1524 default:
kono
parents: 68
diff changeset
1525 if (ISPRINT ((unsigned char) *p))
kono
parents: 68
diff changeset
1526 *q++ = *p;
kono
parents: 68
diff changeset
1527 else
kono
parents: 68
diff changeset
1528 {
kono
parents: 68
diff changeset
1529 sprintf (q, "\\%03o", (unsigned char) *p);
kono
parents: 68
diff changeset
1530 q += 4;
kono
parents: 68
diff changeset
1531 }
kono
parents: 68
diff changeset
1532 }
kono
parents: 68
diff changeset
1533 }
kono
parents: 68
diff changeset
1534 *q = '\0';
kono
parents: 68
diff changeset
1535 expansion = quoted_expansion;
kono
parents: 68
diff changeset
1536 elen = q - expansion;
kono
parents: 68
diff changeset
1537 }
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1538
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1539 buf = (char *) alloca (mlen + elen + extra);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1540 if (is_str)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1541 sprintf (buf, "%s=\"%s\"", macro, expansion);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1542 else
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1543 sprintf (buf, "%s=%s", macro, expansion);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1544
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1545 cpp_define (parse_in, buf);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1546 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1547
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1548
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1549 /* Pass an object-like macro and an integer value to define it to. */
111
kono
parents: 68
diff changeset
1550 void
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1551 builtin_define_with_int_value (const char *macro, HOST_WIDE_INT value)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1552 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1553 char *buf;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1554 size_t mlen = strlen (macro);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1555 size_t vlen = 18;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1556 size_t extra = 2; /* space for = and NUL. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1557
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1558 buf = (char *) alloca (mlen + vlen + extra);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1559 memcpy (buf, macro, mlen);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1560 buf[mlen] = '=';
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1561 sprintf (buf + mlen + 1, HOST_WIDE_INT_PRINT_DEC, value);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1562
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1563 cpp_define (parse_in, buf);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1564 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1565
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1566 /* builtin_define_with_hex_fp_value is very expensive, so the following
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1567 array and function allows it to be done lazily when __DBL_MAX__
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1568 etc. is first used. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1569
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1570 struct GTY(()) lazy_hex_fp_value_struct
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1571 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1572 const char *hex_str;
111
kono
parents: 68
diff changeset
1573 machine_mode mode;
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1574 int digits;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1575 const char *fp_suffix;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1576 };
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1577 /* Number of the expensive to compute macros we should evaluate lazily.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1578 Each builtin_define_float_constants invocation calls
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1579 builtin_define_with_hex_fp_value 4 times and builtin_define_float_constants
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1580 is called for FLT, DBL, LDBL and up to NUM_FLOATN_NX_TYPES times for
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1581 FLTNN*. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1582 #define LAZY_HEX_FP_VALUES_CNT (4 * (3 + NUM_FLOATN_NX_TYPES))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1583 static GTY(()) struct lazy_hex_fp_value_struct
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1584 lazy_hex_fp_values[LAZY_HEX_FP_VALUES_CNT];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1585 static GTY(()) unsigned lazy_hex_fp_value_count;
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1586
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1587 static void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1588 lazy_hex_fp_value (cpp_reader *, cpp_macro *macro, unsigned num)
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1589 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1590 REAL_VALUE_TYPE real;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1591 char dec_str[64], buf1[256];
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1592
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1593 gcc_checking_assert (num < lazy_hex_fp_value_count);
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1594
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1595 real_from_string (&real, lazy_hex_fp_values[num].hex_str);
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1596 real_to_decimal_for_mode (dec_str, &real, sizeof (dec_str),
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1597 lazy_hex_fp_values[num].digits, 0,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1598 lazy_hex_fp_values[num].mode);
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1599
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1600 size_t len
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1601 = sprintf (buf1, "%s%s", dec_str, lazy_hex_fp_values[num].fp_suffix);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1602 gcc_assert (len < sizeof (buf1));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1603 for (unsigned idx = 0; idx < macro->count; idx++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1604 if (macro->exp.tokens[idx].type == CPP_NUMBER)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1605 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1606 macro->exp.tokens[idx].val.str.len = len;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1607 macro->exp.tokens[idx].val.str.text
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1608 = (const unsigned char *) ggc_strdup (buf1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1609 return;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1610 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1611
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1612 /* We must have replaced a token. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1613 gcc_unreachable ();
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1614 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1615
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1616 /* Pass an object-like macro a hexadecimal floating-point value. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1617 static void
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1618 builtin_define_with_hex_fp_value (const char *macro,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1619 tree type, int digits,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1620 const char *hex_str,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1621 const char *fp_suffix,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1622 const char *fp_cast)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1623 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1624 REAL_VALUE_TYPE real;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1625 char dec_str[64], buf[256], buf1[128], buf2[64];
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1626
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1627 /* This is very expensive, so if possible expand them lazily. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1628 if (lazy_hex_fp_value_count < LAZY_HEX_FP_VALUES_CNT
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1629 && flag_dump_macros == 0
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1630 && !cpp_get_options (parse_in)->traditional)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1631 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1632 if (lazy_hex_fp_value_count == 0)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1633 cpp_get_callbacks (parse_in)->user_lazy_macro = lazy_hex_fp_value;
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1634 sprintf (buf2, fp_cast, "1.1");
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1635 sprintf (buf1, "%s=%s", macro, buf2);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1636 cpp_define (parse_in, buf1);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1637 struct cpp_hashnode *node = C_CPP_HASHNODE (get_identifier (macro));
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1638 lazy_hex_fp_values[lazy_hex_fp_value_count].hex_str
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1639 = ggc_strdup (hex_str);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1640 lazy_hex_fp_values[lazy_hex_fp_value_count].mode = TYPE_MODE (type);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1641 lazy_hex_fp_values[lazy_hex_fp_value_count].digits = digits;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1642 lazy_hex_fp_values[lazy_hex_fp_value_count].fp_suffix = fp_suffix;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1643 cpp_define_lazily (parse_in, node, lazy_hex_fp_value_count++);
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1644 return;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1645 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1646
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1647 /* Hex values are really cool and convenient, except that they're
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1648 not supported in strict ISO C90 mode. First, the "p-" sequence
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1649 is not valid as part of a preprocessor number. Second, we get a
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1650 pedwarn from the preprocessor, which has no context, so we can't
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1651 suppress the warning with __extension__.
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1652
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1653 So instead what we do is construct the number in hex (because
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1654 it's easy to get the exact correct value), parse it as a real,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1655 then print it back out as decimal. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1656
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1657 real_from_string (&real, hex_str);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1658 real_to_decimal_for_mode (dec_str, &real, sizeof (dec_str), digits, 0,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1659 TYPE_MODE (type));
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1660
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1661 /* Assemble the macro in the following fashion
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1662 macro = fp_cast [dec_str fp_suffix] */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1663 sprintf (buf2, "%s%s", dec_str, fp_suffix);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1664 sprintf (buf1, fp_cast, buf2);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1665 sprintf (buf, "%s=%s", macro, buf1);
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1666
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1667 cpp_define (parse_in, buf);
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1668 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1669
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1670 /* Return a string constant for the suffix for a value of type TYPE
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1671 promoted according to the integer promotions. The type must be one
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1672 of the standard integer type nodes. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1673
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1674 static const char *
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1675 type_suffix (tree type)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1676 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1677 static const char *const suffixes[] = { "", "U", "L", "UL", "LL", "ULL" };
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1678 int unsigned_suffix;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1679 int is_long;
111
kono
parents: 68
diff changeset
1680 int tp = TYPE_PRECISION (type);
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1681
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1682 if (type == long_long_integer_type_node
111
kono
parents: 68
diff changeset
1683 || type == long_long_unsigned_type_node
kono
parents: 68
diff changeset
1684 || tp > TYPE_PRECISION (long_integer_type_node))
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1685 is_long = 2;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1686 else if (type == long_integer_type_node
111
kono
parents: 68
diff changeset
1687 || type == long_unsigned_type_node
kono
parents: 68
diff changeset
1688 || tp > TYPE_PRECISION (integer_type_node))
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1689 is_long = 1;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1690 else if (type == integer_type_node
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1691 || type == unsigned_type_node
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1692 || type == short_integer_type_node
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1693 || type == short_unsigned_type_node
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1694 || type == signed_char_type_node
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1695 || type == unsigned_char_type_node
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1696 /* ??? "char" is not a signed or unsigned integer type and
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1697 so is not permitted for the standard typedefs, but some
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1698 systems use it anyway. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1699 || type == char_type_node)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1700 is_long = 0;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1701 else
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1702 gcc_unreachable ();
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1703
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1704 unsigned_suffix = TYPE_UNSIGNED (type);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1705 if (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1706 unsigned_suffix = 0;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1707 return suffixes[is_long * 2 + unsigned_suffix];
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1708 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1709
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1710 /* Define MACRO as a <stdint.h> constant-suffix macro for TYPE. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1711 static void
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1712 builtin_define_constants (const char *macro, tree type)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1713 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1714 const char *suffix;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1715 char *buf;
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1716
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1717 suffix = type_suffix (type);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1718
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1719 if (suffix[0] == 0)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1720 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1721 buf = (char *) alloca (strlen (macro) + 6);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1722 sprintf (buf, "%s(c)=c", macro);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1723 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1724 else
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1725 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1726 buf = (char *) alloca (strlen (macro) + 9 + strlen (suffix) + 1);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1727 sprintf (buf, "%s(c)=c ## %s", macro, suffix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1728 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1729
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1730 cpp_define (parse_in, buf);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1731 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1732
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1733 /* Define MAX for TYPE based on the precision of the type. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1734
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1735 static void
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1736 builtin_define_type_max (const char *macro, tree type)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1737 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1738 builtin_define_type_minmax (NULL, macro, type);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1739 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1740
111
kono
parents: 68
diff changeset
1741 /* Given a value with COUNT LSBs set, fill BUF with a hexidecimal
kono
parents: 68
diff changeset
1742 representation of that value. For example, a COUNT of 10 would
kono
parents: 68
diff changeset
1743 return "0x3ff". */
kono
parents: 68
diff changeset
1744
kono
parents: 68
diff changeset
1745 static void
kono
parents: 68
diff changeset
1746 print_bits_of_hex (char *buf, int bufsz, int count)
kono
parents: 68
diff changeset
1747 {
kono
parents: 68
diff changeset
1748 gcc_assert (bufsz > 3);
kono
parents: 68
diff changeset
1749 *buf++ = '0';
kono
parents: 68
diff changeset
1750 *buf++ = 'x';
kono
parents: 68
diff changeset
1751 bufsz -= 2;
kono
parents: 68
diff changeset
1752
kono
parents: 68
diff changeset
1753 gcc_assert (count > 0);
kono
parents: 68
diff changeset
1754
kono
parents: 68
diff changeset
1755 switch (count % 4) {
kono
parents: 68
diff changeset
1756 case 0:
kono
parents: 68
diff changeset
1757 break;
kono
parents: 68
diff changeset
1758 case 1:
kono
parents: 68
diff changeset
1759 *buf++ = '1';
kono
parents: 68
diff changeset
1760 bufsz --;
kono
parents: 68
diff changeset
1761 count -= 1;
kono
parents: 68
diff changeset
1762 break;
kono
parents: 68
diff changeset
1763 case 2:
kono
parents: 68
diff changeset
1764 *buf++ = '3';
kono
parents: 68
diff changeset
1765 bufsz --;
kono
parents: 68
diff changeset
1766 count -= 2;
kono
parents: 68
diff changeset
1767 break;
kono
parents: 68
diff changeset
1768 case 3:
kono
parents: 68
diff changeset
1769 *buf++ = '7';
kono
parents: 68
diff changeset
1770 bufsz --;
kono
parents: 68
diff changeset
1771 count -= 3;
kono
parents: 68
diff changeset
1772 break;
kono
parents: 68
diff changeset
1773 }
kono
parents: 68
diff changeset
1774 while (count >= 4)
kono
parents: 68
diff changeset
1775 {
kono
parents: 68
diff changeset
1776 gcc_assert (bufsz > 1);
kono
parents: 68
diff changeset
1777 *buf++ = 'f';
kono
parents: 68
diff changeset
1778 bufsz --;
kono
parents: 68
diff changeset
1779 count -= 4;
kono
parents: 68
diff changeset
1780 }
kono
parents: 68
diff changeset
1781 gcc_assert (bufsz > 0);
kono
parents: 68
diff changeset
1782 *buf++ = 0;
kono
parents: 68
diff changeset
1783 }
kono
parents: 68
diff changeset
1784
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1785 /* Define MIN_MACRO (if not NULL) and MAX_MACRO for TYPE based on the
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1786 precision of the type. */
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1787
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1788 static void
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1789 builtin_define_type_minmax (const char *min_macro, const char *max_macro,
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1790 tree type)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1791 {
111
kono
parents: 68
diff changeset
1792 #define PBOH_SZ (MAX_BITSIZE_MODE_ANY_INT/4+4)
kono
parents: 68
diff changeset
1793 char value[PBOH_SZ];
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1794
111
kono
parents: 68
diff changeset
1795 const char *suffix;
kono
parents: 68
diff changeset
1796 char *buf;
kono
parents: 68
diff changeset
1797 int bits;
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1798
111
kono
parents: 68
diff changeset
1799 bits = TYPE_PRECISION (type) + (TYPE_UNSIGNED (type) ? 0 : -1);
kono
parents: 68
diff changeset
1800
kono
parents: 68
diff changeset
1801 print_bits_of_hex (value, PBOH_SZ, bits);
kono
parents: 68
diff changeset
1802
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1803 suffix = type_suffix (type);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1804
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1805 buf = (char *) alloca (strlen (max_macro) + 1 + strlen (value)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1806 + strlen (suffix) + 1);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1807 sprintf (buf, "%s=%s%s", max_macro, value, suffix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1808
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1809 cpp_define (parse_in, buf);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1810
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1811 if (min_macro)
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1812 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1813 if (TYPE_UNSIGNED (type))
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1814 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1815 buf = (char *) alloca (strlen (min_macro) + 2 + strlen (suffix) + 1);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1816 sprintf (buf, "%s=0%s", min_macro, suffix);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1817 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1818 else
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1819 {
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1820 buf = (char *) alloca (strlen (min_macro) + 3
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1821 + strlen (max_macro) + 6);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1822 sprintf (buf, "%s=(-%s - 1)", min_macro, max_macro);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1823 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1824 cpp_define (parse_in, buf);
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1825 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1826 }
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1827
111
kono
parents: 68
diff changeset
1828 /* Define WIDTH_MACRO for the width of TYPE. If TYPE2 is not NULL,
kono
parents: 68
diff changeset
1829 both types must have the same width. */
kono
parents: 68
diff changeset
1830
kono
parents: 68
diff changeset
1831 static void
kono
parents: 68
diff changeset
1832 builtin_define_type_width (const char *width_macro, tree type, tree type2)
kono
parents: 68
diff changeset
1833 {
kono
parents: 68
diff changeset
1834 if (type2 != NULL_TREE)
kono
parents: 68
diff changeset
1835 gcc_assert (TYPE_PRECISION (type) == TYPE_PRECISION (type2));
kono
parents: 68
diff changeset
1836 builtin_define_with_int_value (width_macro, TYPE_PRECISION (type));
kono
parents: 68
diff changeset
1837 }
kono
parents: 68
diff changeset
1838
68
561a7518be6b update gcc-4.6
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1839 #include "gt-c-family-c-cppbuiltin.h"