Home | History | Annotate | Line # | Download | only in gcc
opth-gen.awk revision 1.12
      1  1.12  mrg #  Copyright (C) 2003-2020 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.12  mrg print "/* Free heap memory used by target option variables.  */";
    307  1.12  mrg print "extern void cl_target_option_free (struct cl_target_option *);";
    308  1.12  mrg print "";
    309   1.5  mrg print "/* Hash option variables from a structure.  */";
    310   1.5  mrg print "extern hashval_t cl_target_option_hash (const struct cl_target_option *);";
    311   1.5  mrg print "";
    312   1.5  mrg print "/* Hash optimization from a structure.  */";
    313   1.5  mrg print "extern hashval_t cl_optimization_hash (const struct cl_optimization *);";
    314   1.5  mrg print "";
    315  1.11  mrg print "/* Compare two optimization options.  */";
    316  1.11  mrg print "extern bool cl_optimization_option_eq (cl_optimization const *ptr1, cl_optimization const *ptr2);"
    317  1.11  mrg print "";
    318  1.12  mrg print "/* Free heap memory used by optimization options.  */";
    319  1.12  mrg print "extern void cl_optimization_option_free (cl_optimization *ptr1);"
    320  1.12  mrg print "";
    321   1.6  mrg print "/* Generator files may not have access to location_t, and don't need these.  */"
    322   1.6  mrg print "#if defined(UNKNOWN_LOCATION)"
    323   1.3  mrg print "bool                                                                  "
    324   1.3  mrg print "common_handle_option_auto (struct gcc_options *opts,                  "
    325   1.3  mrg print "                           struct gcc_options *opts_set,              "
    326   1.3  mrg print "                           const struct cl_decoded_option *decoded,   "
    327   1.3  mrg print "                           unsigned int lang_mask, int kind,          "
    328   1.3  mrg print "                           location_t loc,                            "
    329   1.3  mrg print "                           const struct cl_option_handlers *handlers, "
    330   1.3  mrg print "                           diagnostic_context *dc);                   "
    331   1.3  mrg for (i = 0; i < n_langs; i++) {
    332   1.3  mrg     lang_name = lang_sanitized_name(langs[i]);
    333  1.11  mrg     print "bool"
    334  1.11  mrg     print lang_name "_handle_option_auto (struct gcc_options *opts,"
    335  1.11  mrg     print "                           struct gcc_options *opts_set,"
    336  1.11  mrg     print "                           size_t scode, const char *arg,"
    337  1.11  mrg     print "                           HOST_WIDE_INT value,"
    338  1.11  mrg     print "                           unsigned int lang_mask, int kind,"
    339  1.11  mrg     print "                           location_t loc,"
    340  1.11  mrg     print "                           const struct cl_option_handlers *handlers,"
    341  1.11  mrg     print "                           diagnostic_context *dc);"
    342   1.3  mrg }
    343   1.5  mrg print "void cpp_handle_option_auto (const struct gcc_options * opts, size_t scode,"
    344   1.5  mrg print "                             struct cpp_options * cpp_opts);"
    345   1.5  mrg print "void init_global_opts_from_cpp(struct gcc_options * opts,      "
    346   1.5  mrg print "                               const struct cpp_options * cpp_opts);"    
    347   1.3  mrg print "#endif";
    348   1.1  mrg print "#endif";
    349   1.1  mrg print "";
    350   1.1  mrg 
    351   1.1  mrg for (i = 0; i < n_opts; i++) {
    352   1.1  mrg 	name = opt_args("Mask", flags[i])
    353   1.3  mrg 	if (name == "") {
    354   1.3  mrg 		opt = opt_args("InverseMask", flags[i])
    355   1.3  mrg 		if (opt ~ ",")
    356   1.3  mrg 			name = nth_arg(0, opt)
    357   1.3  mrg 		else
    358   1.3  mrg 			name = opt
    359   1.3  mrg 	}
    360   1.3  mrg 	if (name != "" && mask_bits[name] == 0) {
    361   1.3  mrg 		mask_bits[name] = 1
    362   1.3  mrg 		vname = var_name(flags[i])
    363   1.3  mrg 		mask = "MASK_"
    364   1.8  mrg 		mask_1 = "1U"
    365   1.3  mrg 		if (vname != "") {
    366   1.3  mrg 			mask = "OPTION_MASK_"
    367   1.3  mrg 			if (host_wide_int[vname] == "yes")
    368   1.8  mrg 				mask_1 = "HOST_WIDE_INT_1U"
    369   1.3  mrg 		} else
    370   1.3  mrg 			extra_mask_bits[name] = 1
    371   1.3  mrg 		print "#define " mask name " (" mask_1 " << " masknum[vname]++ ")"
    372   1.1  mrg 	}
    373   1.1  mrg }
    374   1.1  mrg for (i = 0; i < n_extra_masks; i++) {
    375   1.3  mrg 	if (extra_mask_bits[extra_masks[i]] == 0)
    376   1.8  mrg 		print "#define MASK_" extra_masks[i] " (1U << " masknum[""]++ ")"
    377   1.1  mrg }
    378   1.1  mrg 
    379   1.1  mrg for (var in masknum) {
    380   1.3  mrg 	if (var != "" && host_wide_int[var] == "yes") {
    381   1.8  mrg 		print "#if defined(HOST_BITS_PER_WIDE_INT) && " masknum[var] " > HOST_BITS_PER_WIDE_INT"
    382   1.3  mrg 		print "#error too many masks for " var
    383   1.3  mrg 		print "#endif"
    384   1.3  mrg 	}
    385   1.8  mrg 	else if (masknum[var] > 32) {
    386   1.1  mrg 		if (var == "")
    387   1.1  mrg 			print "#error too many target masks"
    388   1.1  mrg 		else
    389   1.1  mrg 			print "#error too many masks for " var
    390   1.1  mrg 	}
    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 	name = opt_args("Mask", flags[i])
    396   1.3  mrg 	if (name == "") {
    397   1.3  mrg 		opt = opt_args("InverseMask", flags[i])
    398   1.3  mrg 		if (opt ~ ",")
    399   1.3  mrg 			name = nth_arg(0, opt)
    400   1.3  mrg 		else
    401   1.3  mrg 			name = opt
    402   1.1  mrg 	}
    403   1.3  mrg 	if (name != "" && mask_macros[name] == 0) {
    404   1.3  mrg 		mask_macros[name] = 1
    405   1.3  mrg 		vname = var_name(flags[i])
    406   1.3  mrg 		mask = "OPTION_MASK_"
    407   1.3  mrg 		if (vname == "") {
    408   1.3  mrg 			vname = "target_flags"
    409   1.3  mrg 			mask = "MASK_"
    410   1.3  mrg 			extra_mask_macros[name] = 1
    411   1.3  mrg 		}
    412   1.3  mrg 		print "#define TARGET_" name \
    413   1.1  mrg 		      " ((" vname " & " mask name ") != 0)"
    414   1.5  mrg 		print "#define TARGET_" name "_P(" vname ")" \
    415   1.8  mrg 		      " (((" vname ") & " mask name ") != 0)"
    416   1.3  mrg 	}
    417   1.1  mrg }
    418   1.1  mrg for (i = 0; i < n_extra_masks; i++) {
    419   1.3  mrg 	if (extra_mask_macros[extra_masks[i]] == 0)
    420   1.3  mrg 		print "#define TARGET_" extra_masks[i] \
    421   1.3  mrg 		      " ((target_flags & MASK_" extra_masks[i] ") != 0)"
    422   1.1  mrg }
    423   1.1  mrg print ""
    424   1.1  mrg 
    425   1.1  mrg for (i = 0; i < n_opts; i++) {
    426   1.1  mrg 	opt = opt_args("InverseMask", flags[i])
    427   1.1  mrg 	if (opt ~ ",") {
    428   1.1  mrg 		vname = var_name(flags[i])
    429   1.1  mrg 		mask = "OPTION_MASK_"
    430   1.1  mrg 		if (vname == "") {
    431   1.1  mrg 			vname = "target_flags"
    432   1.1  mrg 			mask = "MASK_"
    433   1.1  mrg 		}
    434   1.3  mrg 		print "#define TARGET_" nth_arg(1, opt) \
    435   1.1  mrg 		      " ((" vname " & " mask nth_arg(0, opt) ") == 0)"
    436   1.1  mrg 	}
    437   1.1  mrg }
    438   1.1  mrg print ""
    439   1.1  mrg 
    440   1.1  mrg for (i = 0; i < n_langs; i++) {
    441   1.3  mrg         macros[i] = "CL_" lang_sanitized_name(langs[i])
    442   1.1  mrg 	s = substr("            ", length (macros[i]))
    443   1.3  mrg 	print "#define " macros[i] s " (1U << " i ")"
    444   1.1  mrg     }
    445   1.3  mrg print "#define CL_LANG_ALL   ((1U << " n_langs ") - 1)"
    446   1.1  mrg 
    447   1.1  mrg print ""
    448   1.1  mrg print "enum opt_code"
    449   1.1  mrg print "{"
    450   1.1  mrg 	
    451   1.1  mrg for (i = 0; i < n_opts; i++)
    452   1.1  mrg 	back_chain[i] = "N_OPTS";
    453   1.1  mrg 
    454   1.3  mrg enum_value = 0
    455   1.1  mrg for (i = 0; i < n_opts; i++) {
    456   1.1  mrg 	# Combine the flags of identical switches.  Switches
    457   1.1  mrg 	# appear many times if they are handled by many front
    458   1.1  mrg 	# ends, for example.
    459   1.1  mrg 	while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
    460   1.1  mrg 		flags[i + 1] = flags[i] " " flags[i + 1];
    461   1.1  mrg 		i++;
    462   1.1  mrg 	}
    463   1.1  mrg 
    464   1.1  mrg 	len = length (opts[i]);
    465   1.3  mrg 	enum = opt_enum(opts[i])
    466   1.3  mrg 	enum_string = enum " = " enum_value ","
    467   1.3  mrg 
    468   1.3  mrg 	# Aliases do not get enumeration names.
    469   1.3  mrg 	if ((flag_set_p("Alias.*", flags[i]) \
    470   1.3  mrg 	     && !flag_set_p("SeparateAlias", flags[i])) \
    471   1.3  mrg 	    || flag_set_p("Ignore", flags[i])) {
    472   1.3  mrg 		enum_string = "/* " enum_string " */"
    473   1.3  mrg 	}
    474   1.1  mrg 
    475   1.1  mrg 	# If this switch takes joined arguments, back-chain all
    476   1.1  mrg 	# subsequent switches to it for which it is a prefix.  If
    477   1.1  mrg 	# a later switch S is a longer prefix of a switch T, T
    478   1.1  mrg 	# will be back-chained to S in a later iteration of this
    479   1.1  mrg 	# for() loop, which is what we want.
    480   1.1  mrg 	if (flag_set_p("Joined.*", flags[i])) {
    481   1.1  mrg 		for (j = i + 1; j < n_opts; j++) {
    482   1.1  mrg 			if (substr (opts[j], 1, len) != opts[i])
    483   1.1  mrg 				break;
    484   1.1  mrg 			back_chain[j] = enum;
    485   1.1  mrg 		}
    486   1.1  mrg 	}
    487   1.1  mrg 
    488   1.3  mrg 	s = substr("                                          ",
    489   1.3  mrg 		   length (enum_string))
    490   1.1  mrg 
    491   1.1  mrg 	if (help[i] == "")
    492   1.1  mrg 		hlp = "0"
    493   1.1  mrg 	else
    494   1.1  mrg 		hlp = "N_(\"" help[i] "\")";
    495   1.1  mrg 
    496   1.3  mrg 	print "  " enum_string s "/* -" opts[i] " */"
    497   1.3  mrg 	enum_value++
    498   1.1  mrg }
    499   1.1  mrg 
    500   1.3  mrg print "  N_OPTS,"
    501   1.3  mrg print "  OPT_SPECIAL_unknown,"
    502   1.3  mrg print "  OPT_SPECIAL_ignore,"
    503  1.12  mrg print "  OPT_SPECIAL_warn_removed,"
    504   1.3  mrg print "  OPT_SPECIAL_program_name,"
    505   1.3  mrg print "  OPT_SPECIAL_input_file"
    506   1.1  mrg print "};"
    507   1.1  mrg print ""
    508   1.5  mrg print "#ifdef GCC_C_COMMON_C"
    509   1.5  mrg print "/* Mapping from cpp message reasons to the options that enable them.  */"
    510   1.5  mrg print "#include <cpplib.h>"
    511   1.5  mrg print "struct cpp_reason_option_codes_t"
    512   1.5  mrg print "{"
    513  1.11  mrg print "  /* cpplib message reason.  */"
    514  1.11  mrg print "  const enum cpp_warning_reason reason;"
    515  1.11  mrg print "  /* gcc option that controls this message.  */"
    516  1.11  mrg print "  const int option_code;"
    517   1.5  mrg print "};"
    518   1.5  mrg print ""
    519   1.5  mrg print "static const struct cpp_reason_option_codes_t cpp_reason_option_codes[] = {"
    520   1.5  mrg for (i = 0; i < n_opts; i++) {
    521   1.5  mrg     # With identical flags, pick only the last one.  The
    522   1.5  mrg     # earlier loop ensured that it has all flags merged,
    523   1.5  mrg     # and a nonempty help text if one of the texts was nonempty.
    524   1.5  mrg     while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
    525   1.5  mrg         i++;
    526   1.5  mrg     }
    527   1.5  mrg     cpp_reason = nth_arg(0, opt_args("CppReason", flags[i]));
    528   1.5  mrg     if (cpp_reason != "") {
    529   1.5  mrg         cpp_reason = cpp_reason ",";
    530   1.5  mrg         printf("  {%-40s %s},\n", cpp_reason, opt_enum(opts[i]))
    531   1.5  mrg     }
    532   1.5  mrg }
    533   1.5  mrg printf("  {%-40s 0},\n", "CPP_W_NONE,")
    534   1.5  mrg print "};"
    535   1.5  mrg print "#endif"
    536   1.5  mrg print ""
    537   1.1  mrg print "#endif /* OPTIONS_H */"
    538   1.1  mrg }
    539