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