Mercurial > hg > CbC > CbC_gcc
comparison gcc/optc-save-gen.awk @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | |
children | 84e7813d76e9 |
comparison
equal
deleted
inserted
replaced
68:561a7518be6b | 111:04ced10e8804 |
---|---|
1 # Copyright (C) 2003-2017 Free Software Foundation, Inc. | |
2 # Contributed by Kelley Cook, June 2004. | |
3 # Original code from Neil Booth, May 2003. | |
4 # | |
5 # This program is free software; you can redistribute it and/or modify it | |
6 # under the terms of the GNU General Public License as published by the | |
7 # Free Software Foundation; either version 3, or (at your option) any | |
8 # later version. | |
9 # | |
10 # This program is distributed in the hope that it will be useful, | |
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 # GNU General Public License for more details. | |
14 # | |
15 # You should have received a copy of the GNU General Public License | |
16 # along with this program; see the file COPYING3. If not see | |
17 # <http://www.gnu.org/licenses/>. | |
18 | |
19 # This Awk script reads in the option records generated from | |
20 # opt-gather.awk, combines the flags of duplicate options and generates a | |
21 # C file. | |
22 # | |
23 | |
24 # This program uses functions from opt-functions.awk and code from | |
25 # opt-read.awk. | |
26 # | |
27 # Usage: awk -f opt-functions.awk -f opt-read.awk -f optc-save-gen.awk \ | |
28 # [-v header_name=header.h] < inputfile > options-save.c | |
29 | |
30 # Dump that array of options into a C file. | |
31 END { | |
32 print "/* This file is auto-generated by optc-save-gen.awk. */" | |
33 print "" | |
34 n_headers = split(header_name, headers, " ") | |
35 for (i = 1; i <= n_headers; i++) | |
36 print "#include " quote headers[i] quote | |
37 print "#include " quote "opts.h" quote | |
38 print "#include " quote "intl.h" quote | |
39 print "" | |
40 print "#include " quote "flags.h" quote | |
41 print "#include " quote "target.h" quote | |
42 print "#include " quote "inchash.h" quote | |
43 print "#include " quote "hash-set.h" quote | |
44 print "#include " quote "vec.h" quote | |
45 print "#include " quote "input.h" quote | |
46 print "#include " quote "alias.h" quote | |
47 print "#include " quote "symtab.h" quote | |
48 print "#include " quote "inchash.h" quote | |
49 print "#include " quote "tree.h" quote | |
50 print "#include " quote "fold-const.h" quote | |
51 print "#include " quote "tree-ssa-alias.h" quote | |
52 print "#include " quote "is-a.h" quote | |
53 print "#include " quote "predict.h" quote | |
54 print "#include " quote "function.h" quote | |
55 print "#include " quote "basic-block.h" quote | |
56 print "#include " quote "gimple-expr.h" quote | |
57 print "#include " quote "gimple.h" quote | |
58 print "#include " quote "data-streamer.h" quote | |
59 print "#include " quote "ipa-ref.h" quote | |
60 print "#include " quote "cgraph.h" quote | |
61 print "" | |
62 | |
63 if (n_extra_c_includes > 0) { | |
64 for (i = 0; i < n_extra_c_includes; i++) { | |
65 print "#include " quote extra_c_includes[i] quote | |
66 } | |
67 print "" | |
68 } | |
69 | |
70 have_save = 0; | |
71 if (n_extra_target_vars) | |
72 have_save = 1 | |
73 | |
74 for (i = 0; i < n_opts; i++) { | |
75 if (flag_set_p("Save", flags[i])) | |
76 have_save = 1; | |
77 } | |
78 | |
79 print "/* Save optimization variables into a structure. */" | |
80 print "void"; | |
81 print "cl_optimization_save (struct cl_optimization *ptr, struct gcc_options *opts)"; | |
82 print "{"; | |
83 | |
84 n_opt_char = 3; | |
85 n_opt_short = 0; | |
86 n_opt_int = 0; | |
87 n_opt_enum = 0; | |
88 n_opt_other = 0; | |
89 var_opt_char[0] = "optimize"; | |
90 var_opt_char[1] = "optimize_size"; | |
91 var_opt_char[2] = "optimize_debug"; | |
92 var_opt_range["optimize"] = "0, 255"; | |
93 var_opt_range["optimize_size"] = "0, 1"; | |
94 var_opt_range["optimize_debug"] = "0, 1"; | |
95 | |
96 # Sort by size to mimic how the structure is laid out to be friendlier to the | |
97 # cache. | |
98 | |
99 for (i = 0; i < n_opts; i++) { | |
100 if (flag_set_p("(Optimization|PerFunction)", flags[i])) { | |
101 name = var_name(flags[i]) | |
102 if(name == "") | |
103 continue; | |
104 | |
105 if(name in var_opt_seen) | |
106 continue; | |
107 | |
108 var_opt_seen[name]++; | |
109 otype = var_type_struct(flags[i]); | |
110 if (otype ~ "^((un)?signed +)?int *$") | |
111 var_opt_int[n_opt_int++] = name; | |
112 | |
113 else if (otype ~ "^((un)?signed +)?short *$") | |
114 var_opt_short[n_opt_short++] = name; | |
115 | |
116 else if (otype ~ ("^enum +[_" alnum "]+ *")) | |
117 var_opt_enum[n_opt_enum++] = name; | |
118 | |
119 else if (otype ~ "^((un)?signed +)?char *$") { | |
120 var_opt_char[n_opt_char++] = name; | |
121 if (otype ~ "^unsigned +char *$") | |
122 var_opt_range[name] = "0, 255" | |
123 else if (otype ~ "^signed +char *$") | |
124 var_opt_range[name] = "-128, 127" | |
125 } | |
126 else | |
127 var_opt_other[n_opt_other++] = name; | |
128 } | |
129 } | |
130 | |
131 for (i = 0; i < n_opt_char; i++) { | |
132 name = var_opt_char[i]; | |
133 if (var_opt_range[name] != "") | |
134 print " gcc_assert (IN_RANGE (opts->x_" name ", " var_opt_range[name] "));"; | |
135 } | |
136 | |
137 print ""; | |
138 for (i = 0; i < n_opt_other; i++) { | |
139 print " ptr->x_" var_opt_other[i] " = opts->x_" var_opt_other[i] ";"; | |
140 } | |
141 | |
142 for (i = 0; i < n_opt_int; i++) { | |
143 print " ptr->x_" var_opt_int[i] " = opts->x_" var_opt_int[i] ";"; | |
144 } | |
145 | |
146 for (i = 0; i < n_opt_enum; i++) { | |
147 print " ptr->x_" var_opt_enum[i] " = opts->x_" var_opt_enum[i] ";"; | |
148 } | |
149 | |
150 for (i = 0; i < n_opt_short; i++) { | |
151 print " ptr->x_" var_opt_short[i] " = opts->x_" var_opt_short[i] ";"; | |
152 } | |
153 | |
154 for (i = 0; i < n_opt_char; i++) { | |
155 print " ptr->x_" var_opt_char[i] " = opts->x_" var_opt_char[i] ";"; | |
156 } | |
157 | |
158 print "}"; | |
159 | |
160 print ""; | |
161 print "/* Restore optimization options from a structure. */"; | |
162 print "void"; | |
163 print "cl_optimization_restore (struct gcc_options *opts, struct cl_optimization *ptr)"; | |
164 print "{"; | |
165 | |
166 for (i = 0; i < n_opt_other; i++) { | |
167 print " opts->x_" var_opt_other[i] " = ptr->x_" var_opt_other[i] ";"; | |
168 } | |
169 | |
170 for (i = 0; i < n_opt_int; i++) { | |
171 print " opts->x_" var_opt_int[i] " = ptr->x_" var_opt_int[i] ";"; | |
172 } | |
173 | |
174 for (i = 0; i < n_opt_enum; i++) { | |
175 print " opts->x_" var_opt_enum[i] " = ptr->x_" var_opt_enum[i] ";"; | |
176 } | |
177 | |
178 for (i = 0; i < n_opt_short; i++) { | |
179 print " opts->x_" var_opt_short[i] " = ptr->x_" var_opt_short[i] ";"; | |
180 } | |
181 | |
182 for (i = 0; i < n_opt_char; i++) { | |
183 print " opts->x_" var_opt_char[i] " = ptr->x_" var_opt_char[i] ";"; | |
184 } | |
185 | |
186 print " targetm.override_options_after_change ();"; | |
187 print "}"; | |
188 | |
189 print ""; | |
190 print "/* Print optimization options from a structure. */"; | |
191 print "void"; | |
192 print "cl_optimization_print (FILE *file,"; | |
193 print " int indent_to,"; | |
194 print " struct cl_optimization *ptr)"; | |
195 print "{"; | |
196 | |
197 print " fputs (\"\\n\", file);"; | |
198 for (i = 0; i < n_opt_other; i++) { | |
199 print " if (ptr->x_" var_opt_other[i] ")"; | |
200 print " fprintf (file, \"%*s%s (%#lx)\\n\","; | |
201 print " indent_to, \"\","; | |
202 print " \"" var_opt_other[i] "\","; | |
203 print " (unsigned long)ptr->x_" var_opt_other[i] ");"; | |
204 print ""; | |
205 } | |
206 | |
207 for (i = 0; i < n_opt_int; i++) { | |
208 print " if (ptr->x_" var_opt_int[i] ")"; | |
209 print " fprintf (file, \"%*s%s (%#x)\\n\","; | |
210 print " indent_to, \"\","; | |
211 print " \"" var_opt_int[i] "\","; | |
212 print " ptr->x_" var_opt_int[i] ");"; | |
213 print ""; | |
214 } | |
215 | |
216 for (i = 0; i < n_opt_enum; i++) { | |
217 print " fprintf (file, \"%*s%s (%#x)\\n\","; | |
218 print " indent_to, \"\","; | |
219 print " \"" var_opt_enum[i] "\","; | |
220 print " (int) ptr->x_" var_opt_enum[i] ");"; | |
221 print ""; | |
222 } | |
223 | |
224 for (i = 0; i < n_opt_short; i++) { | |
225 print " if (ptr->x_" var_opt_short[i] ")"; | |
226 print " fprintf (file, \"%*s%s (%#x)\\n\","; | |
227 print " indent_to, \"\","; | |
228 print " \"" var_opt_short[i] "\","; | |
229 print " ptr->x_" var_opt_short[i] ");"; | |
230 print ""; | |
231 } | |
232 | |
233 for (i = 0; i < n_opt_char; i++) { | |
234 print " if (ptr->x_" var_opt_char[i] ")"; | |
235 print " fprintf (file, \"%*s%s (%#x)\\n\","; | |
236 print " indent_to, \"\","; | |
237 print " \"" var_opt_char[i] "\","; | |
238 print " ptr->x_" var_opt_char[i] ");"; | |
239 print ""; | |
240 } | |
241 | |
242 print "}"; | |
243 | |
244 print ""; | |
245 print "/* Print different optimization variables from structures provided as arguments. */"; | |
246 print "void"; | |
247 print "cl_optimization_print_diff (FILE *file,"; | |
248 print " int indent_to,"; | |
249 print " struct cl_optimization *ptr1,"; | |
250 print " struct cl_optimization *ptr2)"; | |
251 print "{"; | |
252 | |
253 print " fputs (\"\\n\", file);"; | |
254 for (i = 0; i < n_opt_other; i++) { | |
255 print " if (ptr1->x_" var_opt_other[i] " != ptr2->x_" var_opt_other[i] ")"; | |
256 print " fprintf (file, \"%*s%s (%#lx/%#lx)\\n\","; | |
257 print " indent_to, \"\","; | |
258 print " \"" var_opt_other[i] "\","; | |
259 print " (unsigned long)ptr1->x_" var_opt_other[i] ","; | |
260 print " (unsigned long)ptr2->x_" var_opt_other[i] ");"; | |
261 print ""; | |
262 } | |
263 | |
264 for (i = 0; i < n_opt_int; i++) { | |
265 print " if (ptr1->x_" var_opt_int[i] " != ptr2->x_" var_opt_int[i] ")"; | |
266 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; | |
267 print " indent_to, \"\","; | |
268 print " \"" var_opt_int[i] "\","; | |
269 print " ptr1->x_" var_opt_int[i] ","; | |
270 print " ptr2->x_" var_opt_int[i] ");"; | |
271 print ""; | |
272 } | |
273 | |
274 for (i = 0; i < n_opt_enum; i++) { | |
275 print " if (ptr1->x_" var_opt_enum[i] " != ptr2->x_" var_opt_enum[i] ")"; | |
276 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; | |
277 print " indent_to, \"\","; | |
278 print " \"" var_opt_enum[i] "\","; | |
279 print " (int) ptr1->x_" var_opt_enum[i] ","; | |
280 print " (int) ptr2->x_" var_opt_enum[i] ");"; | |
281 print ""; | |
282 } | |
283 | |
284 for (i = 0; i < n_opt_short; i++) { | |
285 print " if (ptr1->x_" var_opt_short[i] " != ptr2->x_" var_opt_short[i] ")"; | |
286 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; | |
287 print " indent_to, \"\","; | |
288 print " \"" var_opt_short[i] "\","; | |
289 print " ptr1->x_" var_opt_short[i] ","; | |
290 print " ptr2->x_" var_opt_short[i] ");"; | |
291 print ""; | |
292 } | |
293 | |
294 for (i = 0; i < n_opt_char; i++) { | |
295 print " if (ptr1->x_" var_opt_char[i] " != ptr2->x_" var_opt_char[i] ")"; | |
296 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; | |
297 print " indent_to, \"\","; | |
298 print " \"" var_opt_char[i] "\","; | |
299 print " ptr1->x_" var_opt_char[i] ","; | |
300 print " ptr2->x_" var_opt_char[i] ");"; | |
301 print ""; | |
302 } | |
303 | |
304 print "}"; | |
305 | |
306 | |
307 print ""; | |
308 print "/* Save selected option variables into a structure. */" | |
309 print "void"; | |
310 print "cl_target_option_save (struct cl_target_option *ptr, struct gcc_options *opts)"; | |
311 print "{"; | |
312 | |
313 n_target_char = 0; | |
314 n_target_short = 0; | |
315 n_target_int = 0; | |
316 n_target_enum = 0; | |
317 n_target_other = 0; | |
318 | |
319 if (have_save) { | |
320 for (i = 0; i < n_opts; i++) { | |
321 if (flag_set_p("Save", flags[i])) { | |
322 name = var_name(flags[i]) | |
323 if(name == "") | |
324 name = "target_flags"; | |
325 | |
326 if(name in var_save_seen) | |
327 continue; | |
328 | |
329 var_save_seen[name]++; | |
330 otype = var_type_struct(flags[i]) | |
331 if (otype ~ "^((un)?signed +)?int *$") | |
332 var_target_int[n_target_int++] = name; | |
333 | |
334 else if (otype ~ "^((un)?signed +)?short *$") | |
335 var_target_short[n_target_short++] = name; | |
336 | |
337 else if (otype ~ ("^enum +[_" alnum "]+ *$")) | |
338 var_target_enum[n_target_enum++] = name; | |
339 | |
340 else if (otype ~ "^((un)?signed +)?char *$") { | |
341 var_target_char[n_target_char++] = name; | |
342 if (otype ~ "^unsigned +char *$") | |
343 var_target_range[name] = "0, 255" | |
344 else if (otype ~ "^signed +char *$") | |
345 var_target_range[name] = "-128, 127" | |
346 if (otype == var_type(flags[i])) | |
347 var_target_range[name] = "" | |
348 } | |
349 else | |
350 var_target_other[n_target_other++] = name; | |
351 } | |
352 } | |
353 } else { | |
354 var_target_int[n_target_int++] = "target_flags"; | |
355 } | |
356 | |
357 have_assert = 0; | |
358 for (i = 0; i < n_target_char; i++) { | |
359 name = var_target_char[i]; | |
360 if (var_target_range[name] != "") { | |
361 have_assert = 1; | |
362 print " gcc_assert (IN_RANGE (opts->x_" name ", " var_target_range[name] "));"; | |
363 } | |
364 } | |
365 | |
366 if (have_assert) | |
367 print ""; | |
368 | |
369 print " if (targetm.target_option.save)"; | |
370 print " targetm.target_option.save (ptr, opts);"; | |
371 print ""; | |
372 | |
373 for (i = 0; i < n_extra_target_vars; i++) { | |
374 print " ptr->x_" extra_target_vars[i] " = opts->x_" extra_target_vars[i] ";"; | |
375 } | |
376 | |
377 for (i = 0; i < n_target_other; i++) { | |
378 print " ptr->x_" var_target_other[i] " = opts->x_" var_target_other[i] ";"; | |
379 } | |
380 | |
381 for (i = 0; i < n_target_enum; i++) { | |
382 print " ptr->x_" var_target_enum[i] " = opts->x_" var_target_enum[i] ";"; | |
383 } | |
384 | |
385 for (i = 0; i < n_target_int; i++) { | |
386 print " ptr->x_" var_target_int[i] " = opts->x_" var_target_int[i] ";"; | |
387 } | |
388 | |
389 for (i = 0; i < n_target_short; i++) { | |
390 print " ptr->x_" var_target_short[i] " = opts->x_" var_target_short[i] ";"; | |
391 } | |
392 | |
393 for (i = 0; i < n_target_char; i++) { | |
394 print " ptr->x_" var_target_char[i] " = opts->x_" var_target_char[i] ";"; | |
395 } | |
396 | |
397 print "}"; | |
398 | |
399 print ""; | |
400 print "/* Restore selected current options from a structure. */"; | |
401 print "void"; | |
402 print "cl_target_option_restore (struct gcc_options *opts, struct cl_target_option *ptr)"; | |
403 print "{"; | |
404 | |
405 for (i = 0; i < n_extra_target_vars; i++) { | |
406 print " opts->x_" extra_target_vars[i] " = ptr->x_" extra_target_vars[i] ";"; | |
407 } | |
408 | |
409 for (i = 0; i < n_target_other; i++) { | |
410 print " opts->x_" var_target_other[i] " = ptr->x_" var_target_other[i] ";"; | |
411 } | |
412 | |
413 for (i = 0; i < n_target_enum; i++) { | |
414 print " opts->x_" var_target_enum[i] " = ptr->x_" var_target_enum[i] ";"; | |
415 } | |
416 | |
417 for (i = 0; i < n_target_int; i++) { | |
418 print " opts->x_" var_target_int[i] " = ptr->x_" var_target_int[i] ";"; | |
419 } | |
420 | |
421 for (i = 0; i < n_target_short; i++) { | |
422 print " opts->x_" var_target_short[i] " = ptr->x_" var_target_short[i] ";"; | |
423 } | |
424 | |
425 for (i = 0; i < n_target_char; i++) { | |
426 print " opts->x_" var_target_char[i] " = ptr->x_" var_target_char[i] ";"; | |
427 } | |
428 | |
429 # This must occur after the normal variables in case the code depends on those | |
430 # variables. | |
431 print ""; | |
432 print " if (targetm.target_option.restore)"; | |
433 print " targetm.target_option.restore (opts, ptr);"; | |
434 | |
435 print "}"; | |
436 | |
437 print ""; | |
438 print "/* Print optimization options from a structure. */"; | |
439 print "void"; | |
440 print "cl_target_option_print (FILE *file,"; | |
441 print " int indent,"; | |
442 print " struct cl_target_option *ptr)"; | |
443 print "{"; | |
444 | |
445 print " fputs (\"\\n\", file);"; | |
446 for (i = 0; i < n_target_other; i++) { | |
447 print " if (ptr->x_" var_target_other[i] ")"; | |
448 if (host_wide_int[var_target_other[i]] == "yes") | |
449 print " fprintf (file, \"%*s%s (%#\" HOST_WIDE_INT_PRINT \"x)\\n\","; | |
450 else | |
451 print " fprintf (file, \"%*s%s (%#x)\\n\","; | |
452 print " indent, \"\","; | |
453 print " \"" var_target_other[i] "\","; | |
454 if (host_wide_int[var_target_other[i]] == "yes") | |
455 print " ptr->x_" var_target_other[i] ");"; | |
456 else | |
457 print " (unsigned long)ptr->x_" var_target_other[i] ");"; | |
458 print ""; | |
459 } | |
460 | |
461 for (i = 0; i < n_target_enum; i++) { | |
462 print " if (ptr->x_" var_target_enum[i] ")"; | |
463 print " fprintf (file, \"%*s%s (%#x)\\n\","; | |
464 print " indent, \"\","; | |
465 print " \"" var_target_enum[i] "\","; | |
466 print " ptr->x_" var_target_enum[i] ");"; | |
467 print ""; | |
468 } | |
469 | |
470 for (i = 0; i < n_target_int; i++) { | |
471 print " if (ptr->x_" var_target_int[i] ")"; | |
472 print " fprintf (file, \"%*s%s (%#x)\\n\","; | |
473 print " indent, \"\","; | |
474 print " \"" var_target_int[i] "\","; | |
475 print " ptr->x_" var_target_int[i] ");"; | |
476 print ""; | |
477 } | |
478 | |
479 for (i = 0; i < n_target_short; i++) { | |
480 print " if (ptr->x_" var_target_short[i] ")"; | |
481 print " fprintf (file, \"%*s%s (%#x)\\n\","; | |
482 print " indent, \"\","; | |
483 print " \"" var_target_short[i] "\","; | |
484 print " ptr->x_" var_target_short[i] ");"; | |
485 print ""; | |
486 } | |
487 | |
488 for (i = 0; i < n_target_char; i++) { | |
489 print " if (ptr->x_" var_target_char[i] ")"; | |
490 print " fprintf (file, \"%*s%s (%#x)\\n\","; | |
491 print " indent, \"\","; | |
492 print " \"" var_target_char[i] "\","; | |
493 print " ptr->x_" var_target_char[i] ");"; | |
494 print ""; | |
495 } | |
496 | |
497 print ""; | |
498 print " if (targetm.target_option.print)"; | |
499 print " targetm.target_option.print (file, indent, ptr);"; | |
500 print "}"; | |
501 | |
502 print ""; | |
503 print "/* Print different target option variables from structures provided as arguments. */"; | |
504 print "void"; | |
505 print "cl_target_option_print_diff (FILE *file,"; | |
506 print " int indent ATTRIBUTE_UNUSED,"; | |
507 print " struct cl_target_option *ptr1 ATTRIBUTE_UNUSED,"; | |
508 print " struct cl_target_option *ptr2 ATTRIBUTE_UNUSED)"; | |
509 print "{"; | |
510 | |
511 print " fputs (\"\\n\", file);"; | |
512 for (i = 0; i < n_target_other; i++) { | |
513 print " if (ptr1->x_" var_target_other[i] " != ptr2->x_" var_target_other[i] ")"; | |
514 if (host_wide_int[var_target_other[i]] == "yes") | |
515 print " fprintf (file, \"%*s%s (%#\" HOST_WIDE_INT_PRINT \"x/%#\" HOST_WIDE_INT_PRINT \"x)\\n\","; | |
516 else | |
517 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; | |
518 print " indent, \"\","; | |
519 print " \"" var_target_other[i] "\","; | |
520 if (host_wide_int[var_target_other[i]] == "yes") { | |
521 print " ptr1->x_" var_target_other[i] ","; | |
522 print " ptr2->x_" var_target_other[i] ");"; | |
523 } | |
524 else { | |
525 print " (unsigned long)ptr1->x_" var_target_other[i] ","; | |
526 print " (unsigned long)ptr2->x_" var_target_other[i] ");"; | |
527 } | |
528 print ""; | |
529 } | |
530 | |
531 for (i = 0; i < n_target_enum; i++) { | |
532 print " if (ptr1->x_" var_target_enum[i] " != ptr2->x_" var_target_enum[i] ")"; | |
533 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; | |
534 print " indent, \"\","; | |
535 print " \"" var_target_enum[i] "\","; | |
536 print " ptr1->x_" var_target_enum[i] ","; | |
537 print " ptr2->x_" var_target_enum[i] ");"; | |
538 print ""; | |
539 } | |
540 | |
541 for (i = 0; i < n_target_int; i++) { | |
542 print " if (ptr1->x_" var_target_int[i] " != ptr2->x_" var_target_int[i] ")"; | |
543 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; | |
544 print " indent, \"\","; | |
545 print " \"" var_target_int[i] "\","; | |
546 print " ptr1->x_" var_target_int[i] ","; | |
547 print " ptr2->x_" var_target_int[i] ");"; | |
548 print ""; | |
549 } | |
550 | |
551 for (i = 0; i < n_target_short; i++) { | |
552 print " if (ptr1->x_" var_target_short[i] " != ptr2->x_" var_target_short[i] ")"; | |
553 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; | |
554 print " indent, \"\","; | |
555 print " \"" var_target_short[i] "\","; | |
556 print " ptr1->x_" var_target_short[i] ","; | |
557 print " ptr2->x_" var_target_short[i] ");"; | |
558 print ""; | |
559 } | |
560 | |
561 for (i = 0; i < n_target_char; i++) { | |
562 print " if (ptr1->x_" var_target_char[i] " != ptr2->x_" var_target_char[i] ")"; | |
563 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; | |
564 print " indent, \"\","; | |
565 print " \"" var_target_char[i] "\","; | |
566 print " ptr1->x_" var_target_char[i] ","; | |
567 print " ptr2->x_" var_target_char[i] ");"; | |
568 print ""; | |
569 } | |
570 | |
571 print "}"; | |
572 | |
573 print ""; | |
574 print "/* Compare two target options */"; | |
575 print "bool"; | |
576 print "cl_target_option_eq (struct cl_target_option const *ptr1 ATTRIBUTE_UNUSED,"; | |
577 print " struct cl_target_option const *ptr2 ATTRIBUTE_UNUSED)"; | |
578 print "{"; | |
579 n_target_val = 0; | |
580 n_target_str = 0; | |
581 n_target_array = 0; | |
582 | |
583 for (i = 0; i < n_target_save; i++) { | |
584 var = target_save_decl[i]; | |
585 sub (" *=.*", "", var); | |
586 name = var; | |
587 type = var; | |
588 sub("^.*[ *]", "", name) | |
589 sub(" *" name "$", "", type) | |
590 if (target_save_decl[i] ~ "^const char \\*+[_" alnum "]+$") | |
591 var_target_str[n_target_str++] = name; | |
592 else { | |
593 if (target_save_decl[i] ~ " .*\\[.+\\]+$") { | |
594 size = name; | |
595 sub("[^\\[]+\\[", "", size); | |
596 sub("\\]$", "", size); | |
597 sub("\\[.+", "", name) | |
598 sub(" [^ ]+$", "", type) | |
599 var_target_array[n_target_array] = name | |
600 var_target_array_type[n_target_array] = type | |
601 var_target_array_size[n_target_array++] = size | |
602 } | |
603 else { | |
604 var_target_val_type[n_target_val] = type; | |
605 var_target_val[n_target_val++] = name; | |
606 } | |
607 } | |
608 } | |
609 if (have_save) { | |
610 for (i = 0; i < n_opts; i++) { | |
611 if (flag_set_p("Save", flags[i])) { | |
612 name = var_name(flags[i]) | |
613 if(name == "") | |
614 name = "target_flags"; | |
615 | |
616 if(name in var_list_seen) | |
617 continue; | |
618 | |
619 var_list_seen[name]++; | |
620 otype = var_type_struct(flags[i]) | |
621 if (otype ~ "^const char \\**$") | |
622 var_target_str[n_target_str++] = "x_" name; | |
623 else { | |
624 var_target_val_type[n_target_val] = otype; | |
625 var_target_val[n_target_val++] = "x_" name; | |
626 } | |
627 } | |
628 } | |
629 } else { | |
630 var_target_val_type[n_target_val] = "int"; | |
631 var_target_val[n_target_val++] = "x_target_flags"; | |
632 } | |
633 | |
634 for (i = 0; i < n_target_str; i++) { | |
635 name = var_target_str[i] | |
636 print " if (ptr1->" name" != ptr2->" name; | |
637 print " && (!ptr1->" name" || !ptr2->" name | |
638 print " || strcmp (ptr1->" name", ptr2->" name ")))"; | |
639 print " return false;"; | |
640 } | |
641 for (i = 0; i < n_target_array; i++) { | |
642 name = var_target_array[i] | |
643 size = var_target_array_size[i] | |
644 type = var_target_array_type[i] | |
645 print " if (ptr1->" name" != ptr2->" name ""; | |
646 print " || memcmp (ptr1->" name ", ptr2->" name ", " size " * sizeof(" type ")))" | |
647 print " return false;"; | |
648 } | |
649 for (i = 0; i < n_target_val; i++) { | |
650 name = var_target_val[i] | |
651 print " if (ptr1->" name" != ptr2->" name ")"; | |
652 print " return false;"; | |
653 } | |
654 | |
655 print " return true;"; | |
656 | |
657 print "}"; | |
658 | |
659 print ""; | |
660 print "/* Hash target options */"; | |
661 print "hashval_t"; | |
662 print "cl_target_option_hash (struct cl_target_option const *ptr ATTRIBUTE_UNUSED)"; | |
663 print "{"; | |
664 print " inchash::hash hstate;"; | |
665 for (i = 0; i < n_target_str; i++) { | |
666 name = var_target_str[i] | |
667 print " if (ptr->" name")"; | |
668 print " hstate.add (ptr->" name", strlen (ptr->" name"));"; | |
669 print " else"; | |
670 print " hstate.add_int (0);"; | |
671 } | |
672 for (i = 0; i < n_target_array; i++) { | |
673 name= var_target_array[i] | |
674 size = var_target_array_size[i] | |
675 type = var_target_array_type[i] | |
676 print " hstate.add_int (" size ");"; | |
677 print " hstate.add (ptr->" name ", sizeof (" type ") * " size ");"; | |
678 } | |
679 for (i = 0; i < n_target_val; i++) { | |
680 name = var_target_val[i] | |
681 print " hstate.add_hwi (ptr->" name");"; | |
682 } | |
683 print " return hstate.end ();"; | |
684 print "}"; | |
685 | |
686 print ""; | |
687 print "/* Stream out target options */"; | |
688 print "void"; | |
689 print "cl_target_option_stream_out (struct output_block *ob ATTRIBUTE_UNUSED,"; | |
690 print " struct bitpack_d *bp ATTRIBUTE_UNUSED,"; | |
691 print " struct cl_target_option *ptr ATTRIBUTE_UNUSED)"; | |
692 print "{"; | |
693 for (i = 0; i < n_target_str; i++) { | |
694 name = var_target_str[i] | |
695 print " bp_pack_string (ob, bp, ptr->" name", true);"; | |
696 } | |
697 for (i = 0; i < n_target_array; i++) { | |
698 name = var_target_array[i] | |
699 size = var_target_array_size[i] | |
700 print " for (unsigned i = 0; i < " size "; i++)" | |
701 print " bp_pack_value (bp, ptr->" name "[i], 64);"; | |
702 } | |
703 for (i = 0; i < n_target_val; i++) { | |
704 name = var_target_val[i] | |
705 print " bp_pack_value (bp, ptr->" name", 64);"; | |
706 } | |
707 print "}"; | |
708 | |
709 print ""; | |
710 print "/* Stream in target options */"; | |
711 print "void"; | |
712 print "cl_target_option_stream_in (struct data_in *data_in ATTRIBUTE_UNUSED,"; | |
713 print " struct bitpack_d *bp ATTRIBUTE_UNUSED,"; | |
714 print " struct cl_target_option *ptr ATTRIBUTE_UNUSED)"; | |
715 print "{"; | |
716 for (i = 0; i < n_target_str; i++) { | |
717 name = var_target_str[i] | |
718 print " ptr->" name" = bp_unpack_string (data_in, bp);"; | |
719 print " if (ptr->" name")"; | |
720 print " ptr->" name" = xstrdup (ptr->" name");"; | |
721 } | |
722 for (i = 0; i < n_target_array; i++) { | |
723 name = var_target_array[i] | |
724 size = var_target_array_size[i] | |
725 print " for (int i = " size " - 1; i >= 0; i--)" | |
726 print " ptr->" name "[i] = (" var_target_array_type[i] ") bp_unpack_value (bp, 64);"; | |
727 } | |
728 for (i = 0; i < n_target_val; i++) { | |
729 name = var_target_val[i] | |
730 print " ptr->" name" = (" var_target_val_type[i] ") bp_unpack_value (bp, 64);"; | |
731 } | |
732 | |
733 print "}"; | |
734 | |
735 n_opt_val = 3; | |
736 var_opt_val[0] = "x_optimize" | |
737 var_opt_val_type[0] = "char " | |
738 var_opt_val[1] = "x_optimize_size" | |
739 var_opt_val[2] = "x_optimize_debug" | |
740 var_opt_val_type[1] = "char " | |
741 var_opt_val_type[2] = "char " | |
742 for (i = 0; i < n_opts; i++) { | |
743 if (flag_set_p("(Optimization|PerFunction)", flags[i])) { | |
744 name = var_name(flags[i]) | |
745 if(name == "") | |
746 continue; | |
747 | |
748 if(name in var_opt_list_seen) | |
749 continue; | |
750 | |
751 var_opt_list_seen[name]++; | |
752 | |
753 otype = var_type_struct(flags[i]) | |
754 var_opt_val_type[n_opt_val] = otype; | |
755 var_opt_val[n_opt_val++] = "x_" name; | |
756 var_opt_hash[n_opt_val] = flag_set_p("Optimization", flags[i]); | |
757 } | |
758 } | |
759 print ""; | |
760 print "/* Hash optimization options */"; | |
761 print "hashval_t"; | |
762 print "cl_optimization_hash (struct cl_optimization const *ptr ATTRIBUTE_UNUSED)"; | |
763 print "{"; | |
764 print " inchash::hash hstate;"; | |
765 for (i = 0; i < n_opt_val; i++) { | |
766 if (!var_opt_hash[i]) | |
767 continue; | |
768 name = var_opt_val[i] | |
769 print " hstate.add_hwi (ptr->" name");"; | |
770 } | |
771 print " return hstate.end ();"; | |
772 print "}"; | |
773 | |
774 print ""; | |
775 print "/* Stream out optimization options */"; | |
776 print "void"; | |
777 print "cl_optimization_stream_out (struct bitpack_d *bp,"; | |
778 print " struct cl_optimization *ptr)"; | |
779 print "{"; | |
780 for (i = 0; i < n_opt_val; i++) { | |
781 name = var_opt_val[i] | |
782 print " bp_pack_value (bp, ptr->" name", 64);"; | |
783 } | |
784 print "}"; | |
785 | |
786 print ""; | |
787 print "/* Stream in optimization options */"; | |
788 print "void"; | |
789 print "cl_optimization_stream_in (struct bitpack_d *bp,"; | |
790 print " struct cl_optimization *ptr)"; | |
791 print "{"; | |
792 for (i = 0; i < n_opt_val; i++) { | |
793 name = var_opt_val[i] | |
794 print " ptr->" name" = (" var_opt_val_type[i] ") bp_unpack_value (bp, 64);"; | |
795 } | |
796 print "}"; | |
797 } |