annotate gcc/optc-save-gen.awk @ 144:8f4e72ab4e11

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