]>
Commit | Line | Data |
---|---|---|
85ec4feb | 1 | # Copyright (C) 2003-2018 Free Software Foundation, Inc. |
776dc15d KC |
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 | |
9dcd6f09 | 7 | # Free Software Foundation; either version 3, or (at your option) any |
776dc15d KC |
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 | |
9dcd6f09 NC |
16 | # along with this program; see the file COPYING3. If not see |
17 | # <http://www.gnu.org/licenses/>. | |
776dc15d KC |
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 | # | |
86fa5de4 JM |
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 | |
776dc15d KC |
27 | |
28 | # Dump out an enumeration into a .h file. | |
29 | # Combine the flags of duplicate options. | |
30 | END { | |
14078ff6 | 31 | print "/* This file is auto-generated by opth-gen.awk. */" |
776dc15d KC |
32 | print "" |
33 | print "#ifndef OPTIONS_H" | |
34 | print "#define OPTIONS_H" | |
35 | print "" | |
f938f60c JM |
36 | print "#include \"flag-types.h\"" |
37 | print "" | |
776dc15d | 38 | |
fd438373 MM |
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 | } | |
ab442df7 | 45 | |
a75bfaa6 | 46 | print "#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) && !defined(IN_RTS)" |
e3339d0f | 47 | print "#ifndef GENERATOR_FILE" |
57dfdff0 | 48 | print "#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS)" |
fd438373 MM |
49 | print "struct GTY(()) gcc_options" |
50 | print "#else" | |
51 | print "struct gcc_options" | |
52 | print "#endif" | |
53 | print "{" | |
e3339d0f JM |
54 | print "#endif" |
55 | ||
e90afde6 JM |
56 | for (i = 0; i < n_extra_vars; i++) { |
57 | var = extra_vars[i] | |
58 | sub(" *=.*", "", var) | |
e3339d0f JM |
59 | orig_var = var |
60 | name = var | |
61 | type = var | |
69ccdddb | 62 | type_after = var |
e3339d0f | 63 | sub("^.*[ *]", "", name) |
69ccdddb JM |
64 | sub("\\[.*\\]$", "", name) |
65 | sub("\\[.*\\]$", "", type) | |
e3339d0f | 66 | sub(" *" name "$", "", type) |
69ccdddb | 67 | sub("^.*" name, "", type_after) |
e3339d0f JM |
68 | var_seen[name] = 1 |
69 | print "#ifdef GENERATOR_FILE" | |
70 | print "extern " orig_var ";" | |
71 | print "#else" | |
69ccdddb | 72 | print " " type " x_" name type_after ";" |
e3339d0f JM |
73 | print "#define " name " global_options.x_" name |
74 | print "#endif" | |
e90afde6 JM |
75 | } |
76 | ||
776dc15d | 77 | for (i = 0; i < n_opts; i++) { |
ab442df7 MM |
78 | if (flag_set_p("Save", flags[i])) |
79 | have_save = 1; | |
80 | ||
776dc15d KC |
81 | name = var_name(flags[i]); |
82 | if (name == "") | |
83 | continue; | |
84 | ||
ab442df7 MM |
85 | if (name in var_seen) |
86 | continue; | |
87 | ||
88 | var_seen[name] = 1; | |
e3339d0f | 89 | print "#ifdef GENERATOR_FILE" |
55bea00a | 90 | print "extern " var_type(flags[i]) name ";" |
e3339d0f JM |
91 | print "#else" |
92 | print " " var_type(flags[i]) "x_" name ";" | |
93 | print "#define " name " global_options.x_" name | |
94 | print "#endif" | |
55bea00a | 95 | } |
46625112 JM |
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 | } | |
5e46b0c6 ILT |
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 | } | |
e3339d0f JM |
112 | print "#ifndef GENERATOR_FILE" |
113 | print "};" | |
114 | print "extern struct gcc_options global_options;" | |
a75bfaa6 | 115 | print "extern const struct gcc_options global_options_init;" |
d4d24ba4 | 116 | print "extern struct gcc_options global_options_set;" |
70e8b89b | 117 | print "#define target_flags_explicit global_options_set.x_target_flags" |
e3339d0f | 118 | print "#endif" |
a75bfaa6 | 119 | print "#endif" |
55bea00a | 120 | print "" |
776dc15d | 121 | |
ab442df7 MM |
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 | ||
f6d08ab2 | 129 | print "#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) && !defined(IN_RTS)" |
ab442df7 MM |
130 | print "" |
131 | print "/* Structure to save/restore optimization and target specific options. */"; | |
d1b38208 | 132 | print "struct GTY(()) cl_optimization"; |
ab442df7 MM |
133 | print "{"; |
134 | ||
b16650ac | 135 | n_opt_char = 3; |
ab442df7 MM |
136 | n_opt_short = 0; |
137 | n_opt_int = 0; | |
bea30e0d | 138 | n_opt_enum = 0; |
ab442df7 | 139 | n_opt_other = 0; |
e3339d0f JM |
140 | var_opt_char[0] = "unsigned char x_optimize"; |
141 | var_opt_char[1] = "unsigned char x_optimize_size"; | |
b16650ac | 142 | var_opt_char[2] = "unsigned char x_optimize_debug"; |
ab442df7 MM |
143 | |
144 | for (i = 0; i < n_opts; i++) { | |
ff98fa95 | 145 | if (flag_set_p("(Optimization|PerFunction)", flags[i])) { |
ab442df7 MM |
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 *$") | |
e3339d0f | 156 | var_opt_int[n_opt_int++] = otype "x_" name; |
ab442df7 MM |
157 | |
158 | else if (otype ~ "^((un)?signed +)?short *$") | |
e3339d0f | 159 | var_opt_short[n_opt_short++] = otype "x_" name; |
ab442df7 MM |
160 | |
161 | else if (otype ~ "^((un)?signed +)?char *$") | |
e3339d0f | 162 | var_opt_char[n_opt_char++] = otype "x_" name; |
ab442df7 | 163 | |
fd438373 MM |
164 | else if (otype ~ ("^enum +[_" alnum "]+ *$")) |
165 | var_opt_enum[n_opt_enum++] = otype "x_" name; | |
166 | ||
ab442df7 | 167 | else |
e3339d0f | 168 | var_opt_other[n_opt_other++] = otype "x_" name; |
ab442df7 MM |
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 | ||
fd438373 MM |
180 | for (i = 0; i < n_opt_enum; i++) { |
181 | print " " var_opt_enum[i] ";"; | |
182 | } | |
183 | ||
ab442df7 MM |
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. */"; | |
d1b38208 | 197 | print "struct GTY(()) cl_target_option"; |
ab442df7 MM |
198 | print "{"; |
199 | ||
200 | n_target_char = 0; | |
201 | n_target_short = 0; | |
202 | n_target_int = 0; | |
fd438373 | 203 | n_target_enum = 0; |
ab442df7 MM |
204 | n_target_other = 0; |
205 | ||
206 | for (i = 0; i < n_target_save; i++) { | |
e4590d63 | 207 | if (target_save_decl[i] ~ "^((un)?signed +)?int +[_" alnum "]+$") |
ab442df7 MM |
208 | var_target_int[n_target_int++] = target_save_decl[i]; |
209 | ||
e4590d63 | 210 | else if (target_save_decl[i] ~ "^((un)?signed +)?short +[_" alnum "]+$") |
ab442df7 MM |
211 | var_target_short[n_target_short++] = target_save_decl[i]; |
212 | ||
e4590d63 | 213 | else if (target_save_decl[i] ~ "^((un)?signed +)?char +[_ " alnum "]+$") |
ab442df7 MM |
214 | var_target_char[n_target_char++] = target_save_decl[i]; |
215 | ||
fd438373 MM |
216 | else if (target_save_decl[i] ~ ("^enum +[_" alnum "]+ +[_" alnum "]+$")) { |
217 | var_target_enum[n_target_enum++] = target_save_decl[i]; | |
218 | } | |
ab442df7 MM |
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 *$") | |
e3339d0f | 236 | var_target_int[n_target_int++] = otype "x_" name; |
ab442df7 MM |
237 | |
238 | else if (otype ~ "^((un)?signed +)?short *$") | |
e3339d0f | 239 | var_target_short[n_target_short++] = otype "x_" name; |
ab442df7 MM |
240 | |
241 | else if (otype ~ "^((un)?signed +)?char *$") | |
e3339d0f | 242 | var_target_char[n_target_char++] = otype "x_" name; |
ab442df7 | 243 | |
fd438373 MM |
244 | else if (otype ~ ("^enum +[_" alnum "]+ +[_" alnum "]+")) |
245 | var_target_enum[n_target_enum++] = otype "x_" name; | |
246 | ||
ab442df7 | 247 | else |
e3339d0f | 248 | var_target_other[n_target_other++] = otype "x_" name; |
ab442df7 MM |
249 | } |
250 | } | |
251 | } else { | |
e3339d0f | 252 | var_target_int[n_target_int++] = "int x_target_flags"; |
ab442df7 MM |
253 | } |
254 | ||
255 | for (i = 0; i < n_target_other; i++) { | |
256 | print " " var_target_other[i] ";"; | |
257 | } | |
258 | ||
fd438373 MM |
259 | for (i = 0; i < n_target_enum; i++) { |
260 | print " " var_target_enum[i] ";"; | |
261 | } | |
262 | ||
ab442df7 MM |
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. */" | |
46625112 | 279 | print "extern void cl_optimization_save (struct cl_optimization *, struct gcc_options *);"; |
ab442df7 MM |
280 | print ""; |
281 | print "/* Restore optimization variables from a structure. */"; | |
46625112 | 282 | print "extern void cl_optimization_restore (struct gcc_options *, struct cl_optimization *);"; |
ab442df7 MM |
283 | print ""; |
284 | print "/* Print optimization variables from a structure. */"; | |
285 | print "extern void cl_optimization_print (FILE *, int, struct cl_optimization *);"; | |
286 | print ""; | |
eaabbb00 ML |
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 ""; | |
ab442df7 | 290 | print "/* Save selected option variables into a structure. */" |
46625112 | 291 | print "extern void cl_target_option_save (struct cl_target_option *, struct gcc_options *);"; |
ab442df7 MM |
292 | print ""; |
293 | print "/* Restore selected option variables from a structure. */" | |
46625112 | 294 | print "extern void cl_target_option_restore (struct gcc_options *, struct cl_target_option *);"; |
ab442df7 MM |
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 *);"; | |
7d5a5747 | 298 | print ""; |
eaabbb00 ML |
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 ""; | |
54e774c0 JH |
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 ""; | |
ca9a04da JH |
308 | print "/* Hash optimization from a structure. */"; |
309 | print "extern hashval_t cl_optimization_hash (const struct cl_optimization *);"; | |
310 | print ""; | |
c518c102 ML |
311 | print "/* Compare two optimization options. */"; |
312 | print "extern bool cl_optimization_option_eq (cl_optimization const *ptr1, cl_optimization const *ptr2);" | |
313 | print ""; | |
903f5c23 AM |
314 | print "/* Generator files may not have access to location_t, and don't need these. */" |
315 | print "#if defined(UNKNOWN_LOCATION)" | |
7d5a5747 MLI |
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); " | |
f2bc201f MLI |
324 | for (i = 0; i < n_langs; i++) { |
325 | lang_name = lang_sanitized_name(langs[i]); | |
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, int value, " | |
330 | print " unsigned int lang_mask, int kind, " | |
331 | print " location_t loc, " | |
332 | print " const struct cl_option_handlers *handlers, " | |
333 | print " diagnostic_context *dc); " | |
334 | } | |
43f9a13c MLI |
335 | print "void cpp_handle_option_auto (const struct gcc_options * opts, size_t scode," |
336 | print " struct cpp_options * cpp_opts);" | |
337 | print "void init_global_opts_from_cpp(struct gcc_options * opts, " | |
338 | print " const struct cpp_options * cpp_opts);" | |
7d5a5747 | 339 | print "#endif"; |
ab442df7 MM |
340 | print "#endif"; |
341 | print ""; | |
342 | ||
75685792 RS |
343 | for (i = 0; i < n_opts; i++) { |
344 | name = opt_args("Mask", flags[i]) | |
1ad36b7e L |
345 | if (name == "") { |
346 | opt = opt_args("InverseMask", flags[i]) | |
347 | if (opt ~ ",") | |
348 | name = nth_arg(0, opt) | |
349 | else | |
350 | name = opt | |
f7f655c7 | 351 | } |
1ad36b7e L |
352 | if (name != "" && mask_bits[name] == 0) { |
353 | mask_bits[name] = 1 | |
354 | vname = var_name(flags[i]) | |
355 | mask = "MASK_" | |
d5c45ad7 | 356 | mask_1 = "1U" |
1ad36b7e L |
357 | if (vname != "") { |
358 | mask = "OPTION_MASK_" | |
359 | if (host_wide_int[vname] == "yes") | |
d5c45ad7 | 360 | mask_1 = "HOST_WIDE_INT_1U" |
eefdb8e6 L |
361 | } else |
362 | extra_mask_bits[name] = 1 | |
99114bbf | 363 | print "#define " mask name " (" mask_1 " << " masknum[vname]++ ")" |
1ad36b7e | 364 | } |
75685792 | 365 | } |
fe609b0f | 366 | for (i = 0; i < n_extra_masks; i++) { |
eefdb8e6 | 367 | if (extra_mask_bits[extra_masks[i]] == 0) |
d5c45ad7 | 368 | print "#define MASK_" extra_masks[i] " (1U << " masknum[""]++ ")" |
f7f655c7 DD |
369 | } |
370 | ||
371 | for (var in masknum) { | |
99114bbf | 372 | if (var != "" && host_wide_int[var] == "yes") { |
d5c45ad7 | 373 | print "#if defined(HOST_BITS_PER_WIDE_INT) && " masknum[var] " > HOST_BITS_PER_WIDE_INT" |
99114bbf L |
374 | print "#error too many masks for " var |
375 | print "#endif" | |
376 | } | |
d5c45ad7 | 377 | else if (masknum[var] > 32) { |
f7f655c7 DD |
378 | if (var == "") |
379 | print "#error too many target masks" | |
380 | else | |
381 | print "#error too many masks for " var | |
382 | } | |
fe609b0f | 383 | } |
75685792 RS |
384 | print "" |
385 | ||
386 | for (i = 0; i < n_opts; i++) { | |
387 | name = opt_args("Mask", flags[i]) | |
1ad36b7e L |
388 | if (name == "") { |
389 | opt = opt_args("InverseMask", flags[i]) | |
390 | if (opt ~ ",") | |
391 | name = nth_arg(0, opt) | |
392 | else | |
393 | name = opt | |
f7f655c7 | 394 | } |
1ad36b7e L |
395 | if (name != "" && mask_macros[name] == 0) { |
396 | mask_macros[name] = 1 | |
397 | vname = var_name(flags[i]) | |
1ad36b7e L |
398 | mask = "OPTION_MASK_" |
399 | if (vname == "") { | |
400 | vname = "target_flags" | |
1ad36b7e | 401 | mask = "MASK_" |
eefdb8e6 | 402 | extra_mask_macros[name] = 1 |
1ad36b7e | 403 | } |
90922d36 | 404 | print "#define TARGET_" name \ |
f7f655c7 | 405 | " ((" vname " & " mask name ") != 0)" |
bf7b5747 | 406 | print "#define TARGET_" name "_P(" vname ")" \ |
d5c45ad7 | 407 | " (((" vname ") & " mask name ") != 0)" |
1ad36b7e | 408 | } |
75685792 | 409 | } |
fe609b0f | 410 | for (i = 0; i < n_extra_masks; i++) { |
eefdb8e6 L |
411 | if (extra_mask_macros[extra_masks[i]] == 0) |
412 | print "#define TARGET_" extra_masks[i] \ | |
413 | " ((target_flags & MASK_" extra_masks[i] ") != 0)" | |
fe609b0f | 414 | } |
75685792 RS |
415 | print "" |
416 | ||
417 | for (i = 0; i < n_opts; i++) { | |
418 | opt = opt_args("InverseMask", flags[i]) | |
7bd85ce0 JM |
419 | if (opt ~ ",") { |
420 | vname = var_name(flags[i]) | |
7bd85ce0 JM |
421 | mask = "OPTION_MASK_" |
422 | if (vname == "") { | |
423 | vname = "target_flags" | |
7bd85ce0 JM |
424 | mask = "MASK_" |
425 | } | |
90922d36 | 426 | print "#define TARGET_" nth_arg(1, opt) \ |
7bd85ce0 JM |
427 | " ((" vname " & " mask nth_arg(0, opt) ") == 0)" |
428 | } | |
75685792 RS |
429 | } |
430 | print "" | |
776dc15d KC |
431 | |
432 | for (i = 0; i < n_langs; i++) { | |
f2bc201f | 433 | macros[i] = "CL_" lang_sanitized_name(langs[i]) |
776dc15d | 434 | s = substr(" ", length (macros[i])) |
eb50f63a | 435 | print "#define " macros[i] s " (1U << " i ")" |
776dc15d | 436 | } |
eb50f63a | 437 | print "#define CL_LANG_ALL ((1U << " n_langs ") - 1)" |
776dc15d KC |
438 | |
439 | print "" | |
440 | print "enum opt_code" | |
441 | print "{" | |
442 | ||
443 | for (i = 0; i < n_opts; i++) | |
444 | back_chain[i] = "N_OPTS"; | |
445 | ||
5de8299c | 446 | enum_value = 0 |
64fbae21 RS |
447 | for (i = 0; i < n_opts; i++) { |
448 | # Combine the flags of identical switches. Switches | |
449 | # appear many times if they are handled by many front | |
450 | # ends, for example. | |
451 | while( i + 1 != n_opts && opts[i] == opts[i + 1] ) { | |
452 | flags[i + 1] = flags[i] " " flags[i + 1]; | |
453 | i++; | |
454 | } | |
776dc15d KC |
455 | |
456 | len = length (opts[i]); | |
9db94baa | 457 | enum = opt_enum(opts[i]) |
5de8299c JM |
458 | enum_string = enum " = " enum_value "," |
459 | ||
460 | # Aliases do not get enumeration names. | |
d1583032 JM |
461 | if ((flag_set_p("Alias.*", flags[i]) \ |
462 | && !flag_set_p("SeparateAlias", flags[i])) \ | |
463 | || flag_set_p("Ignore", flags[i])) { | |
5de8299c JM |
464 | enum_string = "/* " enum_string " */" |
465 | } | |
776dc15d KC |
466 | |
467 | # If this switch takes joined arguments, back-chain all | |
468 | # subsequent switches to it for which it is a prefix. If | |
469 | # a later switch S is a longer prefix of a switch T, T | |
470 | # will be back-chained to S in a later iteration of this | |
471 | # for() loop, which is what we want. | |
a56a0779 | 472 | if (flag_set_p("Joined.*", flags[i])) { |
776dc15d KC |
473 | for (j = i + 1; j < n_opts; j++) { |
474 | if (substr (opts[j], 1, len) != opts[i]) | |
475 | break; | |
476 | back_chain[j] = enum; | |
477 | } | |
478 | } | |
479 | ||
5de8299c JM |
480 | s = substr(" ", |
481 | length (enum_string)) | |
776dc15d KC |
482 | |
483 | if (help[i] == "") | |
484 | hlp = "0" | |
485 | else | |
486 | hlp = "N_(\"" help[i] "\")"; | |
487 | ||
5de8299c JM |
488 | print " " enum_string s "/* -" opts[i] " */" |
489 | enum_value++ | |
776dc15d KC |
490 | } |
491 | ||
6e2f1956 JM |
492 | print " N_OPTS," |
493 | print " OPT_SPECIAL_unknown," | |
2d2bd949 | 494 | print " OPT_SPECIAL_ignore," |
6e2f1956 JM |
495 | print " OPT_SPECIAL_program_name," |
496 | print " OPT_SPECIAL_input_file" | |
776dc15d KC |
497 | print "};" |
498 | print "" | |
40e23961 | 499 | print "#ifdef GCC_C_COMMON_C" |
b559c810 MLI |
500 | print "/* Mapping from cpp message reasons to the options that enable them. */" |
501 | print "#include <cpplib.h>" | |
502 | print "struct cpp_reason_option_codes_t" | |
503 | print "{" | |
504 | print " const int reason; /* cpplib message reason. */" | |
505 | print " const int option_code; /* gcc option that controls this message. */" | |
506 | print "};" | |
507 | print "" | |
508 | print "static const struct cpp_reason_option_codes_t cpp_reason_option_codes[] = {" | |
509 | for (i = 0; i < n_opts; i++) { | |
510 | # With identical flags, pick only the last one. The | |
511 | # earlier loop ensured that it has all flags merged, | |
512 | # and a nonempty help text if one of the texts was nonempty. | |
513 | while( i + 1 != n_opts && opts[i] == opts[i + 1] ) { | |
514 | i++; | |
515 | } | |
516 | cpp_reason = nth_arg(0, opt_args("CppReason", flags[i])); | |
517 | if (cpp_reason != "") { | |
518 | cpp_reason = cpp_reason ","; | |
519 | printf(" {%-40s %s},\n", cpp_reason, opt_enum(opts[i])) | |
520 | } | |
521 | } | |
522 | printf(" {%-40s 0},\n", "CPP_W_NONE,") | |
523 | print "};" | |
524 | print "#endif" | |
525 | print "" | |
776dc15d KC |
526 | print "#endif /* OPTIONS_H */" |
527 | } |