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)";