]>
Commit | Line | Data |
---|---|---|
fbd26352 | 1 | # Copyright (C) 2003-2019 Free Software Foundation, Inc. |
e8b212b8 | 2 | # Contributed by Kelley Cook, June 2004. |
3 | # Original code from Neil Booth, May 2003. | |
4 | # | |
5 | # This program is free software; you can redistribute it and/or modify it | |
6 | # under the terms of the GNU General Public License as published by the | |
8c4c00c1 | 7 | # Free Software Foundation; either version 3, or (at your option) any |
e8b212b8 | 8 | # later version. |
9 | # | |
10 | # This program is distributed in the hope that it will be useful, | |
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | # GNU General Public License for more details. | |
14 | # | |
15 | # You should have received a copy of the GNU General Public License | |
8c4c00c1 | 16 | # along with this program; see the file COPYING3. If not see |
17 | # <http://www.gnu.org/licenses/>. | |
e8b212b8 | 18 | |
19 | # This Awk script reads in the option records generated from | |
20 | # opt-gather.awk, combines the flags of duplicate options and generates a | |
21 | # C header file. | |
22 | # | |
1e127302 | 23 | # This program uses functions from opt-functions.awk and code from |
24 | # opt-read.awk. | |
25 | # Usage: awk -f opt-functions.awk -f opt-read.awk -f opth-gen.awk \ | |
26 | # < inputfile > options.h | |
e8b212b8 | 27 | |
28 | # Dump out an enumeration into a .h file. | |
29 | # Combine the flags of duplicate options. | |
30 | END { | |
5e2d3b19 | 31 | print "/* This file is auto-generated by opth-gen.awk. */" |
e8b212b8 | 32 | print "" |
33 | print "#ifndef OPTIONS_H" | |
34 | print "#define OPTIONS_H" | |
35 | print "" | |
a317e77e | 36 | print "#include \"flag-types.h\"" |
37 | print "" | |
e8b212b8 | 38 | |
755fa783 | 39 | if (n_extra_h_includes > 0) { |
40 | for (i = 0; i < n_extra_h_includes; i++) { | |
41 | print "#include " quote extra_h_includes[i] quote | |
42 | } | |
43 | print "" | |
44 | } | |
46f8e3b0 | 45 | |
f3f006ad | 46 | print "#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) && !defined(IN_RTS)" |
5ae82d58 | 47 | print "#ifndef GENERATOR_FILE" |
0bfbe373 | 48 | print "#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS)" |
755fa783 | 49 | print "struct GTY(()) gcc_options" |
50 | print "#else" | |
51 | print "struct gcc_options" | |
52 | print "#endif" | |
53 | print "{" | |
5ae82d58 | 54 | print "#endif" |
55 | ||
0f8defe5 | 56 | for (i = 0; i < n_extra_vars; i++) { |
57 | var = extra_vars[i] | |
58 | sub(" *=.*", "", var) | |
5ae82d58 | 59 | orig_var = var |
60 | name = var | |
61 | type = var | |
d7175aef | 62 | type_after = var |
5ae82d58 | 63 | sub("^.*[ *]", "", name) |
d7175aef | 64 | sub("\\[.*\\]$", "", name) |
65 | sub("\\[.*\\]$", "", type) | |
5ae82d58 | 66 | sub(" *" name "$", "", type) |
d7175aef | 67 | sub("^.*" name, "", type_after) |
5ae82d58 | 68 | var_seen[name] = 1 |
69 | print "#ifdef GENERATOR_FILE" | |
70 | print "extern " orig_var ";" | |
71 | print "#else" | |
d7175aef | 72 | print " " type " x_" name type_after ";" |
5ae82d58 | 73 | print "#define " name " global_options.x_" name |
74 | print "#endif" | |
0f8defe5 | 75 | } |
76 | ||
e8b212b8 | 77 | for (i = 0; i < n_opts; i++) { |
46f8e3b0 | 78 | if (flag_set_p("Save", flags[i])) |
79 | have_save = 1; | |
80 | ||
e8b212b8 | 81 | name = var_name(flags[i]); |
82 | if (name == "") | |
83 | continue; | |
84 | ||
46f8e3b0 | 85 | if (name in var_seen) |
86 | continue; | |
87 | ||
88 | var_seen[name] = 1; | |
5ae82d58 | 89 | print "#ifdef GENERATOR_FILE" |
0fe44c73 | 90 | print "extern " var_type(flags[i]) name ";" |
5ae82d58 | 91 | print "#else" |
92 | print " " var_type(flags[i]) "x_" name ";" | |
93 | print "#define " name " global_options.x_" name | |
94 | print "#endif" | |
0fe44c73 | 95 | } |
2c5d2e39 | 96 | for (i = 0; i < n_opts; i++) { |
97 | name = static_var(opts[i], flags[i]); | |
98 | if (name != "") { | |
99 | print "#ifndef GENERATOR_FILE" | |
100 | print " " var_type(flags[i]) "x_" name ";" | |
101 | print "#define x_" name " do_not_use" | |
102 | print "#endif" | |
103 | } | |
104 | } | |
ecee1b29 | 105 | for (i = 0; i < n_opts; i++) { |
106 | if (flag_set_p("SetByCombined", flags[i])) { | |
107 | print "#ifndef GENERATOR_FILE" | |
108 | print " bool frontend_set_" var_name(flags[i]) ";" | |
109 | print "#endif" | |
110 | } | |
111 | } | |
5ae82d58 | 112 | print "#ifndef GENERATOR_FILE" |
113 | print "};" | |
114 | print "extern struct gcc_options global_options;" | |
f3f006ad | 115 | print "extern const struct gcc_options global_options_init;" |
f83b64ca | 116 | print "extern struct gcc_options global_options_set;" |
a702fa95 | 117 | print "#define target_flags_explicit global_options_set.x_target_flags" |
5ae82d58 | 118 | print "#endif" |
f3f006ad | 119 | print "#endif" |
0fe44c73 | 120 | print "" |
e8b212b8 | 121 | |
46f8e3b0 | 122 | # All of the optimization switches gathered together so they can be saved and restored. |
123 | # This will allow attribute((cold)) to turn on space optimization. | |
124 | ||
125 | # Change the type of normal switches from int to unsigned char to save space. | |
126 | # Also, order the structure so that pointer fields occur first, then int | |
127 | # fields, and then char fields to provide the best packing. | |
128 | ||
bfa29ed4 | 129 | print "#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) && !defined(IN_RTS)" |
46f8e3b0 | 130 | print "" |
131 | print "/* Structure to save/restore optimization and target specific options. */"; | |
fb1e4f4a | 132 | print "struct GTY(()) cl_optimization"; |
46f8e3b0 | 133 | print "{"; |
134 | ||
bfedbed1 | 135 | n_opt_char = 3; |
46f8e3b0 | 136 | n_opt_short = 0; |
137 | n_opt_int = 0; | |
b92389a6 | 138 | n_opt_enum = 0; |
46f8e3b0 | 139 | n_opt_other = 0; |
5ae82d58 | 140 | var_opt_char[0] = "unsigned char x_optimize"; |
141 | var_opt_char[1] = "unsigned char x_optimize_size"; | |
bfedbed1 | 142 | var_opt_char[2] = "unsigned char x_optimize_debug"; |
46f8e3b0 | 143 | |
144 | for (i = 0; i < n_opts; i++) { | |
05d8c5f8 | 145 | if (flag_set_p("(Optimization|PerFunction)", flags[i])) { |
46f8e3b0 | 146 | name = var_name(flags[i]) |
147 | if(name == "") | |
148 | continue; | |
149 | ||
150 | if(name in var_opt_seen) | |
151 | continue; | |
152 | ||
153 | var_opt_seen[name]++; | |
154 | otype = var_type_struct(flags[i]); | |
155 | if (otype ~ "^((un)?signed +)?int *$") | |
5ae82d58 | 156 | var_opt_int[n_opt_int++] = otype "x_" name; |
46f8e3b0 | 157 | |
158 | else if (otype ~ "^((un)?signed +)?short *$") | |
5ae82d58 | 159 | var_opt_short[n_opt_short++] = otype "x_" name; |
46f8e3b0 | 160 | |
161 | else if (otype ~ "^((un)?signed +)?char *$") | |
5ae82d58 | 162 | var_opt_char[n_opt_char++] = otype "x_" name; |
46f8e3b0 | 163 | |
755fa783 | 164 | else if (otype ~ ("^enum +[_" alnum "]+ *$")) |
165 | var_opt_enum[n_opt_enum++] = otype "x_" name; | |
166 | ||
46f8e3b0 | 167 | else |
5ae82d58 | 168 | var_opt_other[n_opt_other++] = otype "x_" name; |
46f8e3b0 | 169 | } |
170 | } | |
171 | ||
172 | for (i = 0; i < n_opt_other; i++) { | |
173 | print " " var_opt_other[i] ";"; | |
174 | } | |
175 | ||
176 | for (i = 0; i < n_opt_int; i++) { | |
177 | print " " var_opt_int[i] ";"; | |
178 | } | |
179 | ||
755fa783 | 180 | for (i = 0; i < n_opt_enum; i++) { |
181 | print " " var_opt_enum[i] ";"; | |
182 | } | |
183 | ||
46f8e3b0 | 184 | for (i = 0; i < n_opt_short; i++) { |
185 | print " " var_opt_short[i] ";"; | |
186 | } | |
187 | ||
188 | for (i = 0; i < n_opt_char; i++) { | |
189 | print " " var_opt_char[i] ";"; | |
190 | } | |
191 | ||
192 | print "};"; | |
193 | print ""; | |
194 | ||
195 | # Target and optimization save/restore/print functions. | |
196 | print "/* Structure to save/restore selected target specific options. */"; | |
fb1e4f4a | 197 | print "struct GTY(()) cl_target_option"; |
46f8e3b0 | 198 | print "{"; |
199 | ||
200 | n_target_char = 0; | |
201 | n_target_short = 0; | |
202 | n_target_int = 0; | |
755fa783 | 203 | n_target_enum = 0; |
46f8e3b0 | 204 | n_target_other = 0; |
205 | ||
206 | for (i = 0; i < n_target_save; i++) { | |
ca40ed4b | 207 | if (target_save_decl[i] ~ "^((un)?signed +)?int +[_" alnum "]+$") |
46f8e3b0 | 208 | var_target_int[n_target_int++] = target_save_decl[i]; |
209 | ||
ca40ed4b | 210 | else if (target_save_decl[i] ~ "^((un)?signed +)?short +[_" alnum "]+$") |
46f8e3b0 | 211 | var_target_short[n_target_short++] = target_save_decl[i]; |
212 | ||
ca40ed4b | 213 | else if (target_save_decl[i] ~ "^((un)?signed +)?char +[_ " alnum "]+$") |
46f8e3b0 | 214 | var_target_char[n_target_char++] = target_save_decl[i]; |
215 | ||
755fa783 | 216 | else if (target_save_decl[i] ~ ("^enum +[_" alnum "]+ +[_" alnum "]+$")) { |
217 | var_target_enum[n_target_enum++] = target_save_decl[i]; | |
218 | } | |
46f8e3b0 | 219 | else |
220 | var_target_other[n_target_other++] = target_save_decl[i]; | |
221 | } | |
222 | ||
223 | if (have_save) { | |
224 | for (i = 0; i < n_opts; i++) { | |
225 | if (flag_set_p("Save", flags[i])) { | |
226 | name = var_name(flags[i]) | |
227 | if(name == "") | |
228 | name = "target_flags"; | |
229 | ||
230 | if(name in var_save_seen) | |
231 | continue; | |
232 | ||
233 | var_save_seen[name]++; | |
234 | otype = var_type_struct(flags[i]) | |
235 | if (otype ~ "^((un)?signed +)?int *$") | |
5ae82d58 | 236 | var_target_int[n_target_int++] = otype "x_" name; |
46f8e3b0 | 237 | |
238 | else if (otype ~ "^((un)?signed +)?short *$") | |
5ae82d58 | 239 | var_target_short[n_target_short++] = otype "x_" name; |
46f8e3b0 | 240 | |
241 | else if (otype ~ "^((un)?signed +)?char *$") | |
5ae82d58 | 242 | var_target_char[n_target_char++] = otype "x_" name; |
46f8e3b0 | 243 | |
755fa783 | 244 | else if (otype ~ ("^enum +[_" alnum "]+ +[_" alnum "]+")) |
245 | var_target_enum[n_target_enum++] = otype "x_" name; | |
246 | ||
46f8e3b0 | 247 | else |
5ae82d58 | 248 | var_target_other[n_target_other++] = otype "x_" name; |
46f8e3b0 | 249 | } |
250 | } | |
251 | } else { | |
5ae82d58 | 252 | var_target_int[n_target_int++] = "int x_target_flags"; |
46f8e3b0 | 253 | } |
254 | ||
255 | for (i = 0; i < n_target_other; i++) { | |
256 | print " " var_target_other[i] ";"; | |
257 | } | |
258 | ||
755fa783 | 259 | for (i = 0; i < n_target_enum; i++) { |
260 | print " " var_target_enum[i] ";"; | |
261 | } | |
262 | ||
46f8e3b0 | 263 | for (i = 0; i < n_target_int; i++) { |
264 | print " " var_target_int[i] ";"; | |
265 | } | |
266 | ||
267 | for (i = 0; i < n_target_short; i++) { | |
268 | print " " var_target_short[i] ";"; | |
269 | } | |
270 | ||
271 | for (i = 0; i < n_target_char; i++) { | |
272 | print " " var_target_char[i] ";"; | |
273 | } | |
274 | ||
275 | print "};"; | |
276 | print ""; | |
277 | print ""; | |
278 | print "/* Save optimization variables into a structure. */" | |
2c5d2e39 | 279 | print "extern void cl_optimization_save (struct cl_optimization *, struct gcc_options *);"; |
46f8e3b0 | 280 | print ""; |
281 | print "/* Restore optimization variables from a structure. */"; | |
2c5d2e39 | 282 | print "extern void cl_optimization_restore (struct gcc_options *, struct cl_optimization *);"; |
46f8e3b0 | 283 | print ""; |
284 | print "/* Print optimization variables from a structure. */"; | |
285 | print "extern void cl_optimization_print (FILE *, int, struct cl_optimization *);"; | |
286 | print ""; | |
7174b54b | 287 | print "/* Print different optimization variables from structures provided as arguments. */"; |
288 | print "extern void cl_optimization_print_diff (FILE *, int, cl_optimization *ptr1, cl_optimization *ptr2);"; | |
289 | print ""; | |
46f8e3b0 | 290 | print "/* Save selected option variables into a structure. */" |
2c5d2e39 | 291 | print "extern void cl_target_option_save (struct cl_target_option *, struct gcc_options *);"; |
46f8e3b0 | 292 | print ""; |
293 | print "/* Restore selected option variables from a structure. */" | |
2c5d2e39 | 294 | print "extern void cl_target_option_restore (struct gcc_options *, struct cl_target_option *);"; |
46f8e3b0 | 295 | print ""; |
296 | print "/* Print target option variables from a structure. */"; | |
297 | print "extern void cl_target_option_print (FILE *, int, struct cl_target_option *);"; | |
fbb6fbd8 | 298 | print ""; |
7174b54b | 299 | print "/* Print different target option variables from structures provided as arguments. */"; |
300 | print "extern void cl_target_option_print_diff (FILE *, int, cl_target_option *ptr1, cl_target_option *ptr2);"; | |
301 | print ""; | |
ab90b67e | 302 | print "/* Compare two target option variables from a structure. */"; |
303 | print "extern bool cl_target_option_eq (const struct cl_target_option *, const struct cl_target_option *);"; | |
304 | print ""; | |
305 | print "/* Hash option variables from a structure. */"; | |
306 | print "extern hashval_t cl_target_option_hash (const struct cl_target_option *);"; | |
307 | print ""; | |
54f880b2 | 308 | print "/* Hash optimization from a structure. */"; |
309 | print "extern hashval_t cl_optimization_hash (const struct cl_optimization *);"; | |
310 | print ""; | |
6848a0ae | 311 | print "/* Compare two optimization options. */"; |
312 | print "extern bool cl_optimization_option_eq (cl_optimization const *ptr1, cl_optimization const *ptr2);" | |
313 | print ""; | |
e51764ad | 314 | print "/* Generator files may not have access to location_t, and don't need these. */" |
315 | print "#if defined(UNKNOWN_LOCATION)" | |
fbb6fbd8 | 316 | print "bool " |
317 | print "common_handle_option_auto (struct gcc_options *opts, " | |
318 | print " struct gcc_options *opts_set, " | |
319 | print " const struct cl_decoded_option *decoded, " | |
320 | print " unsigned int lang_mask, int kind, " | |
321 | print " location_t loc, " | |
322 | print " const struct cl_option_handlers *handlers, " | |
323 | print " diagnostic_context *dc); " | |
d3b7ee7c | 324 | for (i = 0; i < n_langs; i++) { |
325 | lang_name = lang_sanitized_name(langs[i]); | |
8e18705e | 326 | print "bool" |
327 | print lang_name "_handle_option_auto (struct gcc_options *opts," | |
328 | print " struct gcc_options *opts_set," | |
329 | print " size_t scode, const char *arg," | |
330 | print " HOST_WIDE_INT value," | |
331 | print " unsigned int lang_mask, int kind," | |
332 | print " location_t loc," | |
333 | print " const struct cl_option_handlers *handlers," | |
334 | print " diagnostic_context *dc);" | |
d3b7ee7c | 335 | } |
3636964b | 336 | print "void cpp_handle_option_auto (const struct gcc_options * opts, size_t scode," |
337 | print " struct cpp_options * cpp_opts);" | |
338 | print "void init_global_opts_from_cpp(struct gcc_options * opts, " | |
339 | print " const struct cpp_options * cpp_opts);" | |
fbb6fbd8 | 340 | print "#endif"; |
46f8e3b0 | 341 | print "#endif"; |
342 | print ""; | |
343 | ||
ff05e09e | 344 | for (i = 0; i < n_opts; i++) { |
345 | name = opt_args("Mask", flags[i]) | |
dbc6e347 | 346 | if (name == "") { |
347 | opt = opt_args("InverseMask", flags[i]) | |
348 | if (opt ~ ",") | |
349 | name = nth_arg(0, opt) | |
350 | else | |
351 | name = opt | |
c5e839cb | 352 | } |
dbc6e347 | 353 | if (name != "" && mask_bits[name] == 0) { |
354 | mask_bits[name] = 1 | |
355 | vname = var_name(flags[i]) | |
356 | mask = "MASK_" | |
e16d8ad0 | 357 | mask_1 = "1U" |
dbc6e347 | 358 | if (vname != "") { |
359 | mask = "OPTION_MASK_" | |
360 | if (host_wide_int[vname] == "yes") | |
e16d8ad0 | 361 | mask_1 = "HOST_WIDE_INT_1U" |
5fcf082c | 362 | } else |
363 | extra_mask_bits[name] = 1 | |
72ec6882 | 364 | print "#define " mask name " (" mask_1 " << " masknum[vname]++ ")" |
dbc6e347 | 365 | } |
ff05e09e | 366 | } |
a9341855 | 367 | for (i = 0; i < n_extra_masks; i++) { |
5fcf082c | 368 | if (extra_mask_bits[extra_masks[i]] == 0) |
e16d8ad0 | 369 | print "#define MASK_" extra_masks[i] " (1U << " masknum[""]++ ")" |
c5e839cb | 370 | } |
371 | ||
372 | for (var in masknum) { | |
72ec6882 | 373 | if (var != "" && host_wide_int[var] == "yes") { |
e16d8ad0 | 374 | print "#if defined(HOST_BITS_PER_WIDE_INT) && " masknum[var] " > HOST_BITS_PER_WIDE_INT" |
72ec6882 | 375 | print "#error too many masks for " var |
376 | print "#endif" | |
377 | } | |
e16d8ad0 | 378 | else if (masknum[var] > 32) { |
c5e839cb | 379 | if (var == "") |
380 | print "#error too many target masks" | |
381 | else | |
382 | print "#error too many masks for " var | |
383 | } | |
a9341855 | 384 | } |
ff05e09e | 385 | print "" |
386 | ||
387 | for (i = 0; i < n_opts; i++) { | |
388 | name = opt_args("Mask", flags[i]) | |
dbc6e347 | 389 | if (name == "") { |
390 | opt = opt_args("InverseMask", flags[i]) | |
391 | if (opt ~ ",") | |
392 | name = nth_arg(0, opt) | |
393 | else | |
394 | name = opt | |
c5e839cb | 395 | } |
dbc6e347 | 396 | if (name != "" && mask_macros[name] == 0) { |
397 | mask_macros[name] = 1 | |
398 | vname = var_name(flags[i]) | |
dbc6e347 | 399 | mask = "OPTION_MASK_" |
400 | if (vname == "") { | |
401 | vname = "target_flags" | |
dbc6e347 | 402 | mask = "MASK_" |
5fcf082c | 403 | extra_mask_macros[name] = 1 |
dbc6e347 | 404 | } |
66da3ba4 | 405 | print "#define TARGET_" name \ |
c5e839cb | 406 | " ((" vname " & " mask name ") != 0)" |
55310327 | 407 | print "#define TARGET_" name "_P(" vname ")" \ |
e16d8ad0 | 408 | " (((" vname ") & " mask name ") != 0)" |
dbc6e347 | 409 | } |
ff05e09e | 410 | } |
a9341855 | 411 | for (i = 0; i < n_extra_masks; i++) { |
5fcf082c | 412 | if (extra_mask_macros[extra_masks[i]] == 0) |
413 | print "#define TARGET_" extra_masks[i] \ | |
414 | " ((target_flags & MASK_" extra_masks[i] ") != 0)" | |
a9341855 | 415 | } |
ff05e09e | 416 | print "" |
417 | ||
418 | for (i = 0; i < n_opts; i++) { | |
419 | opt = opt_args("InverseMask", flags[i]) | |
c490c13b | 420 | if (opt ~ ",") { |
421 | vname = var_name(flags[i]) | |
c490c13b | 422 | mask = "OPTION_MASK_" |
423 | if (vname == "") { | |
424 | vname = "target_flags" | |
c490c13b | 425 | mask = "MASK_" |
426 | } | |
66da3ba4 | 427 | print "#define TARGET_" nth_arg(1, opt) \ |
c490c13b | 428 | " ((" vname " & " mask nth_arg(0, opt) ") == 0)" |
429 | } | |
ff05e09e | 430 | } |
431 | print "" | |
e8b212b8 | 432 | |
433 | for (i = 0; i < n_langs; i++) { | |
d3b7ee7c | 434 | macros[i] = "CL_" lang_sanitized_name(langs[i]) |
e8b212b8 | 435 | s = substr(" ", length (macros[i])) |
607eb2c8 | 436 | print "#define " macros[i] s " (1U << " i ")" |
e8b212b8 | 437 | } |
607eb2c8 | 438 | print "#define CL_LANG_ALL ((1U << " n_langs ") - 1)" |
e8b212b8 | 439 | |
440 | print "" | |
441 | print "enum opt_code" | |
442 | print "{" | |
443 | ||
444 | for (i = 0; i < n_opts; i++) | |
445 | back_chain[i] = "N_OPTS"; | |
446 | ||
67089c6b | 447 | enum_value = 0 |
a324cccc | 448 | for (i = 0; i < n_opts; i++) { |
449 | # Combine the flags of identical switches. Switches | |
450 | # appear many times if they are handled by many front | |
451 | # ends, for example. | |
452 | while( i + 1 != n_opts && opts[i] == opts[i + 1] ) { | |
453 | flags[i + 1] = flags[i] " " flags[i + 1]; | |
454 | i++; | |
455 | } | |
e8b212b8 | 456 | |
457 | len = length (opts[i]); | |
d4c7816a | 458 | enum = opt_enum(opts[i]) |
67089c6b | 459 | enum_string = enum " = " enum_value "," |
460 | ||
461 | # Aliases do not get enumeration names. | |
0b1d266f | 462 | if ((flag_set_p("Alias.*", flags[i]) \ |
463 | && !flag_set_p("SeparateAlias", flags[i])) \ | |
464 | || flag_set_p("Ignore", flags[i])) { | |
67089c6b | 465 | enum_string = "/* " enum_string " */" |
466 | } | |
e8b212b8 | 467 | |
468 | # If this switch takes joined arguments, back-chain all | |
469 | # subsequent switches to it for which it is a prefix. If | |
470 | # a later switch S is a longer prefix of a switch T, T | |
471 | # will be back-chained to S in a later iteration of this | |
472 | # for() loop, which is what we want. | |
a150399d | 473 | if (flag_set_p("Joined.*", flags[i])) { |
e8b212b8 | 474 | for (j = i + 1; j < n_opts; j++) { |
475 | if (substr (opts[j], 1, len) != opts[i]) | |
476 | break; | |
477 | back_chain[j] = enum; | |
478 | } | |
479 | } | |
480 | ||
67089c6b | 481 | s = substr(" ", |
482 | length (enum_string)) | |
e8b212b8 | 483 | |
484 | if (help[i] == "") | |
485 | hlp = "0" | |
486 | else | |
487 | hlp = "N_(\"" help[i] "\")"; | |
488 | ||
67089c6b | 489 | print " " enum_string s "/* -" opts[i] " */" |
490 | enum_value++ | |
e8b212b8 | 491 | } |
492 | ||
615ef0bb | 493 | print " N_OPTS," |
494 | print " OPT_SPECIAL_unknown," | |
3b0273a1 | 495 | print " OPT_SPECIAL_ignore," |
0c46a085 | 496 | print " OPT_SPECIAL_deprecated," |
615ef0bb | 497 | print " OPT_SPECIAL_program_name," |
498 | print " OPT_SPECIAL_input_file" | |
e8b212b8 | 499 | print "};" |
500 | print "" | |
b20a8bb4 | 501 | print "#ifdef GCC_C_COMMON_C" |
7ff8db31 | 502 | print "/* Mapping from cpp message reasons to the options that enable them. */" |
503 | print "#include <cpplib.h>" | |
504 | print "struct cpp_reason_option_codes_t" | |
505 | print "{" | |
fb225cf1 | 506 | print " /* cpplib message reason. */" |
507 | print " const enum cpp_warning_reason reason;" | |
508 | print " /* gcc option that controls this message. */" | |
509 | print " const int option_code;" | |
7ff8db31 | 510 | print "};" |
511 | print "" | |
512 | print "static const struct cpp_reason_option_codes_t cpp_reason_option_codes[] = {" | |
513 | for (i = 0; i < n_opts; i++) { | |
514 | # With identical flags, pick only the last one. The | |
515 | # earlier loop ensured that it has all flags merged, | |
516 | # and a nonempty help text if one of the texts was nonempty. | |
517 | while( i + 1 != n_opts && opts[i] == opts[i + 1] ) { | |
518 | i++; | |
519 | } | |
520 | cpp_reason = nth_arg(0, opt_args("CppReason", flags[i])); | |
521 | if (cpp_reason != "") { | |
522 | cpp_reason = cpp_reason ","; | |
523 | printf(" {%-40s %s},\n", cpp_reason, opt_enum(opts[i])) | |
524 | } | |
525 | } | |
526 | printf(" {%-40s 0},\n", "CPP_W_NONE,") | |
527 | print "};" | |
528 | print "#endif" | |
529 | print "" | |
e8b212b8 | 530 | print "#endif /* OPTIONS_H */" |
531 | } |