Home | History | Annotate | Line # | Download | only in gcc
opth-gen.awk revision 1.3
      1  1.3  mrg #  Copyright (C) 2003-2013 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 header file.
     22  1.1  mrg #
     23  1.3  mrg # This program uses functions from opt-functions.awk and code from
     24  1.3  mrg # opt-read.awk.
     25  1.3  mrg # Usage: awk -f opt-functions.awk -f opt-read.awk -f opth-gen.awk \
     26  1.3  mrg #            < inputfile > options.h
     27  1.1  mrg 
     28  1.1  mrg # Dump out an enumeration into a .h file.
     29  1.1  mrg # Combine the flags of duplicate options.
     30  1.1  mrg END {
     31  1.1  mrg print "/* This file is auto-generated by opth-gen.awk.  */"
     32  1.1  mrg print ""
     33  1.1  mrg print "#ifndef OPTIONS_H"
     34  1.1  mrg print "#define OPTIONS_H"
     35  1.1  mrg print ""
     36  1.3  mrg print "#include \"flag-types.h\""
     37  1.1  mrg print ""
     38  1.1  mrg 
     39  1.3  mrg if (n_extra_h_includes > 0) {
     40  1.3  mrg 	for (i = 0; i < n_extra_h_includes; i++) {
     41  1.3  mrg 		print "#include " quote extra_h_includes[i] quote
     42  1.3  mrg 	}
     43  1.3  mrg 	print ""
     44  1.3  mrg }
     45  1.3  mrg 
     46  1.3  mrg print "#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) && !defined(IN_RTS)"
     47  1.3  mrg print "#ifndef GENERATOR_FILE"
     48  1.3  mrg print "#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS)"
     49  1.3  mrg print "struct GTY(()) gcc_options"
     50  1.3  mrg print "#else"
     51  1.3  mrg print "struct gcc_options"
     52  1.3  mrg print "#endif"
     53  1.3  mrg print "{"
     54  1.3  mrg print "#endif"
     55  1.3  mrg 
     56  1.3  mrg for (i = 0; i < n_extra_vars; i++) {
     57  1.3  mrg 	var = extra_vars[i]
     58  1.3  mrg 	sub(" *=.*", "", var)
     59  1.3  mrg 	orig_var = var
     60  1.3  mrg 	name = var
     61  1.3  mrg 	type = var
     62  1.3  mrg 	type_after = var
     63  1.3  mrg 	sub("^.*[ *]", "", name)
     64  1.3  mrg 	sub("\\[.*\\]$", "", name)
     65  1.3  mrg 	sub("\\[.*\\]$", "", type)
     66  1.3  mrg 	sub(" *" name "$", "", type)
     67  1.3  mrg 	sub("^.*" name, "", type_after)
     68  1.3  mrg 	var_seen[name] = 1
     69  1.3  mrg 	print "#ifdef GENERATOR_FILE"
     70  1.3  mrg 	print "extern " orig_var ";"
     71  1.3  mrg 	print "#else"
     72  1.3  mrg 	print "  " type " x_" name type_after ";"
     73  1.3  mrg 	print "#define " name " global_options.x_" name
     74  1.3  mrg 	print "#endif"
     75  1.3  mrg }
     76  1.1  mrg 
     77  1.1  mrg for (i = 0; i < n_opts; i++) {
     78  1.1  mrg 	if (flag_set_p("Save", flags[i]))
     79  1.1  mrg 		have_save = 1;
     80  1.1  mrg 
     81  1.1  mrg 	name = var_name(flags[i]);
     82  1.1  mrg 	if (name == "")
     83  1.1  mrg 		continue;
     84  1.1  mrg 
     85  1.1  mrg 	if (name in var_seen)
     86  1.1  mrg 		continue;
     87  1.1  mrg 
     88  1.1  mrg 	var_seen[name] = 1;
     89  1.3  mrg 	print "#ifdef GENERATOR_FILE"
     90  1.1  mrg 	print "extern " var_type(flags[i]) name ";"
     91  1.3  mrg 	print "#else"
     92  1.3  mrg 	print "  " var_type(flags[i]) "x_" name ";"
     93  1.3  mrg 	print "#define " name " global_options.x_" name
     94  1.3  mrg 	print "#endif"
     95  1.1  mrg }
     96  1.3  mrg for (i = 0; i < n_opts; i++) {
     97  1.3  mrg 	name = static_var(opts[i], flags[i]);
     98  1.3  mrg 	if (name != "") {
     99  1.3  mrg 		print "#ifndef GENERATOR_FILE"
    100  1.3  mrg 		print "  " var_type(flags[i]) "x_" name ";"
    101  1.3  mrg 		print "#define x_" name " do_not_use"
    102  1.3  mrg 		print "#endif"
    103  1.3  mrg 	}
    104  1.3  mrg }
    105  1.3  mrg for (i = 0; i < n_opts; i++) {
    106  1.3  mrg 	if (flag_set_p("SetByCombined", flags[i])) {
    107  1.3  mrg 		print "#ifndef GENERATOR_FILE"
    108  1.3  mrg 		print "  bool frontend_set_" var_name(flags[i]) ";"
    109  1.3  mrg 		print "#endif"
    110  1.3  mrg 	}
    111  1.3  mrg }
    112  1.3  mrg print "#ifndef GENERATOR_FILE"
    113  1.3  mrg print "};"
    114  1.3  mrg print "extern struct gcc_options global_options;"
    115  1.3  mrg print "extern const struct gcc_options global_options_init;"
    116  1.3  mrg print "extern struct gcc_options global_options_set;"
    117  1.3  mrg print "#define target_flags_explicit global_options_set.x_target_flags"
    118  1.3  mrg print "#endif"
    119  1.3  mrg print "#endif"
    120  1.1  mrg print ""
    121  1.1  mrg 
    122  1.1  mrg # All of the optimization switches gathered together so they can be saved and restored.
    123  1.1  mrg # This will allow attribute((cold)) to turn on space optimization.
    124  1.1  mrg 
    125  1.1  mrg # Change the type of normal switches from int to unsigned char to save space.
    126  1.1  mrg # Also, order the structure so that pointer fields occur first, then int
    127  1.1  mrg # fields, and then char fields to provide the best packing.
    128  1.1  mrg 
    129  1.3  mrg print "#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) && !defined(IN_RTS)"
    130  1.1  mrg print ""
    131  1.1  mrg print "/* Structure to save/restore optimization and target specific options.  */";
    132  1.1  mrg print "struct GTY(()) cl_optimization";
    133  1.1  mrg print "{";
    134  1.1  mrg 
    135  1.1  mrg n_opt_char = 2;
    136  1.1  mrg n_opt_short = 0;
    137  1.1  mrg n_opt_int = 0;
    138  1.3  mrg n_opt_enum = 1;
    139  1.1  mrg n_opt_other = 0;
    140  1.3  mrg var_opt_char[0] = "unsigned char x_optimize";
    141  1.3  mrg var_opt_char[1] = "unsigned char x_optimize_size";
    142  1.3  mrg var_opt_enum[0] = "enum fp_contract_mode x_flag_fp_contract_mode";
    143  1.1  mrg 
    144  1.1  mrg for (i = 0; i < n_opts; i++) {
    145  1.1  mrg 	if (flag_set_p("Optimization", flags[i])) {
    146  1.1  mrg 		name = var_name(flags[i])
    147  1.1  mrg 		if(name == "")
    148  1.1  mrg 			continue;
    149  1.1  mrg 
    150  1.1  mrg 		if(name in var_opt_seen)
    151  1.1  mrg 			continue;
    152  1.1  mrg 
    153  1.1  mrg 		var_opt_seen[name]++;
    154  1.1  mrg 		otype = var_type_struct(flags[i]);
    155  1.1  mrg 		if (otype ~ "^((un)?signed +)?int *$")
    156  1.3  mrg 			var_opt_int[n_opt_int++] = otype "x_" name;
    157  1.1  mrg 
    158  1.1  mrg 		else if (otype ~ "^((un)?signed +)?short *$")
    159  1.3  mrg 			var_opt_short[n_opt_short++] = otype "x_" name;
    160  1.1  mrg 
    161  1.1  mrg 		else if (otype ~ "^((un)?signed +)?char *$")
    162  1.3  mrg 			var_opt_char[n_opt_char++] = otype "x_" name;
    163  1.3  mrg 
    164  1.3  mrg 		else if (otype ~ ("^enum +[_" alnum "]+ *$"))
    165  1.3  mrg 			var_opt_enum[n_opt_enum++] = otype "x_" name;
    166  1.1  mrg 
    167  1.1  mrg 		else
    168  1.3  mrg 			var_opt_other[n_opt_other++] = otype "x_" name;
    169  1.1  mrg 	}
    170  1.1  mrg }
    171  1.1  mrg 
    172  1.1  mrg for (i = 0; i < n_opt_other; i++) {
    173  1.1  mrg 	print "  " var_opt_other[i] ";";
    174  1.1  mrg }
    175  1.1  mrg 
    176  1.1  mrg for (i = 0; i < n_opt_int; i++) {
    177  1.1  mrg 	print "  " var_opt_int[i] ";";
    178  1.1  mrg }
    179  1.1  mrg 
    180  1.3  mrg for (i = 0; i < n_opt_enum; i++) {
    181  1.3  mrg 	print "  " var_opt_enum[i] ";";
    182  1.3  mrg }
    183  1.3  mrg 
    184  1.1  mrg for (i = 0; i < n_opt_short; i++) {
    185  1.1  mrg 	print "  " var_opt_short[i] ";";
    186  1.1  mrg }
    187  1.1  mrg 
    188  1.1  mrg for (i = 0; i < n_opt_char; i++) {
    189  1.1  mrg 	print "  " var_opt_char[i] ";";
    190  1.1  mrg }
    191  1.1  mrg 
    192  1.1  mrg print "};";
    193  1.1  mrg print "";
    194  1.1  mrg 
    195  1.1  mrg # Target and optimization save/restore/print functions.
    196  1.1  mrg print "/* Structure to save/restore selected target specific options.  */";
    197  1.1  mrg print "struct GTY(()) cl_target_option";
    198  1.1  mrg print "{";
    199  1.1  mrg 
    200  1.1  mrg n_target_char = 0;
    201  1.1  mrg n_target_short = 0;
    202  1.1  mrg n_target_int = 0;
    203  1.3  mrg n_target_enum = 0;
    204  1.1  mrg n_target_other = 0;
    205  1.1  mrg 
    206  1.1  mrg for (i = 0; i < n_target_save; i++) {
    207  1.3  mrg 	if (target_save_decl[i] ~ "^((un)?signed +)?int +[_" alnum "]+$")
    208  1.1  mrg 		var_target_int[n_target_int++] = target_save_decl[i];
    209  1.1  mrg 
    210  1.3  mrg 	else if (target_save_decl[i] ~ "^((un)?signed +)?short +[_" alnum "]+$")
    211  1.1  mrg 		var_target_short[n_target_short++] = target_save_decl[i];
    212  1.1  mrg 
    213  1.3  mrg 	else if (target_save_decl[i] ~ "^((un)?signed +)?char +[_ " alnum "]+$")
    214  1.1  mrg 		var_target_char[n_target_char++] = target_save_decl[i];
    215  1.1  mrg 
    216  1.3  mrg 	else if (target_save_decl[i] ~ ("^enum +[_" alnum "]+ +[_" alnum "]+$")) {
    217  1.3  mrg 		var_target_enum[n_target_enum++] = target_save_decl[i];
    218  1.3  mrg 	}
    219  1.1  mrg 	else
    220  1.1  mrg 		var_target_other[n_target_other++] = target_save_decl[i];
    221  1.1  mrg }
    222  1.1  mrg 
    223  1.1  mrg if (have_save) {
    224  1.1  mrg 	for (i = 0; i < n_opts; i++) {
    225  1.1  mrg 		if (flag_set_p("Save", flags[i])) {
    226  1.1  mrg 			name = var_name(flags[i])
    227  1.1  mrg 			if(name == "")
    228  1.1  mrg 				name = "target_flags";
    229  1.1  mrg 
    230  1.1  mrg 			if(name in var_save_seen)
    231  1.1  mrg 				continue;
    232  1.1  mrg 
    233  1.1  mrg 			var_save_seen[name]++;
    234  1.1  mrg 			otype = var_type_struct(flags[i])
    235  1.1  mrg 			if (otype ~ "^((un)?signed +)?int *$")
    236  1.3  mrg 				var_target_int[n_target_int++] = otype "x_" name;
    237  1.1  mrg 
    238  1.1  mrg 			else if (otype ~ "^((un)?signed +)?short *$")
    239  1.3  mrg 				var_target_short[n_target_short++] = otype "x_" name;
    240  1.1  mrg 
    241  1.1  mrg 			else if (otype ~ "^((un)?signed +)?char *$")
    242  1.3  mrg 				var_target_char[n_target_char++] = otype "x_" name;
    243  1.3  mrg 
    244  1.3  mrg 			else if (otype ~ ("^enum +[_" alnum "]+ +[_" alnum "]+"))
    245  1.3  mrg 				var_target_enum[n_target_enum++] = otype "x_" name;
    246  1.1  mrg 
    247  1.1  mrg 			else
    248  1.3  mrg 				var_target_other[n_target_other++] = otype "x_" name;
    249  1.1  mrg 		}
    250  1.1  mrg 	}
    251  1.1  mrg } else {
    252  1.3  mrg 	var_target_int[n_target_int++] = "int x_target_flags";
    253  1.1  mrg }
    254  1.1  mrg 
    255  1.1  mrg for (i = 0; i < n_target_other; i++) {
    256  1.1  mrg 	print "  " var_target_other[i] ";";
    257  1.1  mrg }
    258  1.1  mrg 
    259  1.3  mrg for (i = 0; i < n_target_enum; i++) {
    260  1.3  mrg 	print "  " var_target_enum[i] ";";
    261  1.3  mrg }
    262  1.3  mrg 
    263  1.1  mrg for (i = 0; i < n_target_int; i++) {
    264  1.1  mrg 	print "  " var_target_int[i] ";";
    265  1.1  mrg }
    266  1.1  mrg 
    267  1.1  mrg for (i = 0; i < n_target_short; i++) {
    268  1.1  mrg 	print "  " var_target_short[i] ";";
    269  1.1  mrg }
    270  1.1  mrg 
    271  1.1  mrg for (i = 0; i < n_target_char; i++) {
    272  1.1  mrg 	print "  " var_target_char[i] ";";
    273  1.1  mrg }
    274  1.1  mrg 
    275  1.1  mrg print "};";
    276  1.1  mrg print "";
    277  1.1  mrg print "";
    278  1.1  mrg print "/* Save optimization variables into a structure.  */"
    279  1.3  mrg print "extern void cl_optimization_save (struct cl_optimization *, struct gcc_options *);";
    280  1.1  mrg print "";
    281  1.1  mrg print "/* Restore optimization variables from a structure.  */";
    282  1.3  mrg print "extern void cl_optimization_restore (struct gcc_options *, struct cl_optimization *);";
    283  1.1  mrg print "";
    284  1.1  mrg print "/* Print optimization variables from a structure.  */";
    285  1.1  mrg print "extern void cl_optimization_print (FILE *, int, struct cl_optimization *);";
    286  1.1  mrg print "";
    287  1.1  mrg print "/* Save selected option variables into a structure.  */"
    288  1.3  mrg print "extern void cl_target_option_save (struct cl_target_option *, struct gcc_options *);";
    289  1.1  mrg print "";
    290  1.1  mrg print "/* Restore selected option variables from a structure.  */"
    291  1.3  mrg print "extern void cl_target_option_restore (struct gcc_options *, struct cl_target_option *);";
    292  1.1  mrg print "";
    293  1.1  mrg print "/* Print target option variables from a structure.  */";
    294  1.1  mrg print "extern void cl_target_option_print (FILE *, int, struct cl_target_option *);";
    295  1.3  mrg print "";
    296  1.3  mrg print "/* Anything that includes tm.h, does not necessarily need this.  */"
    297  1.3  mrg print "#if !defined(GCC_TM_H)"
    298  1.3  mrg print "#include \"input.h\" /* for location_t */"
    299  1.3  mrg print "bool                                                                  "
    300  1.3  mrg print "common_handle_option_auto (struct gcc_options *opts,                  "
    301  1.3  mrg print "                           struct gcc_options *opts_set,              "
    302  1.3  mrg print "                           const struct cl_decoded_option *decoded,   "
    303  1.3  mrg print "                           unsigned int lang_mask, int kind,          "
    304  1.3  mrg print "                           location_t loc,                            "
    305  1.3  mrg print "                           const struct cl_option_handlers *handlers, "
    306  1.3  mrg print "                           diagnostic_context *dc);                   "
    307  1.3  mrg for (i = 0; i < n_langs; i++) {
    308  1.3  mrg     lang_name = lang_sanitized_name(langs[i]);
    309  1.3  mrg     print "bool                                                                  "
    310  1.3  mrg     print lang_name "_handle_option_auto (struct gcc_options *opts,              "
    311  1.3  mrg     print "                           struct gcc_options *opts_set,              "
    312  1.3  mrg     print "                           size_t scode, const char *arg, int value,  "
    313  1.3  mrg     print "                           unsigned int lang_mask, int kind,          "
    314  1.3  mrg     print "                           location_t loc,                            "
    315  1.3  mrg     print "                           const struct cl_option_handlers *handlers, "
    316  1.3  mrg     print "                           diagnostic_context *dc);                   "
    317  1.3  mrg }
    318  1.3  mrg print "#endif";
    319  1.1  mrg print "#endif";
    320  1.1  mrg print "";
    321  1.1  mrg 
    322  1.1  mrg for (i = 0; i < n_opts; i++) {
    323  1.1  mrg 	name = opt_args("Mask", flags[i])
    324  1.3  mrg 	if (name == "") {
    325  1.3  mrg 		opt = opt_args("InverseMask", flags[i])
    326  1.3  mrg 		if (opt ~ ",")
    327  1.3  mrg 			name = nth_arg(0, opt)
    328  1.3  mrg 		else
    329  1.3  mrg 			name = opt
    330  1.3  mrg 	}
    331  1.3  mrg 	if (name != "" && mask_bits[name] == 0) {
    332  1.3  mrg 		mask_bits[name] = 1
    333  1.3  mrg 		vname = var_name(flags[i])
    334  1.3  mrg 		mask = "MASK_"
    335  1.3  mrg 		mask_1 = "1"
    336  1.3  mrg 		if (vname != "") {
    337  1.3  mrg 			mask = "OPTION_MASK_"
    338  1.3  mrg 			if (host_wide_int[vname] == "yes")
    339  1.3  mrg 				mask_1 = "HOST_WIDE_INT_1"
    340  1.3  mrg 		} else
    341  1.3  mrg 			extra_mask_bits[name] = 1
    342  1.3  mrg 		print "#define " mask name " (" mask_1 " << " masknum[vname]++ ")"
    343  1.1  mrg 	}
    344  1.1  mrg }
    345  1.1  mrg for (i = 0; i < n_extra_masks; i++) {
    346  1.3  mrg 	if (extra_mask_bits[extra_masks[i]] == 0)
    347  1.3  mrg 		print "#define MASK_" extra_masks[i] " (1 << " masknum[""]++ ")"
    348  1.1  mrg }
    349  1.1  mrg 
    350  1.1  mrg for (var in masknum) {
    351  1.3  mrg 	if (var != "" && host_wide_int[var] == "yes") {
    352  1.3  mrg 		print" #if defined(HOST_BITS_PER_WIDE_INT) && " masknum[var] " >= HOST_BITS_PER_WIDE_INT"
    353  1.3  mrg 		print "#error too many masks for " var
    354  1.3  mrg 		print "#endif"
    355  1.3  mrg 	}
    356  1.3  mrg 	else if (masknum[var] > 31) {
    357  1.1  mrg 		if (var == "")
    358  1.1  mrg 			print "#error too many target masks"
    359  1.1  mrg 		else
    360  1.1  mrg 			print "#error too many masks for " var
    361  1.1  mrg 	}
    362  1.1  mrg }
    363  1.1  mrg print ""
    364  1.1  mrg 
    365  1.1  mrg for (i = 0; i < n_opts; i++) {
    366  1.1  mrg 	name = opt_args("Mask", flags[i])
    367  1.3  mrg 	if (name == "") {
    368  1.3  mrg 		opt = opt_args("InverseMask", flags[i])
    369  1.3  mrg 		if (opt ~ ",")
    370  1.3  mrg 			name = nth_arg(0, opt)
    371  1.3  mrg 		else
    372  1.3  mrg 			name = opt
    373  1.1  mrg 	}
    374  1.3  mrg 	if (name != "" && mask_macros[name] == 0) {
    375  1.3  mrg 		mask_macros[name] = 1
    376  1.3  mrg 		vname = var_name(flags[i])
    377  1.3  mrg 		mask = "OPTION_MASK_"
    378  1.3  mrg 		if (vname == "") {
    379  1.3  mrg 			vname = "target_flags"
    380  1.3  mrg 			mask = "MASK_"
    381  1.3  mrg 			extra_mask_macros[name] = 1
    382  1.3  mrg 		}
    383  1.3  mrg 		print "#define TARGET_" name \
    384  1.1  mrg 		      " ((" vname " & " mask name ") != 0)"
    385  1.3  mrg 	}
    386  1.1  mrg }
    387  1.1  mrg for (i = 0; i < n_extra_masks; i++) {
    388  1.3  mrg 	if (extra_mask_macros[extra_masks[i]] == 0)
    389  1.3  mrg 		print "#define TARGET_" extra_masks[i] \
    390  1.3  mrg 		      " ((target_flags & MASK_" extra_masks[i] ") != 0)"
    391  1.1  mrg }
    392  1.1  mrg print ""
    393  1.1  mrg 
    394  1.1  mrg for (i = 0; i < n_opts; i++) {
    395  1.1  mrg 	opt = opt_args("InverseMask", flags[i])
    396  1.1  mrg 	if (opt ~ ",") {
    397  1.1  mrg 		vname = var_name(flags[i])
    398  1.1  mrg 		mask = "OPTION_MASK_"
    399  1.1  mrg 		if (vname == "") {
    400  1.1  mrg 			vname = "target_flags"
    401  1.1  mrg 			mask = "MASK_"
    402  1.1  mrg 		}
    403  1.3  mrg 		print "#define TARGET_" nth_arg(1, opt) \
    404  1.1  mrg 		      " ((" vname " & " mask nth_arg(0, opt) ") == 0)"
    405  1.1  mrg 	}
    406  1.1  mrg }
    407  1.1  mrg print ""
    408  1.1  mrg 
    409  1.1  mrg for (i = 0; i < n_langs; i++) {
    410  1.3  mrg         macros[i] = "CL_" lang_sanitized_name(langs[i])
    411  1.1  mrg 	s = substr("            ", length (macros[i]))
    412  1.3  mrg 	print "#define " macros[i] s " (1U << " i ")"
    413  1.1  mrg     }
    414  1.3  mrg print "#define CL_LANG_ALL   ((1U << " n_langs ") - 1)"
    415  1.1  mrg 
    416  1.1  mrg print ""
    417  1.1  mrg print "enum opt_code"
    418  1.1  mrg print "{"
    419  1.1  mrg 	
    420  1.1  mrg for (i = 0; i < n_opts; i++)
    421  1.1  mrg 	back_chain[i] = "N_OPTS";
    422  1.1  mrg 
    423  1.3  mrg enum_value = 0
    424  1.1  mrg for (i = 0; i < n_opts; i++) {
    425  1.1  mrg 	# Combine the flags of identical switches.  Switches
    426  1.1  mrg 	# appear many times if they are handled by many front
    427  1.1  mrg 	# ends, for example.
    428  1.1  mrg 	while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
    429  1.1  mrg 		flags[i + 1] = flags[i] " " flags[i + 1];
    430  1.1  mrg 		i++;
    431  1.1  mrg 	}
    432  1.1  mrg 
    433  1.1  mrg 	len = length (opts[i]);
    434  1.3  mrg 	enum = opt_enum(opts[i])
    435  1.3  mrg 	enum_string = enum " = " enum_value ","
    436  1.3  mrg 
    437  1.3  mrg 	# Aliases do not get enumeration names.
    438  1.3  mrg 	if ((flag_set_p("Alias.*", flags[i]) \
    439  1.3  mrg 	     && !flag_set_p("SeparateAlias", flags[i])) \
    440  1.3  mrg 	    || flag_set_p("Ignore", flags[i])) {
    441  1.3  mrg 		enum_string = "/* " enum_string " */"
    442  1.3  mrg 	}
    443  1.1  mrg 
    444  1.1  mrg 	# If this switch takes joined arguments, back-chain all
    445  1.1  mrg 	# subsequent switches to it for which it is a prefix.  If
    446  1.1  mrg 	# a later switch S is a longer prefix of a switch T, T
    447  1.1  mrg 	# will be back-chained to S in a later iteration of this
    448  1.1  mrg 	# for() loop, which is what we want.
    449  1.1  mrg 	if (flag_set_p("Joined.*", flags[i])) {
    450  1.1  mrg 		for (j = i + 1; j < n_opts; j++) {
    451  1.1  mrg 			if (substr (opts[j], 1, len) != opts[i])
    452  1.1  mrg 				break;
    453  1.1  mrg 			back_chain[j] = enum;
    454  1.1  mrg 		}
    455  1.1  mrg 	}
    456  1.1  mrg 
    457  1.3  mrg 	s = substr("                                          ",
    458  1.3  mrg 		   length (enum_string))
    459  1.1  mrg 
    460  1.1  mrg 	if (help[i] == "")
    461  1.1  mrg 		hlp = "0"
    462  1.1  mrg 	else
    463  1.1  mrg 		hlp = "N_(\"" help[i] "\")";
    464  1.1  mrg 
    465  1.3  mrg 	print "  " enum_string s "/* -" opts[i] " */"
    466  1.3  mrg 	enum_value++
    467  1.1  mrg }
    468  1.1  mrg 
    469  1.3  mrg print "  N_OPTS,"
    470  1.3  mrg print "  OPT_SPECIAL_unknown,"
    471  1.3  mrg print "  OPT_SPECIAL_ignore,"
    472  1.3  mrg print "  OPT_SPECIAL_program_name,"
    473  1.3  mrg print "  OPT_SPECIAL_input_file"
    474  1.1  mrg print "};"
    475  1.1  mrg print ""
    476  1.1  mrg print "#endif /* OPTIONS_H */"
    477  1.1  mrg }
    478