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