Home | History | Annotate | Line # | Download | only in gcc
opth-gen.awk revision 1.9
      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 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.9  mrg n_opt_char = 4;
    136  1.1  mrg n_opt_short = 0;
    137  1.1  mrg n_opt_int = 0;
    138  1.5  mrg n_opt_enum = 0;
    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.5  mrg var_opt_char[2] = "unsigned char x_optimize_debug";
    143  1.9  mrg var_opt_char[3] = "unsigned char x_optimize_fast";
    144  1.1  mrg 
    145  1.1  mrg for (i = 0; i < n_opts; i++) {
    146  1.8  mrg 	if (flag_set_p("(Optimization|PerFunction)", flags[i])) {
    147  1.1  mrg 		name = var_name(flags[i])
    148  1.1  mrg 		if(name == "")
    149  1.1  mrg 			continue;
    150  1.1  mrg 
    151  1.1  mrg 		if(name in var_opt_seen)
    152  1.1  mrg 			continue;
    153  1.1  mrg 
    154  1.1  mrg 		var_opt_seen[name]++;
    155  1.1  mrg 		otype = var_type_struct(flags[i]);
    156  1.1  mrg 		if (otype ~ "^((un)?signed +)?int *$")
    157  1.3  mrg 			var_opt_int[n_opt_int++] = otype "x_" name;
    158  1.1  mrg 
    159  1.1  mrg 		else if (otype ~ "^((un)?signed +)?short *$")
    160  1.3  mrg 			var_opt_short[n_opt_short++] = otype "x_" name;
    161  1.1  mrg 
    162  1.1  mrg 		else if (otype ~ "^((un)?signed +)?char *$")
    163  1.3  mrg 			var_opt_char[n_opt_char++] = otype "x_" name;
    164  1.3  mrg 
    165  1.3  mrg 		else if (otype ~ ("^enum +[_" alnum "]+ *$"))
    166  1.3  mrg 			var_opt_enum[n_opt_enum++] = otype "x_" name;
    167  1.1  mrg 
    168  1.1  mrg 		else
    169  1.3  mrg 			var_opt_other[n_opt_other++] = otype "x_" name;
    170  1.1  mrg 	}
    171  1.1  mrg }
    172  1.1  mrg 
    173  1.1  mrg for (i = 0; i < n_opt_other; i++) {
    174  1.1  mrg 	print "  " var_opt_other[i] ";";
    175  1.1  mrg }
    176  1.1  mrg 
    177  1.1  mrg for (i = 0; i < n_opt_int; i++) {
    178  1.1  mrg 	print "  " var_opt_int[i] ";";
    179  1.1  mrg }
    180  1.1  mrg 
    181  1.3  mrg for (i = 0; i < n_opt_enum; i++) {
    182  1.3  mrg 	print "  " var_opt_enum[i] ";";
    183  1.3  mrg }
    184  1.3  mrg 
    185  1.1  mrg for (i = 0; i < n_opt_short; i++) {
    186  1.1  mrg 	print "  " var_opt_short[i] ";";
    187  1.1  mrg }
    188  1.1  mrg 
    189  1.1  mrg for (i = 0; i < n_opt_char; i++) {
    190  1.1  mrg 	print "  " var_opt_char[i] ";";
    191  1.1  mrg }
    192  1.1  mrg 
    193  1.1  mrg print "};";
    194  1.1  mrg print "";
    195  1.1  mrg 
    196  1.1  mrg # Target and optimization save/restore/print functions.
    197  1.1  mrg print "/* Structure to save/restore selected target specific options.  */";
    198  1.1  mrg print "struct GTY(()) cl_target_option";
    199  1.1  mrg print "{";
    200  1.1  mrg 
    201  1.1  mrg n_target_char = 0;
    202  1.1  mrg n_target_short = 0;
    203  1.1  mrg n_target_int = 0;
    204  1.3  mrg n_target_enum = 0;
    205  1.1  mrg n_target_other = 0;
    206  1.1  mrg 
    207  1.1  mrg for (i = 0; i < n_target_save; i++) {
    208  1.3  mrg 	if (target_save_decl[i] ~ "^((un)?signed +)?int +[_" alnum "]+$")
    209  1.1  mrg 		var_target_int[n_target_int++] = target_save_decl[i];
    210  1.1  mrg 
    211  1.3  mrg 	else if (target_save_decl[i] ~ "^((un)?signed +)?short +[_" alnum "]+$")
    212  1.1  mrg 		var_target_short[n_target_short++] = target_save_decl[i];
    213  1.1  mrg 
    214  1.3  mrg 	else if (target_save_decl[i] ~ "^((un)?signed +)?char +[_ " alnum "]+$")
    215  1.1  mrg 		var_target_char[n_target_char++] = target_save_decl[i];
    216  1.1  mrg 
    217  1.3  mrg 	else if (target_save_decl[i] ~ ("^enum +[_" alnum "]+ +[_" alnum "]+$")) {
    218  1.3  mrg 		var_target_enum[n_target_enum++] = target_save_decl[i];
    219  1.3  mrg 	}
    220  1.1  mrg 	else
    221  1.1  mrg 		var_target_other[n_target_other++] = target_save_decl[i];
    222  1.1  mrg }
    223  1.1  mrg 
    224  1.1  mrg if (have_save) {
    225  1.1  mrg 	for (i = 0; i < n_opts; i++) {
    226  1.1  mrg 		if (flag_set_p("Save", flags[i])) {
    227  1.1  mrg 			name = var_name(flags[i])
    228  1.1  mrg 			if(name == "")
    229  1.1  mrg 				name = "target_flags";
    230  1.1  mrg 
    231  1.1  mrg 			if(name in var_save_seen)
    232  1.1  mrg 				continue;
    233  1.1  mrg 
    234  1.1  mrg 			var_save_seen[name]++;
    235  1.1  mrg 			otype = var_type_struct(flags[i])
    236  1.1  mrg 			if (otype ~ "^((un)?signed +)?int *$")
    237  1.3  mrg 				var_target_int[n_target_int++] = otype "x_" name;
    238  1.1  mrg 
    239  1.1  mrg 			else if (otype ~ "^((un)?signed +)?short *$")
    240  1.3  mrg 				var_target_short[n_target_short++] = otype "x_" name;
    241  1.1  mrg 
    242  1.1  mrg 			else if (otype ~ "^((un)?signed +)?char *$")
    243  1.3  mrg 				var_target_char[n_target_char++] = otype "x_" name;
    244  1.3  mrg 
    245  1.3  mrg 			else if (otype ~ ("^enum +[_" alnum "]+ +[_" alnum "]+"))
    246  1.3  mrg 				var_target_enum[n_target_enum++] = otype "x_" name;
    247  1.1  mrg 
    248  1.1  mrg 			else
    249  1.3  mrg 				var_target_other[n_target_other++] = otype "x_" name;
    250  1.1  mrg 		}
    251  1.1  mrg 	}
    252  1.1  mrg } else {
    253  1.3  mrg 	var_target_int[n_target_int++] = "int x_target_flags";
    254  1.1  mrg }
    255  1.1  mrg 
    256  1.1  mrg for (i = 0; i < n_target_other; i++) {
    257  1.1  mrg 	print "  " var_target_other[i] ";";
    258  1.1  mrg }
    259  1.1  mrg 
    260  1.3  mrg for (i = 0; i < n_target_enum; i++) {
    261  1.3  mrg 	print "  " var_target_enum[i] ";";
    262  1.3  mrg }
    263  1.3  mrg 
    264  1.1  mrg for (i = 0; i < n_target_int; i++) {
    265  1.1  mrg 	print "  " var_target_int[i] ";";
    266  1.1  mrg }
    267  1.1  mrg 
    268  1.1  mrg for (i = 0; i < n_target_short; i++) {
    269  1.1  mrg 	print "  " var_target_short[i] ";";
    270  1.1  mrg }
    271  1.1  mrg 
    272  1.1  mrg for (i = 0; i < n_target_char; i++) {
    273  1.1  mrg 	print "  " var_target_char[i] ";";
    274  1.1  mrg }
    275  1.1  mrg 
    276  1.1  mrg print "};";
    277  1.1  mrg print "";
    278  1.1  mrg print "";
    279  1.1  mrg print "/* Save optimization variables into a structure.  */"
    280  1.3  mrg print "extern void cl_optimization_save (struct cl_optimization *, struct gcc_options *);";
    281  1.1  mrg print "";
    282  1.1  mrg print "/* Restore optimization variables from a structure.  */";
    283  1.3  mrg print "extern void cl_optimization_restore (struct gcc_options *, struct cl_optimization *);";
    284  1.1  mrg print "";
    285  1.1  mrg print "/* Print optimization variables from a structure.  */";
    286  1.1  mrg print "extern void cl_optimization_print (FILE *, int, struct cl_optimization *);";
    287  1.1  mrg print "";
    288  1.5  mrg print "/* Print different optimization variables from structures provided as arguments.  */";
    289  1.5  mrg print "extern void cl_optimization_print_diff (FILE *, int, cl_optimization *ptr1, cl_optimization *ptr2);";
    290  1.5  mrg print "";
    291  1.1  mrg print "/* Save selected option variables into a structure.  */"
    292  1.3  mrg print "extern void cl_target_option_save (struct cl_target_option *, struct gcc_options *);";
    293  1.1  mrg print "";
    294  1.1  mrg print "/* Restore selected option variables from a structure.  */"
    295  1.3  mrg print "extern void cl_target_option_restore (struct gcc_options *, struct cl_target_option *);";
    296  1.1  mrg print "";
    297  1.1  mrg print "/* Print target option variables from a structure.  */";
    298  1.1  mrg print "extern void cl_target_option_print (FILE *, int, struct cl_target_option *);";
    299  1.3  mrg print "";
    300  1.5  mrg print "/* Print different target option variables from structures provided as arguments.  */";
    301  1.5  mrg print "extern void cl_target_option_print_diff (FILE *, int, cl_target_option *ptr1, cl_target_option *ptr2);";
    302  1.5  mrg print "";
    303  1.5  mrg print "/* Compare two target option variables from a structure.  */";
    304  1.5  mrg print "extern bool cl_target_option_eq (const struct cl_target_option *, const struct cl_target_option *);";
    305  1.5  mrg print "";
    306  1.5  mrg print "/* Hash option variables from a structure.  */";
    307  1.5  mrg print "extern hashval_t cl_target_option_hash (const struct cl_target_option *);";
    308  1.5  mrg print "";
    309  1.5  mrg print "/* Hash optimization from a structure.  */";
    310  1.5  mrg print "extern hashval_t cl_optimization_hash (const struct cl_optimization *);";
    311  1.5  mrg print "";
    312  1.6  mrg print "/* Generator files may not have access to location_t, and don't need these.  */"
    313  1.6  mrg print "#if defined(UNKNOWN_LOCATION)"
    314  1.3  mrg print "bool                                                                  "
    315  1.3  mrg print "common_handle_option_auto (struct gcc_options *opts,                  "
    316  1.3  mrg print "                           struct gcc_options *opts_set,              "
    317  1.3  mrg print "                           const struct cl_decoded_option *decoded,   "
    318  1.3  mrg print "                           unsigned int lang_mask, int kind,          "
    319  1.3  mrg print "                           location_t loc,                            "
    320  1.3  mrg print "                           const struct cl_option_handlers *handlers, "
    321  1.3  mrg print "                           diagnostic_context *dc);                   "
    322  1.3  mrg for (i = 0; i < n_langs; i++) {
    323  1.3  mrg     lang_name = lang_sanitized_name(langs[i]);
    324  1.3  mrg     print "bool                                                                  "
    325  1.3  mrg     print lang_name "_handle_option_auto (struct gcc_options *opts,              "
    326  1.3  mrg     print "                           struct gcc_options *opts_set,              "
    327  1.3  mrg     print "                           size_t scode, const char *arg, int value,  "
    328  1.3  mrg     print "                           unsigned int lang_mask, int kind,          "
    329  1.3  mrg     print "                           location_t loc,                            "
    330  1.3  mrg     print "                           const struct cl_option_handlers *handlers, "
    331  1.3  mrg     print "                           diagnostic_context *dc);                   "
    332  1.3  mrg }
    333  1.5  mrg print "void cpp_handle_option_auto (const struct gcc_options * opts, size_t scode,"
    334  1.5  mrg print "                             struct cpp_options * cpp_opts);"
    335  1.5  mrg print "void init_global_opts_from_cpp(struct gcc_options * opts,      "
    336  1.5  mrg print "                               const struct cpp_options * cpp_opts);"    
    337  1.3  mrg print "#endif";
    338  1.1  mrg print "#endif";
    339  1.1  mrg print "";
    340  1.1  mrg 
    341  1.1  mrg for (i = 0; i < n_opts; i++) {
    342  1.1  mrg 	name = opt_args("Mask", flags[i])
    343  1.3  mrg 	if (name == "") {
    344  1.3  mrg 		opt = opt_args("InverseMask", flags[i])
    345  1.3  mrg 		if (opt ~ ",")
    346  1.3  mrg 			name = nth_arg(0, opt)
    347  1.3  mrg 		else
    348  1.3  mrg 			name = opt
    349  1.3  mrg 	}
    350  1.3  mrg 	if (name != "" && mask_bits[name] == 0) {
    351  1.3  mrg 		mask_bits[name] = 1
    352  1.3  mrg 		vname = var_name(flags[i])
    353  1.3  mrg 		mask = "MASK_"
    354  1.8  mrg 		mask_1 = "1U"
    355  1.3  mrg 		if (vname != "") {
    356  1.3  mrg 			mask = "OPTION_MASK_"
    357  1.3  mrg 			if (host_wide_int[vname] == "yes")
    358  1.8  mrg 				mask_1 = "HOST_WIDE_INT_1U"
    359  1.3  mrg 		} else
    360  1.3  mrg 			extra_mask_bits[name] = 1
    361  1.3  mrg 		print "#define " mask name " (" mask_1 " << " masknum[vname]++ ")"
    362  1.1  mrg 	}
    363  1.1  mrg }
    364  1.1  mrg for (i = 0; i < n_extra_masks; i++) {
    365  1.3  mrg 	if (extra_mask_bits[extra_masks[i]] == 0)
    366  1.8  mrg 		print "#define MASK_" extra_masks[i] " (1U << " masknum[""]++ ")"
    367  1.1  mrg }
    368  1.1  mrg 
    369  1.1  mrg for (var in masknum) {
    370  1.3  mrg 	if (var != "" && host_wide_int[var] == "yes") {
    371  1.8  mrg 		print "#if defined(HOST_BITS_PER_WIDE_INT) && " masknum[var] " > HOST_BITS_PER_WIDE_INT"
    372  1.3  mrg 		print "#error too many masks for " var
    373  1.3  mrg 		print "#endif"
    374  1.3  mrg 	}
    375  1.8  mrg 	else if (masknum[var] > 32) {
    376  1.1  mrg 		if (var == "")
    377  1.1  mrg 			print "#error too many target masks"
    378  1.1  mrg 		else
    379  1.1  mrg 			print "#error too many masks for " var
    380  1.1  mrg 	}
    381  1.1  mrg }
    382  1.1  mrg print ""
    383  1.1  mrg 
    384  1.1  mrg for (i = 0; i < n_opts; i++) {
    385  1.1  mrg 	name = opt_args("Mask", flags[i])
    386  1.3  mrg 	if (name == "") {
    387  1.3  mrg 		opt = opt_args("InverseMask", flags[i])
    388  1.3  mrg 		if (opt ~ ",")
    389  1.3  mrg 			name = nth_arg(0, opt)
    390  1.3  mrg 		else
    391  1.3  mrg 			name = opt
    392  1.1  mrg 	}
    393  1.3  mrg 	if (name != "" && mask_macros[name] == 0) {
    394  1.3  mrg 		mask_macros[name] = 1
    395  1.3  mrg 		vname = var_name(flags[i])
    396  1.3  mrg 		mask = "OPTION_MASK_"
    397  1.3  mrg 		if (vname == "") {
    398  1.3  mrg 			vname = "target_flags"
    399  1.3  mrg 			mask = "MASK_"
    400  1.3  mrg 			extra_mask_macros[name] = 1
    401  1.3  mrg 		}
    402  1.3  mrg 		print "#define TARGET_" name \
    403  1.1  mrg 		      " ((" vname " & " mask name ") != 0)"
    404  1.5  mrg 		print "#define TARGET_" name "_P(" vname ")" \
    405  1.8  mrg 		      " (((" vname ") & " mask name ") != 0)"
    406  1.3  mrg 	}
    407  1.1  mrg }
    408  1.1  mrg for (i = 0; i < n_extra_masks; i++) {
    409  1.3  mrg 	if (extra_mask_macros[extra_masks[i]] == 0)
    410  1.3  mrg 		print "#define TARGET_" extra_masks[i] \
    411  1.3  mrg 		      " ((target_flags & MASK_" extra_masks[i] ") != 0)"
    412  1.1  mrg }
    413  1.1  mrg print ""
    414  1.1  mrg 
    415  1.1  mrg for (i = 0; i < n_opts; i++) {
    416  1.1  mrg 	opt = opt_args("InverseMask", flags[i])
    417  1.1  mrg 	if (opt ~ ",") {
    418  1.1  mrg 		vname = var_name(flags[i])
    419  1.1  mrg 		mask = "OPTION_MASK_"
    420  1.1  mrg 		if (vname == "") {
    421  1.1  mrg 			vname = "target_flags"
    422  1.1  mrg 			mask = "MASK_"
    423  1.1  mrg 		}
    424  1.3  mrg 		print "#define TARGET_" nth_arg(1, opt) \
    425  1.1  mrg 		      " ((" vname " & " mask nth_arg(0, opt) ") == 0)"
    426  1.1  mrg 	}
    427  1.1  mrg }
    428  1.1  mrg print ""
    429  1.1  mrg 
    430  1.1  mrg for (i = 0; i < n_langs; i++) {
    431  1.3  mrg         macros[i] = "CL_" lang_sanitized_name(langs[i])
    432  1.1  mrg 	s = substr("            ", length (macros[i]))
    433  1.3  mrg 	print "#define " macros[i] s " (1U << " i ")"
    434  1.1  mrg     }
    435  1.3  mrg print "#define CL_LANG_ALL   ((1U << " n_langs ") - 1)"
    436  1.1  mrg 
    437  1.1  mrg print ""
    438  1.1  mrg print "enum opt_code"
    439  1.1  mrg print "{"
    440  1.1  mrg 	
    441  1.1  mrg for (i = 0; i < n_opts; i++)
    442  1.1  mrg 	back_chain[i] = "N_OPTS";
    443  1.1  mrg 
    444  1.3  mrg enum_value = 0
    445  1.1  mrg for (i = 0; i < n_opts; i++) {
    446  1.1  mrg 	# Combine the flags of identical switches.  Switches
    447  1.1  mrg 	# appear many times if they are handled by many front
    448  1.1  mrg 	# ends, for example.
    449  1.1  mrg 	while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
    450  1.1  mrg 		flags[i + 1] = flags[i] " " flags[i + 1];
    451  1.1  mrg 		i++;
    452  1.1  mrg 	}
    453  1.1  mrg 
    454  1.1  mrg 	len = length (opts[i]);
    455  1.3  mrg 	enum = opt_enum(opts[i])
    456  1.3  mrg 	enum_string = enum " = " enum_value ","
    457  1.3  mrg 
    458  1.3  mrg 	# Aliases do not get enumeration names.
    459  1.3  mrg 	if ((flag_set_p("Alias.*", flags[i]) \
    460  1.3  mrg 	     && !flag_set_p("SeparateAlias", flags[i])) \
    461  1.3  mrg 	    || flag_set_p("Ignore", flags[i])) {
    462  1.3  mrg 		enum_string = "/* " enum_string " */"
    463  1.3  mrg 	}
    464  1.1  mrg 
    465  1.1  mrg 	# If this switch takes joined arguments, back-chain all
    466  1.1  mrg 	# subsequent switches to it for which it is a prefix.  If
    467  1.1  mrg 	# a later switch S is a longer prefix of a switch T, T
    468  1.1  mrg 	# will be back-chained to S in a later iteration of this
    469  1.1  mrg 	# for() loop, which is what we want.
    470  1.1  mrg 	if (flag_set_p("Joined.*", flags[i])) {
    471  1.1  mrg 		for (j = i + 1; j < n_opts; j++) {
    472  1.1  mrg 			if (substr (opts[j], 1, len) != opts[i])
    473  1.1  mrg 				break;
    474  1.1  mrg 			back_chain[j] = enum;
    475  1.1  mrg 		}
    476  1.1  mrg 	}
    477  1.1  mrg 
    478  1.3  mrg 	s = substr("                                          ",
    479  1.3  mrg 		   length (enum_string))
    480  1.1  mrg 
    481  1.1  mrg 	if (help[i] == "")
    482  1.1  mrg 		hlp = "0"
    483  1.1  mrg 	else
    484  1.1  mrg 		hlp = "N_(\"" help[i] "\")";
    485  1.1  mrg 
    486  1.3  mrg 	print "  " enum_string s "/* -" opts[i] " */"
    487  1.3  mrg 	enum_value++
    488  1.1  mrg }
    489  1.1  mrg 
    490  1.3  mrg print "  N_OPTS,"
    491  1.3  mrg print "  OPT_SPECIAL_unknown,"
    492  1.3  mrg print "  OPT_SPECIAL_ignore,"
    493  1.3  mrg print "  OPT_SPECIAL_program_name,"
    494  1.3  mrg print "  OPT_SPECIAL_input_file"
    495  1.1  mrg print "};"
    496  1.1  mrg print ""
    497  1.5  mrg print "#ifdef GCC_C_COMMON_C"
    498  1.5  mrg print "/* Mapping from cpp message reasons to the options that enable them.  */"
    499  1.5  mrg print "#include <cpplib.h>"
    500  1.5  mrg print "struct cpp_reason_option_codes_t"
    501  1.5  mrg print "{"
    502  1.5  mrg print "  const int reason;		/* cpplib message reason.  */"
    503  1.5  mrg print "  const int option_code;	/* gcc option that controls this message.  */"
    504  1.5  mrg print "};"
    505  1.5  mrg print ""
    506  1.5  mrg print "static const struct cpp_reason_option_codes_t cpp_reason_option_codes[] = {"
    507  1.5  mrg for (i = 0; i < n_opts; i++) {
    508  1.5  mrg     # With identical flags, pick only the last one.  The
    509  1.5  mrg     # earlier loop ensured that it has all flags merged,
    510  1.5  mrg     # and a nonempty help text if one of the texts was nonempty.
    511  1.5  mrg     while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
    512  1.5  mrg         i++;
    513  1.5  mrg     }
    514  1.5  mrg     cpp_reason = nth_arg(0, opt_args("CppReason", flags[i]));
    515  1.5  mrg     if (cpp_reason != "") {
    516  1.5  mrg         cpp_reason = cpp_reason ",";
    517  1.5  mrg         printf("  {%-40s %s},\n", cpp_reason, opt_enum(opts[i]))
    518  1.5  mrg     }
    519  1.5  mrg }
    520  1.5  mrg printf("  {%-40s 0},\n", "CPP_W_NONE,")
    521  1.5  mrg print "};"
    522  1.5  mrg print "#endif"
    523  1.5  mrg print ""
    524  1.1  mrg print "#endif /* OPTIONS_H */"
    525  1.1  mrg }
    526