Mercurial > hg > CbC > CbC_gcc
annotate gcc/genconditions.c @ 143:76e1cf5455ef
add cbc_gc test
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 23 Dec 2018 19:24:05 +0900 |
parents | 84e7813d76e9 |
children | 1830386684a0 |
rev | line source |
---|---|
0 | 1 /* Process machine description and calculate constant conditions. |
131 | 2 Copyright (C) 2001-2018 Free Software Foundation, Inc. |
0 | 3 |
4 This file is part of GCC. | |
5 | |
6 GCC is free software; you can redistribute it and/or modify | |
7 it under the terms of the GNU General Public License as published by | |
8 the Free Software Foundation; either version 3, or (at your option) | |
9 any later version. | |
10 | |
11 GCC is distributed in the hope that it will be useful, | |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 GNU General Public License for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with GCC; see the file COPYING3. If not see | |
18 <http://www.gnu.org/licenses/>. */ | |
19 | |
20 /* In a machine description, all of the insn patterns - define_insn, | |
21 define_expand, define_split, define_peephole, define_peephole2 - | |
22 contain an optional C expression which makes the final decision | |
23 about whether or not this pattern is usable. That expression may | |
24 turn out to be always false when the compiler is built. If it is, | |
25 most of the programs that generate code from the machine | |
26 description can simply ignore the entire pattern. */ | |
27 | |
28 #include "bconfig.h" | |
29 #include "system.h" | |
30 #include "coretypes.h" | |
31 #include "tm.h" | |
32 #include "rtl.h" | |
33 #include "errors.h" | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
34 #include "read-md.h" |
0 | 35 #include "gensupport.h" |
36 | |
37 /* so we can include except.h in the generated file. */ | |
38 static int saw_eh_return; | |
39 | |
40 static void write_header (void); | |
41 static void write_conditions (void); | |
42 static int write_one_condition (void **, void *); | |
43 | |
44 /* Generate the header for insn-conditions.c. */ | |
45 | |
46 static void | |
47 write_header (void) | |
48 { | |
49 puts ("\ | |
50 /* Generated automatically by the program `genconditions' from the target\n\ | |
51 machine description file. */\n\ | |
52 \n\ | |
131 | 53 #define IN_TARGET_CODE 1\n\ |
0 | 54 #include \"bconfig.h\"\n\ |
111 | 55 #define INCLUDE_STRING\n\ |
0 | 56 #include \"system.h\"\n\ |
57 \n\ | |
58 /* It is necessary, but not entirely safe, to include the headers below\n\ | |
59 in a generator program. As a defensive measure, don't do so when the\n\ | |
60 table isn't going to have anything in it. */\n\ | |
61 #if GCC_VERSION >= 3001\n\ | |
62 \n\ | |
63 /* Do not allow checking to confuse the issue. */\n\ | |
111 | 64 #undef CHECKING_P\n\ |
65 #define CHECKING_P 0\n\ | |
0 | 66 #undef ENABLE_TREE_CHECKING\n\ |
67 #undef ENABLE_RTL_CHECKING\n\ | |
68 #undef ENABLE_RTL_FLAG_CHECKING\n\ | |
69 #undef ENABLE_GC_CHECKING\n\ | |
70 #undef ENABLE_GC_ALWAYS_COLLECT\n\ | |
111 | 71 #define USE_ENUM_MODES\n\ |
0 | 72 \n\ |
73 #include \"coretypes.h\"\n\ | |
74 #include \"tm.h\"\n\ | |
75 #include \"insn-constants.h\"\n\ | |
76 #include \"rtl.h\"\n\ | |
111 | 77 #include \"memmodel.h\"\n\ |
0 | 78 #include \"tm_p.h\"\n\ |
111 | 79 #include \"hard-reg-set.h\"\n\ |
0 | 80 #include \"function.h\"\n\ |
111 | 81 #include \"emit-rtl.h\"\n\ |
0 | 82 \n\ |
83 /* Fake - insn-config.h doesn't exist yet. */\n\ | |
84 #define MAX_RECOG_OPERANDS 10\n\ | |
85 #define MAX_DUP_OPERANDS 10\n\ | |
86 #define MAX_INSNS_PER_SPLIT 5\n\ | |
87 \n\ | |
88 #include \"regs.h\"\n\ | |
89 #include \"recog.h\"\n\ | |
90 #include \"output.h\"\n\ | |
91 #include \"flags.h\"\n\ | |
92 #include \"hard-reg-set.h\"\n\ | |
111 | 93 #include \"predict.h\"\n\ |
94 #include \"basic-block.h\"\n\ | |
95 #include \"bitmap.h\"\n\ | |
96 #include \"df.h\"\n\ | |
0 | 97 #include \"resource.h\"\n\ |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
98 #include \"diagnostic-core.h\"\n\ |
0 | 99 #include \"reload.h\"\n\ |
100 #include \"tm-constrs.h\"\n"); | |
101 | |
102 if (saw_eh_return) | |
103 puts ("#define HAVE_eh_return 1"); | |
104 puts ("#include \"except.h\"\n"); | |
105 | |
106 puts ("\ | |
107 /* Dummy external declarations. */\n\ | |
111 | 108 extern rtx_insn *insn;\n\ |
0 | 109 extern rtx ins1;\n\ |
110 extern rtx operands[];\n\ | |
111 \n\ | |
112 #endif /* gcc >= 3.0.1 */\n"); | |
113 } | |
114 | |
115 /* Write out one entry in the conditions table, using the data pointed | |
116 to by SLOT. Each entry looks like this: | |
117 | |
118 { "! optimize_size && ! TARGET_READ_MODIFY_WRITE", | |
119 __builtin_constant_p (! optimize_size && ! TARGET_READ_MODIFY_WRITE) | |
120 ? (int) (! optimize_size && ! TARGET_READ_MODIFY_WRITE) | |
121 : -1) }, */ | |
122 | |
123 static int | |
124 write_one_condition (void **slot, void * ARG_UNUSED (dummy)) | |
125 { | |
126 const struct c_test *test = * (const struct c_test **) slot; | |
127 const char *p; | |
128 | |
111 | 129 rtx_reader_ptr->print_md_ptr_loc (test->expr); |
0 | 130 fputs (" { \"", stdout); |
131 for (p = test->expr; *p; p++) | |
132 { | |
133 switch (*p) | |
134 { | |
135 case '\n': fputs ("\\n\\", stdout); break; | |
136 case '\\': | |
137 case '\"': putchar ('\\'); break; | |
138 default: break; | |
139 } | |
140 putchar (*p); | |
141 } | |
142 | |
143 fputs ("\",\n __builtin_constant_p ", stdout); | |
111 | 144 rtx_reader_ptr->print_c_condition (test->expr); |
0 | 145 fputs ("\n ? (int) ", stdout); |
111 | 146 rtx_reader_ptr->print_c_condition (test->expr); |
0 | 147 fputs ("\n : -1 },\n", stdout); |
148 return 1; | |
149 } | |
150 | |
151 /* Write out the complete conditions table, its size, and a flag | |
152 indicating that gensupport.c can now do insn elision. */ | |
153 static void | |
154 write_conditions (void) | |
155 { | |
156 puts ("\ | |
157 /* Structure definition duplicated from gensupport.h rather than\n\ | |
158 drag in that file and its dependencies. */\n\ | |
159 struct c_test\n\ | |
160 {\n\ | |
161 const char *expr;\n\ | |
162 int value;\n\ | |
163 };\n\ | |
164 \n\ | |
165 /* This table lists each condition found in the machine description.\n\ | |
166 Each condition is mapped to its truth value (0 or 1), or -1 if that\n\ | |
167 cannot be calculated at compile time.\n\ | |
168 If we don't have __builtin_constant_p, or it's not acceptable in array\n\ | |
169 initializers, fall back to assuming that all conditions potentially\n\ | |
170 vary at run time. It works in 3.0.1 and later; 3.0 only when not\n\ | |
171 optimizing. */\n\ | |
172 \n\ | |
173 #if GCC_VERSION >= 3001\n\ | |
174 static const struct c_test insn_conditions[] = {\n"); | |
175 | |
176 traverse_c_tests (write_one_condition, 0); | |
177 | |
178 puts ("\n};\n#endif /* gcc >= 3.0.1 */\n"); | |
179 } | |
180 | |
181 /* Emit code which will convert the C-format table to a | |
182 (define_conditions) form, which the MD reader can understand. | |
183 The result will be added to the set of files scanned by | |
184 'downstream' generators. */ | |
185 static void | |
186 write_writer (void) | |
187 { | |
188 puts ("int\n" | |
189 "main(void)\n" | |
190 "{\n" | |
191 " unsigned int i;\n" | |
192 " const char *p;\n" | |
193 " puts (\"(define_conditions [\");\n" | |
194 "#if GCC_VERSION >= 3001\n" | |
195 " for (i = 0; i < ARRAY_SIZE (insn_conditions); i++)\n" | |
196 " {\n" | |
197 " printf (\" (%d \\\"\", insn_conditions[i].value);\n" | |
198 " for (p = insn_conditions[i].expr; *p; p++)\n" | |
199 " {\n" | |
200 " switch (*p)\n" | |
201 " {\n" | |
202 " case '\\\\':\n" | |
203 " case '\\\"': putchar ('\\\\'); break;\n" | |
204 " default: break;\n" | |
205 " }\n" | |
206 " putchar (*p);\n" | |
207 " }\n" | |
208 " puts (\"\\\")\");\n" | |
209 " }\n" | |
210 "#endif /* gcc >= 3.0.1 */\n" | |
211 " puts (\"])\");\n" | |
212 " fflush (stdout);\n" | |
213 "return ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE;\n" | |
214 "}"); | |
215 } | |
216 | |
217 int | |
111 | 218 main (int argc, const char **argv) |
0 | 219 { |
220 progname = "genconditions"; | |
221 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
222 if (!init_rtx_reader_args (argc, argv)) |
0 | 223 return (FATAL_EXIT_CODE); |
224 | |
225 /* Read the machine description. */ | |
111 | 226 md_rtx_info info; |
227 while (read_md_rtx (&info)) | |
0 | 228 { |
111 | 229 rtx def = info.def; |
230 add_c_test (get_c_test (def), -1); | |
231 switch (GET_CODE (def)) | |
0 | 232 { |
233 case DEFINE_INSN: | |
234 case DEFINE_EXPAND: | |
235 /* except.h needs to know whether there is an eh_return | |
236 pattern in the machine description. */ | |
111 | 237 if (!strcmp (XSTR (def, 0), "eh_return")) |
0 | 238 saw_eh_return = 1; |
239 break; | |
240 | |
111 | 241 default: |
0 | 242 break; |
243 } | |
244 } | |
245 | |
246 write_header (); | |
247 write_conditions (); | |
248 write_writer (); | |
249 | |
250 fflush (stdout); | |
251 return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE); | |
252 } |