Mercurial > hg > CbC > CbC_gcc
comparison gcc/optc-gen.awk @ 69:1b10fe6932e1
merge 69
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 21 Aug 2011 07:53:12 +0900 |
parents | f6334be47118 |
children | 04ced10e8804 |
comparison
equal
deleted
inserted
replaced
66:b362627d71ba | 69:1b10fe6932e1 |
---|---|
1 # Copyright (C) 2003, 2004, 2007, 2008, 2009 Free Software Foundation, Inc. | 1 # Copyright (C) 2003, 2004, 2007, 2008, 2009, 2010, 2011 |
2 # Free Software Foundation, Inc. | |
2 # Contributed by Kelley Cook, June 2004. | 3 # Contributed by Kelley Cook, June 2004. |
3 # Original code from Neil Booth, May 2003. | 4 # Original code from Neil Booth, May 2003. |
4 # | 5 # |
5 # This program is free software; you can redistribute it and/or modify it | 6 # This program is free software; you can redistribute it and/or modify it |
6 # under the terms of the GNU General Public License as published by the | 7 # under the terms of the GNU General Public License as published by the |
27 | 28 |
28 BEGIN { | 29 BEGIN { |
29 n_opts = 0 | 30 n_opts = 0 |
30 n_langs = 0 | 31 n_langs = 0 |
31 n_target_save = 0 | 32 n_target_save = 0 |
32 quote = "\042" | 33 n_extra_vars = 0 |
34 n_extra_target_vars = 0 | |
35 n_extra_c_includes = 0 | |
36 n_extra_h_includes = 0 | |
37 n_enums = 0 | |
38 quote = "\042" | |
33 comma = "," | 39 comma = "," |
34 FS=SUBSEP | 40 FS=SUBSEP |
35 # Default the name of header created from opth-gen.awk to options.h | 41 # Default the name of header created from opth-gen.awk to options.h |
36 if (header_name == "") header_name="options.h" | 42 if (header_name == "") header_name="options.h" |
37 } | 43 } |
44 } | 50 } |
45 else if ($1 == "TargetSave") { | 51 else if ($1 == "TargetSave") { |
46 # Make sure the declarations are put in source order | 52 # Make sure the declarations are put in source order |
47 target_save_decl[n_target_save] = $2 | 53 target_save_decl[n_target_save] = $2 |
48 n_target_save++ | 54 n_target_save++ |
55 } | |
56 else if ($1 == "Variable") { | |
57 extra_vars[n_extra_vars] = $2 | |
58 n_extra_vars++ | |
59 } | |
60 else if ($1 == "TargetVariable") { | |
61 # Combination of TargetSave and Variable | |
62 extra_vars[n_extra_vars] = $2 | |
63 n_extra_vars++ | |
64 | |
65 var = $2 | |
66 sub(" *=.*", "", var) | |
67 orig_var = var | |
68 name = var | |
69 type = var | |
70 sub("^.*[ *]", "", name) | |
71 sub(" *" name "$", "", type) | |
72 target_save_decl[n_target_save] = type " x_" name | |
73 n_target_save++ | |
74 | |
75 extra_target_vars[n_extra_target_vars] = name | |
76 n_extra_target_vars++; | |
77 } | |
78 else if ($1 == "HeaderInclude") { | |
79 extra_h_includes[n_extra_h_includes++] = $2; | |
80 } | |
81 else if ($1 == "SourceInclude") { | |
82 extra_c_includes[n_extra_c_includes++] = $2; | |
83 } | |
84 else if ($1 == "Enum") { | |
85 props = $2 | |
86 name = opt_args("Name", props) | |
87 type = opt_args("Type", props) | |
88 unknown_error = opt_args("UnknownError", props) | |
89 enum_names[n_enums] = name | |
90 enum_type[name] = type | |
91 enum_index[name] = n_enums | |
92 enum_unknown_error[name] = unknown_error | |
93 enum_help[name] = $3 | |
94 n_enums++ | |
95 } | |
96 else if ($1 == "EnumValue") { | |
97 props = $2 | |
98 enum_name = opt_args("Enum", props) | |
99 string = opt_args("String", props) | |
100 value = opt_args("Value", props) | |
101 val_flags = "0" | |
102 val_flags = val_flags \ | |
103 test_flag("Canonical", props, "| CL_ENUM_CANONICAL") \ | |
104 test_flag("DriverOnly", props, "| CL_ENUM_DRIVER_ONLY") | |
105 enum_data[enum_name] = enum_data[enum_name] \ | |
106 " { " quote string quote ", " value ", " val_flags \ | |
107 " },\n" | |
49 } | 108 } |
50 else { | 109 else { |
51 name = opt_args("Mask", $1) | 110 name = opt_args("Mask", $1) |
52 if (name == "") { | 111 if (name == "") { |
53 opts[n_opts] = $1 | 112 opts[n_opts] = $1 |
68 for (i = 1; i <= n_headers; i++) | 127 for (i = 1; i <= n_headers; i++) |
69 print "#include " quote headers[i] quote | 128 print "#include " quote headers[i] quote |
70 print "#include " quote "opts.h" quote | 129 print "#include " quote "opts.h" quote |
71 print "#include " quote "intl.h" quote | 130 print "#include " quote "intl.h" quote |
72 print "" | 131 print "" |
73 print "#ifdef GCC_DRIVER" | 132 print "#ifndef GCC_DRIVER" |
74 print "int target_flags;" | |
75 print "#else" | |
76 print "#include " quote "flags.h" quote | 133 print "#include " quote "flags.h" quote |
77 print "#include " quote "target.h" quote | 134 print "#include " quote "target.h" quote |
78 print "#endif /* GCC_DRIVER */" | 135 print "#endif /* GCC_DRIVER */" |
79 print "" | 136 print "" |
80 | 137 |
138 if (n_extra_c_includes > 0) { | |
139 for (i = 0; i < n_extra_c_includes; i++) { | |
140 print "#include " quote extra_c_includes[i] quote | |
141 } | |
142 print "" | |
143 } | |
144 | |
145 for (i = 0; i < n_enums; i++) { | |
146 name = enum_names[i] | |
147 type = enum_type[name] | |
148 print "static const struct cl_enum_arg cl_enum_" name \ | |
149 "_data[] = " | |
150 print "{" | |
151 print enum_data[name] " { NULL, 0, 0 }" | |
152 print "};" | |
153 print "" | |
154 print "static void" | |
155 print "cl_enum_" name "_set (void *var, int value)" | |
156 print "{" | |
157 print " *((" type " *) var) = (" type ") value;" | |
158 print "}" | |
159 print "" | |
160 print "static int" | |
161 print "cl_enum_" name "_get (const void *var)" | |
162 print "{" | |
163 print " return (int) *((const " type " *) var);" | |
164 print "}" | |
165 print "" | |
166 } | |
167 | |
168 print "const struct cl_enum cl_enums[] =" | |
169 print "{" | |
170 for (i = 0; i < n_enums; i++) { | |
171 name = enum_names[i] | |
172 ehelp = enum_help[name] | |
173 if (ehelp == "") | |
174 ehelp = "NULL" | |
175 else | |
176 ehelp = quote ehelp quote | |
177 unknown_error = enum_unknown_error[name] | |
178 if (unknown_error == "") | |
179 unknown_error = "NULL" | |
180 else | |
181 unknown_error = quote unknown_error quote | |
182 print " {" | |
183 print " " ehelp "," | |
184 print " " unknown_error "," | |
185 print " cl_enum_" name "_data," | |
186 print " sizeof (" enum_type[name] ")," | |
187 print " cl_enum_" name "_set," | |
188 print " cl_enum_" name "_get" | |
189 print " }," | |
190 } | |
191 print "};" | |
192 print "const unsigned int cl_enums_count = " n_enums ";" | |
193 print "" | |
194 | |
81 have_save = 0; | 195 have_save = 0; |
196 if (n_extra_target_vars) | |
197 have_save = 1 | |
198 | |
199 print "const struct gcc_options global_options_init =\n{" | |
200 for (i = 0; i < n_extra_vars; i++) { | |
201 var = extra_vars[i] | |
202 init = extra_vars[i] | |
203 if (var ~ "=" ) { | |
204 sub(".*= *", "", init) | |
205 sub(" *=.*", "", var) | |
206 sub("^.*[ *]", "", var) | |
207 sub("\\[.*\\]$", "", var) | |
208 } else { | |
209 init = "0" | |
210 } | |
211 var_seen[var] = 1 | |
212 print " " init ", /* " var " */" | |
213 } | |
82 for (i = 0; i < n_opts; i++) { | 214 for (i = 0; i < n_opts; i++) { |
83 if (flag_set_p("Save", flags[i])) | 215 if (flag_set_p("Save", flags[i])) |
84 have_save = 1; | 216 have_save = 1; |
85 | 217 |
86 name = var_name(flags[i]); | 218 name = var_name(flags[i]); |
87 if (name == "") | 219 if (name == "") |
88 continue; | 220 continue; |
89 | 221 |
90 if (flag_set_p("VarExists", flags[i])) { | 222 init = opt_args("Init", flags[i]) |
91 # Need it for the gcc driver. | 223 if (init != "") { |
92 if (name in var_seen) | 224 if (name in var_init && var_init[name] != init) |
93 continue; | 225 print "#error multiple initializers for " name |
94 init = "" | 226 var_init[name] = init |
95 gcc_driver = 1 | 227 } |
96 } | 228 } |
97 else { | 229 for (i = 0; i < n_opts; i++) { |
98 init = opt_args("Init", flags[i]) | 230 name = var_name(flags[i]); |
99 if (init != "") | 231 if (name == "") |
100 init = " = " init; | 232 continue; |
101 else if (name in var_seen) | 233 |
102 continue; | 234 if (name in var_seen) |
103 gcc_driver = 0 | 235 continue; |
104 } | 236 |
105 | 237 if (name in var_init) |
106 if (gcc_driver == 1) | 238 init = var_init[name] |
107 print "#ifdef GCC_DRIVER" | 239 else |
108 print "/* Set by -" opts[i] "." | 240 init = "0" |
109 print " " help[i] " */" | 241 |
110 print var_type(flags[i]) name init ";" | 242 print " " init ", /* " name " */" |
111 if (gcc_driver == 1) | |
112 print "#endif /* GCC_DRIVER */" | |
113 print "" | |
114 | 243 |
115 var_seen[name] = 1; | 244 var_seen[name] = 1; |
116 } | 245 } |
117 | |
118 print "" | |
119 print "/* Local state variables. */" | |
120 for (i = 0; i < n_opts; i++) { | 246 for (i = 0; i < n_opts; i++) { |
121 name = static_var(opts[i], flags[i]); | 247 name = static_var(opts[i], flags[i]); |
122 if (name != "") | 248 if (name != "") { |
123 print "static " var_type(flags[i]) name ";" | 249 print " 0, /* " name " (private state) */" |
124 } | 250 print "#undef x_" name |
251 } | |
252 } | |
253 for (i = 0; i < n_opts; i++) { | |
254 if (flag_set_p("SetByCombined", flags[i])) | |
255 print " false, /* frontend_set_" var_name(flags[i]) " */" | |
256 } | |
257 print "};" | |
258 print "" | |
259 print "struct gcc_options global_options;" | |
260 print "struct gcc_options global_options_set;" | |
125 print "" | 261 print "" |
126 | 262 |
127 print "const char * const lang_names[] =\n{" | 263 print "const char * const lang_names[] =\n{" |
128 for (i = 0; i < n_langs; i++) { | 264 for (i = 0; i < n_langs; i++) { |
129 macros[i] = "CL_" langs[i] | 265 macros[i] = "CL_" langs[i] |
130 gsub( "[^A-Za-z0-9_]", "X", macros[i] ) | 266 gsub( "[^" alnum "_]", "X", macros[i] ) |
131 s = substr(" ", length (macros[i])) | 267 s = substr(" ", length (macros[i])) |
132 print " " quote langs[i] quote "," | 268 print " " quote langs[i] quote "," |
133 } | 269 } |
134 | 270 |
135 print " 0\n};\n" | 271 print " 0\n};\n" |
167 while( i + 1 != n_opts && opts[i] == opts[i + 1] ) { | 303 while( i + 1 != n_opts && opts[i] == opts[i + 1] ) { |
168 i++; | 304 i++; |
169 } | 305 } |
170 | 306 |
171 len = length (opts[i]); | 307 len = length (opts[i]); |
172 enum = "OPT_" opts[i] | 308 enum = opt_enum(opts[i]) |
173 if (opts[i] == "finline-limit=" || opts[i] == "Wlarger-than=") | |
174 enum = enum "eq" | |
175 gsub ("[^A-Za-z0-9]", "_", enum) | |
176 | 309 |
177 # If this switch takes joined arguments, back-chain all | 310 # If this switch takes joined arguments, back-chain all |
178 # subsequent switches to it for which it is a prefix. If | 311 # subsequent switches to it for which it is a prefix. If |
179 # a later switch S is a longer prefix of a switch T, T | 312 # a later switch S is a longer prefix of a switch T, T |
180 # will be back-chained to S in a later iteration of this | 313 # will be back-chained to S in a later iteration of this |
193 | 326 |
194 if (help[i] == "") | 327 if (help[i] == "") |
195 hlp = "0" | 328 hlp = "0" |
196 else | 329 else |
197 hlp = quote help[i] quote; | 330 hlp = quote help[i] quote; |
331 | |
332 missing_arg_error = opt_args("MissingArgError", flags[i]) | |
333 if (missing_arg_error == "") | |
334 missing_arg_error = "0" | |
335 else | |
336 missing_arg_error = quote missing_arg_error quote | |
337 | |
338 | |
339 warn_message = opt_args("Warn", flags[i]) | |
340 if (warn_message == "") | |
341 warn_message = "0" | |
342 else | |
343 warn_message = quote warn_message quote | |
344 | |
345 alias_arg = opt_args("Alias", flags[i]) | |
346 if (alias_arg == "") { | |
347 if (flag_set_p("Ignore", flags[i])) | |
348 alias_data = "NULL, NULL, OPT_SPECIAL_ignore" | |
349 else | |
350 alias_data = "NULL, NULL, N_OPTS" | |
351 } else { | |
352 alias_opt = nth_arg(0, alias_arg) | |
353 alias_posarg = nth_arg(1, alias_arg) | |
354 alias_negarg = nth_arg(2, alias_arg) | |
355 | |
356 if (var_ref(opts[i], flags[i]) != "-1") | |
357 print "#error Alias setting variable" | |
358 | |
359 if (alias_posarg != "" && alias_negarg == "") { | |
360 if (!flag_set_p("RejectNegative", flags[i]) \ | |
361 && opts[i] ~ "^[Wfm]") | |
362 print "#error Alias with single argument " \ | |
363 "allowing negative form" | |
364 } | |
365 | |
366 alias_opt = opt_enum(alias_opt) | |
367 if (alias_posarg == "") | |
368 alias_posarg = "NULL" | |
369 else | |
370 alias_posarg = quote alias_posarg quote | |
371 if (alias_negarg == "") | |
372 alias_negarg = "NULL" | |
373 else | |
374 alias_negarg = quote alias_negarg quote | |
375 alias_data = alias_posarg ", " alias_negarg ", " alias_opt | |
376 } | |
198 | 377 |
199 neg = opt_args("Negative", flags[i]); | 378 neg = opt_args("Negative", flags[i]); |
200 if (neg != "") | 379 if (neg != "") |
201 idx = indices[neg] | 380 idx = indices[neg] |
202 else { | 381 else { |
209 idx = -1; | 388 idx = -1; |
210 } | 389 } |
211 } | 390 } |
212 # Split the printf after %u to work around an ia64-hp-hpux11.23 | 391 # Split the printf after %u to work around an ia64-hp-hpux11.23 |
213 # awk bug. | 392 # awk bug. |
214 printf(" { %c-%s%c,\n %s,\n %s, %u,", | 393 printf(" { %c-%s%c,\n %s,\n %s,\n %s,\n %s, %s, %u,", |
215 quote, opts[i], quote, hlp, back_chain[i], len) | 394 quote, opts[i], quote, hlp, missing_arg_error, warn_message, |
395 alias_data, back_chain[i], len) | |
216 printf(" %d,\n", idx) | 396 printf(" %d,\n", idx) |
217 condition = opt_args("Condition", flags[i]) | 397 condition = opt_args("Condition", flags[i]) |
218 cl_flags = switch_flags(flags[i]) | 398 cl_flags = switch_flags(flags[i]) |
219 if (condition != "") | 399 if (condition != "") |
220 printf("#if %s\n" \ | 400 printf("#if %s\n" \ |
234 print ""; | 414 print ""; |
235 print "#if !defined(GCC_DRIVER) && !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS)" | 415 print "#if !defined(GCC_DRIVER) && !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS)" |
236 print ""; | 416 print ""; |
237 print "/* Save optimization variables into a structure. */" | 417 print "/* Save optimization variables into a structure. */" |
238 print "void"; | 418 print "void"; |
239 print "cl_optimization_save (struct cl_optimization *ptr)"; | 419 print "cl_optimization_save (struct cl_optimization *ptr, struct gcc_options *opts)"; |
240 print "{"; | 420 print "{"; |
241 | 421 |
242 n_opt_char = 2; | 422 n_opt_char = 2; |
243 n_opt_short = 0; | 423 n_opt_short = 0; |
244 n_opt_int = 0; | 424 n_opt_int = 0; |
425 n_opt_enum = 1; | |
245 n_opt_other = 0; | 426 n_opt_other = 0; |
246 var_opt_char[0] = "optimize"; | 427 var_opt_char[0] = "optimize"; |
247 var_opt_char[1] = "optimize_size"; | 428 var_opt_char[1] = "optimize_size"; |
248 var_opt_range["optimize"] = "0, 255"; | 429 var_opt_range["optimize"] = "0, 255"; |
249 var_opt_range["optimize_size"] = "0, 255"; | 430 var_opt_range["optimize_size"] = "0, 255"; |
431 var_opt_enum[0] = "flag_fp_contract_mode"; | |
250 | 432 |
251 # Sort by size to mimic how the structure is laid out to be friendlier to the | 433 # Sort by size to mimic how the structure is laid out to be friendlier to the |
252 # cache. | 434 # cache. |
253 | 435 |
254 for (i = 0; i < n_opts; i++) { | 436 for (i = 0; i < n_opts; i++) { |
265 if (otype ~ "^((un)?signed +)?int *$") | 447 if (otype ~ "^((un)?signed +)?int *$") |
266 var_opt_int[n_opt_int++] = name; | 448 var_opt_int[n_opt_int++] = name; |
267 | 449 |
268 else if (otype ~ "^((un)?signed +)?short *$") | 450 else if (otype ~ "^((un)?signed +)?short *$") |
269 var_opt_short[n_opt_short++] = name; | 451 var_opt_short[n_opt_short++] = name; |
452 | |
453 else if (otype ~ ("^enum +[_" alnum "]+ *")) | |
454 var_opt_enum[n_opt_enum++] = name; | |
270 | 455 |
271 else if (otype ~ "^((un)?signed +)?char *$") { | 456 else if (otype ~ "^((un)?signed +)?char *$") { |
272 var_opt_char[n_opt_char++] = name; | 457 var_opt_char[n_opt_char++] = name; |
273 if (otype ~ "^unsigned +char *$") | 458 if (otype ~ "^unsigned +char *$") |
274 var_opt_range[name] = "0, 255" | 459 var_opt_range[name] = "0, 255" |
281 } | 466 } |
282 | 467 |
283 for (i = 0; i < n_opt_char; i++) { | 468 for (i = 0; i < n_opt_char; i++) { |
284 name = var_opt_char[i]; | 469 name = var_opt_char[i]; |
285 if (var_opt_range[name] != "") | 470 if (var_opt_range[name] != "") |
286 print " gcc_assert (IN_RANGE (" name ", " var_opt_range[name] "));"; | 471 print " gcc_assert (IN_RANGE (opts->x_" name ", " var_opt_range[name] "));"; |
287 } | 472 } |
288 | 473 |
289 print ""; | 474 print ""; |
290 for (i = 0; i < n_opt_other; i++) { | 475 for (i = 0; i < n_opt_other; i++) { |
291 print " ptr->" var_opt_other[i] " = " var_opt_other[i] ";"; | 476 print " ptr->x_" var_opt_other[i] " = opts->x_" var_opt_other[i] ";"; |
292 } | 477 } |
293 | 478 |
294 for (i = 0; i < n_opt_int; i++) { | 479 for (i = 0; i < n_opt_int; i++) { |
295 print " ptr->" var_opt_int[i] " = " var_opt_int[i] ";"; | 480 print " ptr->x_" var_opt_int[i] " = opts->x_" var_opt_int[i] ";"; |
481 } | |
482 | |
483 for (i = 0; i < n_opt_enum; i++) { | |
484 print " ptr->x_" var_opt_enum[i] " = opts->x_" var_opt_enum[i] ";"; | |
296 } | 485 } |
297 | 486 |
298 for (i = 0; i < n_opt_short; i++) { | 487 for (i = 0; i < n_opt_short; i++) { |
299 print " ptr->" var_opt_short[i] " = " var_opt_short[i] ";"; | 488 print " ptr->x_" var_opt_short[i] " = opts->x_" var_opt_short[i] ";"; |
300 } | 489 } |
301 | 490 |
302 for (i = 0; i < n_opt_char; i++) { | 491 for (i = 0; i < n_opt_char; i++) { |
303 print " ptr->" var_opt_char[i] " = " var_opt_char[i] ";"; | 492 print " ptr->x_" var_opt_char[i] " = opts->x_" var_opt_char[i] ";"; |
304 } | 493 } |
305 | 494 |
306 print "}"; | 495 print "}"; |
307 | 496 |
308 print ""; | 497 print ""; |
309 print "/* Restore optimization options from a structure. */"; | 498 print "/* Restore optimization options from a structure. */"; |
310 print "void"; | 499 print "void"; |
311 print "cl_optimization_restore (struct cl_optimization *ptr)"; | 500 print "cl_optimization_restore (struct gcc_options *opts, struct cl_optimization *ptr)"; |
312 print "{"; | 501 print "{"; |
313 | 502 |
314 for (i = 0; i < n_opt_other; i++) { | 503 for (i = 0; i < n_opt_other; i++) { |
315 print " " var_opt_other[i] " = ptr->" var_opt_other[i] ";"; | 504 print " opts->x_" var_opt_other[i] " = ptr->x_" var_opt_other[i] ";"; |
316 } | 505 } |
317 | 506 |
318 for (i = 0; i < n_opt_int; i++) { | 507 for (i = 0; i < n_opt_int; i++) { |
319 print " " var_opt_int[i] " = ptr->" var_opt_int[i] ";"; | 508 print " opts->x_" var_opt_int[i] " = ptr->x_" var_opt_int[i] ";"; |
509 } | |
510 | |
511 for (i = 0; i < n_opt_enum; i++) { | |
512 print " opts->x_" var_opt_enum[i] " = ptr->x_" var_opt_enum[i] ";"; | |
320 } | 513 } |
321 | 514 |
322 for (i = 0; i < n_opt_short; i++) { | 515 for (i = 0; i < n_opt_short; i++) { |
323 print " " var_opt_short[i] " = ptr->" var_opt_short[i] ";"; | 516 print " opts->x_" var_opt_short[i] " = ptr->x_" var_opt_short[i] ";"; |
324 } | 517 } |
325 | 518 |
326 for (i = 0; i < n_opt_char; i++) { | 519 for (i = 0; i < n_opt_char; i++) { |
327 print " " var_opt_char[i] " = ptr->" var_opt_char[i] ";"; | 520 print " opts->x_" var_opt_char[i] " = ptr->x_" var_opt_char[i] ";"; |
328 } | 521 } |
329 | 522 |
330 print " targetm.override_options_after_change ();"; | 523 print " targetm.override_options_after_change ();"; |
331 print "}"; | 524 print "}"; |
332 | 525 |
338 print " struct cl_optimization *ptr)"; | 531 print " struct cl_optimization *ptr)"; |
339 print "{"; | 532 print "{"; |
340 | 533 |
341 print " fputs (\"\\n\", file);"; | 534 print " fputs (\"\\n\", file);"; |
342 for (i = 0; i < n_opt_other; i++) { | 535 for (i = 0; i < n_opt_other; i++) { |
343 print " if (ptr->" var_opt_other[i] ")"; | 536 print " if (ptr->x_" var_opt_other[i] ")"; |
344 print " fprintf (file, \"%*s%s (0x%lx)\\n\","; | 537 print " fprintf (file, \"%*s%s (%#lx)\\n\","; |
345 print " indent_to, \"\","; | 538 print " indent_to, \"\","; |
346 print " \"" var_opt_other[i] "\","; | 539 print " \"" var_opt_other[i] "\","; |
347 print " (unsigned long)ptr->" var_opt_other[i] ");"; | 540 print " (unsigned long)ptr->x_" var_opt_other[i] ");"; |
348 print ""; | 541 print ""; |
349 } | 542 } |
350 | 543 |
351 for (i = 0; i < n_opt_int; i++) { | 544 for (i = 0; i < n_opt_int; i++) { |
352 print " if (ptr->" var_opt_int[i] ")"; | 545 print " if (ptr->x_" var_opt_int[i] ")"; |
353 print " fprintf (file, \"%*s%s (0x%x)\\n\","; | 546 print " fprintf (file, \"%*s%s (%#x)\\n\","; |
354 print " indent_to, \"\","; | 547 print " indent_to, \"\","; |
355 print " \"" var_opt_int[i] "\","; | 548 print " \"" var_opt_int[i] "\","; |
356 print " ptr->" var_opt_int[i] ");"; | 549 print " ptr->x_" var_opt_int[i] ");"; |
550 print ""; | |
551 } | |
552 | |
553 for (i = 0; i < n_opt_enum; i++) { | |
554 print " fprintf (file, \"%*s%s (%#x)\\n\","; | |
555 print " indent_to, \"\","; | |
556 print " \"" var_opt_enum[i] "\","; | |
557 print " (int) ptr->x_" var_opt_enum[i] ");"; | |
357 print ""; | 558 print ""; |
358 } | 559 } |
359 | 560 |
360 for (i = 0; i < n_opt_short; i++) { | 561 for (i = 0; i < n_opt_short; i++) { |
361 print " if (ptr->" var_opt_short[i] ")"; | 562 print " if (ptr->x_" var_opt_short[i] ")"; |
362 print " fprintf (file, \"%*s%s (0x%x)\\n\","; | 563 print " fprintf (file, \"%*s%s (%#x)\\n\","; |
363 print " indent_to, \"\","; | 564 print " indent_to, \"\","; |
364 print " \"" var_opt_short[i] "\","; | 565 print " \"" var_opt_short[i] "\","; |
365 print " ptr->" var_opt_short[i] ");"; | 566 print " ptr->x_" var_opt_short[i] ");"; |
366 print ""; | 567 print ""; |
367 } | 568 } |
368 | 569 |
369 for (i = 0; i < n_opt_char; i++) { | 570 for (i = 0; i < n_opt_char; i++) { |
370 print " if (ptr->" var_opt_char[i] ")"; | 571 print " if (ptr->x_" var_opt_char[i] ")"; |
371 print " fprintf (file, \"%*s%s (0x%x)\\n\","; | 572 print " fprintf (file, \"%*s%s (%#x)\\n\","; |
372 print " indent_to, \"\","; | 573 print " indent_to, \"\","; |
373 print " \"" var_opt_char[i] "\","; | 574 print " \"" var_opt_char[i] "\","; |
374 print " ptr->" var_opt_char[i] ");"; | 575 print " ptr->x_" var_opt_char[i] ");"; |
375 print ""; | 576 print ""; |
376 } | 577 } |
377 | 578 |
378 print "}"; | 579 print "}"; |
379 | 580 |
380 print ""; | 581 print ""; |
381 print "/* Save selected option variables into a structure. */" | 582 print "/* Save selected option variables into a structure. */" |
382 print "void"; | 583 print "void"; |
383 print "cl_target_option_save (struct cl_target_option *ptr)"; | 584 print "cl_target_option_save (struct cl_target_option *ptr, struct gcc_options *opts)"; |
384 print "{"; | 585 print "{"; |
385 | 586 |
386 n_target_char = 0; | 587 n_target_char = 0; |
387 n_target_short = 0; | 588 n_target_short = 0; |
388 n_target_int = 0; | 589 n_target_int = 0; |
590 n_target_enum = 0; | |
389 n_target_other = 0; | 591 n_target_other = 0; |
390 | 592 |
391 if (have_save) { | 593 if (have_save) { |
392 for (i = 0; i < n_opts; i++) { | 594 for (i = 0; i < n_opts; i++) { |
393 if (flag_set_p("Save", flags[i])) { | 595 if (flag_set_p("Save", flags[i])) { |
403 if (otype ~ "^((un)?signed +)?int *$") | 605 if (otype ~ "^((un)?signed +)?int *$") |
404 var_target_int[n_target_int++] = name; | 606 var_target_int[n_target_int++] = name; |
405 | 607 |
406 else if (otype ~ "^((un)?signed +)?short *$") | 608 else if (otype ~ "^((un)?signed +)?short *$") |
407 var_target_short[n_target_short++] = name; | 609 var_target_short[n_target_short++] = name; |
610 | |
611 else if (otype ~ ("^enum +[_" alnum "]+ *$")) | |
612 var_target_enum[n_target_enum++] = name; | |
408 | 613 |
409 else if (otype ~ "^((un)?signed +)?char *$") { | 614 else if (otype ~ "^((un)?signed +)?char *$") { |
410 var_target_char[n_target_char++] = name; | 615 var_target_char[n_target_char++] = name; |
411 if (otype ~ "^unsigned +char *$") | 616 if (otype ~ "^unsigned +char *$") |
412 var_target_range[name] = "0, 255" | 617 var_target_range[name] = "0, 255" |
424 have_assert = 0; | 629 have_assert = 0; |
425 for (i = 0; i < n_target_char; i++) { | 630 for (i = 0; i < n_target_char; i++) { |
426 name = var_target_char[i]; | 631 name = var_target_char[i]; |
427 if (var_target_range[name] != "") { | 632 if (var_target_range[name] != "") { |
428 have_assert = 1; | 633 have_assert = 1; |
429 print " gcc_assert (IN_RANGE (" name ", " var_target_range[name] "));"; | 634 print " gcc_assert (IN_RANGE (opts->x_" name ", " var_target_range[name] "));"; |
430 } | 635 } |
431 } | 636 } |
432 | 637 |
433 if (have_assert) | 638 if (have_assert) |
434 print ""; | 639 print ""; |
435 | 640 |
436 print " if (targetm.target_option.save)"; | 641 print " if (targetm.target_option.save)"; |
437 print " targetm.target_option.save (ptr);"; | 642 print " targetm.target_option.save (ptr);"; |
438 print ""; | 643 print ""; |
439 | 644 |
645 for (i = 0; i < n_extra_target_vars; i++) { | |
646 print " ptr->x_" extra_target_vars[i] " = opts->x_" extra_target_vars[i] ";"; | |
647 } | |
648 | |
440 for (i = 0; i < n_target_other; i++) { | 649 for (i = 0; i < n_target_other; i++) { |
441 print " ptr->" var_target_other[i] " = " var_target_other[i] ";"; | 650 print " ptr->x_" var_target_other[i] " = opts->x_" var_target_other[i] ";"; |
651 } | |
652 | |
653 for (i = 0; i < n_target_enum; i++) { | |
654 print " ptr->x_" var_target_enum[i] " = opts->x_" var_target_enum[i] ";"; | |
442 } | 655 } |
443 | 656 |
444 for (i = 0; i < n_target_int; i++) { | 657 for (i = 0; i < n_target_int; i++) { |
445 print " ptr->" var_target_int[i] " = " var_target_int[i] ";"; | 658 print " ptr->x_" var_target_int[i] " = opts->x_" var_target_int[i] ";"; |
446 } | 659 } |
447 | 660 |
448 for (i = 0; i < n_target_short; i++) { | 661 for (i = 0; i < n_target_short; i++) { |
449 print " ptr->" var_target_short[i] " = " var_target_short[i] ";"; | 662 print " ptr->x_" var_target_short[i] " = opts->x_" var_target_short[i] ";"; |
450 } | 663 } |
451 | 664 |
452 for (i = 0; i < n_target_char; i++) { | 665 for (i = 0; i < n_target_char; i++) { |
453 print " ptr->" var_target_char[i] " = " var_target_char[i] ";"; | 666 print " ptr->x_" var_target_char[i] " = opts->x_" var_target_char[i] ";"; |
454 } | 667 } |
455 | 668 |
456 print "}"; | 669 print "}"; |
457 | 670 |
458 print ""; | 671 print ""; |
459 print "/* Restore selected current options from a structure. */"; | 672 print "/* Restore selected current options from a structure. */"; |
460 print "void"; | 673 print "void"; |
461 print "cl_target_option_restore (struct cl_target_option *ptr)"; | 674 print "cl_target_option_restore (struct gcc_options *opts, struct cl_target_option *ptr)"; |
462 print "{"; | 675 print "{"; |
463 | 676 |
677 for (i = 0; i < n_extra_target_vars; i++) { | |
678 print " opts->x_" extra_target_vars[i] " = ptr->x_" extra_target_vars[i] ";"; | |
679 } | |
680 | |
464 for (i = 0; i < n_target_other; i++) { | 681 for (i = 0; i < n_target_other; i++) { |
465 print " " var_target_other[i] " = ptr->" var_target_other[i] ";"; | 682 print " opts->x_" var_target_other[i] " = ptr->x_" var_target_other[i] ";"; |
683 } | |
684 | |
685 for (i = 0; i < n_target_enum; i++) { | |
686 print " opts->x_" var_target_enum[i] " = ptr->x_" var_target_enum[i] ";"; | |
466 } | 687 } |
467 | 688 |
468 for (i = 0; i < n_target_int; i++) { | 689 for (i = 0; i < n_target_int; i++) { |
469 print " " var_target_int[i] " = ptr->" var_target_int[i] ";"; | 690 print " opts->x_" var_target_int[i] " = ptr->x_" var_target_int[i] ";"; |
470 } | 691 } |
471 | 692 |
472 for (i = 0; i < n_target_short; i++) { | 693 for (i = 0; i < n_target_short; i++) { |
473 print " " var_target_short[i] " = ptr->" var_target_short[i] ";"; | 694 print " opts->x_" var_target_short[i] " = ptr->x_" var_target_short[i] ";"; |
474 } | 695 } |
475 | 696 |
476 for (i = 0; i < n_target_char; i++) { | 697 for (i = 0; i < n_target_char; i++) { |
477 print " " var_target_char[i] " = ptr->" var_target_char[i] ";"; | 698 print " opts->x_" var_target_char[i] " = ptr->x_" var_target_char[i] ";"; |
478 } | 699 } |
479 | 700 |
480 # This must occur after the normal variables in case the code depends on those | 701 # This must occur after the normal variables in case the code depends on those |
481 # variables. | 702 # variables. |
482 print ""; | 703 print ""; |
493 print " struct cl_target_option *ptr)"; | 714 print " struct cl_target_option *ptr)"; |
494 print "{"; | 715 print "{"; |
495 | 716 |
496 print " fputs (\"\\n\", file);"; | 717 print " fputs (\"\\n\", file);"; |
497 for (i = 0; i < n_target_other; i++) { | 718 for (i = 0; i < n_target_other; i++) { |
498 print " if (ptr->" var_target_other[i] ")"; | 719 print " if (ptr->x_" var_target_other[i] ")"; |
499 print " fprintf (file, \"%*s%s (0x%lx)\\n\","; | 720 print " fprintf (file, \"%*s%s (%#lx)\\n\","; |
500 print " indent, \"\","; | 721 print " indent, \"\","; |
501 print " \"" var_target_other[i] "\","; | 722 print " \"" var_target_other[i] "\","; |
502 print " (unsigned long)ptr->" var_target_other[i] ");"; | 723 print " (unsigned long)ptr->x_" var_target_other[i] ");"; |
724 print ""; | |
725 } | |
726 | |
727 for (i = 0; i < n_target_enum; i++) { | |
728 print " if (ptr->x_" var_target_enum[i] ")"; | |
729 print " fprintf (file, \"%*s%s (%#x)\\n\","; | |
730 print " indent, \"\","; | |
731 print " \"" var_target_enum[i] "\","; | |
732 print " ptr->x_" var_target_enum[i] ");"; | |
503 print ""; | 733 print ""; |
504 } | 734 } |
505 | 735 |
506 for (i = 0; i < n_target_int; i++) { | 736 for (i = 0; i < n_target_int; i++) { |
507 print " if (ptr->" var_target_int[i] ")"; | 737 print " if (ptr->x_" var_target_int[i] ")"; |
508 print " fprintf (file, \"%*s%s (0x%x)\\n\","; | 738 print " fprintf (file, \"%*s%s (%#x)\\n\","; |
509 print " indent, \"\","; | 739 print " indent, \"\","; |
510 print " \"" var_target_int[i] "\","; | 740 print " \"" var_target_int[i] "\","; |
511 print " ptr->" var_target_int[i] ");"; | 741 print " ptr->x_" var_target_int[i] ");"; |
512 print ""; | 742 print ""; |
513 } | 743 } |
514 | 744 |
515 for (i = 0; i < n_target_short; i++) { | 745 for (i = 0; i < n_target_short; i++) { |
516 print " if (ptr->" var_target_short[i] ")"; | 746 print " if (ptr->x_" var_target_short[i] ")"; |
517 print " fprintf (file, \"%*s%s (0x%x)\\n\","; | 747 print " fprintf (file, \"%*s%s (%#x)\\n\","; |
518 print " indent, \"\","; | 748 print " indent, \"\","; |
519 print " \"" var_target_short[i] "\","; | 749 print " \"" var_target_short[i] "\","; |
520 print " ptr->" var_target_short[i] ");"; | 750 print " ptr->x_" var_target_short[i] ");"; |
521 print ""; | 751 print ""; |
522 } | 752 } |
523 | 753 |
524 for (i = 0; i < n_target_char; i++) { | 754 for (i = 0; i < n_target_char; i++) { |
525 print " if (ptr->" var_target_char[i] ")"; | 755 print " if (ptr->x_" var_target_char[i] ")"; |
526 print " fprintf (file, \"%*s%s (0x%x)\\n\","; | 756 print " fprintf (file, \"%*s%s (%#x)\\n\","; |
527 print " indent, \"\","; | 757 print " indent, \"\","; |
528 print " \"" var_target_char[i] "\","; | 758 print " \"" var_target_char[i] "\","; |
529 print " ptr->" var_target_char[i] ");"; | 759 print " ptr->x_" var_target_char[i] ");"; |
530 print ""; | 760 print ""; |
531 } | 761 } |
532 | 762 |
533 print ""; | 763 print ""; |
534 print " if (targetm.target_option.print)"; | 764 print " if (targetm.target_option.print)"; |