]>
Commit | Line | Data |
---|---|---|
8d9254fc | 1 | # Copyright (C) 2003-2020 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 | ||
f521d9d8 | 135 | n_opt_char = 4; |
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"; |
f521d9d8 | 143 | var_opt_char[3] = "unsigned char x_optimize_fast"; |
ab442df7 MM |
144 | |
145 | for (i = 0; i < n_opts; i++) { | |
ff98fa95 | 146 | if (flag_set_p("(Optimization|PerFunction)", flags[i])) { |
ab442df7 MM |
147 | name = var_name(flags[i]) |
148 | if(name == "") | |
149 | continue; | |
150 | ||
151 | if(name in var_opt_seen) | |
152 | continue; | |
153 | ||
154 | var_opt_seen[name]++; | |
155 | otype = var_type_struct(flags[i]); | |
156 | if (otype ~ "^((un)?signed +)?int *$") | |
e3339d0f | 157 | var_opt_int[n_opt_int++] = otype "x_" name; |
ab442df7 MM |
158 | |
159 | else if (otype ~ "^((un)?signed +)?short *$") | |
e3339d0f | 160 | var_opt_short[n_opt_short++] = otype "x_" name; |
ab442df7 MM |
161 | |
162 | else if (otype ~ "^((un)?signed +)?char *$") | |
e3339d0f | 163 | var_opt_char[n_opt_char++] = otype "x_" name; |
ab442df7 | 164 | |
fd438373 MM |
165 | else if (otype ~ ("^enum +[_" alnum "]+ *$")) |
166 | var_opt_enum[n_opt_enum++] = otype "x_" name; | |
167 | ||
ab442df7 | 168 | else |
e3339d0f | 169 | var_opt_other[n_opt_other++] = otype "x_" name; |
ab442df7 MM |
170 | } |
171 | } | |
172 | ||
173 | for (i = 0; i < n_opt_other; i++) { | |
174 | print " " var_opt_other[i] ";"; | |
175 | } | |
176 | ||
177 | for (i = 0; i < n_opt_int; i++) { | |
178 | print " " var_opt_int[i] ";"; | |
179 | } | |
180 | ||
fd438373 MM |
181 | for (i = 0; i < n_opt_enum; i++) { |
182 | print " " var_opt_enum[i] ";"; | |
183 | } | |
184 | ||
ab442df7 MM |
185 | for (i = 0; i < n_opt_short; i++) { |
186 | print " " var_opt_short[i] ";"; | |
187 | } | |
188 | ||
189 | for (i = 0; i < n_opt_char; i++) { | |
190 | print " " var_opt_char[i] ";"; | |
191 | } | |
192 | ||
193 | print "};"; | |
194 | print ""; | |
195 | ||
196 | # Target and optimization save/restore/print functions. | |
197 | print "/* Structure to save/restore selected target specific options. */"; | |
d1b38208 | 198 | print "struct GTY(()) cl_target_option"; |
ab442df7 MM |
199 | print "{"; |
200 | ||
201 | n_target_char = 0; | |
202 | n_target_short = 0; | |
203 | n_target_int = 0; | |
fd438373 | 204 | n_target_enum = 0; |
ab442df7 MM |
205 | n_target_other = 0; |
206 | ||
207 | for (i = 0; i < n_target_save; i++) { | |
e4590d63 | 208 | if (target_save_decl[i] ~ "^((un)?signed +)?int +[_" alnum "]+$") |
ab442df7 MM |
209 | var_target_int[n_target_int++] = target_save_decl[i]; |
210 | ||
e4590d63 | 211 | else if (target_save_decl[i] ~ "^((un)?signed +)?short +[_" alnum "]+$") |
ab442df7 MM |
212 | var_target_short[n_target_short++] = target_save_decl[i]; |
213 | ||
e4590d63 | 214 | else if (target_save_decl[i] ~ "^((un)?signed +)?char +[_ " alnum "]+$") |
ab442df7 MM |
215 | var_target_char[n_target_char++] = target_save_decl[i]; |
216 | ||
fd438373 MM |
217 | else if (target_save_decl[i] ~ ("^enum +[_" alnum "]+ +[_" alnum "]+$")) { |
218 | var_target_enum[n_target_enum++] = target_save_decl[i]; | |
219 | } | |
ab442df7 MM |
220 | else |
221 | var_target_other[n_target_other++] = target_save_decl[i]; | |
222 | } | |
223 | ||
224 | if (have_save) { | |
225 | for (i = 0; i < n_opts; i++) { | |
226 | if (flag_set_p("Save", flags[i])) { | |
227 | name = var_name(flags[i]) | |
228 | if(name == "") | |
229 | name = "target_flags"; | |
230 | ||
231 | if(name in var_save_seen) | |
232 | continue; | |
233 | ||
234 | var_save_seen[name]++; | |
235 | otype = var_type_struct(flags[i]) | |
236 | if (otype ~ "^((un)?signed +)?int *$") | |
e3339d0f | 237 | var_target_int[n_target_int++] = otype "x_" name; |
ab442df7 MM |
238 | |
239 | else if (otype ~ "^((un)?signed +)?short *$") | |
e3339d0f | 240 | var_target_short[n_target_short++] = otype "x_" name; |
ab442df7 MM |
241 | |
242 | else if (otype ~ "^((un)?signed +)?char *$") | |
e3339d0f | 243 | var_target_char[n_target_char++] = otype "x_" name; |
ab442df7 | 244 | |
fd438373 MM |
245 | else if (otype ~ ("^enum +[_" alnum "]+ +[_" alnum "]+")) |
246 | var_target_enum[n_target_enum++] = otype "x_" name; | |
247 | ||
ab442df7 | 248 | else |
e3339d0f | 249 | var_target_other[n_target_other++] = otype "x_" name; |
ab442df7 MM |
250 | } |
251 | } | |
252 | } else { | |
e3339d0f | 253 | var_target_int[n_target_int++] = "int x_target_flags"; |
ab442df7 MM |
254 | } |
255 | ||
256 | for (i = 0; i < n_target_other; i++) { | |
257 | print " " var_target_other[i] ";"; | |
258 | } | |
259 | ||
fd438373 MM |
260 | for (i = 0; i < n_target_enum; i++) { |
261 | print " " var_target_enum[i] ";"; | |
262 | } | |
263 | ||
ab442df7 MM |
264 | for (i = 0; i < n_target_int; i++) { |
265 | print " " var_target_int[i] ";"; | |
266 | } | |
267 | ||
268 | for (i = 0; i < n_target_short; i++) { | |
269 | print " " var_target_short[i] ";"; | |
270 | } | |
271 | ||
272 | for (i = 0; i < n_target_char; i++) { | |
273 | print " " var_target_char[i] ";"; | |
274 | } | |
275 | ||
276 | print "};"; | |
277 | print ""; | |
278 | print ""; | |
279 | print "/* Save optimization variables into a structure. */" | |
46625112 | 280 | print "extern void cl_optimization_save (struct cl_optimization *, struct gcc_options *);"; |
ab442df7 MM |
281 | print ""; |
282 | print "/* Restore optimization variables from a structure. */"; | |
46625112 | 283 | print "extern void cl_optimization_restore (struct gcc_options *, struct cl_optimization *);"; |
ab442df7 MM |
284 | print ""; |
285 | print "/* Print optimization variables from a structure. */"; | |
286 | print "extern void cl_optimization_print (FILE *, int, struct cl_optimization *);"; | |
287 | print ""; | |
eaabbb00 ML |
288 | print "/* Print different optimization variables from structures provided as arguments. */"; |
289 | print "extern void cl_optimization_print_diff (FILE *, int, cl_optimization *ptr1, cl_optimization *ptr2);"; | |
290 | print ""; | |
ab442df7 | 291 | print "/* Save selected option variables into a structure. */" |
46625112 | 292 | print "extern void cl_target_option_save (struct cl_target_option *, struct gcc_options *);"; |
ab442df7 MM |
293 | print ""; |
294 | print "/* Restore selected option variables from a structure. */" | |
46625112 | 295 | print "extern void cl_target_option_restore (struct gcc_options *, struct cl_target_option *);"; |
ab442df7 MM |
296 | print ""; |
297 | print "/* Print target option variables from a structure. */"; | |
298 | print "extern void cl_target_option_print (FILE *, int, struct cl_target_option *);"; | |
7d5a5747 | 299 | print ""; |
eaabbb00 ML |
300 | print "/* Print different target option variables from structures provided as arguments. */"; |
301 | print "extern void cl_target_option_print_diff (FILE *, int, cl_target_option *ptr1, cl_target_option *ptr2);"; | |
302 | print ""; | |
54e774c0 JH |
303 | print "/* Compare two target option variables from a structure. */"; |
304 | print "extern bool cl_target_option_eq (const struct cl_target_option *, const struct cl_target_option *);"; | |
305 | print ""; | |
c6145f2a JH |
306 | print "/* Free heap memory used by target option variables. */"; |
307 | print "extern void cl_target_option_free (struct cl_target_option *);"; | |
308 | print ""; | |
54e774c0 JH |
309 | print "/* Hash option variables from a structure. */"; |
310 | print "extern hashval_t cl_target_option_hash (const struct cl_target_option *);"; | |
311 | print ""; | |
ca9a04da JH |
312 | print "/* Hash optimization from a structure. */"; |
313 | print "extern hashval_t cl_optimization_hash (const struct cl_optimization *);"; | |
314 | print ""; | |
c518c102 ML |
315 | print "/* Compare two optimization options. */"; |
316 | print "extern bool cl_optimization_option_eq (cl_optimization const *ptr1, cl_optimization const *ptr2);" | |
317 | print ""; | |
c6145f2a JH |
318 | print "/* Free heap memory used by optimization options. */"; |
319 | print "extern void cl_optimization_option_free (cl_optimization *ptr1);" | |
320 | print ""; | |
dc6d15ea ML |
321 | print "/* Compare and report difference for a part of cl_optimization options. */"; |
322 | print "extern void cl_optimization_compare (gcc_options *ptr1, gcc_options *ptr2);"; | |
323 | print ""; | |
903f5c23 AM |
324 | print "/* Generator files may not have access to location_t, and don't need these. */" |
325 | print "#if defined(UNKNOWN_LOCATION)" | |
7d5a5747 MLI |
326 | print "bool " |
327 | print "common_handle_option_auto (struct gcc_options *opts, " | |
328 | print " struct gcc_options *opts_set, " | |
329 | print " const struct cl_decoded_option *decoded, " | |
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); " | |
f2bc201f MLI |
334 | for (i = 0; i < n_langs; i++) { |
335 | lang_name = lang_sanitized_name(langs[i]); | |
00abf86c MS |
336 | print "bool" |
337 | print lang_name "_handle_option_auto (struct gcc_options *opts," | |
338 | print " struct gcc_options *opts_set," | |
339 | print " size_t scode, const char *arg," | |
340 | print " HOST_WIDE_INT value," | |
341 | print " unsigned int lang_mask, int kind," | |
342 | print " location_t loc," | |
343 | print " const struct cl_option_handlers *handlers," | |
344 | print " diagnostic_context *dc);" | |
f2bc201f | 345 | } |
43f9a13c MLI |
346 | print "void cpp_handle_option_auto (const struct gcc_options * opts, size_t scode," |
347 | print " struct cpp_options * cpp_opts);" | |
348 | print "void init_global_opts_from_cpp(struct gcc_options * opts, " | |
349 | print " const struct cpp_options * cpp_opts);" | |
7d5a5747 | 350 | print "#endif"; |
ab442df7 MM |
351 | print "#endif"; |
352 | print ""; | |
353 | ||
75685792 RS |
354 | for (i = 0; i < n_opts; i++) { |
355 | name = opt_args("Mask", flags[i]) | |
1ad36b7e L |
356 | if (name == "") { |
357 | opt = opt_args("InverseMask", flags[i]) | |
358 | if (opt ~ ",") | |
359 | name = nth_arg(0, opt) | |
360 | else | |
361 | name = opt | |
f7f655c7 | 362 | } |
1ad36b7e L |
363 | if (name != "" && mask_bits[name] == 0) { |
364 | mask_bits[name] = 1 | |
365 | vname = var_name(flags[i]) | |
366 | mask = "MASK_" | |
d5c45ad7 | 367 | mask_1 = "1U" |
1ad36b7e L |
368 | if (vname != "") { |
369 | mask = "OPTION_MASK_" | |
370 | if (host_wide_int[vname] == "yes") | |
d5c45ad7 | 371 | mask_1 = "HOST_WIDE_INT_1U" |
eefdb8e6 L |
372 | } else |
373 | extra_mask_bits[name] = 1 | |
99114bbf | 374 | print "#define " mask name " (" mask_1 " << " masknum[vname]++ ")" |
1ad36b7e | 375 | } |
75685792 | 376 | } |
fe609b0f | 377 | for (i = 0; i < n_extra_masks; i++) { |
eefdb8e6 | 378 | if (extra_mask_bits[extra_masks[i]] == 0) |
d5c45ad7 | 379 | print "#define MASK_" extra_masks[i] " (1U << " masknum[""]++ ")" |
f7f655c7 DD |
380 | } |
381 | ||
382 | for (var in masknum) { | |
99114bbf | 383 | if (var != "" && host_wide_int[var] == "yes") { |
d5c45ad7 | 384 | print "#if defined(HOST_BITS_PER_WIDE_INT) && " masknum[var] " > HOST_BITS_PER_WIDE_INT" |
99114bbf L |
385 | print "#error too many masks for " var |
386 | print "#endif" | |
387 | } | |
d5c45ad7 | 388 | else if (masknum[var] > 32) { |
f7f655c7 DD |
389 | if (var == "") |
390 | print "#error too many target masks" | |
391 | else | |
392 | print "#error too many masks for " var | |
393 | } | |
fe609b0f | 394 | } |
75685792 RS |
395 | print "" |
396 | ||
397 | for (i = 0; i < n_opts; i++) { | |
398 | name = opt_args("Mask", flags[i]) | |
1ad36b7e L |
399 | if (name == "") { |
400 | opt = opt_args("InverseMask", flags[i]) | |
401 | if (opt ~ ",") | |
402 | name = nth_arg(0, opt) | |
403 | else | |
404 | name = opt | |
f7f655c7 | 405 | } |
1ad36b7e L |
406 | if (name != "" && mask_macros[name] == 0) { |
407 | mask_macros[name] = 1 | |
408 | vname = var_name(flags[i]) | |
1ad36b7e L |
409 | mask = "OPTION_MASK_" |
410 | if (vname == "") { | |
411 | vname = "target_flags" | |
1ad36b7e | 412 | mask = "MASK_" |
eefdb8e6 | 413 | extra_mask_macros[name] = 1 |
1ad36b7e | 414 | } |
90922d36 | 415 | print "#define TARGET_" name \ |
f7f655c7 | 416 | " ((" vname " & " mask name ") != 0)" |
bf7b5747 | 417 | print "#define TARGET_" name "_P(" vname ")" \ |
d5c45ad7 | 418 | " (((" vname ") & " mask name ") != 0)" |
1ad36b7e | 419 | } |
75685792 | 420 | } |
fe609b0f | 421 | for (i = 0; i < n_extra_masks; i++) { |
eefdb8e6 L |
422 | if (extra_mask_macros[extra_masks[i]] == 0) |
423 | print "#define TARGET_" extra_masks[i] \ | |
424 | " ((target_flags & MASK_" extra_masks[i] ") != 0)" | |
fe609b0f | 425 | } |
75685792 RS |
426 | print "" |
427 | ||
428 | for (i = 0; i < n_opts; i++) { | |
429 | opt = opt_args("InverseMask", flags[i]) | |
7bd85ce0 JM |
430 | if (opt ~ ",") { |
431 | vname = var_name(flags[i]) | |
7bd85ce0 JM |
432 | mask = "OPTION_MASK_" |
433 | if (vname == "") { | |
434 | vname = "target_flags" | |
7bd85ce0 JM |
435 | mask = "MASK_" |
436 | } | |
90922d36 | 437 | print "#define TARGET_" nth_arg(1, opt) \ |
7bd85ce0 JM |
438 | " ((" vname " & " mask nth_arg(0, opt) ") == 0)" |
439 | } | |
75685792 RS |
440 | } |
441 | print "" | |
776dc15d KC |
442 | |
443 | for (i = 0; i < n_langs; i++) { | |
f2bc201f | 444 | macros[i] = "CL_" lang_sanitized_name(langs[i]) |
776dc15d | 445 | s = substr(" ", length (macros[i])) |
eb50f63a | 446 | print "#define " macros[i] s " (1U << " i ")" |
776dc15d | 447 | } |
eb50f63a | 448 | print "#define CL_LANG_ALL ((1U << " n_langs ") - 1)" |
776dc15d KC |
449 | |
450 | print "" | |
451 | print "enum opt_code" | |
452 | print "{" | |
453 | ||
454 | for (i = 0; i < n_opts; i++) | |
455 | back_chain[i] = "N_OPTS"; | |
456 | ||
5de8299c | 457 | enum_value = 0 |
64fbae21 RS |
458 | for (i = 0; i < n_opts; i++) { |
459 | # Combine the flags of identical switches. Switches | |
460 | # appear many times if they are handled by many front | |
461 | # ends, for example. | |
462 | while( i + 1 != n_opts && opts[i] == opts[i + 1] ) { | |
463 | flags[i + 1] = flags[i] " " flags[i + 1]; | |
464 | i++; | |
465 | } | |
776dc15d KC |
466 | |
467 | len = length (opts[i]); | |
9db94baa | 468 | enum = opt_enum(opts[i]) |
5de8299c JM |
469 | enum_string = enum " = " enum_value "," |
470 | ||
471 | # Aliases do not get enumeration names. | |
d1583032 JM |
472 | if ((flag_set_p("Alias.*", flags[i]) \ |
473 | && !flag_set_p("SeparateAlias", flags[i])) \ | |
474 | || flag_set_p("Ignore", flags[i])) { | |
5de8299c JM |
475 | enum_string = "/* " enum_string " */" |
476 | } | |
776dc15d KC |
477 | |
478 | # If this switch takes joined arguments, back-chain all | |
479 | # subsequent switches to it for which it is a prefix. If | |
480 | # a later switch S is a longer prefix of a switch T, T | |
481 | # will be back-chained to S in a later iteration of this | |
482 | # for() loop, which is what we want. | |
a56a0779 | 483 | if (flag_set_p("Joined.*", flags[i])) { |
776dc15d KC |
484 | for (j = i + 1; j < n_opts; j++) { |
485 | if (substr (opts[j], 1, len) != opts[i]) | |
486 | break; | |
487 | back_chain[j] = enum; | |
488 | } | |
489 | } | |
490 | ||
5de8299c JM |
491 | s = substr(" ", |
492 | length (enum_string)) | |
776dc15d KC |
493 | |
494 | if (help[i] == "") | |
495 | hlp = "0" | |
496 | else | |
497 | hlp = "N_(\"" help[i] "\")"; | |
498 | ||
5de8299c JM |
499 | print " " enum_string s "/* -" opts[i] " */" |
500 | enum_value++ | |
776dc15d KC |
501 | } |
502 | ||
6e2f1956 JM |
503 | print " N_OPTS," |
504 | print " OPT_SPECIAL_unknown," | |
2d2bd949 | 505 | print " OPT_SPECIAL_ignore," |
68a57628 | 506 | print " OPT_SPECIAL_warn_removed," |
6e2f1956 JM |
507 | print " OPT_SPECIAL_program_name," |
508 | print " OPT_SPECIAL_input_file" | |
776dc15d KC |
509 | print "};" |
510 | print "" | |
40e23961 | 511 | print "#ifdef GCC_C_COMMON_C" |
b559c810 MLI |
512 | print "/* Mapping from cpp message reasons to the options that enable them. */" |
513 | print "#include <cpplib.h>" | |
514 | print "struct cpp_reason_option_codes_t" | |
515 | print "{" | |
c24300ba DM |
516 | print " /* cpplib message reason. */" |
517 | print " const enum cpp_warning_reason reason;" | |
518 | print " /* gcc option that controls this message. */" | |
519 | print " const int option_code;" | |
b559c810 MLI |
520 | print "};" |
521 | print "" | |
522 | print "static const struct cpp_reason_option_codes_t cpp_reason_option_codes[] = {" | |
523 | for (i = 0; i < n_opts; i++) { | |
524 | # With identical flags, pick only the last one. The | |
525 | # earlier loop ensured that it has all flags merged, | |
526 | # and a nonempty help text if one of the texts was nonempty. | |
527 | while( i + 1 != n_opts && opts[i] == opts[i + 1] ) { | |
528 | i++; | |
529 | } | |
530 | cpp_reason = nth_arg(0, opt_args("CppReason", flags[i])); | |
531 | if (cpp_reason != "") { | |
532 | cpp_reason = cpp_reason ","; | |
533 | printf(" {%-40s %s},\n", cpp_reason, opt_enum(opts[i])) | |
534 | } | |
535 | } | |
536 | printf(" {%-40s 0},\n", "CPP_W_NONE,") | |
537 | print "};" | |
538 | print "#endif" | |
539 | print "" | |
776dc15d KC |
540 | print "#endif /* OPTIONS_H */" |
541 | } |