Home | History | Annotate | Line # | Download | only in gcc
      1  1.12  mrg #  Copyright (C) 2003-2022 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.12  mrg #            [-v header_name=header.h] < inputfile > options.cc
     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.12  mrg 	enabledby_n_args = n_args(enabledby_arg)
    102  1.12  mrg 	if (enabledby_n_args != 2 \
    103  1.12  mrg 	    && enabledby_n_args != 4) {
    104  1.12  mrg 	    print "#error " opts[i] " LangEnabledBy(" enabledby_arg ") must specify two or four arguments"
    105  1.12  mrg 	}
    106  1.12  mrg 
    107  1.12  mrg 	enabledby_langs = nth_arg(0, enabledby_arg);
    108  1.12  mrg 	if (enabledby_langs == "")
    109  1.12  mrg 	    print "#error " opts[i] " LangEnabledBy(" enabledby_arg ") must specify LANGUAGE"
    110  1.12  mrg 	enabledby_opt = nth_arg(1, enabledby_arg);
    111  1.12  mrg 	if (enabledby_opt == "")
    112  1.12  mrg 	    print "#error " opts[i] " LangEnabledBy(" enabledby_arg ") must specify OPT"
    113  1.12  mrg 
    114  1.12  mrg 	enabledby_posarg_negarg = ""
    115  1.12  mrg 	if (enabledby_n_args == 4) {
    116  1.12  mrg 	    enabledby_posarg = nth_arg(2, enabledby_arg);
    117  1.12  mrg 	    enabledby_negarg = nth_arg(3, enabledby_arg);
    118  1.12  mrg 	    if (enabledby_posarg == "" \
    119  1.12  mrg 		|| enabledby_negarg == "")
    120  1.12  mrg 		print "#error " opts[i] " LangEnabledBy(" enabledby_arg ") with four arguments must specify POSARG and NEGARG"
    121  1.12  mrg 	    else
    122  1.12  mrg 		enabledby_posarg_negarg = "," enabledby_posarg "," enabledby_negarg
    123  1.12  mrg 	}
    124  1.12  mrg 
    125  1.12  mrg 	n_enabledby_arg_langs = split(enabledby_langs, enabledby_arg_langs, " ");
    126  1.12  mrg 	n_enabledby_array = split(enabledby_opt, enabledby_array, " \\|\\| ");
    127  1.12  mrg 	for (k = 1; k <= n_enabledby_array; k++) {
    128  1.12  mrg 	    enabledby_index = opt_numbers[enabledby_array[k]];
    129  1.12  mrg 	    if (enabledby_index == "") {
    130  1.12  mrg 		print "#error " opts[i] " LangEnabledBy(" enabledby_arg "), unknown option '" enabledby_opt "'"
    131  1.12  mrg 		continue
    132  1.12  mrg 	    }
    133  1.12  mrg 
    134  1.12  mrg 	    for (j = 1; j <= n_enabledby_arg_langs; j++) {
    135  1.12  mrg 		lang_name = enabledby_arg_langs[j]
    136  1.12  mrg 		lang_index = lang_numbers[lang_name];
    137  1.12  mrg 		if (lang_index == "") {
    138  1.12  mrg 		    print "#error " opts[i] " LangEnabledBy(" enabledby_arg "), unknown language '" lang_name "'"
    139  1.12  mrg 		    continue
    140  1.12  mrg 		}
    141  1.12  mrg 
    142  1.12  mrg 		lang_name = lang_sanitized_name(lang_name);
    143  1.12  mrg 
    144  1.12  mrg 		if (enables[lang_name,enabledby_array[k]] == "") {
    145  1.12  mrg 		    enabledby[lang_name,n_enabledby_lang[lang_index]] = enabledby_array[k];
    146  1.12  mrg 		    n_enabledby_lang[lang_index]++;
    147  1.12  mrg 		}
    148  1.12  mrg 		enables[lang_name,enabledby_array[k]] \
    149  1.12  mrg 		    = enables[lang_name,enabledby_array[k]] opts[i] enabledby_posarg_negarg ";";
    150  1.12  mrg 	    }
    151  1.12  mrg 	}
    152   1.3  mrg     }
    153  1.12  mrg 
    154  1.12  mrg     if (flag_set_p("Param", flags[i]) && !(opts[i] ~ "^-param="))
    155  1.12  mrg       print "#error Parameter option name '" opts[i] "' must start with '-param='"
    156   1.3  mrg }
    157   1.3  mrg 
    158   1.3  mrg 
    159   1.1  mrg print "/* This file is auto-generated by optc-gen.awk.  */"
    160   1.1  mrg print ""
    161   1.1  mrg n_headers = split(header_name, headers, " ")
    162   1.1  mrg for (i = 1; i <= n_headers; i++)
    163   1.1  mrg 	print "#include " quote headers[i] quote
    164   1.1  mrg print "#include " quote "opts.h" quote
    165   1.1  mrg print "#include " quote "intl.h" quote
    166   1.3  mrg print "#include " quote "insn-attr-common.h" quote
    167   1.1  mrg print ""
    168   1.3  mrg 
    169   1.3  mrg if (n_extra_c_includes > 0) {
    170   1.3  mrg 	for (i = 0; i < n_extra_c_includes; i++) {
    171   1.3  mrg 		print "#include " quote extra_c_includes[i] quote
    172   1.3  mrg 	}
    173   1.3  mrg 	print ""
    174   1.3  mrg }
    175   1.3  mrg 
    176   1.3  mrg for (i = 0; i < n_enums; i++) {
    177   1.3  mrg 	name = enum_names[i]
    178   1.3  mrg 	type = enum_type[name]
    179   1.3  mrg 	print "static const struct cl_enum_arg cl_enum_" name \
    180   1.3  mrg 	    "_data[] = "
    181   1.3  mrg 	print "{"
    182   1.3  mrg 	print enum_data[name] "  { NULL, 0, 0 }"
    183   1.3  mrg 	print "};"
    184   1.3  mrg 	print ""
    185   1.3  mrg 	print "static void"
    186   1.3  mrg 	print "cl_enum_" name "_set (void *var, int value)"
    187   1.3  mrg 	print "{"
    188   1.3  mrg 	print "  *((" type " *) var) = (" type ") value;"
    189   1.3  mrg 	print "}"
    190   1.3  mrg 	print ""
    191   1.3  mrg 	print "static int"
    192   1.3  mrg 	print "cl_enum_" name "_get (const void *var)"
    193   1.3  mrg 	print "{"
    194   1.3  mrg 	print "  return (int) *((const " type " *) var);"
    195   1.3  mrg 	print "}"
    196   1.3  mrg 	print ""
    197   1.3  mrg }
    198   1.3  mrg 
    199   1.3  mrg print "const struct cl_enum cl_enums[] ="
    200   1.3  mrg print "{"
    201   1.3  mrg for (i = 0; i < n_enums; i++) {
    202   1.3  mrg 	name = enum_names[i]
    203   1.3  mrg 	ehelp = enum_help[name]
    204   1.3  mrg 	if (ehelp == "")
    205   1.3  mrg 		ehelp = "NULL"
    206   1.3  mrg 	else
    207   1.3  mrg 		ehelp = quote ehelp quote
    208   1.3  mrg 	unknown_error = enum_unknown_error[name]
    209   1.3  mrg 	if (unknown_error == "")
    210   1.3  mrg 		unknown_error = "NULL"
    211   1.3  mrg 	else
    212   1.3  mrg 		unknown_error = quote unknown_error quote
    213   1.3  mrg 	print "  {"
    214   1.3  mrg 	print "    " ehelp ","
    215   1.3  mrg 	print "    " unknown_error ","
    216   1.3  mrg 	print "    cl_enum_" name "_data,"
    217   1.3  mrg 	print "    sizeof (" enum_type[name] "),"
    218   1.3  mrg 	print "    cl_enum_" name "_set,"
    219   1.3  mrg 	print "    cl_enum_" name "_get"
    220   1.3  mrg 	print "  },"
    221   1.3  mrg }
    222   1.3  mrg print "};"
    223   1.3  mrg print "const unsigned int cl_enums_count = " n_enums ";"
    224   1.1  mrg print ""
    225   1.1  mrg 
    226   1.3  mrg print "const struct gcc_options global_options_init =\n{"
    227   1.3  mrg for (i = 0; i < n_extra_vars; i++) {
    228   1.3  mrg 	var = extra_vars[i]
    229   1.3  mrg 	init = extra_vars[i]
    230   1.3  mrg 	if (var ~ "=" ) {
    231   1.3  mrg 		sub(".*= *", "", init)
    232   1.3  mrg 	} else {
    233   1.3  mrg 		init = "0"
    234   1.3  mrg 	}
    235   1.3  mrg 	sub(" *=.*", "", var)
    236   1.3  mrg 	name = var
    237   1.3  mrg 	sub("^.*[ *]", "", name)
    238   1.3  mrg 	sub("\\[.*\\]$", "", name)
    239   1.3  mrg 	var_seen[name] = 1
    240   1.3  mrg 	print "  " init ", /* " name " */"
    241   1.3  mrg }
    242   1.1  mrg for (i = 0; i < n_opts; i++) {
    243   1.3  mrg 	name = var_name(flags[i]);
    244  1.12  mrg 	init = opt_args("Init", flags[i])
    245  1.12  mrg 
    246  1.12  mrg 	if (name == "") {
    247  1.12  mrg 		if (init != "")
    248  1.12  mrg 		    print "#error " opts[i] " must specify Var to use Init"
    249   1.3  mrg 		continue;
    250  1.12  mrg 	}
    251   1.1  mrg 
    252   1.3  mrg 	if (init != "") {
    253   1.3  mrg 		if (name in var_init && var_init[name] != init)
    254   1.3  mrg 			print "#error multiple initializers for " name
    255   1.3  mrg 		var_init[name] = init
    256   1.3  mrg 	}
    257   1.3  mrg }
    258   1.3  mrg for (i = 0; i < n_opts; i++) {
    259   1.1  mrg 	name = var_name(flags[i]);
    260   1.1  mrg 	if (name == "")
    261   1.1  mrg 		continue;
    262   1.1  mrg 
    263   1.3  mrg 	if (name in var_seen)
    264   1.3  mrg 		continue;
    265   1.3  mrg 
    266   1.3  mrg 	if (name in var_init)
    267   1.3  mrg 		init = var_init[name]
    268   1.3  mrg 	else
    269   1.3  mrg 		init = "0"
    270   1.1  mrg 
    271   1.3  mrg 	print "  " init ", /* " name " */"
    272   1.1  mrg 
    273   1.1  mrg 	var_seen[name] = 1;
    274   1.1  mrg }
    275   1.1  mrg for (i = 0; i < n_opts; i++) {
    276   1.1  mrg 	name = static_var(opts[i], flags[i]);
    277   1.3  mrg 	if (name != "") {
    278   1.3  mrg 		print "  0, /* " name " (private state) */"
    279   1.3  mrg 		print "#undef x_" name
    280   1.3  mrg 	}
    281   1.3  mrg }
    282   1.3  mrg for (i = 0; i < n_opts; i++) {
    283   1.3  mrg 	if (flag_set_p("SetByCombined", flags[i]))
    284   1.3  mrg 		print "  false, /* frontend_set_" var_name(flags[i]) " */"
    285   1.1  mrg }
    286   1.3  mrg print "};"
    287   1.3  mrg print ""
    288   1.3  mrg print "struct gcc_options global_options;"
    289   1.3  mrg print "struct gcc_options global_options_set;"
    290   1.1  mrg print ""
    291   1.1  mrg 
    292   1.1  mrg print "const char * const lang_names[] =\n{"
    293   1.1  mrg for (i = 0; i < n_langs; i++) {
    294   1.3  mrg         macros[i] = "CL_" lang_sanitized_name(langs[i])
    295   1.1  mrg 	s = substr("         ", length (macros[i]))
    296   1.1  mrg 	print "  " quote langs[i] quote ","
    297   1.1  mrg     }
    298   1.1  mrg 
    299   1.1  mrg print "  0\n};\n"
    300   1.1  mrg print "const unsigned int cl_options_count = N_OPTS;\n"
    301   1.3  mrg print "#if (1U << " n_langs ") > CL_MIN_OPTION_CLASS"
    302   1.3  mrg print "  #error the number of languages exceeds the implementation limit"
    303   1.3  mrg print "#endif"
    304   1.1  mrg print "const unsigned int cl_lang_count = " n_langs ";\n"
    305   1.1  mrg 
    306   1.1  mrg print "const struct cl_option cl_options[] =\n{"
    307   1.1  mrg 
    308   1.1  mrg j = 0
    309   1.1  mrg for (i = 0; i < n_opts; i++) {
    310   1.1  mrg 	back_chain[i] = "N_OPTS";
    311   1.1  mrg 	indices[opts[i]] = j;
    312   1.1  mrg 	# Combine the flags of identical switches.  Switches
    313   1.1  mrg 	# appear many times if they are handled by many front
    314   1.1  mrg 	# ends, for example.
    315   1.1  mrg 	while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
    316   1.1  mrg 		flags[i + 1] = flags[i] " " flags[i + 1];
    317   1.1  mrg 		if (help[i + 1] == "")
    318   1.1  mrg 			help[i + 1] = help[i]
    319  1.12  mrg 		else if (help[i] != "" && help[i + 1] != help[i]) {
    320   1.3  mrg 			print "#error Multiple different help strings for " \
    321  1.12  mrg 				opts[i] ":"
    322  1.12  mrg 			print "#error   " help[i]
    323  1.12  mrg 			print "#error   " help[i + 1]
    324  1.12  mrg 		}
    325   1.3  mrg 				
    326   1.1  mrg 		i++;
    327   1.1  mrg 		back_chain[i] = "N_OPTS";
    328   1.1  mrg 		indices[opts[i]] = j;
    329   1.1  mrg 	}
    330   1.1  mrg 	j++;
    331   1.1  mrg }
    332   1.1  mrg 
    333  1.10  mrg optindex = 0
    334   1.1  mrg for (i = 0; i < n_opts; i++) {
    335   1.1  mrg 	# With identical flags, pick only the last one.  The
    336   1.1  mrg 	# earlier loop ensured that it has all flags merged,
    337   1.1  mrg 	# and a nonempty help text if one of the texts was nonempty.
    338   1.1  mrg 	while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
    339   1.1  mrg 		i++;
    340   1.1  mrg 	}
    341   1.1  mrg 
    342   1.1  mrg 	len = length (opts[i]);
    343   1.3  mrg 	enum = opt_enum(opts[i])
    344   1.1  mrg 
    345   1.1  mrg 	# If this switch takes joined arguments, back-chain all
    346   1.1  mrg 	# subsequent switches to it for which it is a prefix.  If
    347   1.1  mrg 	# a later switch S is a longer prefix of a switch T, T
    348   1.1  mrg 	# will be back-chained to S in a later iteration of this
    349   1.1  mrg 	# for() loop, which is what we want.
    350   1.1  mrg 	if (flag_set_p("Joined.*", flags[i])) {
    351   1.1  mrg 		for (j = i + 1; j < n_opts; j++) {
    352   1.1  mrg 			if (substr (opts[j], 1, len) != opts[i])
    353   1.1  mrg 				break;
    354   1.1  mrg 			back_chain[j] = enum;
    355   1.1  mrg 		}
    356   1.1  mrg 	}
    357   1.1  mrg 
    358   1.1  mrg 	s = substr("                                  ", length (opts[i]))
    359   1.1  mrg 	if (i + 1 == n_opts)
    360   1.1  mrg 		comma = ""
    361   1.1  mrg 
    362   1.1  mrg 	if (help[i] == "")
    363  1.10  mrg 		hlp = "NULL"
    364   1.1  mrg 	else
    365   1.1  mrg 		hlp = quote help[i] quote;
    366   1.1  mrg 
    367   1.3  mrg 	missing_arg_error = opt_args("MissingArgError", flags[i])
    368   1.3  mrg 	if (missing_arg_error == "")
    369  1.10  mrg 		missing_arg_error = "NULL"
    370   1.3  mrg 	else
    371   1.3  mrg 		missing_arg_error = quote missing_arg_error quote
    372   1.3  mrg 
    373   1.3  mrg 
    374   1.3  mrg 	warn_message = opt_args("Warn", flags[i])
    375   1.3  mrg 	if (warn_message == "")
    376  1.10  mrg 		warn_message = "NULL"
    377   1.3  mrg 	else
    378   1.3  mrg 		warn_message = quote warn_message quote
    379   1.3  mrg 
    380   1.3  mrg 	alias_arg = opt_args("Alias", flags[i])
    381   1.3  mrg 	if (alias_arg == "") {
    382  1.10  mrg 		if (flag_set_p("Ignore", flags[i])) {
    383  1.10  mrg 			  alias_data = "NULL, NULL, OPT_SPECIAL_ignore"
    384  1.10  mrg         if (warn_message != "NULL")
    385  1.10  mrg 				  print "#error Ignored option with Warn"
    386  1.10  mrg         if (var_name(flags[i]) != "")
    387  1.10  mrg 				  print "#error Ignored option with Var"
    388  1.10  mrg       }
    389  1.11  mrg     else if (flag_set_p("Deprecated", flags[i]))
    390  1.11  mrg         print "#error Deprecated was replaced with WarnRemoved"
    391  1.11  mrg     else if (flag_set_p("WarnRemoved", flags[i])) {
    392  1.11  mrg 			  alias_data = "NULL, NULL, OPT_SPECIAL_warn_removed"
    393  1.10  mrg         if (warn_message != "NULL")
    394  1.11  mrg 				  print "#error WarnRemoved option with Warn"
    395  1.10  mrg       }
    396   1.3  mrg 		else
    397   1.3  mrg 			alias_data = "NULL, NULL, N_OPTS"
    398   1.8  mrg 		if (flag_set_p("Enum.*", flags[i])) {
    399   1.8  mrg 			if (!flag_set_p("RejectNegative", flags[i]) \
    400  1.12  mrg 			    && !flag_set_p("EnumSet", flags[i]) \
    401  1.12  mrg 			    && !flag_set_p("EnumBitSet", flags[i]) \
    402   1.9  mrg 			    && opts[i] ~ "^[Wfgm]")
    403   1.8  mrg 				print "#error Enum allowing negative form"
    404   1.8  mrg 		}
    405   1.3  mrg 	} else {
    406   1.3  mrg 		alias_opt = nth_arg(0, alias_arg)
    407   1.3  mrg 		alias_posarg = nth_arg(1, alias_arg)
    408   1.3  mrg 		alias_negarg = nth_arg(2, alias_arg)
    409   1.3  mrg 
    410   1.9  mrg 		if (var_ref(opts[i], flags[i]) != "(unsigned short) -1")
    411   1.3  mrg 			print "#error Alias setting variable"
    412   1.3  mrg 
    413   1.3  mrg 		if (alias_posarg != "" && alias_negarg == "") {
    414   1.3  mrg 			if (!flag_set_p("RejectNegative", flags[i]) \
    415   1.3  mrg 			    && opts[i] ~ "^[Wfm]")
    416   1.3  mrg 				print "#error Alias with single argument " \
    417   1.3  mrg 					"allowing negative form"
    418   1.3  mrg 		}
    419   1.3  mrg 		if (alias_posarg != "" \
    420   1.3  mrg 		    && flag_set_p("NegativeAlias", flags[i])) {
    421   1.3  mrg 			print "#error Alias with multiple arguments " \
    422   1.3  mrg 				"used with NegativeAlias"
    423   1.3  mrg 		}
    424   1.3  mrg 
    425   1.3  mrg 		alias_opt = opt_enum(alias_opt)
    426   1.3  mrg 		if (alias_posarg == "")
    427   1.3  mrg 			alias_posarg = "NULL"
    428   1.3  mrg 		else
    429   1.3  mrg 			alias_posarg = quote alias_posarg quote
    430   1.3  mrg 		if (alias_negarg == "")
    431   1.3  mrg 			alias_negarg = "NULL"
    432   1.3  mrg 		else
    433   1.3  mrg 			alias_negarg = quote alias_negarg quote
    434   1.3  mrg 		alias_data = alias_posarg ", " alias_negarg ", " alias_opt
    435   1.3  mrg 	}
    436   1.3  mrg 
    437   1.1  mrg 	neg = opt_args("Negative", flags[i]);
    438   1.1  mrg 	if (neg != "")
    439   1.1  mrg 		idx = indices[neg]
    440   1.1  mrg 	else {
    441   1.1  mrg 		if (flag_set_p("RejectNegative", flags[i]))
    442   1.1  mrg 			idx = -1;
    443   1.1  mrg 		else {
    444   1.9  mrg 			if (opts[i] ~ "^[Wfgm]")
    445   1.1  mrg 				idx = indices[opts[i]];
    446   1.1  mrg 			else
    447   1.1  mrg 				idx = -1;
    448   1.1  mrg 		}
    449   1.1  mrg 	}
    450   1.1  mrg 	# Split the printf after %u to work around an ia64-hp-hpux11.23
    451   1.1  mrg 	# awk bug.
    452  1.10  mrg 	printf(" /* [%i] = */ {\n", optindex)
    453  1.10  mrg 	printf("    %c-%s%c,\n    %s,\n    %s,\n    %s,\n    %s, %s, %u,",
    454   1.3  mrg 	       quote, opts[i], quote, hlp, missing_arg_error, warn_message,
    455   1.3  mrg 	       alias_data, back_chain[i], len)
    456  1.10  mrg 	printf(" /* .neg_idx = */ %d,\n", idx)
    457   1.1  mrg 	condition = opt_args("Condition", flags[i])
    458   1.1  mrg 	cl_flags = switch_flags(flags[i])
    459   1.3  mrg 	cl_bit_fields = switch_bit_fields(flags[i])
    460   1.3  mrg 	cl_zero_bit_fields = switch_bit_fields("")
    461   1.1  mrg 	if (condition != "")
    462   1.1  mrg 		printf("#if %s\n" \
    463   1.1  mrg 		       "    %s,\n" \
    464   1.3  mrg 		       "    0, %s,\n" \
    465   1.1  mrg 		       "#else\n" \
    466   1.3  mrg 		       "    0,\n" \
    467   1.3  mrg 		       "    1 /* Disabled.  */, %s,\n" \
    468   1.1  mrg 		       "#endif\n",
    469   1.3  mrg 		       condition, cl_flags, cl_bit_fields, cl_zero_bit_fields)
    470   1.1  mrg 	else
    471   1.3  mrg 		printf("    %s,\n" \
    472   1.3  mrg 		       "    0, %s,\n",
    473   1.3  mrg 		       cl_flags, cl_bit_fields)
    474   1.9  mrg 	printf("    %s, %s, %s }%s\n", var_ref(opts[i], flags[i]),
    475   1.9  mrg 	       var_set(flags[i]), integer_range_info(opt_args("IntegerRange", flags[i]),
    476  1.12  mrg 		    opt_args("Init", flags[i]), opts[i], flag_set_p("UInteger", flags[i])), comma)
    477  1.10  mrg 
    478  1.10  mrg 	# Bump up the informational option index.
    479  1.10  mrg 	++optindex
    480  1.10  mrg  }
    481   1.1  mrg 
    482   1.1  mrg print "};"
    483   1.1  mrg 
    484   1.3  mrg print "\n\n"
    485   1.3  mrg print "bool                                                                  "
    486   1.3  mrg print "common_handle_option_auto (struct gcc_options *opts,                  "
    487   1.3  mrg print "                           struct gcc_options *opts_set,              "
    488   1.3  mrg print "                           const struct cl_decoded_option *decoded,   "
    489   1.3  mrg print "                           unsigned int lang_mask, int kind,          "
    490   1.3  mrg print "                           location_t loc,                            "
    491   1.3  mrg print "                           const struct cl_option_handlers *handlers, "
    492   1.3  mrg print "                           diagnostic_context *dc)                    "
    493   1.3  mrg print "{                                                                     "
    494   1.3  mrg print "  size_t scode = decoded->opt_index;                                  "
    495  1.10  mrg print "  HOST_WIDE_INT value = decoded->value;                               "
    496   1.3  mrg print "  enum opt_code code = (enum opt_code) scode;                         "
    497   1.3  mrg print "                                                                      "
    498   1.3  mrg print "  gcc_assert (decoded->canonical_option_num_elements <= 2);           "
    499   1.3  mrg print "                                                                      "
    500   1.3  mrg print "  switch (code)                                                       "
    501   1.3  mrg print "    {                                                                 "
    502   1.3  mrg # Handle EnabledBy
    503   1.3  mrg for (i = 0; i < n_enabledby; i++) {
    504   1.3  mrg     enabledby_name = enabledby[i];
    505   1.3  mrg     print "    case " opt_enum(enabledby_name) ":"
    506   1.3  mrg     n_enables = split(enables[enabledby_name], thisenable, ";");
    507   1.3  mrg     n_enablesif = split(enablesif[enabledby_name], thisenableif, ";");
    508   1.3  mrg     if (n_enables != n_enablesif) {
    509   1.3  mrg         print "#error n_enables != n_enablesif: Something went wrong!"
    510   1.3  mrg     }
    511   1.3  mrg     for (j = 1; j < n_enables; j++) {
    512   1.3  mrg         opt_var_name = var_name(flags[opt_numbers[thisenable[j]]]);
    513   1.3  mrg         if (opt_var_name != "") {
    514   1.3  mrg             condition = "!opts_set->x_" opt_var_name
    515   1.3  mrg             if (thisenableif[j] != "") {
    516   1.5  mrg                 value = "(" thisenableif[j] ")"
    517   1.5  mrg             } else {
    518   1.5  mrg                 value = "value"
    519   1.3  mrg             }
    520   1.3  mrg             print "      if (" condition ")"
    521   1.3  mrg             print "        handle_generated_option (opts, opts_set,"
    522   1.5  mrg             print "                                 " opt_enum(thisenable[j]) ", NULL, " value ","
    523   1.8  mrg             print "                                 lang_mask, kind, loc, handlers, true, dc);"
    524   1.3  mrg         } else {
    525   1.3  mrg             print "#error " thisenable[j] " does not have a Var() flag"
    526   1.3  mrg         }
    527   1.3  mrg     }
    528   1.3  mrg     print "      break;\n"
    529   1.1  mrg }
    530   1.3  mrg print "    default:    "
    531   1.3  mrg print "      break;    "
    532   1.3  mrg print "    }           "
    533   1.3  mrg print "  return true;  "
    534   1.3  mrg print "}               "
    535   1.1  mrg 
    536   1.3  mrg # Handle LangEnabledBy
    537   1.3  mrg for (i = 0; i < n_langs; i++) {
    538   1.3  mrg     lang_name = lang_sanitized_name(langs[i]);
    539   1.3  mrg     mark_unused = " ATTRIBUTE_UNUSED";
    540   1.1  mrg 
    541   1.3  mrg     print "\n\n"
    542   1.3  mrg     print "bool                                                                  "
    543   1.3  mrg     print lang_name "_handle_option_auto (struct gcc_options *opts" mark_unused ",              "
    544   1.3  mrg     print "                           struct gcc_options *opts_set" mark_unused ",              "
    545  1.10  mrg     print "                           size_t scode" mark_unused ", const char *arg" mark_unused ", HOST_WIDE_INT value" mark_unused ",  "
    546   1.3  mrg     print "                           unsigned int lang_mask" mark_unused ", int kind" mark_unused ",          "
    547   1.3  mrg     print "                           location_t loc" mark_unused ",                            "
    548   1.3  mrg     print "                           const struct cl_option_handlers *handlers" mark_unused ", "
    549   1.3  mrg     print "                           diagnostic_context *dc" mark_unused ")                    "
    550   1.3  mrg     print "{                                                                     "
    551   1.3  mrg     print "  enum opt_code code = (enum opt_code) scode;                         "
    552   1.3  mrg     print "                                                                      "
    553   1.3  mrg     print "  switch (code)                                                       "
    554   1.3  mrg     print "    {                                                                 "
    555   1.3  mrg     
    556   1.3  mrg     for (k = 0; k < n_enabledby_lang[i]; k++) {
    557   1.3  mrg         enabledby_name = enabledby[lang_name,k];
    558   1.3  mrg         print "    case " opt_enum(enabledby_name) ":"
    559   1.3  mrg         n_thisenable = split(enables[lang_name,enabledby_name], thisenable, ";");
    560   1.3  mrg         for (j = 1; j < n_thisenable; j++) {
    561   1.3  mrg             n_thisenable_args = split(thisenable[j], thisenable_args, ",");
    562   1.3  mrg             if (n_thisenable_args == 1) {
    563   1.3  mrg                 thisenable_opt = thisenable[j];
    564   1.3  mrg                 value = "value";
    565   1.3  mrg             } else {
    566   1.3  mrg                 thisenable_opt = thisenable_args[1];
    567   1.3  mrg                 with_posarg = thisenable_args[2];
    568   1.3  mrg                 with_negarg = thisenable_args[3];
    569   1.3  mrg                 value = "value ? " with_posarg " : " with_negarg;
    570   1.3  mrg             }
    571   1.3  mrg             opt_var_name = var_name(flags[opt_numbers[thisenable_opt]]);
    572   1.3  mrg             if (opt_var_name != "") {
    573   1.3  mrg                 print "      if (!opts_set->x_" opt_var_name ")"
    574   1.3  mrg                 print "        handle_generated_option (opts, opts_set,"
    575   1.3  mrg                 print "                                 " opt_enum(thisenable_opt) ", NULL, " value ","
    576   1.8  mrg                 print "                                 lang_mask, kind, loc, handlers, true, dc);"
    577   1.3  mrg             } else {
    578   1.3  mrg                 print "#error " thisenable_opt " does not have a Var() flag"
    579   1.3  mrg             }
    580   1.3  mrg         }
    581   1.3  mrg         print "      break;\n"
    582   1.3  mrg     }
    583   1.3  mrg     print "    default:    "
    584   1.3  mrg     print "      break;    "
    585   1.3  mrg     print "    }           "
    586   1.3  mrg     print "  return true;  "
    587   1.3  mrg     print "}               "
    588   1.1  mrg }
    589   1.1  mrg 
    590   1.5  mrg #Handle CPP()
    591   1.5  mrg print "\n"
    592   1.5  mrg print "#include " quote "cpplib.h" quote;
    593   1.5  mrg print "void"
    594   1.5  mrg print "cpp_handle_option_auto (const struct gcc_options * opts,                   "
    595   1.5  mrg print "                        size_t scode, struct cpp_options * cpp_opts)"    
    596   1.5  mrg print "{                                                                     "
    597   1.5  mrg print "  enum opt_code code = (enum opt_code) scode;                         "
    598   1.5  mrg print "                                                                      "
    599   1.5  mrg print "  switch (code)                                                       "
    600   1.5  mrg print "    {                                                                 "
    601   1.5  mrg for (i = 0; i < n_opts; i++) {
    602   1.5  mrg     # With identical flags, pick only the last one.  The
    603   1.5  mrg     # earlier loop ensured that it has all flags merged,
    604   1.5  mrg     # and a nonempty help text if one of the texts was nonempty.
    605   1.5  mrg     while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
    606   1.5  mrg         i++;
    607   1.5  mrg     }
    608   1.5  mrg 
    609   1.5  mrg     cpp_option = nth_arg(0, opt_args("CPP", flags[i]));
    610   1.5  mrg     if (cpp_option != "") {
    611   1.5  mrg         opt_var_name = var_name(flags[i]);
    612   1.5  mrg         init = opt_args("Init", flags[i])
    613   1.5  mrg         if (opt_var_name != "" && init != "") {
    614   1.5  mrg             print "    case " opt_enum(opts[i]) ":"
    615   1.5  mrg             print "      cpp_opts->" cpp_option " = opts->x_" opt_var_name ";"
    616   1.5  mrg             print "      break;"
    617   1.5  mrg         } else if (opt_var_name == "" && init == "") {
    618   1.5  mrg             print "#error CPP() requires setting Init() and Var() for " opts[i]
    619   1.5  mrg         } else if (opt_var_name != "") {
    620   1.5  mrg             print "#error CPP() requires setting Init() for " opts[i]
    621   1.5  mrg         } else {
    622   1.5  mrg             print "#error CPP() requires setting Var() for " opts[i]
    623   1.5  mrg         }
    624   1.5  mrg     }
    625   1.5  mrg }
    626   1.5  mrg print "    default:    "
    627   1.5  mrg print "      break;    "
    628   1.5  mrg print "    }           "
    629   1.5  mrg print "}\n"
    630   1.5  mrg print "void"
    631   1.5  mrg print "init_global_opts_from_cpp(struct gcc_options * opts,                   "
    632   1.5  mrg print "                         const struct cpp_options * cpp_opts)"    
    633   1.5  mrg print "{                                                                     "
    634   1.5  mrg for (i = 0; i < n_opts; i++) {
    635   1.5  mrg     # With identical flags, pick only the last one.  The
    636   1.5  mrg     # earlier loop ensured that it has all flags merged,
    637   1.5  mrg     # and a nonempty help text if one of the texts was nonempty.
    638   1.5  mrg     while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
    639   1.5  mrg         i++;
    640   1.5  mrg     }
    641   1.5  mrg     cpp_option = nth_arg(0, opt_args("CPP", flags[i]));
    642   1.5  mrg     opt_var_name = var_name(flags[i]);
    643   1.5  mrg     if (cpp_option != "" && opt_var_name != "") {
    644   1.5  mrg         print "  opts->x_" opt_var_name " = cpp_opts->" cpp_option ";"
    645   1.5  mrg     }
    646   1.5  mrg }
    647   1.5  mrg print "}               "
    648   1.5  mrg 
    649  1.12  mrg split("", var_seen, ":")
    650  1.12  mrg print "\n#if !defined(GENERATOR_FILE) && defined(ENABLE_PLUGIN)"
    651  1.12  mrg print "DEBUG_VARIABLE const struct cl_var cl_vars[] =\n{"
    652  1.12  mrg 
    653  1.12  mrg for (i = 0; i < n_opts; i++) {
    654  1.12  mrg 	name = var_name(flags[i]);
    655  1.12  mrg 	if (name == "")
    656  1.12  mrg 		continue;
    657  1.12  mrg 	var_seen[name] = 1;
    658   1.1  mrg }
    659   1.5  mrg 
    660  1.12  mrg for (i = 0; i < n_extra_vars; i++) {
    661  1.12  mrg 	var = extra_vars[i]
    662  1.12  mrg 	sub(" *=.*", "", var)
    663  1.12  mrg 	name = var
    664  1.12  mrg 	sub("^.*[ *]", "", name)
    665  1.12  mrg 	sub("\\[.*\\]$", "", name)
    666  1.12  mrg 	if (name in var_seen)
    667  1.12  mrg 		continue;
    668  1.12  mrg 	print "  { " quote name quote ", offsetof (struct gcc_options, x_" name ") },"
    669  1.12  mrg 	var_seen[name] = 1
    670  1.12  mrg }
    671  1.12  mrg 
    672  1.12  mrg print "  { NULL, (unsigned short) -1 }\n};\n#endif"
    673  1.12  mrg 
    674  1.12  mrg }
    675