]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/optc-save-gen.awk
Correct a function pre/postcondition [PR102403].
[thirdparty/gcc.git] / gcc / optc-save-gen.awk
1 # Copyright (C) 2003-2021 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 " struct gcc_options *opts_set)";
83 print "{";
84
85 n_opt_char = 4;
86 n_opt_short = 0;
87 n_opt_int = 0;
88 n_opt_enum = 0;
89 n_opt_string = 0;
90 n_opt_other = 0;
91 var_opt_char[0] = "optimize";
92 var_opt_char[1] = "optimize_size";
93 var_opt_char[2] = "optimize_debug";
94 var_opt_char[3] = "optimize_fast";
95 var_opt_range["optimize"] = "0, 255";
96 var_opt_range["optimize_size"] = "0, 1";
97 var_opt_range["optimize_debug"] = "0, 1";
98 var_opt_range["optimize_fast"] = "0, 1";
99
100 # Sort by size to mimic how the structure is laid out to be friendlier to the
101 # cache.
102
103 for (i = 0; i < n_opts; i++) {
104 if (flag_set_p("(Optimization|PerFunction)", flags[i])) {
105 name = var_name(flags[i])
106 if(name == "")
107 continue;
108
109 if(name in var_opt_seen)
110 continue;
111
112 var_opt_seen[name]++;
113 otype = var_type_struct(flags[i]);
114 if (otype ~ "^((un)?signed +)?int *$")
115 var_opt_int[n_opt_int++] = name;
116
117 else if (otype ~ "^((un)?signed +)?short *$")
118 var_opt_short[n_opt_short++] = name;
119
120 else if (otype ~ ("^enum +[_" alnum "]+ *")) {
121 var_opt_enum_type[n_opt_enum] = otype;
122 var_opt_enum[n_opt_enum++] = name;
123 }
124 else if (otype ~ "^((un)?signed +)?char *$") {
125 var_opt_char[n_opt_char++] = name;
126 if (otype ~ "^unsigned +char *$")
127 var_opt_range[name] = "0, 255"
128 else if (otype ~ "^signed +char *$")
129 var_opt_range[name] = "-128, 127"
130 }
131 else if (otype ~ "^const char \\**$") {
132 var_opt_string[n_opt_string++] = name;
133 string_options_names[name]++
134 }
135 else
136 var_opt_other[n_opt_other++] = name;
137 }
138 }
139
140 for (i = 0; i < n_opt_char; i++) {
141 name = var_opt_char[i];
142 if (var_opt_range[name] != "")
143 print " gcc_assert (IN_RANGE (opts->x_" name ", " var_opt_range[name] "));";
144 }
145
146 print "";
147 for (i = 0; i < n_opt_other; i++) {
148 print " ptr->x_" var_opt_other[i] " = opts->x_" var_opt_other[i] ";";
149 }
150
151 for (i = 0; i < n_opt_int; i++) {
152 print " ptr->x_" var_opt_int[i] " = opts->x_" var_opt_int[i] ";";
153 }
154
155 for (i = 0; i < n_opt_enum; i++) {
156 print " ptr->x_" var_opt_enum[i] " = opts->x_" var_opt_enum[i] ";";
157 }
158
159 for (i = 0; i < n_opt_short; i++) {
160 print " ptr->x_" var_opt_short[i] " = opts->x_" var_opt_short[i] ";";
161 }
162
163 for (i = 0; i < n_opt_char; i++) {
164 print " ptr->x_" var_opt_char[i] " = opts->x_" var_opt_char[i] ";";
165 }
166
167 for (i = 0; i < n_opt_string; i++) {
168 print " ptr->x_" var_opt_string[i] " = opts->x_" var_opt_string[i] ";";
169 }
170
171 print "";
172 print " unsigned HOST_WIDE_INT mask = 0;";
173
174 j = 0;
175 k = 0;
176 for (i = 0; i < n_opt_other; i++) {
177 print " if (opts_set->x_" var_opt_other[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
178 j++;
179 if (j == 64) {
180 print " ptr->explicit_mask[" k "] = mask;";
181 print " mask = 0;";
182 j = 0;
183 k++;
184 }
185 }
186
187 for (i = 0; i < n_opt_int; i++) {
188 print " if (opts_set->x_" var_opt_int[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
189 j++;
190 if (j == 64) {
191 print " ptr->explicit_mask[" k "] = mask;";
192 print " mask = 0;";
193 j = 0;
194 k++;
195 }
196 }
197
198 for (i = 0; i < n_opt_enum; i++) {
199 print " if (opts_set->x_" var_opt_enum[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
200 j++;
201 if (j == 64) {
202 print " ptr->explicit_mask[" k "] = mask;";
203 print " mask = 0;";
204 j = 0;
205 k++;
206 }
207 }
208
209 for (i = 0; i < n_opt_short; i++) {
210 print " if (opts_set->x_" var_opt_short[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
211 j++;
212 if (j == 64) {
213 print " ptr->explicit_mask[" k "] = mask;";
214 print " mask = 0;";
215 j = 0;
216 k++;
217 }
218 }
219
220 for (i = 0; i < n_opt_char; i++) {
221 print " if (opts_set->x_" var_opt_char[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
222 j++;
223 if (j == 64) {
224 print " ptr->explicit_mask[" k "] = mask;";
225 print " mask = 0;";
226 j = 0;
227 k++;
228 }
229 }
230
231 for (i = 0; i < n_opt_string; i++) {
232 print " if (opts_set->x_" var_opt_string[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
233 j++;
234 if (j == 64) {
235 print " ptr->explicit_mask[" k "] = mask;";
236 print " mask = 0;";
237 j = 0;
238 k++;
239 }
240 }
241
242 if (j != 0) {
243 print " ptr->explicit_mask[" k "] = mask;";
244 }
245
246 print "}";
247
248 print "";
249 print "/* Restore optimization options from a structure. */";
250 print "void";
251 print "cl_optimization_restore (struct gcc_options *opts, struct gcc_options *opts_set,";
252 print " struct cl_optimization *ptr)";
253 print "{";
254
255 for (i = 0; i < n_opt_other; i++) {
256 print " opts->x_" var_opt_other[i] " = ptr->x_" var_opt_other[i] ";";
257 }
258
259 for (i = 0; i < n_opt_int; i++) {
260 print " opts->x_" var_opt_int[i] " = ptr->x_" var_opt_int[i] ";";
261 }
262
263 for (i = 0; i < n_opt_enum; i++) {
264 print " opts->x_" var_opt_enum[i] " = ptr->x_" var_opt_enum[i] ";";
265 }
266
267 for (i = 0; i < n_opt_short; i++) {
268 print " opts->x_" var_opt_short[i] " = ptr->x_" var_opt_short[i] ";";
269 }
270
271 for (i = 0; i < n_opt_char; i++) {
272 print " opts->x_" var_opt_char[i] " = ptr->x_" var_opt_char[i] ";";
273 }
274
275 for (i = 0; i < n_opt_string; i++) {
276 print " opts->x_" var_opt_string[i] " = ptr->x_" var_opt_string[i] ";";
277 }
278
279 print "";
280 print " unsigned HOST_WIDE_INT mask;";
281
282 j = 64;
283 k = 0;
284 for (i = 0; i < n_opt_other; i++) {
285 if (j == 64) {
286 print " mask = ptr->explicit_mask[" k "];";
287 k++;
288 j = 0;
289 }
290 print " opts_set->x_" var_opt_other[i] " = (mask & 1) != 0;";
291 print " mask >>= 1;"
292 j++;
293 }
294
295 for (i = 0; i < n_opt_int; i++) {
296 if (j == 64) {
297 print " mask = ptr->explicit_mask[" k "];";
298 k++;
299 j = 0;
300 }
301 print " opts_set->x_" var_opt_int[i] " = (mask & 1) != 0;";
302 print " mask >>= 1;"
303 j++;
304 }
305
306 for (i = 0; i < n_opt_enum; i++) {
307 if (j == 64) {
308 print " mask = ptr->explicit_mask[" k "];";
309 k++;
310 j = 0;
311 }
312 print " opts_set->x_" var_opt_enum[i] " = static_cast<" var_opt_enum_type[i] ">((mask & 1) != 0);";
313 print " mask >>= 1;"
314 j++;
315 }
316
317 for (i = 0; i < n_opt_short; i++) {
318 if (j == 64) {
319 print " mask = ptr->explicit_mask[" k "];";
320 k++;
321 j = 0;
322 }
323 print " opts_set->x_" var_opt_short[i] " = (mask & 1) != 0;";
324 print " mask >>= 1;"
325 j++;
326 }
327
328 for (i = 0; i < n_opt_char; i++) {
329 if (j == 64) {
330 print " mask = ptr->explicit_mask[" k "];";
331 k++;
332 j = 0;
333 }
334 print " opts_set->x_" var_opt_char[i] " = (mask & 1) != 0;";
335 print " mask >>= 1;"
336 j++;
337 }
338
339 for (i = 0; i < n_opt_string; i++) {
340 if (j == 64) {
341 print " mask = ptr->explicit_mask[" k "];";
342 k++;
343 j = 0;
344 }
345 print " opts_set->x_" var_opt_string[i] " = (mask & 1) ? \"\" : nullptr;";
346 print " mask >>= 1;"
347 j++;
348 }
349
350 print " targetm.override_options_after_change ();";
351 print "}";
352
353 print "";
354 print "/* Print optimization options from a structure. */";
355 print "void";
356 print "cl_optimization_print (FILE *file,";
357 print " int indent_to,";
358 print " struct cl_optimization *ptr)";
359 print "{";
360
361 print " fputs (\"\\n\", file);";
362 for (i = 0; i < n_opt_other; i++) {
363 print " if (ptr->x_" var_opt_other[i] ")";
364 print " fprintf (file, \"%*s%s (%#lx)\\n\",";
365 print " indent_to, \"\",";
366 print " \"" var_opt_other[i] "\",";
367 print " (unsigned long)ptr->x_" var_opt_other[i] ");";
368 print "";
369 }
370
371 for (i = 0; i < n_opt_int; i++) {
372 print " if (ptr->x_" var_opt_int[i] ")";
373 print " fprintf (file, \"%*s%s (%#x)\\n\",";
374 print " indent_to, \"\",";
375 print " \"" var_opt_int[i] "\",";
376 print " ptr->x_" var_opt_int[i] ");";
377 print "";
378 }
379
380 for (i = 0; i < n_opt_enum; i++) {
381 print " fprintf (file, \"%*s%s (%#x)\\n\",";
382 print " indent_to, \"\",";
383 print " \"" var_opt_enum[i] "\",";
384 print " (int) ptr->x_" var_opt_enum[i] ");";
385 print "";
386 }
387
388 for (i = 0; i < n_opt_short; i++) {
389 print " if (ptr->x_" var_opt_short[i] ")";
390 print " fprintf (file, \"%*s%s (%#x)\\n\",";
391 print " indent_to, \"\",";
392 print " \"" var_opt_short[i] "\",";
393 print " ptr->x_" var_opt_short[i] ");";
394 print "";
395 }
396
397 for (i = 0; i < n_opt_char; i++) {
398 print " if (ptr->x_" var_opt_char[i] ")";
399 print " fprintf (file, \"%*s%s (%#x)\\n\",";
400 print " indent_to, \"\",";
401 print " \"" var_opt_char[i] "\",";
402 print " ptr->x_" var_opt_char[i] ");";
403 print "";
404 }
405
406 for (i = 0; i < n_opt_string; i++) {
407 print " if (ptr->x_" var_opt_string[i] ")";
408 print " fprintf (file, \"%*s%s (%s)\\n\",";
409 print " indent_to, \"\",";
410 print " \"" var_opt_string[i] "\",";
411 print " ptr->x_" var_opt_string[i] ");";
412 print "";
413 }
414
415 print "}";
416
417 print "";
418 print "/* Print different optimization variables from structures provided as arguments. */";
419 print "void";
420 print "cl_optimization_print_diff (FILE *file,";
421 print " int indent_to,";
422 print " struct cl_optimization *ptr1,";
423 print " struct cl_optimization *ptr2)";
424 print "{";
425
426 print " fputs (\"\\n\", file);";
427 for (i = 0; i < n_opt_other; i++) {
428 print " if (ptr1->x_" var_opt_other[i] " != ptr2->x_" var_opt_other[i] ")";
429 print " fprintf (file, \"%*s%s (%#lx/%#lx)\\n\",";
430 print " indent_to, \"\",";
431 print " \"" var_opt_other[i] "\",";
432 print " (unsigned long)ptr1->x_" var_opt_other[i] ",";
433 print " (unsigned long)ptr2->x_" var_opt_other[i] ");";
434 print "";
435 }
436
437 for (i = 0; i < n_opt_int; i++) {
438 print " if (ptr1->x_" var_opt_int[i] " != ptr2->x_" var_opt_int[i] ")";
439 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
440 print " indent_to, \"\",";
441 print " \"" var_opt_int[i] "\",";
442 print " ptr1->x_" var_opt_int[i] ",";
443 print " ptr2->x_" var_opt_int[i] ");";
444 print "";
445 }
446
447 for (i = 0; i < n_opt_enum; i++) {
448 print " if (ptr1->x_" var_opt_enum[i] " != ptr2->x_" var_opt_enum[i] ")";
449 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
450 print " indent_to, \"\",";
451 print " \"" var_opt_enum[i] "\",";
452 print " (int) ptr1->x_" var_opt_enum[i] ",";
453 print " (int) ptr2->x_" var_opt_enum[i] ");";
454 print "";
455 }
456
457 for (i = 0; i < n_opt_short; i++) {
458 print " if (ptr1->x_" var_opt_short[i] " != ptr2->x_" var_opt_short[i] ")";
459 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
460 print " indent_to, \"\",";
461 print " \"" var_opt_short[i] "\",";
462 print " ptr1->x_" var_opt_short[i] ",";
463 print " ptr2->x_" var_opt_short[i] ");";
464 print "";
465 }
466
467 for (i = 0; i < n_opt_char; i++) {
468 print " if (ptr1->x_" var_opt_char[i] " != ptr2->x_" var_opt_char[i] ")";
469 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
470 print " indent_to, \"\",";
471 print " \"" var_opt_char[i] "\",";
472 print " ptr1->x_" var_opt_char[i] ",";
473 print " ptr2->x_" var_opt_char[i] ");";
474 print "";
475 }
476
477 for (i = 0; i < n_opt_string; i++) {
478 name = var_opt_string[i]
479 print " if (ptr1->x_" name " != ptr2->x_" name "";
480 print " && (!ptr1->x_" name" || !ptr2->x_" name
481 print " || strcmp (ptr1->x_" name", ptr2->x_" name ")))";
482 print " fprintf (file, \"%*s%s (%s/%s)\\n\",";
483 print " indent_to, \"\",";
484 print " \"" name "\",";
485 print " ptr1->x_" name " ? ptr1->x_" name " : \"(null)\",";
486 print " ptr2->x_" name " ? ptr2->x_" name " : \"(null)\");";
487 print "";
488 }
489
490 print "}";
491
492
493 print "";
494 print "/* Save selected option variables into a structure. */"
495 print "void";
496 print "cl_target_option_save (struct cl_target_option *ptr, struct gcc_options *opts,";
497 print " struct gcc_options *opts_set)";
498 print "{";
499
500 n_target_char = 0;
501 n_target_short = 0;
502 n_target_int = 0;
503 n_target_enum = 0;
504 n_target_string = 0;
505 n_target_other = 0;
506
507 if (have_save) {
508 for (i = 0; i < n_opts; i++) {
509 if (flag_set_p("Save", flags[i])) {
510 name = var_name(flags[i])
511 if(name == "")
512 name = "target_flags";
513
514 if(name in var_save_seen)
515 continue;
516
517 var_save_seen[name]++;
518 otype = var_type_struct(flags[i])
519 if (opt_args("Mask", flags[i]) != "" \
520 || opt_args("InverseMask", flags[i]))
521 var_target_explicit_mask[name] = 1;
522
523 if (otype ~ "^((un)?signed +)?int *$")
524 var_target_int[n_target_int++] = name;
525
526 else if (otype ~ "^((un)?signed +)?short *$")
527 var_target_short[n_target_short++] = name;
528
529 else if (otype ~ ("^enum +[_" alnum "]+ *$")) {
530 var_target_enum_type[n_target_enum] = otype;
531 var_target_enum[n_target_enum++] = name;
532 }
533 else if (otype ~ "^((un)?signed +)?char *$") {
534 var_target_char[n_target_char++] = name;
535 if (otype ~ "^unsigned +char *$")
536 var_target_range[name] = "0, 255"
537 else if (otype ~ "^signed +char *$")
538 var_target_range[name] = "-128, 127"
539 if (otype == var_type(flags[i]))
540 var_target_range[name] = ""
541 }
542 else if (otype ~ "^const char \\**$") {
543 var_target_string[n_target_string++] = name;
544 string_options_names[name]++
545 }
546 else
547 var_target_other[n_target_other++] = name;
548 }
549 }
550 } else {
551 var_target_int[n_target_int++] = "target_flags";
552 var_target_explicit_mask["target_flags"] = 1;
553 }
554
555 have_assert = 0;
556 for (i = 0; i < n_target_char; i++) {
557 name = var_target_char[i];
558 if (var_target_range[name] != "") {
559 have_assert = 1;
560 print " gcc_assert (IN_RANGE (opts->x_" name ", " var_target_range[name] "));";
561 }
562 }
563
564 if (have_assert)
565 print "";
566
567 print " if (targetm.target_option.save)";
568 print " targetm.target_option.save (ptr, opts, opts_set);";
569 print "";
570
571 for (i = 0; i < n_extra_target_vars; i++) {
572 print " ptr->x_" extra_target_vars[i] " = opts->x_" extra_target_vars[i] ";";
573 }
574
575 for (i = 0; i < n_target_other; i++) {
576 print " ptr->x_" var_target_other[i] " = opts->x_" var_target_other[i] ";";
577 }
578
579 for (i = 0; i < n_target_enum; i++) {
580 print " ptr->x_" var_target_enum[i] " = opts->x_" var_target_enum[i] ";";
581 }
582
583 for (i = 0; i < n_target_int; i++) {
584 print " ptr->x_" var_target_int[i] " = opts->x_" var_target_int[i] ";";
585 }
586
587 for (i = 0; i < n_target_short; i++) {
588 print " ptr->x_" var_target_short[i] " = opts->x_" var_target_short[i] ";";
589 }
590
591 for (i = 0; i < n_target_char; i++) {
592 print " ptr->x_" var_target_char[i] " = opts->x_" var_target_char[i] ";";
593 }
594
595 for (i = 0; i < n_target_string; i++) {
596 print " ptr->x_" var_target_string[i] " = opts->x_" var_target_string[i] ";";
597 }
598
599 print "";
600
601 j = 0;
602 k = 0;
603 for (i = 0; i < n_extra_target_vars; i++) {
604 if (j == 0 && k == 0) {
605 print " unsigned HOST_WIDE_INT mask = 0;";
606 }
607 print " if (opts_set->x_" extra_target_vars[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
608 j++;
609 if (j == 64) {
610 print " ptr->explicit_mask[" k "] = mask;";
611 print " mask = 0;";
612 j = 0;
613 k++;
614 }
615 }
616
617 for (i = 0; i < n_target_other; i++) {
618 if (var_target_other[i] in var_target_explicit_mask) {
619 print " ptr->explicit_mask_" var_target_other[i] " = opts_set->x_" var_target_other[i] ";";
620 continue;
621 }
622 if (j == 0 && k == 0) {
623 print " unsigned HOST_WIDE_INT mask = 0;";
624 }
625 print " if (opts_set->x_" var_target_other[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
626 j++;
627 if (j == 64) {
628 print " ptr->explicit_mask[" k "] = mask;";
629 print " mask = 0;";
630 j = 0;
631 k++;
632 }
633 }
634
635 for (i = 0; i < n_target_enum; i++) {
636 if (j == 0 && k == 0) {
637 print " unsigned HOST_WIDE_INT mask = 0;";
638 }
639 print " if (opts_set->x_" var_target_enum[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
640 j++;
641 if (j == 64) {
642 print " ptr->explicit_mask[" k "] = mask;";
643 print " mask = 0;";
644 j = 0;
645 k++;
646 }
647 }
648
649 for (i = 0; i < n_target_int; i++) {
650 if (var_target_int[i] in var_target_explicit_mask) {
651 print " ptr->explicit_mask_" var_target_int[i] " = opts_set->x_" var_target_int[i] ";";
652 continue;
653 }
654 if (j == 0 && k == 0) {
655 print " unsigned HOST_WIDE_INT mask = 0;";
656 }
657 print " if (opts_set->x_" var_target_int[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
658 j++;
659 if (j == 64) {
660 print " ptr->explicit_mask[" k "] = mask;";
661 print " mask = 0;";
662 j = 0;
663 k++;
664 }
665 }
666
667 for (i = 0; i < n_target_short; i++) {
668 if (j == 0 && k == 0) {
669 print " unsigned HOST_WIDE_INT mask = 0;";
670 }
671 print " if (opts_set->x_" var_target_short[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
672 j++;
673 if (j == 64) {
674 print " ptr->explicit_mask[" k "] = mask;";
675 print " mask = 0;";
676 j = 0;
677 k++;
678 }
679 }
680
681 for (i = 0; i < n_target_char; i++) {
682 if (j == 0 && k == 0) {
683 print " unsigned HOST_WIDE_INT mask = 0;";
684 }
685 print " if (opts_set->x_" var_target_char[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
686 j++;
687 if (j == 64) {
688 print " ptr->explicit_mask[" k "] = mask;";
689 print " mask = 0;";
690 j = 0;
691 k++;
692 }
693 }
694
695 for (i = 0; i < n_target_string; i++) {
696 if (j == 0 && k == 0) {
697 print " unsigned HOST_WIDE_INT mask = 0;";
698 }
699 print " if (opts_set->x_" var_target_string[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
700 j++;
701 if (j == 64) {
702 print " ptr->explicit_mask[" k "] = mask;";
703 print " mask = 0;";
704 j = 0;
705 k++;
706 }
707 }
708
709 if (j != 0) {
710 print " ptr->explicit_mask[" k "] = mask;";
711 }
712 has_target_explicit_mask = 0;
713 if (j != 0 || k != 0) {
714 has_target_explicit_mask = 1;
715 }
716
717 print "}";
718
719 print "";
720 print "/* Restore selected current options from a structure. */";
721 print "void";
722 print "cl_target_option_restore (struct gcc_options *opts, struct gcc_options *opts_set,";
723 print " struct cl_target_option *ptr)";
724 print "{";
725
726 for (i = 0; i < n_extra_target_vars; i++) {
727 print " opts->x_" extra_target_vars[i] " = ptr->x_" extra_target_vars[i] ";";
728 }
729
730 for (i = 0; i < n_target_other; i++) {
731 print " opts->x_" var_target_other[i] " = ptr->x_" var_target_other[i] ";";
732 }
733
734 for (i = 0; i < n_target_enum; i++) {
735 print " opts->x_" var_target_enum[i] " = ptr->x_" var_target_enum[i] ";";
736 }
737
738 for (i = 0; i < n_target_int; i++) {
739 print " opts->x_" var_target_int[i] " = ptr->x_" var_target_int[i] ";";
740 }
741
742 for (i = 0; i < n_target_short; i++) {
743 print " opts->x_" var_target_short[i] " = ptr->x_" var_target_short[i] ";";
744 }
745
746 for (i = 0; i < n_target_char; i++) {
747 print " opts->x_" var_target_char[i] " = ptr->x_" var_target_char[i] ";";
748 }
749
750 for (i = 0; i < n_target_string; i++) {
751 print " opts->x_" var_target_string[i] " = ptr->x_" var_target_string[i] ";";
752 }
753
754 print "";
755 if (has_target_explicit_mask) {
756 print " unsigned HOST_WIDE_INT mask;";
757 }
758
759 j = 64;
760 k = 0;
761 for (i = 0; i < n_extra_target_vars; i++) {
762 if (j == 64) {
763 print " mask = ptr->explicit_mask[" k "];";
764 k++;
765 j = 0;
766 }
767 if (extra_target_var_types[i] ~ ("^enum +[_" alnum "]+ *$")) {
768 print " opts_set->x_" extra_target_vars[i] " = static_cast<" extra_target_var_types[i] ">((mask & 1) != 0);";
769 }
770 else if (extra_target_var_types[i] ~ "^const char \\**$") {
771 print " opts_set->x_" extra_target_vars[i] " = (mask & 1) ? \"\" : nullptr;";
772 }
773 else {
774 print " opts_set->x_" extra_target_vars[i] " = (mask & 1) != 0;";
775 }
776 print " mask >>= 1;"
777 j++;
778 }
779
780 for (i = 0; i < n_target_other; i++) {
781 if (var_target_other[i] in var_target_explicit_mask) {
782 print " opts_set->x_" var_target_other[i] " = ptr->explicit_mask_" var_target_other[i] ";";
783 continue;
784 }
785 if (j == 64) {
786 print " mask = ptr->explicit_mask[" k "];";
787 k++;
788 j = 0;
789 }
790 print " opts_set->x_" var_target_other[i] " = (mask & 1) != 0;";
791 print " mask >>= 1;"
792 j++;
793 }
794
795 for (i = 0; i < n_target_enum; i++) {
796 if (j == 64) {
797 print " mask = ptr->explicit_mask[" k "];";
798 k++;
799 j = 0;
800 }
801 print " opts_set->x_" var_target_enum[i] " = static_cast<" var_target_enum_type[i] ">((mask & 1) != 0);";
802 print " mask >>= 1;"
803 j++;
804 }
805
806 for (i = 0; i < n_target_int; i++) {
807 if (var_target_int[i] in var_target_explicit_mask) {
808 print " opts_set->x_" var_target_int[i] " = ptr->explicit_mask_" var_target_int[i] ";";
809 continue;
810 }
811 if (j == 64) {
812 print " mask = ptr->explicit_mask[" k "];";
813 k++;
814 j = 0;
815 }
816 print " opts_set->x_" var_target_int[i] " = (mask & 1) != 0;";
817 print " mask >>= 1;"
818 j++;
819 }
820
821 for (i = 0; i < n_target_short; i++) {
822 if (j == 64) {
823 print " mask = ptr->explicit_mask[" k "];";
824 k++;
825 j = 0;
826 }
827 print " opts_set->x_" var_target_short[i] " = (mask & 1) != 0;";
828 print " mask >>= 1;"
829 j++;
830 }
831
832 for (i = 0; i < n_target_char; i++) {
833 if (j == 64) {
834 print " mask = ptr->explicit_mask[" k "];";
835 k++;
836 j = 0;
837 }
838 print " opts_set->x_" var_target_char[i] " = (mask & 1) != 0;";
839 print " mask >>= 1;"
840 j++;
841 }
842
843 for (i = 0; i < n_target_string; i++) {
844 if (j == 64) {
845 print " mask = ptr->explicit_mask[" k "];";
846 k++;
847 j = 0;
848 }
849 print " opts_set->x_" var_target_string[i] " = (mask & 1) ? \"\" : nullptr;";
850 print " mask >>= 1;"
851 j++;
852 }
853
854 # This must occur after the normal variables in case the code depends on those
855 # variables.
856 print "";
857 print " if (targetm.target_option.restore)";
858 print " targetm.target_option.restore (opts, opts_set, ptr);";
859
860 print "}";
861
862 print "";
863 print "/* Print optimization options from a structure. */";
864 print "void";
865 print "cl_target_option_print (FILE *file,";
866 print " int indent,";
867 print " struct cl_target_option *ptr)";
868 print "{";
869
870 print " fputs (\"\\n\", file);";
871 for (i = 0; i < n_target_other; i++) {
872 print " if (ptr->x_" var_target_other[i] ")";
873 hwi = host_wide_int[var_target_other[i]]
874 if (hwi == "yes")
875 print " fprintf (file, \"%*s%s (%#\" HOST_WIDE_INT_PRINT \"x)\\n\",";
876 else
877 print " fprintf (file, \"%*s%s (%#lx)\\n\",";
878 print " indent, \"\",";
879 print " \"" var_target_other[i] "\",";
880 if (hwi == "yes")
881 print " ptr->x_" var_target_other[i] ");";
882 else
883 print " (unsigned long)ptr->x_" var_target_other[i] ");";
884 print "";
885 }
886
887 for (i = 0; i < n_target_enum; i++) {
888 print " if (ptr->x_" var_target_enum[i] ")";
889 print " fprintf (file, \"%*s%s (%#x)\\n\",";
890 print " indent, \"\",";
891 print " \"" var_target_enum[i] "\",";
892 print " ptr->x_" var_target_enum[i] ");";
893 print "";
894 }
895
896 for (i = 0; i < n_target_int; i++) {
897 print " if (ptr->x_" var_target_int[i] ")";
898 print " fprintf (file, \"%*s%s (%#x)\\n\",";
899 print " indent, \"\",";
900 print " \"" var_target_int[i] "\",";
901 print " ptr->x_" var_target_int[i] ");";
902 print "";
903 }
904
905 for (i = 0; i < n_target_short; i++) {
906 print " if (ptr->x_" var_target_short[i] ")";
907 print " fprintf (file, \"%*s%s (%#x)\\n\",";
908 print " indent, \"\",";
909 print " \"" var_target_short[i] "\",";
910 print " ptr->x_" var_target_short[i] ");";
911 print "";
912 }
913
914 for (i = 0; i < n_target_char; i++) {
915 print " if (ptr->x_" var_target_char[i] ")";
916 print " fprintf (file, \"%*s%s (%#x)\\n\",";
917 print " indent, \"\",";
918 print " \"" var_target_char[i] "\",";
919 print " ptr->x_" var_target_char[i] ");";
920 print "";
921 }
922
923 for (i = 0; i < n_target_string; i++) {
924 print " if (ptr->x_" var_target_string[i] ")";
925 print " fprintf (file, \"%*s%s (%s)\\n\",";
926 print " indent, \"\",";
927 print " \"" var_target_string[i] "\",";
928 print " ptr->x_" var_target_string[i] ");";
929 print "";
930 }
931
932 print "";
933 print " if (targetm.target_option.print)";
934 print " targetm.target_option.print (file, indent, ptr);";
935 print "}";
936
937 print "";
938 print "/* Print different target option variables from structures provided as arguments. */";
939 print "void";
940 print "cl_target_option_print_diff (FILE *file,";
941 print " int indent ATTRIBUTE_UNUSED,";
942 print " struct cl_target_option *ptr1 ATTRIBUTE_UNUSED,";
943 print " struct cl_target_option *ptr2 ATTRIBUTE_UNUSED)";
944 print "{";
945
946 print " fputs (\"\\n\", file);";
947 for (i = 0; i < n_target_other; i++) {
948 print " if (ptr1->x_" var_target_other[i] " != ptr2->x_" var_target_other[i] ")";
949 hwi = host_wide_int[var_target_other[i]]
950 if (hwi == "yes")
951 print " fprintf (file, \"%*s%s (%#\" HOST_WIDE_INT_PRINT \"x/%#\" HOST_WIDE_INT_PRINT \"x)\\n\",";
952 else
953 print " fprintf (file, \"%*s%s (%#lx/%#lx)\\n\",";
954 print " indent, \"\",";
955 print " \"" var_target_other[i] "\",";
956 if (hwi == "yes") {
957 print " ptr1->x_" var_target_other[i] ",";
958 print " ptr2->x_" var_target_other[i] ");";
959 }
960 else {
961 print " (unsigned long)ptr1->x_" var_target_other[i] ",";
962 print " (unsigned long)ptr2->x_" var_target_other[i] ");";
963 }
964 print "";
965 }
966
967 for (i = 0; i < n_target_enum; i++) {
968 print " if (ptr1->x_" var_target_enum[i] " != ptr2->x_" var_target_enum[i] ")";
969 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
970 print " indent, \"\",";
971 print " \"" var_target_enum[i] "\",";
972 print " ptr1->x_" var_target_enum[i] ",";
973 print " ptr2->x_" var_target_enum[i] ");";
974 print "";
975 }
976
977 for (i = 0; i < n_target_int; i++) {
978 print " if (ptr1->x_" var_target_int[i] " != ptr2->x_" var_target_int[i] ")";
979 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
980 print " indent, \"\",";
981 print " \"" var_target_int[i] "\",";
982 print " ptr1->x_" var_target_int[i] ",";
983 print " ptr2->x_" var_target_int[i] ");";
984 print "";
985 }
986
987 for (i = 0; i < n_target_short; i++) {
988 print " if (ptr1->x_" var_target_short[i] " != ptr2->x_" var_target_short[i] ")";
989 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
990 print " indent, \"\",";
991 print " \"" var_target_short[i] "\",";
992 print " ptr1->x_" var_target_short[i] ",";
993 print " ptr2->x_" var_target_short[i] ");";
994 print "";
995 }
996
997 for (i = 0; i < n_target_char; i++) {
998 print " if (ptr1->x_" var_target_char[i] " != ptr2->x_" var_target_char[i] ")";
999 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
1000 print " indent, \"\",";
1001 print " \"" var_target_char[i] "\",";
1002 print " ptr1->x_" var_target_char[i] ",";
1003 print " ptr2->x_" var_target_char[i] ");";
1004 print "";
1005 }
1006
1007 for (i = 0; i < n_target_string; i++) {
1008 name = var_target_string[i]
1009 print " if (ptr1->x_" name " != ptr2->x_" name "";
1010 print " && (!ptr1->x_" name" || !ptr2->x_" name
1011 print " || strcmp (ptr1->x_" name", ptr2->x_" name ")))";
1012 print " fprintf (file, \"%*s%s (%s/%s)\\n\",";
1013 print " indent, \"\",";
1014 print " \"" name "\",";
1015 print " ptr1->x_" name " ? ptr1->x_" name " : \"(null)\",";
1016 print " ptr2->x_" name " ? ptr1->x_" name " : \"(null)\");";
1017 print "";
1018 }
1019
1020 print "}";
1021
1022 print "";
1023 print "/* Compare two target options */";
1024 print "bool";
1025 print "cl_target_option_eq (struct cl_target_option const *ptr1 ATTRIBUTE_UNUSED,";
1026 print " struct cl_target_option const *ptr2 ATTRIBUTE_UNUSED)";
1027 print "{";
1028 n_target_val = 0;
1029 n_target_str = 0;
1030 n_target_array = 0;
1031
1032 for (i = 0; i < n_target_save; i++) {
1033 var = target_save_decl[i];
1034 sub (" *=.*", "", var);
1035 name = var;
1036 type = var;
1037 sub("^.*[ *]", "", name)
1038 sub(" *" name "$", "", type)
1039 if (target_save_decl[i] ~ "^const char \\*+[_" alnum "]+$") {
1040 var_target_str[n_target_str++] = name;
1041 string_options_names[name]++
1042 }
1043 else {
1044 if (target_save_decl[i] ~ " .*\\[.+\\]+$") {
1045 size = name;
1046 sub("[^\\[]+\\[", "", size);
1047 sub("\\]$", "", size);
1048 sub("\\[.+", "", name)
1049 sub(" [^ ]+$", "", type)
1050 var_target_array[n_target_array] = name
1051 var_target_array_type[n_target_array] = type
1052 var_target_array_size[n_target_array++] = size
1053 }
1054 else {
1055 var_target_val_type[n_target_val] = type;
1056 var_target_val[n_target_val++] = name;
1057 }
1058 }
1059 }
1060 if (have_save) {
1061 for (i = 0; i < n_opts; i++) {
1062 if (flag_set_p("Save", flags[i])) {
1063 name = var_name(flags[i])
1064 if(name == "")
1065 name = "target_flags";
1066
1067 if(name in var_list_seen)
1068 continue;
1069
1070 var_list_seen[name]++;
1071 otype = var_type_struct(flags[i])
1072 if (otype ~ "^const char \\**$")
1073 var_target_str[n_target_str++] = "x_" name;
1074 else {
1075 var_target_val_type[n_target_val] = otype;
1076 var_target_val[n_target_val++] = "x_" name;
1077 }
1078 }
1079 }
1080 } else {
1081 var_target_val_type[n_target_val] = "int";
1082 var_target_val[n_target_val++] = "x_target_flags";
1083 }
1084
1085 for (i = 0; i < n_target_str; i++) {
1086 name = var_target_str[i]
1087 print " if (ptr1->" name" != ptr2->" name;
1088 print " && (!ptr1->" name" || !ptr2->" name
1089 print " || strcmp (ptr1->" name", ptr2->" name ")))";
1090 print " return false;";
1091 }
1092 for (i = 0; i < n_target_array; i++) {
1093 name = var_target_array[i]
1094 size = var_target_array_size[i]
1095 type = var_target_array_type[i]
1096 print " if (ptr1->" name" != ptr2->" name "";
1097 print " || memcmp (ptr1->" name ", ptr2->" name ", " size " * sizeof(" type ")))"
1098 print " return false;";
1099 }
1100 for (i = 0; i < n_target_val; i++) {
1101 name = var_target_val[i]
1102 print " if (ptr1->" name" != ptr2->" name ")";
1103 print " return false;";
1104 }
1105
1106 if (has_target_explicit_mask) {
1107 print " for (size_t i = 0; i < sizeof (ptr1->explicit_mask) / sizeof (ptr1->explicit_mask[0]); i++)";
1108 print " if (ptr1->explicit_mask[i] != ptr2->explicit_mask[i])";
1109 print " return false;"
1110 }
1111
1112 for (i = 0; i < n_target_other; i++) {
1113 if (var_target_other[i] in var_target_explicit_mask) {
1114 print " if (ptr1->explicit_mask_" var_target_other[i] " != ptr2->explicit_mask_" var_target_other[i] ")";
1115 print " return false;";
1116 }
1117 }
1118
1119 for (i = 0; i < n_target_int; i++) {
1120 if (var_target_int[i] in var_target_explicit_mask) {
1121 print " if (ptr1->explicit_mask_" var_target_int[i] " != ptr2->explicit_mask_" var_target_int[i] ")";
1122 print " return false;";
1123 }
1124 }
1125
1126 print " return true;";
1127
1128 print "}";
1129
1130 print "";
1131 print "/* Hash target options */";
1132 print "hashval_t";
1133 print "cl_target_option_hash (struct cl_target_option const *ptr ATTRIBUTE_UNUSED)";
1134 print "{";
1135 print " inchash::hash hstate;";
1136 for (i = 0; i < n_target_str; i++) {
1137 name = var_target_str[i]
1138 print " if (ptr->" name")";
1139 print " hstate.add (ptr->" name", strlen (ptr->" name"));";
1140 print " else";
1141 print " hstate.add_int (0);";
1142 }
1143 for (i = 0; i < n_target_array; i++) {
1144 name= var_target_array[i]
1145 size = var_target_array_size[i]
1146 type = var_target_array_type[i]
1147 print " hstate.add_int (" size ");";
1148 print " hstate.add (ptr->" name ", sizeof (" type ") * " size ");";
1149 }
1150 for (i = 0; i < n_target_val; i++) {
1151 name = var_target_val[i]
1152 print " hstate.add_hwi (ptr->" name");";
1153 }
1154 if (has_target_explicit_mask) {
1155 print " for (size_t i = 0; i < sizeof (ptr->explicit_mask) / sizeof (ptr->explicit_mask[0]); i++)";
1156 print " hstate.add_hwi (ptr->explicit_mask[i]);";
1157 }
1158
1159 for (i = 0; i < n_target_other; i++) {
1160 if (var_target_other[i] in var_target_explicit_mask)
1161 print " hstate.add_hwi (ptr->explicit_mask_" var_target_other[i] ");";
1162 }
1163
1164 for (i = 0; i < n_target_int; i++) {
1165 if (var_target_int[i] in var_target_explicit_mask)
1166 print " hstate.add_hwi (ptr->explicit_mask_" var_target_int[i] ");";
1167 }
1168
1169 print " return hstate.end ();";
1170 print "}";
1171
1172 print "";
1173 print "/* Stream out target options */";
1174 print "void";
1175 print "cl_target_option_stream_out (struct output_block *ob ATTRIBUTE_UNUSED,";
1176 print " struct bitpack_d *bp ATTRIBUTE_UNUSED,";
1177 print " struct cl_target_option *ptr ATTRIBUTE_UNUSED)";
1178 print "{";
1179 for (i = 0; i < n_target_str; i++) {
1180 name = var_target_str[i]
1181 print " bp_pack_string (ob, bp, ptr->" name", true);";
1182 }
1183 for (i = 0; i < n_target_array; i++) {
1184 name = var_target_array[i]
1185 size = var_target_array_size[i]
1186 print " for (unsigned i = 0; i < " size "; i++)"
1187 print " bp_pack_value (bp, ptr->" name "[i], 64);";
1188 }
1189 for (i = 0; i < n_target_val; i++) {
1190 name = var_target_val[i]
1191 print " bp_pack_value (bp, ptr->" name", 64);";
1192 }
1193
1194 if (has_target_explicit_mask) {
1195 print " for (size_t i = 0; i < sizeof (ptr->explicit_mask) / sizeof (ptr->explicit_mask[0]); i++)";
1196 print " bp_pack_value (bp, ptr->explicit_mask[i], 64);";
1197 }
1198
1199 for (i = 0; i < n_target_other; i++) {
1200 if (var_target_other[i] in var_target_explicit_mask) {
1201 print " bp_pack_value (bp, ptr->explicit_mask_" var_target_other[i] ", 64);";
1202 }
1203 }
1204
1205 for (i = 0; i < n_target_int; i++) {
1206 if (var_target_int[i] in var_target_explicit_mask) {
1207 print " bp_pack_value (bp, ptr->explicit_mask_" var_target_int[i] ", 64);";
1208 }
1209 }
1210
1211 print "}";
1212
1213 print "";
1214 print "/* Stream in target options */";
1215 print "void";
1216 print "cl_target_option_stream_in (struct data_in *data_in ATTRIBUTE_UNUSED,";
1217 print " struct bitpack_d *bp ATTRIBUTE_UNUSED,";
1218 print " struct cl_target_option *ptr ATTRIBUTE_UNUSED)";
1219 print "{";
1220 for (i = 0; i < n_target_str; i++) {
1221 name = var_target_str[i]
1222 print " ptr->" name" = bp_unpack_string (data_in, bp);";
1223 print " if (ptr->" name")";
1224 print " ptr->" name" = xstrdup (ptr->" name");";
1225 }
1226 for (i = 0; i < n_target_array; i++) {
1227 name = var_target_array[i]
1228 size = var_target_array_size[i]
1229 print " for (int i = " size " - 1; i >= 0; i--)"
1230 print " ptr->" name "[i] = (" var_target_array_type[i] ") bp_unpack_value (bp, 64);";
1231 }
1232 for (i = 0; i < n_target_val; i++) {
1233 name = var_target_val[i]
1234 print " ptr->" name" = (" var_target_val_type[i] ") bp_unpack_value (bp, 64);";
1235 }
1236
1237 if (has_target_explicit_mask) {
1238 print " for (size_t i = 0; i < sizeof (ptr->explicit_mask) / sizeof (ptr->explicit_mask[0]); i++)";
1239 print " ptr->explicit_mask[i] = bp_unpack_value (bp, 64);";
1240 }
1241
1242 for (i = 0; i < n_target_other; i++) {
1243 if (var_target_other[i] in var_target_explicit_mask) {
1244 print " ptr->explicit_mask_" var_target_other[i] " = bp_unpack_value (bp, 64);";
1245 }
1246 }
1247
1248 for (i = 0; i < n_target_int; i++) {
1249 if (var_target_int[i] in var_target_explicit_mask) {
1250 print " ptr->explicit_mask_" var_target_int[i] " = bp_unpack_value (bp, 64);";
1251 }
1252 }
1253
1254 print "}";
1255
1256 print "/* free heap memory used by target options */";
1257 print "void";
1258 print "cl_target_option_free (struct cl_target_option *ptr ATTRIBUTE_UNUSED)";
1259 print "{";
1260 for (i = 0; i < n_target_str; i++) {
1261 name = var_target_str[i]
1262 print " if (ptr->" name")";
1263 print " free (const_cast <char *>(ptr->" name"));";
1264 }
1265 print "}";
1266
1267 n_opt_val = 4;
1268 var_opt_val[0] = "x_optimize"
1269 var_opt_val_type[0] = "char "
1270 var_opt_hash[0] = 1;
1271 var_opt_val[1] = "x_optimize_size"
1272 var_opt_val_type[1] = "char "
1273 var_opt_hash[1] = 1;
1274 var_opt_val[2] = "x_optimize_debug"
1275 var_opt_val_type[2] = "char "
1276 var_opt_hash[2] = 1;
1277 var_opt_val[3] = "x_optimize_fast"
1278 var_opt_val_type[3] = "char "
1279 var_opt_hash[3] = 1;
1280 for (i = 0; i < n_opts; i++) {
1281 if (flag_set_p("(Optimization|PerFunction)", flags[i])) {
1282 name = var_name(flags[i])
1283 if(name == "")
1284 continue;
1285
1286 if(name in var_opt_list_seen)
1287 continue;
1288
1289 var_opt_list_seen[name]++;
1290
1291 otype = var_type_struct(flags[i])
1292 var_opt_val_type[n_opt_val] = otype;
1293 var_opt_val[n_opt_val] = "x_" name;
1294 var_opt_hash[n_opt_val] = flag_set_p("Optimization", flags[i]);
1295 var_opt_init[n_opt_val] = opt_args("Init", flags[i]);
1296 n_opt_val++;
1297 }
1298 }
1299 print "";
1300 print "/* Hash optimization options */";
1301 print "hashval_t";
1302 print "cl_optimization_hash (struct cl_optimization const *ptr ATTRIBUTE_UNUSED)";
1303 print "{";
1304 print " inchash::hash hstate;";
1305 for (i = 0; i < n_opt_val; i++) {
1306 if (!var_opt_hash[i])
1307 continue;
1308 name = var_opt_val[i]
1309 otype = var_opt_val_type[i];
1310 if (otype ~ "^const char \\**$")
1311 {
1312 print " if (ptr->" name")";
1313 print " hstate.add (ptr->" name", strlen (ptr->" name"));";
1314 print " else";
1315 print " hstate.add_int (0);";
1316 }
1317 else
1318 print " hstate.add_hwi (ptr->" name");";
1319 }
1320 print " for (size_t i = 0; i < sizeof (ptr->explicit_mask) / sizeof (ptr->explicit_mask[0]); i++)";
1321 print " hstate.add_hwi (ptr->explicit_mask[i]);";
1322 print " return hstate.end ();";
1323 print "}";
1324
1325 print "";
1326 print "/* Compare two optimization options */";
1327 print "bool";
1328 print "cl_optimization_option_eq (cl_optimization const *ptr1,";
1329 print " cl_optimization const *ptr2)";
1330 print "{";
1331 for (i = 0; i < n_opt_val; i++) {
1332 if (!var_opt_hash[i])
1333 continue;
1334 name = var_opt_val[i]
1335 otype = var_opt_val_type[i];
1336 if (otype ~ "^const char \\**$")
1337 {
1338 print " if (ptr1->" name" != ptr2->" name;
1339 print " && (!ptr1->" name" || !ptr2->" name
1340 print " || strcmp (ptr1->" name", ptr2->" name ")))";
1341 print " return false;";
1342 }
1343 else
1344 {
1345 print " if (ptr1->" name" != ptr2->" name ")";
1346 print " return false;";
1347 }
1348 }
1349 print " for (size_t i = 0; i < sizeof (ptr1->explicit_mask) / sizeof (ptr1->explicit_mask[0]); i++)";
1350 print " if (ptr1->explicit_mask[i] != ptr2->explicit_mask[i])";
1351 print " return false;"
1352 print " return true;";
1353 print "}";
1354
1355 print "";
1356 print "/* Stream out optimization options */";
1357 print "void";
1358 print "cl_optimization_stream_out (struct output_block *ob,";
1359 print " struct bitpack_d *bp,";
1360 print " struct cl_optimization *ptr)";
1361 print "{";
1362 for (i = 0; i < n_opt_val; i++) {
1363 name = var_opt_val[i]
1364 otype = var_opt_val_type[i];
1365 if (otype ~ "^const char \\**$")
1366 print " bp_pack_string (ob, bp, ptr->" name", true);";
1367 else {
1368 if (otype ~ "^unsigned") {
1369 sgn = "unsigned";
1370 } else {
1371 sgn = "int";
1372 }
1373 if (name ~ "^x_param" && !(otype ~ "^enum ") && var_opt_init[i]) {
1374 print " if (" var_opt_init[i] " > (" var_opt_val_type[i] ") 10)";
1375 print " bp_pack_var_len_" sgn " (bp, ptr->" name" ^ " var_opt_init[i] ");";
1376 print " else";
1377 print " bp_pack_var_len_" sgn " (bp, ptr->" name");";
1378 } else {
1379 print " bp_pack_var_len_" sgn " (bp, ptr->" name");";
1380 }
1381 }
1382 }
1383 print " for (size_t i = 0; i < sizeof (ptr->explicit_mask) / sizeof (ptr->explicit_mask[0]); i++)";
1384 print " bp_pack_value (bp, ptr->explicit_mask[i], 64);";
1385 print "}";
1386
1387 print "";
1388 print "/* Stream in optimization options */";
1389 print "void";
1390 print "cl_optimization_stream_in (struct data_in *data_in ATTRIBUTE_UNUSED,";
1391 print " struct bitpack_d *bp ATTRIBUTE_UNUSED,";
1392 print " struct cl_optimization *ptr ATTRIBUTE_UNUSED)";
1393 print "{";
1394 for (i = 0; i < n_opt_val; i++) {
1395 name = var_opt_val[i]
1396 otype = var_opt_val_type[i];
1397 if (otype ~ "^const char \\**$") {
1398 print " ptr->" name" = bp_unpack_string (data_in, bp);";
1399 print " if (ptr->" name")";
1400 print " ptr->" name" = xstrdup (ptr->" name");";
1401 }
1402 else {
1403 if (otype ~ "^unsigned") {
1404 sgn = "unsigned";
1405 } else {
1406 sgn = "int";
1407 }
1408 print " ptr->" name" = (" var_opt_val_type[i] ") bp_unpack_var_len_" sgn " (bp);";
1409 if (name ~ "^x_param" && !(otype ~ "^enum ") && var_opt_init[i]) {
1410 print " if (" var_opt_init[i] " > (" var_opt_val_type[i] ") 10)";
1411 print " ptr->" name" ^= " var_opt_init[i] ";";
1412 }
1413 }
1414 }
1415 print " for (size_t i = 0; i < sizeof (ptr->explicit_mask) / sizeof (ptr->explicit_mask[0]); i++)";
1416 print " ptr->explicit_mask[i] = bp_unpack_value (bp, 64);";
1417 print "}";
1418 print "/* Free heap memory used by optimization options */";
1419 print "void";
1420 print "cl_optimization_option_free (struct cl_optimization *ptr ATTRIBUTE_UNUSED)";
1421 print "{";
1422 for (i = 0; i < n_opt_val; i++) {
1423 name = var_opt_val[i]
1424 otype = var_opt_val_type[i];
1425 if (otype ~ "^const char \\**$")
1426 {
1427 print " if (ptr->" name")";
1428 print " free (const_cast <char *>(ptr->" name"));";
1429 }
1430 }
1431 print "}";
1432
1433 print "void";
1434 print "cl_optimization_compare (gcc_options *ptr1, gcc_options *ptr2)"
1435 print "{"
1436
1437 # all these options are mentioned in PR92860
1438 checked_options["flag_merge_constants"]++
1439 checked_options["param_max_fields_for_field_sensitive"]++
1440 checked_options["flag_omit_frame_pointer"]++
1441 # arc exceptions
1442 checked_options["TARGET_ALIGN_CALL"]++
1443 checked_options["TARGET_CASE_VECTOR_PC_RELATIVE"]++
1444 checked_options["arc_size_opt_level"]++
1445 # arm exceptions
1446 checked_options["arm_fp16_format"]++
1447
1448
1449 for (i = 0; i < n_opts; i++) {
1450 name = var_name(flags[i]);
1451 if (name == "")
1452 continue;
1453
1454 if (name in checked_options)
1455 continue;
1456 checked_options[name]++
1457
1458 if (name in string_options_names || ("x_" name) in string_options_names) {
1459 print " if (ptr1->x_" name " != ptr2->x_" name "";
1460 print " && (!ptr1->x_" name" || !ptr2->x_" name
1461 print " || strcmp (ptr1->x_" name", ptr2->x_" name ")))";
1462 print " internal_error (\"%<global_options%> are modified in local context\");";
1463 }
1464 else {
1465 print " if (ptr1->x_" name " != ptr2->x_" name ")"
1466 print " internal_error (\"%<global_options%> are modified in local context\");";
1467 }
1468 }
1469
1470 print "}";
1471 }