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