]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/optc-save-gen.awk
Allow automatics in equivalences
[thirdparty/gcc.git] / gcc / optc-save-gen.awk
CommitLineData
fbd26352 1# Copyright (C) 2003-2019 Free Software Foundation, Inc.
0bfbe373 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.
31END {
32print "/* This file is auto-generated by optc-save-gen.awk. */"
33print ""
34n_headers = split(header_name, headers, " ")
35for (i = 1; i <= n_headers; i++)
36 print "#include " quote headers[i] quote
37print "#include " quote "opts.h" quote
38print "#include " quote "intl.h" quote
39print ""
40print "#include " quote "flags.h" quote
41print "#include " quote "target.h" quote
ab90b67e 42print "#include " quote "inchash.h" quote
b20a8bb4 43print "#include " quote "hash-set.h" quote
b20a8bb4 44print "#include " quote "vec.h" quote
b20a8bb4 45print "#include " quote "input.h" quote
46print "#include " quote "alias.h" quote
47print "#include " quote "symtab.h" quote
b20a8bb4 48print "#include " quote "inchash.h" quote
ab90b67e 49print "#include " quote "tree.h" quote
b20a8bb4 50print "#include " quote "fold-const.h" quote
ab90b67e 51print "#include " quote "tree-ssa-alias.h" quote
52print "#include " quote "is-a.h" quote
53print "#include " quote "predict.h" quote
54print "#include " quote "function.h" quote
55print "#include " quote "basic-block.h" quote
56print "#include " quote "gimple-expr.h" quote
57print "#include " quote "gimple.h" quote
58print "#include " quote "data-streamer.h" quote
59print "#include " quote "ipa-ref.h" quote
60print "#include " quote "cgraph.h" quote
0bfbe373 61print ""
62
63if (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
70have_save = 0;
71if (n_extra_target_vars)
72 have_save = 1
73
74for (i = 0; i < n_opts; i++) {
75 if (flag_set_p("Save", flags[i]))
76 have_save = 1;
77}
78
79print "/* Save optimization variables into a structure. */"
80print "void";
81print "cl_optimization_save (struct cl_optimization *ptr, struct gcc_options *opts)";
82print "{";
83
689babb3 84n_opt_char = 4;
0bfbe373 85n_opt_short = 0;
86n_opt_int = 0;
b92389a6 87n_opt_enum = 0;
6848a0ae 88n_opt_string = 0;
0bfbe373 89n_opt_other = 0;
90var_opt_char[0] = "optimize";
91var_opt_char[1] = "optimize_size";
bfedbed1 92var_opt_char[2] = "optimize_debug";
689babb3 93var_opt_char[3] = "optimize_fast";
0bfbe373 94var_opt_range["optimize"] = "0, 255";
bfedbed1 95var_opt_range["optimize_size"] = "0, 1";
96var_opt_range["optimize_debug"] = "0, 1";
689babb3 97var_opt_range["optimize_fast"] = "0, 1";
0bfbe373 98
99# Sort by size to mimic how the structure is laid out to be friendlier to the
100# cache.
101
102for (i = 0; i < n_opts; i++) {
05d8c5f8 103 if (flag_set_p("(Optimization|PerFunction)", flags[i])) {
0bfbe373 104 name = var_name(flags[i])
105 if(name == "")
106 continue;
107
108 if(name in var_opt_seen)
109 continue;
110
111 var_opt_seen[name]++;
112 otype = var_type_struct(flags[i]);
113 if (otype ~ "^((un)?signed +)?int *$")
114 var_opt_int[n_opt_int++] = name;
115
116 else if (otype ~ "^((un)?signed +)?short *$")
117 var_opt_short[n_opt_short++] = name;
118
119 else if (otype ~ ("^enum +[_" alnum "]+ *"))
120 var_opt_enum[n_opt_enum++] = name;
121
122 else if (otype ~ "^((un)?signed +)?char *$") {
123 var_opt_char[n_opt_char++] = name;
124 if (otype ~ "^unsigned +char *$")
125 var_opt_range[name] = "0, 255"
126 else if (otype ~ "^signed +char *$")
127 var_opt_range[name] = "-128, 127"
128 }
6848a0ae 129 else if (otype ~ "^const char \\**$")
130 var_opt_string[n_opt_string++] = name;
0bfbe373 131 else
132 var_opt_other[n_opt_other++] = name;
133 }
134}
135
136for (i = 0; i < n_opt_char; i++) {
137 name = var_opt_char[i];
138 if (var_opt_range[name] != "")
139 print " gcc_assert (IN_RANGE (opts->x_" name ", " var_opt_range[name] "));";
140}
141
142print "";
143for (i = 0; i < n_opt_other; i++) {
144 print " ptr->x_" var_opt_other[i] " = opts->x_" var_opt_other[i] ";";
145}
146
147for (i = 0; i < n_opt_int; i++) {
148 print " ptr->x_" var_opt_int[i] " = opts->x_" var_opt_int[i] ";";
149}
150
151for (i = 0; i < n_opt_enum; i++) {
152 print " ptr->x_" var_opt_enum[i] " = opts->x_" var_opt_enum[i] ";";
153}
154
155for (i = 0; i < n_opt_short; i++) {
156 print " ptr->x_" var_opt_short[i] " = opts->x_" var_opt_short[i] ";";
157}
158
159for (i = 0; i < n_opt_char; i++) {
160 print " ptr->x_" var_opt_char[i] " = opts->x_" var_opt_char[i] ";";
161}
162
6848a0ae 163for (i = 0; i < n_opt_string; i++) {
164 print " ptr->x_" var_opt_string[i] " = opts->x_" var_opt_string[i] ";";
165}
166
0bfbe373 167print "}";
168
169print "";
170print "/* Restore optimization options from a structure. */";
171print "void";
172print "cl_optimization_restore (struct gcc_options *opts, struct cl_optimization *ptr)";
173print "{";
174
175for (i = 0; i < n_opt_other; i++) {
176 print " opts->x_" var_opt_other[i] " = ptr->x_" var_opt_other[i] ";";
177}
178
179for (i = 0; i < n_opt_int; i++) {
180 print " opts->x_" var_opt_int[i] " = ptr->x_" var_opt_int[i] ";";
181}
182
183for (i = 0; i < n_opt_enum; i++) {
184 print " opts->x_" var_opt_enum[i] " = ptr->x_" var_opt_enum[i] ";";
185}
186
187for (i = 0; i < n_opt_short; i++) {
188 print " opts->x_" var_opt_short[i] " = ptr->x_" var_opt_short[i] ";";
189}
190
191for (i = 0; i < n_opt_char; i++) {
192 print " opts->x_" var_opt_char[i] " = ptr->x_" var_opt_char[i] ";";
193}
194
6848a0ae 195for (i = 0; i < n_opt_string; i++) {
196 print " opts->x_" var_opt_string[i] " = ptr->x_" var_opt_string[i] ";";
197}
198
0bfbe373 199print " targetm.override_options_after_change ();";
200print "}";
201
202print "";
203print "/* Print optimization options from a structure. */";
204print "void";
205print "cl_optimization_print (FILE *file,";
206print " int indent_to,";
207print " struct cl_optimization *ptr)";
208print "{";
209
210print " fputs (\"\\n\", file);";
211for (i = 0; i < n_opt_other; i++) {
212 print " if (ptr->x_" var_opt_other[i] ")";
213 print " fprintf (file, \"%*s%s (%#lx)\\n\",";
214 print " indent_to, \"\",";
215 print " \"" var_opt_other[i] "\",";
216 print " (unsigned long)ptr->x_" var_opt_other[i] ");";
217 print "";
218}
219
220for (i = 0; i < n_opt_int; i++) {
221 print " if (ptr->x_" var_opt_int[i] ")";
222 print " fprintf (file, \"%*s%s (%#x)\\n\",";
223 print " indent_to, \"\",";
224 print " \"" var_opt_int[i] "\",";
225 print " ptr->x_" var_opt_int[i] ");";
226 print "";
227}
228
229for (i = 0; i < n_opt_enum; i++) {
230 print " fprintf (file, \"%*s%s (%#x)\\n\",";
231 print " indent_to, \"\",";
232 print " \"" var_opt_enum[i] "\",";
233 print " (int) ptr->x_" var_opt_enum[i] ");";
234 print "";
235}
236
237for (i = 0; i < n_opt_short; i++) {
238 print " if (ptr->x_" var_opt_short[i] ")";
239 print " fprintf (file, \"%*s%s (%#x)\\n\",";
240 print " indent_to, \"\",";
241 print " \"" var_opt_short[i] "\",";
242 print " ptr->x_" var_opt_short[i] ");";
243 print "";
244}
245
246for (i = 0; i < n_opt_char; i++) {
247 print " if (ptr->x_" var_opt_char[i] ")";
248 print " fprintf (file, \"%*s%s (%#x)\\n\",";
249 print " indent_to, \"\",";
250 print " \"" var_opt_char[i] "\",";
251 print " ptr->x_" var_opt_char[i] ");";
252 print "";
253}
254
6848a0ae 255for (i = 0; i < n_opt_string; i++) {
e643926a 256 print " if (ptr->x_" var_opt_string[i] ")";
6848a0ae 257 print " fprintf (file, \"%*s%s (%s)\\n\",";
258 print " indent_to, \"\",";
259 print " \"" var_opt_string[i] "\",";
260 print " ptr->x_" var_opt_string[i] ");";
261 print "";
262}
263
0bfbe373 264print "}";
265
7174b54b 266print "";
267print "/* Print different optimization variables from structures provided as arguments. */";
268print "void";
269print "cl_optimization_print_diff (FILE *file,";
270print " int indent_to,";
271print " struct cl_optimization *ptr1,";
272print " struct cl_optimization *ptr2)";
273print "{";
274
275print " fputs (\"\\n\", file);";
276for (i = 0; i < n_opt_other; i++) {
277 print " if (ptr1->x_" var_opt_other[i] " != ptr2->x_" var_opt_other[i] ")";
278 print " fprintf (file, \"%*s%s (%#lx/%#lx)\\n\",";
279 print " indent_to, \"\",";
280 print " \"" var_opt_other[i] "\",";
281 print " (unsigned long)ptr1->x_" var_opt_other[i] ",";
282 print " (unsigned long)ptr2->x_" var_opt_other[i] ");";
283 print "";
284}
285
286for (i = 0; i < n_opt_int; i++) {
287 print " if (ptr1->x_" var_opt_int[i] " != ptr2->x_" var_opt_int[i] ")";
288 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
289 print " indent_to, \"\",";
290 print " \"" var_opt_int[i] "\",";
291 print " ptr1->x_" var_opt_int[i] ",";
292 print " ptr2->x_" var_opt_int[i] ");";
293 print "";
294}
295
296for (i = 0; i < n_opt_enum; i++) {
297 print " if (ptr1->x_" var_opt_enum[i] " != ptr2->x_" var_opt_enum[i] ")";
298 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
299 print " indent_to, \"\",";
300 print " \"" var_opt_enum[i] "\",";
301 print " (int) ptr1->x_" var_opt_enum[i] ",";
302 print " (int) ptr2->x_" var_opt_enum[i] ");";
303 print "";
304}
305
306for (i = 0; i < n_opt_short; i++) {
307 print " if (ptr1->x_" var_opt_short[i] " != ptr2->x_" var_opt_short[i] ")";
308 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
309 print " indent_to, \"\",";
310 print " \"" var_opt_short[i] "\",";
311 print " ptr1->x_" var_opt_short[i] ",";
312 print " ptr2->x_" var_opt_short[i] ");";
313 print "";
314}
315
316for (i = 0; i < n_opt_char; i++) {
317 print " if (ptr1->x_" var_opt_char[i] " != ptr2->x_" var_opt_char[i] ")";
318 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
319 print " indent_to, \"\",";
320 print " \"" var_opt_char[i] "\",";
321 print " ptr1->x_" var_opt_char[i] ",";
322 print " ptr2->x_" var_opt_char[i] ");";
323 print "";
324}
325
6848a0ae 326for (i = 0; i < n_opt_string; i++) {
327 name = var_opt_string[i]
328 print " if (ptr1->x_" name " != ptr2->x_" name "";
e643926a 329 print " && (!ptr1->x_" name" || !ptr2->x_" name
6848a0ae 330 print " || strcmp (ptr1->x_" name", ptr2->x_" name ")))";
331 print " fprintf (file, \"%*s%s (%s/%s)\\n\",";
332 print " indent_to, \"\",";
333 print " \"" name "\",";
e643926a 334 print " ptr1->x_" name " ? ptr1->x_" name " : \"(null)\",";
335 print " ptr2->x_" name " ? ptr1->x_" name " : \"(null)\");";
6848a0ae 336 print "";
337}
338
7174b54b 339print "}";
340
341
0bfbe373 342print "";
343print "/* Save selected option variables into a structure. */"
344print "void";
345print "cl_target_option_save (struct cl_target_option *ptr, struct gcc_options *opts)";
346print "{";
347
348n_target_char = 0;
349n_target_short = 0;
350n_target_int = 0;
351n_target_enum = 0;
e643926a 352n_target_string = 0;
0bfbe373 353n_target_other = 0;
354
355if (have_save) {
356 for (i = 0; i < n_opts; i++) {
357 if (flag_set_p("Save", flags[i])) {
358 name = var_name(flags[i])
359 if(name == "")
360 name = "target_flags";
361
362 if(name in var_save_seen)
363 continue;
364
365 var_save_seen[name]++;
366 otype = var_type_struct(flags[i])
367 if (otype ~ "^((un)?signed +)?int *$")
368 var_target_int[n_target_int++] = name;
369
370 else if (otype ~ "^((un)?signed +)?short *$")
371 var_target_short[n_target_short++] = name;
372
373 else if (otype ~ ("^enum +[_" alnum "]+ *$"))
374 var_target_enum[n_target_enum++] = name;
375
376 else if (otype ~ "^((un)?signed +)?char *$") {
377 var_target_char[n_target_char++] = name;
378 if (otype ~ "^unsigned +char *$")
379 var_target_range[name] = "0, 255"
380 else if (otype ~ "^signed +char *$")
381 var_target_range[name] = "-128, 127"
382 if (otype == var_type(flags[i]))
383 var_target_range[name] = ""
384 }
e643926a 385 else if (otype ~ "^const char \\**$")
386 var_target_string[n_target_string++] = name;
0bfbe373 387 else
388 var_target_other[n_target_other++] = name;
389 }
390 }
391} else {
392 var_target_int[n_target_int++] = "target_flags";
393}
394
395have_assert = 0;
396for (i = 0; i < n_target_char; i++) {
397 name = var_target_char[i];
398 if (var_target_range[name] != "") {
399 have_assert = 1;
400 print " gcc_assert (IN_RANGE (opts->x_" name ", " var_target_range[name] "));";
401 }
402}
403
404if (have_assert)
405 print "";
406
407print " if (targetm.target_option.save)";
55310327 408print " targetm.target_option.save (ptr, opts);";
0bfbe373 409print "";
410
411for (i = 0; i < n_extra_target_vars; i++) {
412 print " ptr->x_" extra_target_vars[i] " = opts->x_" extra_target_vars[i] ";";
413}
414
415for (i = 0; i < n_target_other; i++) {
416 print " ptr->x_" var_target_other[i] " = opts->x_" var_target_other[i] ";";
417}
418
419for (i = 0; i < n_target_enum; i++) {
420 print " ptr->x_" var_target_enum[i] " = opts->x_" var_target_enum[i] ";";
421}
422
423for (i = 0; i < n_target_int; i++) {
424 print " ptr->x_" var_target_int[i] " = opts->x_" var_target_int[i] ";";
425}
426
427for (i = 0; i < n_target_short; i++) {
428 print " ptr->x_" var_target_short[i] " = opts->x_" var_target_short[i] ";";
429}
430
431for (i = 0; i < n_target_char; i++) {
432 print " ptr->x_" var_target_char[i] " = opts->x_" var_target_char[i] ";";
433}
434
e643926a 435for (i = 0; i < n_target_string; i++) {
436 print " ptr->x_" var_target_string[i] " = opts->x_" var_target_string[i] ";";
437}
438
0bfbe373 439print "}";
440
441print "";
442print "/* Restore selected current options from a structure. */";
443print "void";
444print "cl_target_option_restore (struct gcc_options *opts, struct cl_target_option *ptr)";
445print "{";
446
447for (i = 0; i < n_extra_target_vars; i++) {
448 print " opts->x_" extra_target_vars[i] " = ptr->x_" extra_target_vars[i] ";";
449}
450
451for (i = 0; i < n_target_other; i++) {
452 print " opts->x_" var_target_other[i] " = ptr->x_" var_target_other[i] ";";
453}
454
455for (i = 0; i < n_target_enum; i++) {
456 print " opts->x_" var_target_enum[i] " = ptr->x_" var_target_enum[i] ";";
457}
458
459for (i = 0; i < n_target_int; i++) {
460 print " opts->x_" var_target_int[i] " = ptr->x_" var_target_int[i] ";";
461}
462
463for (i = 0; i < n_target_short; i++) {
464 print " opts->x_" var_target_short[i] " = ptr->x_" var_target_short[i] ";";
465}
466
467for (i = 0; i < n_target_char; i++) {
468 print " opts->x_" var_target_char[i] " = ptr->x_" var_target_char[i] ";";
469}
470
e643926a 471for (i = 0; i < n_target_string; i++) {
472 print " opts->x_" var_target_string[i] " = ptr->x_" var_target_string[i] ";";
473}
474
0bfbe373 475# This must occur after the normal variables in case the code depends on those
476# variables.
477print "";
478print " if (targetm.target_option.restore)";
55310327 479print " targetm.target_option.restore (opts, ptr);";
0bfbe373 480
481print "}";
482
483print "";
484print "/* Print optimization options from a structure. */";
485print "void";
486print "cl_target_option_print (FILE *file,";
487print " int indent,";
488print " struct cl_target_option *ptr)";
489print "{";
490
491print " fputs (\"\\n\", file);";
492for (i = 0; i < n_target_other; i++) {
493 print " if (ptr->x_" var_target_other[i] ")";
8e18705e 494 hwi = host_wide_int[var_target_other[i]]
495 if (hwi == "yes")
72ec6882 496 print " fprintf (file, \"%*s%s (%#\" HOST_WIDE_INT_PRINT \"x)\\n\",";
497 else
8e18705e 498 print " fprintf (file, \"%*s%s (%#lx)\\n\",";
0bfbe373 499 print " indent, \"\",";
500 print " \"" var_target_other[i] "\",";
8e18705e 501 if (hwi == "yes")
72ec6882 502 print " ptr->x_" var_target_other[i] ");";
503 else
504 print " (unsigned long)ptr->x_" var_target_other[i] ");";
0bfbe373 505 print "";
506}
507
508for (i = 0; i < n_target_enum; i++) {
509 print " if (ptr->x_" var_target_enum[i] ")";
510 print " fprintf (file, \"%*s%s (%#x)\\n\",";
511 print " indent, \"\",";
512 print " \"" var_target_enum[i] "\",";
513 print " ptr->x_" var_target_enum[i] ");";
514 print "";
515}
516
517for (i = 0; i < n_target_int; i++) {
518 print " if (ptr->x_" var_target_int[i] ")";
519 print " fprintf (file, \"%*s%s (%#x)\\n\",";
520 print " indent, \"\",";
521 print " \"" var_target_int[i] "\",";
522 print " ptr->x_" var_target_int[i] ");";
523 print "";
524}
525
526for (i = 0; i < n_target_short; i++) {
527 print " if (ptr->x_" var_target_short[i] ")";
528 print " fprintf (file, \"%*s%s (%#x)\\n\",";
529 print " indent, \"\",";
530 print " \"" var_target_short[i] "\",";
531 print " ptr->x_" var_target_short[i] ");";
532 print "";
533}
534
535for (i = 0; i < n_target_char; i++) {
536 print " if (ptr->x_" var_target_char[i] ")";
537 print " fprintf (file, \"%*s%s (%#x)\\n\",";
538 print " indent, \"\",";
539 print " \"" var_target_char[i] "\",";
540 print " ptr->x_" var_target_char[i] ");";
541 print "";
542}
543
e643926a 544for (i = 0; i < n_target_string; i++) {
545 print " if (ptr->x_" var_target_string[i] ")";
546 print " fprintf (file, \"%*s%s (%s)\\n\",";
547 print " indent, \"\",";
548 print " \"" var_target_string[i] "\",";
549 print " ptr->x_" var_target_string[i] ");";
550 print "";
551}
552
0bfbe373 553print "";
554print " if (targetm.target_option.print)";
555print " targetm.target_option.print (file, indent, ptr);";
7174b54b 556print "}";
557
558print "";
559print "/* Print different target option variables from structures provided as arguments. */";
560print "void";
561print "cl_target_option_print_diff (FILE *file,";
304eacdf 562print " int indent ATTRIBUTE_UNUSED,";
563print " struct cl_target_option *ptr1 ATTRIBUTE_UNUSED,";
564print " struct cl_target_option *ptr2 ATTRIBUTE_UNUSED)";
7174b54b 565print "{";
566
567print " fputs (\"\\n\", file);";
568for (i = 0; i < n_target_other; i++) {
569 print " if (ptr1->x_" var_target_other[i] " != ptr2->x_" var_target_other[i] ")";
8e18705e 570 hwi = host_wide_int[var_target_other[i]]
571 if (hwi == "yes")
7174b54b 572 print " fprintf (file, \"%*s%s (%#\" HOST_WIDE_INT_PRINT \"x/%#\" HOST_WIDE_INT_PRINT \"x)\\n\",";
573 else
8e18705e 574 print " fprintf (file, \"%*s%s (%#lx/%#lx)\\n\",";
7174b54b 575 print " indent, \"\",";
576 print " \"" var_target_other[i] "\",";
8e18705e 577 if (hwi == "yes") {
7174b54b 578 print " ptr1->x_" var_target_other[i] ",";
579 print " ptr2->x_" var_target_other[i] ");";
580 }
581 else {
582 print " (unsigned long)ptr1->x_" var_target_other[i] ",";
583 print " (unsigned long)ptr2->x_" var_target_other[i] ");";
584 }
585 print "";
586}
587
588for (i = 0; i < n_target_enum; i++) {
589 print " if (ptr1->x_" var_target_enum[i] " != ptr2->x_" var_target_enum[i] ")";
590 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
591 print " indent, \"\",";
592 print " \"" var_target_enum[i] "\",";
593 print " ptr1->x_" var_target_enum[i] ",";
594 print " ptr2->x_" var_target_enum[i] ");";
595 print "";
596}
597
598for (i = 0; i < n_target_int; i++) {
599 print " if (ptr1->x_" var_target_int[i] " != ptr2->x_" var_target_int[i] ")";
600 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
601 print " indent, \"\",";
602 print " \"" var_target_int[i] "\",";
603 print " ptr1->x_" var_target_int[i] ",";
604 print " ptr2->x_" var_target_int[i] ");";
605 print "";
606}
607
608for (i = 0; i < n_target_short; i++) {
609 print " if (ptr1->x_" var_target_short[i] " != ptr2->x_" var_target_short[i] ")";
610 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
611 print " indent, \"\",";
612 print " \"" var_target_short[i] "\",";
613 print " ptr1->x_" var_target_short[i] ",";
614 print " ptr2->x_" var_target_short[i] ");";
615 print "";
616}
617
618for (i = 0; i < n_target_char; i++) {
619 print " if (ptr1->x_" var_target_char[i] " != ptr2->x_" var_target_char[i] ")";
620 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
621 print " indent, \"\",";
622 print " \"" var_target_char[i] "\",";
623 print " ptr1->x_" var_target_char[i] ",";
624 print " ptr2->x_" var_target_char[i] ");";
625 print "";
626}
0bfbe373 627
e643926a 628for (i = 0; i < n_target_string; i++) {
629 name = var_target_string[i]
630 print " if (ptr1->x_" name " != ptr2->x_" name "";
631 print " && (!ptr1->x_" name" || !ptr2->x_" name
632 print " || strcmp (ptr1->x_" name", ptr2->x_" name ")))";
633 print " fprintf (file, \"%*s%s (%s/%s)\\n\",";
634 print " indent, \"\",";
635 print " \"" name "\",";
636 print " ptr1->x_" name " ? ptr1->x_" name " : \"(null)\",";
637 print " ptr2->x_" name " ? ptr1->x_" name " : \"(null)\");";
638 print "";
639}
640
0bfbe373 641print "}";
642
ab90b67e 643print "";
644print "/* Compare two target options */";
645print "bool";
646print "cl_target_option_eq (struct cl_target_option const *ptr1 ATTRIBUTE_UNUSED,";
647print " struct cl_target_option const *ptr2 ATTRIBUTE_UNUSED)";
648print "{";
649n_target_val = 0;
650n_target_str = 0;
ec5ca250 651n_target_array = 0;
ab90b67e 652
653for (i = 0; i < n_target_save; i++) {
654 var = target_save_decl[i];
655 sub (" *=.*", "", var);
656 name = var;
657 type = var;
658 sub("^.*[ *]", "", name)
659 sub(" *" name "$", "", type)
660 if (target_save_decl[i] ~ "^const char \\*+[_" alnum "]+$")
661 var_target_str[n_target_str++] = name;
662 else {
ec5ca250 663 if (target_save_decl[i] ~ " .*\\[.+\\]+$") {
664 size = name;
665 sub("[^\\[]+\\[", "", size);
666 sub("\\]$", "", size);
667 sub("\\[.+", "", name)
668 sub(" [^ ]+$", "", type)
669 var_target_array[n_target_array] = name
670 var_target_array_type[n_target_array] = type
671 var_target_array_size[n_target_array++] = size
672 }
673 else {
674 var_target_val_type[n_target_val] = type;
675 var_target_val[n_target_val++] = name;
676 }
ab90b67e 677 }
678}
679if (have_save) {
680 for (i = 0; i < n_opts; i++) {
681 if (flag_set_p("Save", flags[i])) {
682 name = var_name(flags[i])
683 if(name == "")
684 name = "target_flags";
685
686 if(name in var_list_seen)
687 continue;
688
689 var_list_seen[name]++;
690 otype = var_type_struct(flags[i])
691 if (otype ~ "^const char \\**$")
692 var_target_str[n_target_str++] = "x_" name;
693 else {
694 var_target_val_type[n_target_val] = otype;
695 var_target_val[n_target_val++] = "x_" name;
696 }
697 }
698 }
699} else {
700 var_target_val_type[n_target_val] = "int";
701 var_target_val[n_target_val++] = "x_target_flags";
702}
703
704for (i = 0; i < n_target_str; i++) {
705 name = var_target_str[i]
706 print " if (ptr1->" name" != ptr2->" name;
707 print " && (!ptr1->" name" || !ptr2->" name
708 print " || strcmp (ptr1->" name", ptr2->" name ")))";
709 print " return false;";
710}
ec5ca250 711for (i = 0; i < n_target_array; i++) {
712 name = var_target_array[i]
713 size = var_target_array_size[i]
714 type = var_target_array_type[i]
715 print " if (ptr1->" name" != ptr2->" name "";
716 print " || memcmp (ptr1->" name ", ptr2->" name ", " size " * sizeof(" type ")))"
717 print " return false;";
718}
ab90b67e 719for (i = 0; i < n_target_val; i++) {
720 name = var_target_val[i]
721 print " if (ptr1->" name" != ptr2->" name ")";
722 print " return false;";
723}
724
725print " return true;";
726
727print "}";
728
729print "";
730print "/* Hash target options */";
731print "hashval_t";
732print "cl_target_option_hash (struct cl_target_option const *ptr ATTRIBUTE_UNUSED)";
733print "{";
734print " inchash::hash hstate;";
735for (i = 0; i < n_target_str; i++) {
736 name = var_target_str[i]
737 print " if (ptr->" name")";
738 print " hstate.add (ptr->" name", strlen (ptr->" name"));";
739 print " else";
740 print " hstate.add_int (0);";
741}
ec5ca250 742for (i = 0; i < n_target_array; i++) {
743 name= var_target_array[i]
744 size = var_target_array_size[i]
745 type = var_target_array_type[i]
746 print " hstate.add_int (" size ");";
747 print " hstate.add (ptr->" name ", sizeof (" type ") * " size ");";
748}
ab90b67e 749for (i = 0; i < n_target_val; i++) {
750 name = var_target_val[i]
eadcd69c 751 print " hstate.add_hwi (ptr->" name");";
ab90b67e 752}
753print " return hstate.end ();";
754print "}";
755
756print "";
757print "/* Stream out target options */";
758print "void";
759print "cl_target_option_stream_out (struct output_block *ob ATTRIBUTE_UNUSED,";
760print " struct bitpack_d *bp ATTRIBUTE_UNUSED,";
761print " struct cl_target_option *ptr ATTRIBUTE_UNUSED)";
762print "{";
763for (i = 0; i < n_target_str; i++) {
764 name = var_target_str[i]
765 print " bp_pack_string (ob, bp, ptr->" name", true);";
766}
ec5ca250 767for (i = 0; i < n_target_array; i++) {
768 name = var_target_array[i]
769 size = var_target_array_size[i]
770 print " for (unsigned i = 0; i < " size "; i++)"
771 print " bp_pack_value (bp, ptr->" name "[i], 64);";
772}
ab90b67e 773for (i = 0; i < n_target_val; i++) {
774 name = var_target_val[i]
775 print " bp_pack_value (bp, ptr->" name", 64);";
776}
777print "}";
778
779print "";
780print "/* Stream in target options */";
781print "void";
782print "cl_target_option_stream_in (struct data_in *data_in ATTRIBUTE_UNUSED,";
783print " struct bitpack_d *bp ATTRIBUTE_UNUSED,";
784print " struct cl_target_option *ptr ATTRIBUTE_UNUSED)";
785print "{";
786for (i = 0; i < n_target_str; i++) {
787 name = var_target_str[i]
788 print " ptr->" name" = bp_unpack_string (data_in, bp);";
789 print " if (ptr->" name")";
790 print " ptr->" name" = xstrdup (ptr->" name");";
791}
ec5ca250 792for (i = 0; i < n_target_array; i++) {
793 name = var_target_array[i]
794 size = var_target_array_size[i]
795 print " for (int i = " size " - 1; i >= 0; i--)"
796 print " ptr->" name "[i] = (" var_target_array_type[i] ") bp_unpack_value (bp, 64);";
797}
ab90b67e 798for (i = 0; i < n_target_val; i++) {
799 name = var_target_val[i]
800 print " ptr->" name" = (" var_target_val_type[i] ") bp_unpack_value (bp, 64);";
801}
802
803print "}";
804
689babb3 805n_opt_val = 4;
54f880b2 806var_opt_val[0] = "x_optimize"
807var_opt_val_type[0] = "char "
4d502758 808var_opt_hash[0] = 1;
54f880b2 809var_opt_val[1] = "x_optimize_size"
689babb3 810var_opt_val_type[1] = "char "
4d502758 811var_opt_hash[1] = 1;
bfedbed1 812var_opt_val[2] = "x_optimize_debug"
bfedbed1 813var_opt_val_type[2] = "char "
689babb3 814var_opt_hash[2] = 1;
815var_opt_val[3] = "x_optimize_fast"
816var_opt_val_type[3] = "char "
817var_opt_hash[3] = 1;
54f880b2 818for (i = 0; i < n_opts; i++) {
05d8c5f8 819 if (flag_set_p("(Optimization|PerFunction)", flags[i])) {
54f880b2 820 name = var_name(flags[i])
821 if(name == "")
822 continue;
823
824 if(name in var_opt_list_seen)
825 continue;
826
827 var_opt_list_seen[name]++;
828
829 otype = var_type_struct(flags[i])
830 var_opt_val_type[n_opt_val] = otype;
4d502758 831 var_opt_val[n_opt_val] = "x_" name;
05d8c5f8 832 var_opt_hash[n_opt_val] = flag_set_p("Optimization", flags[i]);
4d502758 833 n_opt_val++;
54f880b2 834 }
835}
836print "";
837print "/* Hash optimization options */";
838print "hashval_t";
839print "cl_optimization_hash (struct cl_optimization const *ptr ATTRIBUTE_UNUSED)";
840print "{";
841print " inchash::hash hstate;";
842for (i = 0; i < n_opt_val; i++) {
05d8c5f8 843 if (!var_opt_hash[i])
844 continue;
54f880b2 845 name = var_opt_val[i]
6848a0ae 846 otype = var_opt_val_type[i];
847 if (otype ~ "^const char \\**$")
848 {
849 print " if (ptr->" name")";
850 print " hstate.add (ptr->" name", strlen (ptr->" name"));";
851 print " else";
852 print " hstate.add_int (0);";
853 }
854 else
855 print " hstate.add_hwi (ptr->" name");";
54f880b2 856}
857print " return hstate.end ();";
858print "}";
859
6848a0ae 860print "";
861print "/* Compare two optimization options */";
862print "bool";
863print "cl_optimization_option_eq (cl_optimization const *ptr1,";
864print " cl_optimization const *ptr2)";
865print "{";
866for (i = 0; i < n_opt_val; i++) {
867 if (!var_opt_hash[i])
868 continue;
869 name = var_opt_val[i]
870 otype = var_opt_val_type[i];
871 if (otype ~ "^const char \\**$")
872 {
873 print " if (ptr1->" name" != ptr2->" name;
874 print " && (!ptr1->" name" || !ptr2->" name
875 print " || strcmp (ptr1->" name", ptr2->" name ")))";
876 print " return false;";
877 }
878 else
879 {
880 print " if (ptr1->" name" != ptr2->" name ")";
881 print " return false;";
882 }
883}
884print " return true;";
885print "}";
886
54f880b2 887print "";
888print "/* Stream out optimization options */";
889print "void";
6848a0ae 890print "cl_optimization_stream_out (struct output_block *ob,";
891print " struct bitpack_d *bp,";
54f880b2 892print " struct cl_optimization *ptr)";
893print "{";
894for (i = 0; i < n_opt_val; i++) {
895 name = var_opt_val[i]
6848a0ae 896 otype = var_opt_val_type[i];
897 if (otype ~ "^const char \\**$")
898 print " bp_pack_string (ob, bp, ptr->" name", true);";
899 else
900 print " bp_pack_value (bp, ptr->" name", 64);";
54f880b2 901}
902print "}";
903
904print "";
905print "/* Stream in optimization options */";
906print "void";
6848a0ae 907print "cl_optimization_stream_in (struct data_in *data_in ATTRIBUTE_UNUSED,";
908print " struct bitpack_d *bp ATTRIBUTE_UNUSED,";
909print " struct cl_optimization *ptr ATTRIBUTE_UNUSED)";
54f880b2 910print "{";
911for (i = 0; i < n_opt_val; i++) {
912 name = var_opt_val[i]
6848a0ae 913 otype = var_opt_val_type[i];
914 if (otype ~ "^const char \\**$")
915 {
916 print " ptr->" name" = bp_unpack_string (data_in, bp);";
917 print " if (ptr->" name")";
918 print " ptr->" name" = xstrdup (ptr->" name");";
919 }
920 else
921 print " ptr->" name" = (" var_opt_val_type[i] ") bp_unpack_value (bp, 64);";
54f880b2 922}
923print "}";
0bfbe373 924}