Home | History | Annotate | Line # | Download | only in gcc
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