testsuite: Update scanning symbol sections to support AIX.
[official-gcc.git] / gcc / optc-save-gen.awk
bloba756835230eb430086e6c92826a5314fb4a525f8
1 # Copyright (C) 2003-2020 Free Software Foundation, Inc.
2 # Contributed by Kelley Cook, June 2004.
3 # Original code from Neil Booth, May 2003.
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.
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/>.
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.
24 # This program uses functions from opt-functions.awk and code from
25 # opt-read.awk.
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
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 ""
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
67 print ""
70 have_save = 0;
71 if (n_extra_target_vars)
72 have_save = 1
74 for (i = 0; i < n_opts; i++) {
75 if (flag_set_p("Save", flags[i]))
76 have_save = 1;
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 "{";
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";
100 # Sort by size to mimic how the structure is laid out to be friendlier to the
101 # cache.
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;
109 if(name in var_opt_seen)
110 continue;
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;
117 else if (otype ~ "^((un)?signed +)?short *$")
118 var_opt_short[n_opt_short++] = name;
120 else if (otype ~ ("^enum +[_" alnum "]+ *")) {
121 var_opt_enum_type[n_opt_enum] = otype;
122 var_opt_enum[n_opt_enum++] = name;
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"
131 else if (otype ~ "^const char \\**$") {
132 var_opt_string[n_opt_string++] = name;
133 string_options_names[name]++
135 else
136 var_opt_other[n_opt_other++] = name;
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] "));";
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] ";";
151 for (i = 0; i < n_opt_int; i++) {
152 print " ptr->x_" var_opt_int[i] " = opts->x_" var_opt_int[i] ";";
155 for (i = 0; i < n_opt_enum; i++) {
156 print " ptr->x_" var_opt_enum[i] " = opts->x_" var_opt_enum[i] ";";
159 for (i = 0; i < n_opt_short; i++) {
160 print " ptr->x_" var_opt_short[i] " = opts->x_" var_opt_short[i] ";";
163 for (i = 0; i < n_opt_char; i++) {
164 print " ptr->x_" var_opt_char[i] " = opts->x_" var_opt_char[i] ";";
167 for (i = 0; i < n_opt_string; i++) {
168 print " ptr->x_" var_opt_string[i] " = opts->x_" var_opt_string[i] ";";
171 print "";
172 print " unsigned HOST_WIDE_INT mask = 0;";
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++;
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++;
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++;
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++;
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++;
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++;
242 if (j != 0) {
243 print " ptr->explicit_mask[" k "] = mask;";
246 print "}";
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 "{";
255 for (i = 0; i < n_opt_other; i++) {
256 print " opts->x_" var_opt_other[i] " = ptr->x_" var_opt_other[i] ";";
259 for (i = 0; i < n_opt_int; i++) {
260 print " opts->x_" var_opt_int[i] " = ptr->x_" var_opt_int[i] ";";
263 for (i = 0; i < n_opt_enum; i++) {
264 print " opts->x_" var_opt_enum[i] " = ptr->x_" var_opt_enum[i] ";";
267 for (i = 0; i < n_opt_short; i++) {
268 print " opts->x_" var_opt_short[i] " = ptr->x_" var_opt_short[i] ";";
271 for (i = 0; i < n_opt_char; i++) {
272 print " opts->x_" var_opt_char[i] " = ptr->x_" var_opt_char[i] ";";
275 for (i = 0; i < n_opt_string; i++) {
276 print " opts->x_" var_opt_string[i] " = ptr->x_" var_opt_string[i] ";";
279 print "";
280 print " unsigned HOST_WIDE_INT mask;";
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;
290 print " opts_set->x_" var_opt_other[i] " = (mask & 1) != 0;";
291 print " mask >>= 1;"
292 j++;
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;
301 print " opts_set->x_" var_opt_int[i] " = (mask & 1) != 0;";
302 print " mask >>= 1;"
303 j++;
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;
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++;
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;
323 print " opts_set->x_" var_opt_short[i] " = (mask & 1) != 0;";
324 print " mask >>= 1;"
325 j++;
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;
334 print " opts_set->x_" var_opt_char[i] " = (mask & 1) != 0;";
335 print " mask >>= 1;"
336 j++;
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;
345 print " opts_set->x_" var_opt_string[i] " = (mask & 1) ? \"\" : nullptr;";
346 print " mask >>= 1;"
347 j++;
350 print " targetm.override_options_after_change ();";
351 print "}";
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 "{";
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 "";
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 "";
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 "";
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 "";
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 "";
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 "";
415 print "}";
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 "{";
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 "";
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 "";
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 "";
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 "";
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 "";
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 "";
490 print "}";
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 "{";
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;
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";
514 if(name in var_save_seen)
515 continue;
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;
523 if (otype ~ "^((un)?signed +)?int *$")
524 var_target_int[n_target_int++] = name;
526 else if (otype ~ "^((un)?signed +)?short *$")
527 var_target_short[n_target_short++] = name;
529 else if (otype ~ ("^enum +[_" alnum "]+ *$")) {
530 var_target_enum_type[n_target_enum] = otype;
531 var_target_enum[n_target_enum++] = name;
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] = ""
542 else if (otype ~ "^const char \\**$") {
543 var_target_string[n_target_string++] = name;
544 string_options_names[name]++
546 else
547 var_target_other[n_target_other++] = name;
550 } else {
551 var_target_int[n_target_int++] = "target_flags";
552 var_target_explicit_mask["target_flags"] = 1;
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] "));";
564 if (have_assert)
565 print "";
567 print " if (targetm.target_option.save)";
568 print " targetm.target_option.save (ptr, opts, opts_set);";
569 print "";
571 for (i = 0; i < n_extra_target_vars; i++) {
572 print " ptr->x_" extra_target_vars[i] " = opts->x_" extra_target_vars[i] ";";
575 for (i = 0; i < n_target_other; i++) {
576 print " ptr->x_" var_target_other[i] " = opts->x_" var_target_other[i] ";";
579 for (i = 0; i < n_target_enum; i++) {
580 print " ptr->x_" var_target_enum[i] " = opts->x_" var_target_enum[i] ";";
583 for (i = 0; i < n_target_int; i++) {
584 print " ptr->x_" var_target_int[i] " = opts->x_" var_target_int[i] ";";
587 for (i = 0; i < n_target_short; i++) {
588 print " ptr->x_" var_target_short[i] " = opts->x_" var_target_short[i] ";";
591 for (i = 0; i < n_target_char; i++) {
592 print " ptr->x_" var_target_char[i] " = opts->x_" var_target_char[i] ";";
595 for (i = 0; i < n_target_string; i++) {
596 print " ptr->x_" var_target_string[i] " = opts->x_" var_target_string[i] ";";
599 print "";
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;";
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++;
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;
622 if (j == 0 && k == 0) {
623 print " unsigned HOST_WIDE_INT mask = 0;";
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++;
635 for (i = 0; i < n_target_enum; i++) {
636 if (j == 0 && k == 0) {
637 print " unsigned HOST_WIDE_INT mask = 0;";
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++;
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;
654 if (j == 0 && k == 0) {
655 print " unsigned HOST_WIDE_INT mask = 0;";
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++;
667 for (i = 0; i < n_target_short; i++) {
668 if (j == 0 && k == 0) {
669 print " unsigned HOST_WIDE_INT mask = 0;";
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++;
681 for (i = 0; i < n_target_char; i++) {
682 if (j == 0 && k == 0) {
683 print " unsigned HOST_WIDE_INT mask = 0;";
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++;
695 for (i = 0; i < n_target_string; i++) {
696 if (j == 0 && k == 0) {
697 print " unsigned HOST_WIDE_INT mask = 0;";
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++;
709 if (j != 0) {
710 print " ptr->explicit_mask[" k "] = mask;";
712 has_target_explicit_mask = 0;
713 if (j != 0 || k != 0) {
714 has_target_explicit_mask = 1;
717 print "}";
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 "{";
726 for (i = 0; i < n_extra_target_vars; i++) {
727 print " opts->x_" extra_target_vars[i] " = ptr->x_" extra_target_vars[i] ";";
730 for (i = 0; i < n_target_other; i++) {
731 print " opts->x_" var_target_other[i] " = ptr->x_" var_target_other[i] ";";
734 for (i = 0; i < n_target_enum; i++) {
735 print " opts->x_" var_target_enum[i] " = ptr->x_" var_target_enum[i] ";";
738 for (i = 0; i < n_target_int; i++) {
739 print " opts->x_" var_target_int[i] " = ptr->x_" var_target_int[i] ";";
742 for (i = 0; i < n_target_short; i++) {
743 print " opts->x_" var_target_short[i] " = ptr->x_" var_target_short[i] ";";
746 for (i = 0; i < n_target_char; i++) {
747 print " opts->x_" var_target_char[i] " = ptr->x_" var_target_char[i] ";";
750 for (i = 0; i < n_target_string; i++) {
751 print " opts->x_" var_target_string[i] " = ptr->x_" var_target_string[i] ";";
754 print "";
755 if (has_target_explicit_mask) {
756 print " unsigned HOST_WIDE_INT mask;";
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;
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);";
770 else if (extra_target_var_types[i] ~ "^const char \\**$") {
771 print " opts_set->x_" extra_target_vars[i] " = (mask & 1) ? \"\" : nullptr;";
773 else {
774 print " opts_set->x_" extra_target_vars[i] " = (mask & 1) != 0;";
776 print " mask >>= 1;"
777 j++;
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;
785 if (j == 64) {
786 print " mask = ptr->explicit_mask[" k "];";
787 k++;
788 j = 0;
790 print " opts_set->x_" var_target_other[i] " = (mask & 1) != 0;";
791 print " mask >>= 1;"
792 j++;
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;
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++;
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;
811 if (j == 64) {
812 print " mask = ptr->explicit_mask[" k "];";
813 k++;
814 j = 0;
816 print " opts_set->x_" var_target_int[i] " = (mask & 1) != 0;";
817 print " mask >>= 1;"
818 j++;
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;
827 print " opts_set->x_" var_target_short[i] " = (mask & 1) != 0;";
828 print " mask >>= 1;"
829 j++;
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;
838 print " opts_set->x_" var_target_char[i] " = (mask & 1) != 0;";
839 print " mask >>= 1;"
840 j++;
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;
849 print " opts_set->x_" var_target_string[i] " = (mask & 1) ? \"\" : nullptr;";
850 print " mask >>= 1;"
851 j++;
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);";
860 print "}";
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 "{";
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 "";
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 "";
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 "";
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 "";
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 "";
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 "";
932 print "";
933 print " if (targetm.target_option.print)";
934 print " targetm.target_option.print (file, indent, ptr);";
935 print "}";
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 "{";
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] ");";
960 else {
961 print " (unsigned long)ptr1->x_" var_target_other[i] ",";
962 print " (unsigned long)ptr2->x_" var_target_other[i] ");";
964 print "";
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 "";
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 "";
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 "";
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 "";
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 "";
1020 print "}";
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;
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 else {
1042 if (target_save_decl[i] ~ " .*\\[.+\\]+$") {
1043 size = name;
1044 sub("[^\\[]+\\[", "", size);
1045 sub("\\]$", "", size);
1046 sub("\\[.+", "", name)
1047 sub(" [^ ]+$", "", type)
1048 var_target_array[n_target_array] = name
1049 var_target_array_type[n_target_array] = type
1050 var_target_array_size[n_target_array++] = size
1052 else {
1053 var_target_val_type[n_target_val] = type;
1054 var_target_val[n_target_val++] = name;
1058 if (have_save) {
1059 for (i = 0; i < n_opts; i++) {
1060 if (flag_set_p("Save", flags[i])) {
1061 name = var_name(flags[i])
1062 if(name == "")
1063 name = "target_flags";
1065 if(name in var_list_seen)
1066 continue;
1068 var_list_seen[name]++;
1069 otype = var_type_struct(flags[i])
1070 if (otype ~ "^const char \\**$")
1071 var_target_str[n_target_str++] = "x_" name;
1072 else {
1073 var_target_val_type[n_target_val] = otype;
1074 var_target_val[n_target_val++] = "x_" name;
1078 } else {
1079 var_target_val_type[n_target_val] = "int";
1080 var_target_val[n_target_val++] = "x_target_flags";
1083 for (i = 0; i < n_target_str; i++) {
1084 name = var_target_str[i]
1085 print " if (ptr1->" name" != ptr2->" name;
1086 print " && (!ptr1->" name" || !ptr2->" name
1087 print " || strcmp (ptr1->" name", ptr2->" name ")))";
1088 print " return false;";
1090 for (i = 0; i < n_target_array; i++) {
1091 name = var_target_array[i]
1092 size = var_target_array_size[i]
1093 type = var_target_array_type[i]
1094 print " if (ptr1->" name" != ptr2->" name "";
1095 print " || memcmp (ptr1->" name ", ptr2->" name ", " size " * sizeof(" type ")))"
1096 print " return false;";
1098 for (i = 0; i < n_target_val; i++) {
1099 name = var_target_val[i]
1100 print " if (ptr1->" name" != ptr2->" name ")";
1101 print " return false;";
1104 if (has_target_explicit_mask) {
1105 print " for (size_t i = 0; i < sizeof (ptr1->explicit_mask) / sizeof (ptr1->explicit_mask[0]); i++)";
1106 print " if (ptr1->explicit_mask[i] != ptr2->explicit_mask[i])";
1107 print " return false;"
1110 for (i = 0; i < n_target_other; i++) {
1111 if (var_target_other[i] in var_target_explicit_mask) {
1112 print " if (ptr1->explicit_mask_" var_target_other[i] " != ptr2->explicit_mask_" var_target_other[i] ")";
1113 print " return false;";
1117 for (i = 0; i < n_target_int; i++) {
1118 if (var_target_int[i] in var_target_explicit_mask) {
1119 print " if (ptr1->explicit_mask_" var_target_int[i] " != ptr2->explicit_mask_" var_target_int[i] ")";
1120 print " return false;";
1124 print " return true;";
1126 print "}";
1128 print "";
1129 print "/* Hash target options */";
1130 print "hashval_t";
1131 print "cl_target_option_hash (struct cl_target_option const *ptr ATTRIBUTE_UNUSED)";
1132 print "{";
1133 print " inchash::hash hstate;";
1134 for (i = 0; i < n_target_str; i++) {
1135 name = var_target_str[i]
1136 print " if (ptr->" name")";
1137 print " hstate.add (ptr->" name", strlen (ptr->" name"));";
1138 print " else";
1139 print " hstate.add_int (0);";
1141 for (i = 0; i < n_target_array; i++) {
1142 name= var_target_array[i]
1143 size = var_target_array_size[i]
1144 type = var_target_array_type[i]
1145 print " hstate.add_int (" size ");";
1146 print " hstate.add (ptr->" name ", sizeof (" type ") * " size ");";
1148 for (i = 0; i < n_target_val; i++) {
1149 name = var_target_val[i]
1150 print " hstate.add_hwi (ptr->" name");";
1152 if (has_target_explicit_mask) {
1153 print " for (size_t i = 0; i < sizeof (ptr->explicit_mask) / sizeof (ptr->explicit_mask[0]); i++)";
1154 print " hstate.add_hwi (ptr->explicit_mask[i]);";
1157 for (i = 0; i < n_target_other; i++) {
1158 if (var_target_other[i] in var_target_explicit_mask)
1159 print " hstate.add_hwi (ptr->explicit_mask_" var_target_other[i] ");";
1162 for (i = 0; i < n_target_int; i++) {
1163 if (var_target_int[i] in var_target_explicit_mask)
1164 print " hstate.add_hwi (ptr->explicit_mask_" var_target_int[i] ");";
1167 print " return hstate.end ();";
1168 print "}";
1170 print "";
1171 print "/* Stream out target options */";
1172 print "void";
1173 print "cl_target_option_stream_out (struct output_block *ob ATTRIBUTE_UNUSED,";
1174 print " struct bitpack_d *bp ATTRIBUTE_UNUSED,";
1175 print " struct cl_target_option *ptr ATTRIBUTE_UNUSED)";
1176 print "{";
1177 for (i = 0; i < n_target_str; i++) {
1178 name = var_target_str[i]
1179 print " bp_pack_string (ob, bp, ptr->" name", true);";
1181 for (i = 0; i < n_target_array; i++) {
1182 name = var_target_array[i]
1183 size = var_target_array_size[i]
1184 print " for (unsigned i = 0; i < " size "; i++)"
1185 print " bp_pack_value (bp, ptr->" name "[i], 64);";
1187 for (i = 0; i < n_target_val; i++) {
1188 name = var_target_val[i]
1189 print " bp_pack_value (bp, ptr->" name", 64);";
1192 if (has_target_explicit_mask) {
1193 print " for (size_t i = 0; i < sizeof (ptr->explicit_mask) / sizeof (ptr->explicit_mask[0]); i++)";
1194 print " bp_pack_value (bp, ptr->explicit_mask[i], 64);";
1197 for (i = 0; i < n_target_other; i++) {
1198 if (var_target_other[i] in var_target_explicit_mask) {
1199 print " bp_pack_value (bp, ptr->explicit_mask_" var_target_other[i] ", 64);";
1203 for (i = 0; i < n_target_int; i++) {
1204 if (var_target_int[i] in var_target_explicit_mask) {
1205 print " bp_pack_value (bp, ptr->explicit_mask_" var_target_int[i] ", 64);";
1209 print "}";
1211 print "";
1212 print "/* Stream in target options */";
1213 print "void";
1214 print "cl_target_option_stream_in (struct data_in *data_in ATTRIBUTE_UNUSED,";
1215 print " struct bitpack_d *bp ATTRIBUTE_UNUSED,";
1216 print " struct cl_target_option *ptr ATTRIBUTE_UNUSED)";
1217 print "{";
1218 for (i = 0; i < n_target_str; i++) {
1219 name = var_target_str[i]
1220 print " ptr->" name" = bp_unpack_string (data_in, bp);";
1221 print " if (ptr->" name")";
1222 print " ptr->" name" = xstrdup (ptr->" name");";
1224 for (i = 0; i < n_target_array; i++) {
1225 name = var_target_array[i]
1226 size = var_target_array_size[i]
1227 print " for (int i = " size " - 1; i >= 0; i--)"
1228 print " ptr->" name "[i] = (" var_target_array_type[i] ") bp_unpack_value (bp, 64);";
1230 for (i = 0; i < n_target_val; i++) {
1231 name = var_target_val[i]
1232 print " ptr->" name" = (" var_target_val_type[i] ") bp_unpack_value (bp, 64);";
1235 if (has_target_explicit_mask) {
1236 print " for (size_t i = 0; i < sizeof (ptr->explicit_mask) / sizeof (ptr->explicit_mask[0]); i++)";
1237 print " ptr->explicit_mask[i] = bp_unpack_value (bp, 64);";
1240 for (i = 0; i < n_target_other; i++) {
1241 if (var_target_other[i] in var_target_explicit_mask) {
1242 print " ptr->explicit_mask_" var_target_other[i] " = bp_unpack_value (bp, 64);";
1246 for (i = 0; i < n_target_int; i++) {
1247 if (var_target_int[i] in var_target_explicit_mask) {
1248 print " ptr->explicit_mask_" var_target_int[i] " = bp_unpack_value (bp, 64);";
1252 print "}";
1254 print "/* free heap memory used by target options */";
1255 print "void";
1256 print "cl_target_option_free (struct cl_target_option *ptr ATTRIBUTE_UNUSED)";
1257 print "{";
1258 for (i = 0; i < n_target_str; i++) {
1259 name = var_target_str[i]
1260 print " if (ptr->" name")";
1261 print " free (const_cast <char *>(ptr->" name"));";
1263 print "}";
1265 n_opt_val = 4;
1266 var_opt_val[0] = "x_optimize"
1267 var_opt_val_type[0] = "char "
1268 var_opt_hash[0] = 1;
1269 var_opt_val[1] = "x_optimize_size"
1270 var_opt_val_type[1] = "char "
1271 var_opt_hash[1] = 1;
1272 var_opt_val[2] = "x_optimize_debug"
1273 var_opt_val_type[2] = "char "
1274 var_opt_hash[2] = 1;
1275 var_opt_val[3] = "x_optimize_fast"
1276 var_opt_val_type[3] = "char "
1277 var_opt_hash[3] = 1;
1278 for (i = 0; i < n_opts; i++) {
1279 if (flag_set_p("(Optimization|PerFunction)", flags[i])) {
1280 name = var_name(flags[i])
1281 if(name == "")
1282 continue;
1284 if(name in var_opt_list_seen)
1285 continue;
1287 var_opt_list_seen[name]++;
1289 otype = var_type_struct(flags[i])
1290 var_opt_val_type[n_opt_val] = otype;
1291 var_opt_val[n_opt_val] = "x_" name;
1292 var_opt_hash[n_opt_val] = flag_set_p("Optimization", flags[i]);
1293 n_opt_val++;
1296 print "";
1297 print "/* Hash optimization options */";
1298 print "hashval_t";
1299 print "cl_optimization_hash (struct cl_optimization const *ptr ATTRIBUTE_UNUSED)";
1300 print "{";
1301 print " inchash::hash hstate;";
1302 for (i = 0; i < n_opt_val; i++) {
1303 if (!var_opt_hash[i])
1304 continue;
1305 name = var_opt_val[i]
1306 otype = var_opt_val_type[i];
1307 if (otype ~ "^const char \\**$")
1309 print " if (ptr->" name")";
1310 print " hstate.add (ptr->" name", strlen (ptr->" name"));";
1311 print " else";
1312 print " hstate.add_int (0);";
1314 else
1315 print " hstate.add_hwi (ptr->" name");";
1317 print " for (size_t i = 0; i < sizeof (ptr->explicit_mask) / sizeof (ptr->explicit_mask[0]); i++)";
1318 print " hstate.add_hwi (ptr->explicit_mask[i]);";
1319 print " return hstate.end ();";
1320 print "}";
1322 print "";
1323 print "/* Compare two optimization options */";
1324 print "bool";
1325 print "cl_optimization_option_eq (cl_optimization const *ptr1,";
1326 print " cl_optimization const *ptr2)";
1327 print "{";
1328 for (i = 0; i < n_opt_val; i++) {
1329 if (!var_opt_hash[i])
1330 continue;
1331 name = var_opt_val[i]
1332 otype = var_opt_val_type[i];
1333 if (otype ~ "^const char \\**$")
1335 print " if (ptr1->" name" != ptr2->" name;
1336 print " && (!ptr1->" name" || !ptr2->" name
1337 print " || strcmp (ptr1->" name", ptr2->" name ")))";
1338 print " return false;";
1340 else
1342 print " if (ptr1->" name" != ptr2->" name ")";
1343 print " return false;";
1346 print " for (size_t i = 0; i < sizeof (ptr1->explicit_mask) / sizeof (ptr1->explicit_mask[0]); i++)";
1347 print " if (ptr1->explicit_mask[i] != ptr2->explicit_mask[i])";
1348 print " return false;"
1349 print " return true;";
1350 print "}";
1352 print "";
1353 print "/* Stream out optimization options */";
1354 print "void";
1355 print "cl_optimization_stream_out (struct output_block *ob,";
1356 print " struct bitpack_d *bp,";
1357 print " struct cl_optimization *ptr)";
1358 print "{";
1359 for (i = 0; i < n_opt_val; i++) {
1360 name = var_opt_val[i]
1361 otype = var_opt_val_type[i];
1362 if (otype ~ "^const char \\**$")
1363 print " bp_pack_string (ob, bp, ptr->" name", true);";
1364 else if (otype ~ "^unsigned")
1365 print " bp_pack_var_len_unsigned (bp, ptr->" name");";
1366 else
1367 print " bp_pack_var_len_int (bp, ptr->" name");";
1369 print " for (size_t i = 0; i < sizeof (ptr->explicit_mask) / sizeof (ptr->explicit_mask[0]); i++)";
1370 print " bp_pack_value (bp, ptr->explicit_mask[i], 64);";
1371 print "}";
1373 print "";
1374 print "/* Stream in optimization options */";
1375 print "void";
1376 print "cl_optimization_stream_in (struct data_in *data_in ATTRIBUTE_UNUSED,";
1377 print " struct bitpack_d *bp ATTRIBUTE_UNUSED,";
1378 print " struct cl_optimization *ptr ATTRIBUTE_UNUSED)";
1379 print "{";
1380 for (i = 0; i < n_opt_val; i++) {
1381 name = var_opt_val[i]
1382 otype = var_opt_val_type[i];
1383 if (otype ~ "^const char \\**$") {
1384 print " ptr->" name" = bp_unpack_string (data_in, bp);";
1385 print " if (ptr->" name")";
1386 print " ptr->" name" = xstrdup (ptr->" name");";
1388 else if (otype ~ "^unsigned")
1389 print " ptr->" name" = (" var_opt_val_type[i] ") bp_unpack_var_len_unsigned (bp);";
1390 else
1391 print " ptr->" name" = (" var_opt_val_type[i] ") bp_unpack_var_len_int (bp);";
1393 print " for (size_t i = 0; i < sizeof (ptr->explicit_mask) / sizeof (ptr->explicit_mask[0]); i++)";
1394 print " ptr->explicit_mask[i] = bp_unpack_value (bp, 64);";
1395 print "}";
1396 print "/* Free heap memory used by optimization options */";
1397 print "void";
1398 print "cl_optimization_option_free (struct cl_optimization *ptr ATTRIBUTE_UNUSED)";
1399 print "{";
1400 for (i = 0; i < n_opt_val; i++) {
1401 name = var_opt_val[i]
1402 otype = var_opt_val_type[i];
1403 if (otype ~ "^const char \\**$")
1405 print " if (ptr->" name")";
1406 print " free (const_cast <char *>(ptr->" name"));";
1409 print "}";
1411 print "void";
1412 print "cl_optimization_compare (gcc_options *ptr1, gcc_options *ptr2)"
1413 print "{"
1415 # all these options are mentioned in PR92860
1416 checked_options["flag_merge_constants"]++
1417 checked_options["param_max_fields_for_field_sensitive"]++
1418 checked_options["flag_omit_frame_pointer"]++
1419 checked_options["unroll_only_small_loops"]++
1420 # arc exceptions
1421 checked_options["TARGET_ALIGN_CALL"]++
1422 checked_options["TARGET_CASE_VECTOR_PC_RELATIVE"]++
1423 checked_options["arc_size_opt_level"]++
1425 for (i = 0; i < n_opts; i++) {
1426 name = var_name(flags[i]);
1427 if (name == "")
1428 continue;
1430 if (name in checked_options)
1431 continue;
1432 checked_options[name]++
1434 if (name in string_options_names) {
1435 print " if (ptr1->x_" name " != ptr2->x_" name "";
1436 print " && (!ptr1->x_" name" || !ptr2->x_" name
1437 print " || strcmp (ptr1->x_" name", ptr2->x_" name ")))";
1438 print " internal_error (\"%<global_options%> are modified in local context\");";
1440 else {
1441 print " if (ptr1->x_" name " != ptr2->x_" name ")"
1442 print " internal_error (\"%<global_options%> are modified in local context\");";
1446 print "}";