optc-gen.awk revision 1.8 1 1.8 mrg # Copyright (C) 2003-2017 Free Software Foundation, Inc.
2 1.1 mrg # Contributed by Kelley Cook, June 2004.
3 1.1 mrg # Original code from Neil Booth, May 2003.
4 1.1 mrg #
5 1.1 mrg # This program is free software; you can redistribute it and/or modify it
6 1.1 mrg # under the terms of the GNU General Public License as published by the
7 1.1 mrg # Free Software Foundation; either version 3, or (at your option) any
8 1.1 mrg # later version.
9 1.1 mrg #
10 1.1 mrg # This program is distributed in the hope that it will be useful,
11 1.1 mrg # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 1.1 mrg # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 1.1 mrg # GNU General Public License for more details.
14 1.1 mrg #
15 1.1 mrg # You should have received a copy of the GNU General Public License
16 1.1 mrg # along with this program; see the file COPYING3. If not see
17 1.1 mrg # <http://www.gnu.org/licenses/>.
18 1.1 mrg
19 1.1 mrg # This Awk script reads in the option records generated from
20 1.1 mrg # opt-gather.awk, combines the flags of duplicate options and generates a
21 1.1 mrg # C file.
22 1.1 mrg #
23 1.3 mrg
24 1.3 mrg # This program uses functions from opt-functions.awk and code from
25 1.3 mrg # opt-read.awk.
26 1.1 mrg #
27 1.3 mrg # Usage: awk -f opt-functions.awk -f opt-read.awk -f optc-gen.awk \
28 1.1 mrg # [-v header_name=header.h] < inputfile > options.c
29 1.1 mrg
30 1.1 mrg # Dump that array of options into a C file.
31 1.1 mrg END {
32 1.3 mrg
33 1.6 mrg
34 1.6 mrg # Combine the flags of identical switches. Switches
35 1.6 mrg # appear many times if they are handled by many front
36 1.6 mrg # ends, for example.
37 1.6 mrg for (i = 0; i < n_opts; i++) {
38 1.6 mrg merged_flags[i] = flags[i]
39 1.6 mrg }
40 1.6 mrg for (i = 0; i < n_opts; i++) {
41 1.6 mrg while(i + 1 != n_opts && opts[i] == opts[i + 1] ) {
42 1.6 mrg merged_flags[i + 1] = merged_flags[i] " " merged_flags[i + 1];
43 1.6 mrg i++;
44 1.6 mrg }
45 1.6 mrg }
46 1.6 mrg
47 1.6 mrg # Record EnabledBy and LangEnabledBy uses.
48 1.3 mrg n_enabledby = 0;
49 1.3 mrg for (i = 0; i < n_langs; i++) {
50 1.3 mrg n_enabledby_lang[i] = 0;
51 1.3 mrg }
52 1.3 mrg for (i = 0; i < n_opts; i++) {
53 1.3 mrg enabledby_arg = opt_args("EnabledBy", flags[i]);
54 1.3 mrg if (enabledby_arg != "") {
55 1.5 mrg logical_and = index(enabledby_arg, " && ");
56 1.5 mrg if (logical_and != 0) {
57 1.5 mrg # EnabledBy(arg1 && arg2)
58 1.5 mrg split_sep = " && ";
59 1.5 mrg } else {
60 1.5 mrg # EnabledBy(arg) or EnabledBy(arg1 || arg2 || arg3)
61 1.5 mrg split_sep = " \\|\\| ";
62 1.5 mrg }
63 1.5 mrg n_enabledby_names = split(enabledby_arg, enabledby_names, split_sep);
64 1.5 mrg if (logical_and != 0 && n_enabledby_names > 2) {
65 1.6 mrg print "#error " opts[i] " EnabledBy(Wfoo && Wbar && Wbaz) currently not supported"
66 1.3 mrg }
67 1.3 mrg for (j = 1; j <= n_enabledby_names; j++) {
68 1.3 mrg enabledby_name = enabledby_names[j];
69 1.3 mrg enabledby_index = opt_numbers[enabledby_name];
70 1.3 mrg if (enabledby_index == "") {
71 1.6 mrg print "#error " opts[i] " Enabledby(" enabledby_name "), unknown option '" enabledby_name "'"
72 1.6 mrg } else if (!flag_set_p("Common", merged_flags[enabledby_index])) {
73 1.6 mrg print "#error " opts[i] " Enabledby(" enabledby_name "), '" \
74 1.6 mrg enabledby_name "' must have flag 'Common'" \
75 1.6 mrg " to use Enabledby(), otherwise use LangEnabledBy()"
76 1.6 mrg } else {
77 1.6 mrg condition = "";
78 1.5 mrg if (logical_and != 0) {
79 1.3 mrg opt_var_name_1 = search_var_name(enabledby_names[1], opt_numbers, opts, flags, n_opts);
80 1.3 mrg opt_var_name_2 = search_var_name(enabledby_names[2], opt_numbers, opts, flags, n_opts);
81 1.3 mrg if (opt_var_name_1 == "") {
82 1.3 mrg print "#error " enabledby_names[1] " does not have a Var() flag"
83 1.3 mrg }
84 1.3 mrg if (opt_var_name_2 == "") {
85 1.3 mrg print "#error " enabledby_names[2] " does not have a Var() flag"
86 1.3 mrg }
87 1.3 mrg condition = "opts->x_" opt_var_name_1 " && opts->x_" opt_var_name_2;
88 1.3 mrg }
89 1.3 mrg if (enables[enabledby_name] == "") {
90 1.3 mrg enabledby[n_enabledby] = enabledby_name;
91 1.3 mrg n_enabledby++;
92 1.3 mrg }
93 1.3 mrg enables[enabledby_name] = enables[enabledby_name] opts[i] ";";
94 1.3 mrg enablesif[enabledby_name] = enablesif[enabledby_name] condition ";";
95 1.3 mrg }
96 1.3 mrg }
97 1.3 mrg }
98 1.3 mrg
99 1.3 mrg enabledby_arg = opt_args("LangEnabledBy", flags[i]);
100 1.3 mrg if (enabledby_arg != "") {
101 1.3 mrg enabledby_langs = nth_arg(0, enabledby_arg);
102 1.3 mrg enabledby_name = nth_arg(1, enabledby_arg);
103 1.3 mrg enabledby_posarg = nth_arg(2, enabledby_arg);
104 1.3 mrg enabledby_negarg = nth_arg(3, enabledby_arg);
105 1.3 mrg lang_enabled_by(enabledby_langs, enabledby_name, enabledby_posarg, enabledby_negarg);
106 1.3 mrg }
107 1.3 mrg }
108 1.3 mrg
109 1.3 mrg
110 1.1 mrg print "/* This file is auto-generated by optc-gen.awk. */"
111 1.1 mrg print ""
112 1.1 mrg n_headers = split(header_name, headers, " ")
113 1.1 mrg for (i = 1; i <= n_headers; i++)
114 1.1 mrg print "#include " quote headers[i] quote
115 1.1 mrg print "#include " quote "opts.h" quote
116 1.1 mrg print "#include " quote "intl.h" quote
117 1.3 mrg print "#include " quote "insn-attr-common.h" quote
118 1.1 mrg print ""
119 1.3 mrg
120 1.3 mrg if (n_extra_c_includes > 0) {
121 1.3 mrg for (i = 0; i < n_extra_c_includes; i++) {
122 1.3 mrg print "#include " quote extra_c_includes[i] quote
123 1.3 mrg }
124 1.3 mrg print ""
125 1.3 mrg }
126 1.3 mrg
127 1.3 mrg for (i = 0; i < n_enums; i++) {
128 1.3 mrg name = enum_names[i]
129 1.3 mrg type = enum_type[name]
130 1.3 mrg print "static const struct cl_enum_arg cl_enum_" name \
131 1.3 mrg "_data[] = "
132 1.3 mrg print "{"
133 1.3 mrg print enum_data[name] " { NULL, 0, 0 }"
134 1.3 mrg print "};"
135 1.3 mrg print ""
136 1.3 mrg print "static void"
137 1.3 mrg print "cl_enum_" name "_set (void *var, int value)"
138 1.3 mrg print "{"
139 1.3 mrg print " *((" type " *) var) = (" type ") value;"
140 1.3 mrg print "}"
141 1.3 mrg print ""
142 1.3 mrg print "static int"
143 1.3 mrg print "cl_enum_" name "_get (const void *var)"
144 1.3 mrg print "{"
145 1.3 mrg print " return (int) *((const " type " *) var);"
146 1.3 mrg print "}"
147 1.3 mrg print ""
148 1.3 mrg }
149 1.3 mrg
150 1.3 mrg print "const struct cl_enum cl_enums[] ="
151 1.3 mrg print "{"
152 1.3 mrg for (i = 0; i < n_enums; i++) {
153 1.3 mrg name = enum_names[i]
154 1.3 mrg ehelp = enum_help[name]
155 1.3 mrg if (ehelp == "")
156 1.3 mrg ehelp = "NULL"
157 1.3 mrg else
158 1.3 mrg ehelp = quote ehelp quote
159 1.3 mrg unknown_error = enum_unknown_error[name]
160 1.3 mrg if (unknown_error == "")
161 1.3 mrg unknown_error = "NULL"
162 1.3 mrg else
163 1.3 mrg unknown_error = quote unknown_error quote
164 1.3 mrg print " {"
165 1.3 mrg print " " ehelp ","
166 1.3 mrg print " " unknown_error ","
167 1.3 mrg print " cl_enum_" name "_data,"
168 1.3 mrg print " sizeof (" enum_type[name] "),"
169 1.3 mrg print " cl_enum_" name "_set,"
170 1.3 mrg print " cl_enum_" name "_get"
171 1.3 mrg print " },"
172 1.3 mrg }
173 1.3 mrg print "};"
174 1.3 mrg print "const unsigned int cl_enums_count = " n_enums ";"
175 1.1 mrg print ""
176 1.1 mrg
177 1.3 mrg print "const struct gcc_options global_options_init =\n{"
178 1.3 mrg for (i = 0; i < n_extra_vars; i++) {
179 1.3 mrg var = extra_vars[i]
180 1.3 mrg init = extra_vars[i]
181 1.3 mrg if (var ~ "=" ) {
182 1.3 mrg sub(".*= *", "", init)
183 1.3 mrg } else {
184 1.3 mrg init = "0"
185 1.3 mrg }
186 1.3 mrg sub(" *=.*", "", var)
187 1.3 mrg name = var
188 1.3 mrg sub("^.*[ *]", "", name)
189 1.3 mrg sub("\\[.*\\]$", "", name)
190 1.3 mrg var_seen[name] = 1
191 1.3 mrg print " " init ", /* " name " */"
192 1.3 mrg }
193 1.1 mrg for (i = 0; i < n_opts; i++) {
194 1.3 mrg name = var_name(flags[i]);
195 1.3 mrg if (name == "")
196 1.3 mrg continue;
197 1.1 mrg
198 1.3 mrg init = opt_args("Init", flags[i])
199 1.3 mrg if (init != "") {
200 1.3 mrg if (name in var_init && var_init[name] != init)
201 1.3 mrg print "#error multiple initializers for " name
202 1.3 mrg var_init[name] = init
203 1.3 mrg }
204 1.3 mrg }
205 1.3 mrg for (i = 0; i < n_opts; i++) {
206 1.1 mrg name = var_name(flags[i]);
207 1.1 mrg if (name == "")
208 1.1 mrg continue;
209 1.1 mrg
210 1.3 mrg if (name in var_seen)
211 1.3 mrg continue;
212 1.3 mrg
213 1.3 mrg if (name in var_init)
214 1.3 mrg init = var_init[name]
215 1.3 mrg else
216 1.3 mrg init = "0"
217 1.1 mrg
218 1.3 mrg print " " init ", /* " name " */"
219 1.1 mrg
220 1.1 mrg var_seen[name] = 1;
221 1.1 mrg }
222 1.1 mrg for (i = 0; i < n_opts; i++) {
223 1.1 mrg name = static_var(opts[i], flags[i]);
224 1.3 mrg if (name != "") {
225 1.3 mrg print " 0, /* " name " (private state) */"
226 1.3 mrg print "#undef x_" name
227 1.3 mrg }
228 1.3 mrg }
229 1.3 mrg for (i = 0; i < n_opts; i++) {
230 1.3 mrg if (flag_set_p("SetByCombined", flags[i]))
231 1.3 mrg print " false, /* frontend_set_" var_name(flags[i]) " */"
232 1.1 mrg }
233 1.3 mrg print "};"
234 1.3 mrg print ""
235 1.3 mrg print "struct gcc_options global_options;"
236 1.3 mrg print "struct gcc_options global_options_set;"
237 1.1 mrg print ""
238 1.1 mrg
239 1.1 mrg print "const char * const lang_names[] =\n{"
240 1.1 mrg for (i = 0; i < n_langs; i++) {
241 1.3 mrg macros[i] = "CL_" lang_sanitized_name(langs[i])
242 1.1 mrg s = substr(" ", length (macros[i]))
243 1.1 mrg print " " quote langs[i] quote ","
244 1.1 mrg }
245 1.1 mrg
246 1.1 mrg print " 0\n};\n"
247 1.1 mrg print "const unsigned int cl_options_count = N_OPTS;\n"
248 1.3 mrg print "#if (1U << " n_langs ") > CL_MIN_OPTION_CLASS"
249 1.3 mrg print " #error the number of languages exceeds the implementation limit"
250 1.3 mrg print "#endif"
251 1.1 mrg print "const unsigned int cl_lang_count = " n_langs ";\n"
252 1.1 mrg
253 1.1 mrg print "const struct cl_option cl_options[] =\n{"
254 1.1 mrg
255 1.1 mrg j = 0
256 1.1 mrg for (i = 0; i < n_opts; i++) {
257 1.1 mrg back_chain[i] = "N_OPTS";
258 1.1 mrg indices[opts[i]] = j;
259 1.1 mrg # Combine the flags of identical switches. Switches
260 1.1 mrg # appear many times if they are handled by many front
261 1.1 mrg # ends, for example.
262 1.1 mrg while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
263 1.1 mrg flags[i + 1] = flags[i] " " flags[i + 1];
264 1.1 mrg if (help[i + 1] == "")
265 1.1 mrg help[i + 1] = help[i]
266 1.1 mrg else if (help[i] != "" && help[i + 1] != help[i])
267 1.3 mrg print "#error Multiple different help strings for " \
268 1.3 mrg opts[i] ":\n\t" help[i] "\n\t" help[i + 1]
269 1.3 mrg
270 1.1 mrg i++;
271 1.1 mrg back_chain[i] = "N_OPTS";
272 1.1 mrg indices[opts[i]] = j;
273 1.1 mrg }
274 1.1 mrg j++;
275 1.1 mrg }
276 1.1 mrg
277 1.1 mrg for (i = 0; i < n_opts; i++) {
278 1.1 mrg # With identical flags, pick only the last one. The
279 1.1 mrg # earlier loop ensured that it has all flags merged,
280 1.1 mrg # and a nonempty help text if one of the texts was nonempty.
281 1.1 mrg while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
282 1.1 mrg i++;
283 1.1 mrg }
284 1.1 mrg
285 1.1 mrg len = length (opts[i]);
286 1.3 mrg enum = opt_enum(opts[i])
287 1.1 mrg
288 1.1 mrg # If this switch takes joined arguments, back-chain all
289 1.1 mrg # subsequent switches to it for which it is a prefix. If
290 1.1 mrg # a later switch S is a longer prefix of a switch T, T
291 1.1 mrg # will be back-chained to S in a later iteration of this
292 1.1 mrg # for() loop, which is what we want.
293 1.1 mrg if (flag_set_p("Joined.*", flags[i])) {
294 1.1 mrg for (j = i + 1; j < n_opts; j++) {
295 1.1 mrg if (substr (opts[j], 1, len) != opts[i])
296 1.1 mrg break;
297 1.1 mrg back_chain[j] = enum;
298 1.1 mrg }
299 1.1 mrg }
300 1.1 mrg
301 1.1 mrg s = substr(" ", length (opts[i]))
302 1.1 mrg if (i + 1 == n_opts)
303 1.1 mrg comma = ""
304 1.1 mrg
305 1.1 mrg if (help[i] == "")
306 1.1 mrg hlp = "0"
307 1.1 mrg else
308 1.1 mrg hlp = quote help[i] quote;
309 1.1 mrg
310 1.3 mrg missing_arg_error = opt_args("MissingArgError", flags[i])
311 1.3 mrg if (missing_arg_error == "")
312 1.3 mrg missing_arg_error = "0"
313 1.3 mrg else
314 1.3 mrg missing_arg_error = quote missing_arg_error quote
315 1.3 mrg
316 1.3 mrg
317 1.3 mrg warn_message = opt_args("Warn", flags[i])
318 1.3 mrg if (warn_message == "")
319 1.3 mrg warn_message = "0"
320 1.3 mrg else
321 1.3 mrg warn_message = quote warn_message quote
322 1.3 mrg
323 1.3 mrg alias_arg = opt_args("Alias", flags[i])
324 1.3 mrg if (alias_arg == "") {
325 1.3 mrg if (flag_set_p("Ignore", flags[i]))
326 1.3 mrg alias_data = "NULL, NULL, OPT_SPECIAL_ignore"
327 1.3 mrg else
328 1.3 mrg alias_data = "NULL, NULL, N_OPTS"
329 1.8 mrg if (flag_set_p("Enum.*", flags[i])) {
330 1.8 mrg if (!flag_set_p("RejectNegative", flags[i]) \
331 1.8 mrg && opts[i] ~ "^[Wfm]")
332 1.8 mrg print "#error Enum allowing negative form"
333 1.8 mrg }
334 1.3 mrg } else {
335 1.3 mrg alias_opt = nth_arg(0, alias_arg)
336 1.3 mrg alias_posarg = nth_arg(1, alias_arg)
337 1.3 mrg alias_negarg = nth_arg(2, alias_arg)
338 1.3 mrg
339 1.3 mrg if (var_ref(opts[i], flags[i]) != "-1")
340 1.3 mrg print "#error Alias setting variable"
341 1.3 mrg
342 1.3 mrg if (alias_posarg != "" && alias_negarg == "") {
343 1.3 mrg if (!flag_set_p("RejectNegative", flags[i]) \
344 1.3 mrg && opts[i] ~ "^[Wfm]")
345 1.3 mrg print "#error Alias with single argument " \
346 1.3 mrg "allowing negative form"
347 1.3 mrg }
348 1.3 mrg if (alias_posarg != "" \
349 1.3 mrg && flag_set_p("NegativeAlias", flags[i])) {
350 1.3 mrg print "#error Alias with multiple arguments " \
351 1.3 mrg "used with NegativeAlias"
352 1.3 mrg }
353 1.3 mrg
354 1.3 mrg alias_opt = opt_enum(alias_opt)
355 1.3 mrg if (alias_posarg == "")
356 1.3 mrg alias_posarg = "NULL"
357 1.3 mrg else
358 1.3 mrg alias_posarg = quote alias_posarg quote
359 1.3 mrg if (alias_negarg == "")
360 1.3 mrg alias_negarg = "NULL"
361 1.3 mrg else
362 1.3 mrg alias_negarg = quote alias_negarg quote
363 1.3 mrg alias_data = alias_posarg ", " alias_negarg ", " alias_opt
364 1.3 mrg }
365 1.3 mrg
366 1.1 mrg neg = opt_args("Negative", flags[i]);
367 1.1 mrg if (neg != "")
368 1.1 mrg idx = indices[neg]
369 1.1 mrg else {
370 1.1 mrg if (flag_set_p("RejectNegative", flags[i]))
371 1.1 mrg idx = -1;
372 1.1 mrg else {
373 1.1 mrg if (opts[i] ~ "^[Wfm]")
374 1.1 mrg idx = indices[opts[i]];
375 1.1 mrg else
376 1.1 mrg idx = -1;
377 1.1 mrg }
378 1.1 mrg }
379 1.1 mrg # Split the printf after %u to work around an ia64-hp-hpux11.23
380 1.1 mrg # awk bug.
381 1.3 mrg printf(" { %c-%s%c,\n %s,\n %s,\n %s,\n %s, %s, %u,",
382 1.3 mrg quote, opts[i], quote, hlp, missing_arg_error, warn_message,
383 1.3 mrg alias_data, back_chain[i], len)
384 1.1 mrg printf(" %d,\n", idx)
385 1.1 mrg condition = opt_args("Condition", flags[i])
386 1.1 mrg cl_flags = switch_flags(flags[i])
387 1.3 mrg cl_bit_fields = switch_bit_fields(flags[i])
388 1.3 mrg cl_zero_bit_fields = switch_bit_fields("")
389 1.1 mrg if (condition != "")
390 1.1 mrg printf("#if %s\n" \
391 1.1 mrg " %s,\n" \
392 1.3 mrg " 0, %s,\n" \
393 1.1 mrg "#else\n" \
394 1.3 mrg " 0,\n" \
395 1.3 mrg " 1 /* Disabled. */, %s,\n" \
396 1.1 mrg "#endif\n",
397 1.3 mrg condition, cl_flags, cl_bit_fields, cl_zero_bit_fields)
398 1.1 mrg else
399 1.3 mrg printf(" %s,\n" \
400 1.3 mrg " 0, %s,\n",
401 1.3 mrg cl_flags, cl_bit_fields)
402 1.1 mrg printf(" %s, %s }%s\n", var_ref(opts[i], flags[i]),
403 1.1 mrg var_set(flags[i]), comma)
404 1.1 mrg }
405 1.1 mrg
406 1.1 mrg print "};"
407 1.1 mrg
408 1.3 mrg print "\n\n"
409 1.3 mrg print "bool "
410 1.3 mrg print "common_handle_option_auto (struct gcc_options *opts, "
411 1.3 mrg print " struct gcc_options *opts_set, "
412 1.3 mrg print " const struct cl_decoded_option *decoded, "
413 1.3 mrg print " unsigned int lang_mask, int kind, "
414 1.3 mrg print " location_t loc, "
415 1.3 mrg print " const struct cl_option_handlers *handlers, "
416 1.3 mrg print " diagnostic_context *dc) "
417 1.3 mrg print "{ "
418 1.3 mrg print " size_t scode = decoded->opt_index; "
419 1.3 mrg print " int value = decoded->value; "
420 1.3 mrg print " enum opt_code code = (enum opt_code) scode; "
421 1.3 mrg print " "
422 1.3 mrg print " gcc_assert (decoded->canonical_option_num_elements <= 2); "
423 1.3 mrg print " "
424 1.3 mrg print " switch (code) "
425 1.3 mrg print " { "
426 1.3 mrg # Handle EnabledBy
427 1.3 mrg for (i = 0; i < n_enabledby; i++) {
428 1.3 mrg enabledby_name = enabledby[i];
429 1.3 mrg print " case " opt_enum(enabledby_name) ":"
430 1.3 mrg n_enables = split(enables[enabledby_name], thisenable, ";");
431 1.3 mrg n_enablesif = split(enablesif[enabledby_name], thisenableif, ";");
432 1.3 mrg if (n_enables != n_enablesif) {
433 1.3 mrg print "#error n_enables != n_enablesif: Something went wrong!"
434 1.3 mrg }
435 1.3 mrg for (j = 1; j < n_enables; j++) {
436 1.3 mrg opt_var_name = var_name(flags[opt_numbers[thisenable[j]]]);
437 1.3 mrg if (opt_var_name != "") {
438 1.3 mrg condition = "!opts_set->x_" opt_var_name
439 1.3 mrg if (thisenableif[j] != "") {
440 1.5 mrg value = "(" thisenableif[j] ")"
441 1.5 mrg } else {
442 1.5 mrg value = "value"
443 1.3 mrg }
444 1.3 mrg print " if (" condition ")"
445 1.3 mrg print " handle_generated_option (opts, opts_set,"
446 1.5 mrg print " " opt_enum(thisenable[j]) ", NULL, " value ","
447 1.8 mrg print " lang_mask, kind, loc, handlers, true, dc);"
448 1.3 mrg } else {
449 1.3 mrg print "#error " thisenable[j] " does not have a Var() flag"
450 1.3 mrg }
451 1.3 mrg }
452 1.3 mrg print " break;\n"
453 1.1 mrg }
454 1.3 mrg print " default: "
455 1.3 mrg print " break; "
456 1.3 mrg print " } "
457 1.3 mrg print " return true; "
458 1.3 mrg print "} "
459 1.1 mrg
460 1.3 mrg # Handle LangEnabledBy
461 1.3 mrg for (i = 0; i < n_langs; i++) {
462 1.3 mrg lang_name = lang_sanitized_name(langs[i]);
463 1.3 mrg mark_unused = " ATTRIBUTE_UNUSED";
464 1.1 mrg
465 1.3 mrg print "\n\n"
466 1.3 mrg print "bool "
467 1.3 mrg print lang_name "_handle_option_auto (struct gcc_options *opts" mark_unused ", "
468 1.3 mrg print " struct gcc_options *opts_set" mark_unused ", "
469 1.3 mrg print " size_t scode" mark_unused ", const char *arg" mark_unused ", int value" mark_unused ", "
470 1.3 mrg print " unsigned int lang_mask" mark_unused ", int kind" mark_unused ", "
471 1.3 mrg print " location_t loc" mark_unused ", "
472 1.3 mrg print " const struct cl_option_handlers *handlers" mark_unused ", "
473 1.3 mrg print " diagnostic_context *dc" mark_unused ") "
474 1.3 mrg print "{ "
475 1.3 mrg print " enum opt_code code = (enum opt_code) scode; "
476 1.3 mrg print " "
477 1.3 mrg print " switch (code) "
478 1.3 mrg print " { "
479 1.3 mrg
480 1.3 mrg for (k = 0; k < n_enabledby_lang[i]; k++) {
481 1.3 mrg enabledby_name = enabledby[lang_name,k];
482 1.3 mrg print " case " opt_enum(enabledby_name) ":"
483 1.3 mrg n_thisenable = split(enables[lang_name,enabledby_name], thisenable, ";");
484 1.3 mrg for (j = 1; j < n_thisenable; j++) {
485 1.3 mrg n_thisenable_args = split(thisenable[j], thisenable_args, ",");
486 1.3 mrg if (n_thisenable_args == 1) {
487 1.3 mrg thisenable_opt = thisenable[j];
488 1.3 mrg value = "value";
489 1.3 mrg } else {
490 1.3 mrg thisenable_opt = thisenable_args[1];
491 1.3 mrg with_posarg = thisenable_args[2];
492 1.3 mrg with_negarg = thisenable_args[3];
493 1.3 mrg value = "value ? " with_posarg " : " with_negarg;
494 1.3 mrg }
495 1.3 mrg opt_var_name = var_name(flags[opt_numbers[thisenable_opt]]);
496 1.3 mrg if (opt_var_name != "") {
497 1.3 mrg print " if (!opts_set->x_" opt_var_name ")"
498 1.3 mrg print " handle_generated_option (opts, opts_set,"
499 1.3 mrg print " " opt_enum(thisenable_opt) ", NULL, " value ","
500 1.8 mrg print " lang_mask, kind, loc, handlers, true, dc);"
501 1.3 mrg } else {
502 1.3 mrg print "#error " thisenable_opt " does not have a Var() flag"
503 1.3 mrg }
504 1.3 mrg }
505 1.3 mrg print " break;\n"
506 1.3 mrg }
507 1.3 mrg print " default: "
508 1.3 mrg print " break; "
509 1.3 mrg print " } "
510 1.3 mrg print " return true; "
511 1.3 mrg print "} "
512 1.1 mrg }
513 1.1 mrg
514 1.5 mrg #Handle CPP()
515 1.5 mrg print "\n"
516 1.5 mrg print "#include " quote "cpplib.h" quote;
517 1.5 mrg print "void"
518 1.5 mrg print "cpp_handle_option_auto (const struct gcc_options * opts, "
519 1.5 mrg print " size_t scode, struct cpp_options * cpp_opts)"
520 1.5 mrg print "{ "
521 1.5 mrg print " enum opt_code code = (enum opt_code) scode; "
522 1.5 mrg print " "
523 1.5 mrg print " switch (code) "
524 1.5 mrg print " { "
525 1.5 mrg for (i = 0; i < n_opts; i++) {
526 1.5 mrg # With identical flags, pick only the last one. The
527 1.5 mrg # earlier loop ensured that it has all flags merged,
528 1.5 mrg # and a nonempty help text if one of the texts was nonempty.
529 1.5 mrg while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
530 1.5 mrg i++;
531 1.5 mrg }
532 1.5 mrg
533 1.5 mrg cpp_option = nth_arg(0, opt_args("CPP", flags[i]));
534 1.5 mrg if (cpp_option != "") {
535 1.5 mrg opt_var_name = var_name(flags[i]);
536 1.5 mrg init = opt_args("Init", flags[i])
537 1.5 mrg if (opt_var_name != "" && init != "") {
538 1.5 mrg print " case " opt_enum(opts[i]) ":"
539 1.5 mrg print " cpp_opts->" cpp_option " = opts->x_" opt_var_name ";"
540 1.5 mrg print " break;"
541 1.5 mrg } else if (opt_var_name == "" && init == "") {
542 1.5 mrg print "#error CPP() requires setting Init() and Var() for " opts[i]
543 1.5 mrg } else if (opt_var_name != "") {
544 1.5 mrg print "#error CPP() requires setting Init() for " opts[i]
545 1.5 mrg } else {
546 1.5 mrg print "#error CPP() requires setting Var() for " opts[i]
547 1.5 mrg }
548 1.5 mrg }
549 1.5 mrg }
550 1.5 mrg print " default: "
551 1.5 mrg print " break; "
552 1.5 mrg print " } "
553 1.5 mrg print "}\n"
554 1.5 mrg print "void"
555 1.5 mrg print "init_global_opts_from_cpp(struct gcc_options * opts, "
556 1.5 mrg print " const struct cpp_options * cpp_opts)"
557 1.5 mrg print "{ "
558 1.5 mrg for (i = 0; i < n_opts; i++) {
559 1.5 mrg # With identical flags, pick only the last one. The
560 1.5 mrg # earlier loop ensured that it has all flags merged,
561 1.5 mrg # and a nonempty help text if one of the texts was nonempty.
562 1.5 mrg while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
563 1.5 mrg i++;
564 1.5 mrg }
565 1.5 mrg cpp_option = nth_arg(0, opt_args("CPP", flags[i]));
566 1.5 mrg opt_var_name = var_name(flags[i]);
567 1.5 mrg if (cpp_option != "" && opt_var_name != "") {
568 1.5 mrg print " opts->x_" opt_var_name " = cpp_opts->" cpp_option ";"
569 1.5 mrg }
570 1.5 mrg }
571 1.5 mrg print "} "
572 1.5 mrg
573 1.1 mrg }
574 1.5 mrg
575