annotate gcc/optc-save-gen.awk @ 120:f93fa5091070

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