Home | History | Annotate | Line # | Download | only in gcc
optc-gen.awk revision 1.1
      1  1.1  mrg #  Copyright (C) 2003, 2004, 2007, 2008, 2009, 2010
      2  1.1  mrg #  Free Software Foundation, Inc.
      3  1.1  mrg #  Contributed by Kelley Cook, June 2004.
      4  1.1  mrg #  Original code from Neil Booth, May 2003.
      5  1.1  mrg #
      6  1.1  mrg # This program is free software; you can redistribute it and/or modify it
      7  1.1  mrg # under the terms of the GNU General Public License as published by the
      8  1.1  mrg # Free Software Foundation; either version 3, or (at your option) any
      9  1.1  mrg # later version.
     10  1.1  mrg # 
     11  1.1  mrg # This program is distributed in the hope that it will be useful,
     12  1.1  mrg # but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  1.1  mrg # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14  1.1  mrg # GNU General Public License for more details.
     15  1.1  mrg # 
     16  1.1  mrg # You should have received a copy of the GNU General Public License
     17  1.1  mrg # along with this program; see the file COPYING3.  If not see
     18  1.1  mrg # <http://www.gnu.org/licenses/>.
     19  1.1  mrg 
     20  1.1  mrg # This Awk script reads in the option records generated from 
     21  1.1  mrg # opt-gather.awk, combines the flags of duplicate options and generates a
     22  1.1  mrg # C file.
     23  1.1  mrg #
     24  1.1  mrg # This program uses functions from opt-functions.awk
     25  1.1  mrg #
     26  1.1  mrg # Usage: awk -f opt-functions.awk -f optc-gen.awk \
     27  1.1  mrg #            [-v header_name=header.h] < inputfile > options.c
     28  1.1  mrg 
     29  1.1  mrg BEGIN {
     30  1.1  mrg 	n_opts = 0
     31  1.1  mrg 	n_langs = 0
     32  1.1  mrg 	n_target_save = 0
     33  1.1  mrg         quote = "\042"
     34  1.1  mrg 	comma = ","
     35  1.1  mrg 	FS=SUBSEP
     36  1.1  mrg 	# Default the name of header created from opth-gen.awk to options.h
     37  1.1  mrg 	if (header_name == "") header_name="options.h"
     38  1.1  mrg }
     39  1.1  mrg 
     40  1.1  mrg # Collect the text and flags of each option into an array
     41  1.1  mrg 	{
     42  1.1  mrg 		if ($1 == "Language") {
     43  1.1  mrg 			langs[n_langs] = $2
     44  1.1  mrg 			n_langs++;
     45  1.1  mrg 		}
     46  1.1  mrg 		else if ($1 == "TargetSave") {
     47  1.1  mrg 			# Make sure the declarations are put in source order
     48  1.1  mrg 			target_save_decl[n_target_save] = $2
     49  1.1  mrg 			n_target_save++
     50  1.1  mrg 		}
     51  1.1  mrg 		else {
     52  1.1  mrg 			name = opt_args("Mask", $1)
     53  1.1  mrg 			if (name == "") {
     54  1.1  mrg 				opts[n_opts]  = $1
     55  1.1  mrg 				flags[n_opts] = $2
     56  1.1  mrg 				help[n_opts]  = $3
     57  1.1  mrg 				for (i = 4; i <= NF; i++)
     58  1.1  mrg 					help[n_opts] = help[n_opts] " " $i
     59  1.1  mrg 				n_opts++;
     60  1.1  mrg 			}
     61  1.1  mrg 		}
     62  1.1  mrg 	}
     63  1.1  mrg 
     64  1.1  mrg # Dump that array of options into a C file.
     65  1.1  mrg END {
     66  1.1  mrg print "/* This file is auto-generated by optc-gen.awk.  */"
     67  1.1  mrg print ""
     68  1.1  mrg n_headers = split(header_name, headers, " ")
     69  1.1  mrg for (i = 1; i <= n_headers; i++)
     70  1.1  mrg 	print "#include " quote headers[i] quote
     71  1.1  mrg print "#include " quote "opts.h" quote
     72  1.1  mrg print "#include " quote "intl.h" quote
     73  1.1  mrg print ""
     74  1.1  mrg print "#ifdef GCC_DRIVER"
     75  1.1  mrg print "int target_flags;"
     76  1.1  mrg print "#else"
     77  1.1  mrg print "#include " quote "flags.h" quote
     78  1.1  mrg print "#include " quote "target.h" quote
     79  1.1  mrg print "#endif /* GCC_DRIVER */"
     80  1.1  mrg print ""
     81  1.1  mrg 
     82  1.1  mrg have_save = 0;
     83  1.1  mrg for (i = 0; i < n_opts; i++) {
     84  1.1  mrg 	if (flag_set_p("Save", flags[i]))
     85  1.1  mrg 		have_save = 1;
     86  1.1  mrg 
     87  1.1  mrg 	name = var_name(flags[i]);
     88  1.1  mrg 	if (name == "")
     89  1.1  mrg 		continue;
     90  1.1  mrg 
     91  1.1  mrg 	if (flag_set_p("VarExists", flags[i])) {
     92  1.1  mrg 		# Need it for the gcc driver.
     93  1.1  mrg 		if (name in var_seen)
     94  1.1  mrg 			continue;
     95  1.1  mrg 		init = ""
     96  1.1  mrg 		gcc_driver = 1
     97  1.1  mrg 	}
     98  1.1  mrg 	else {
     99  1.1  mrg 		init = opt_args("Init", flags[i])
    100  1.1  mrg 		if (init != "")
    101  1.1  mrg 			init = " = " init;
    102  1.1  mrg 		else if (name in var_seen)
    103  1.1  mrg 			continue;
    104  1.1  mrg 		gcc_driver = 0
    105  1.1  mrg 	}
    106  1.1  mrg 
    107  1.1  mrg 	if (gcc_driver == 1)
    108  1.1  mrg 		print "#ifdef GCC_DRIVER"
    109  1.1  mrg 	print "/* Set by -" opts[i] "."
    110  1.1  mrg 	print "   " help[i] "  */"
    111  1.1  mrg 	print var_type(flags[i]) name init ";"
    112  1.1  mrg 	if (gcc_driver == 1)
    113  1.1  mrg 		print "#endif /* GCC_DRIVER */"
    114  1.1  mrg 	print ""
    115  1.1  mrg 
    116  1.1  mrg 	var_seen[name] = 1;
    117  1.1  mrg }
    118  1.1  mrg 
    119  1.1  mrg print ""
    120  1.1  mrg print "/* Local state variables.  */"
    121  1.1  mrg for (i = 0; i < n_opts; i++) {
    122  1.1  mrg 	name = static_var(opts[i], flags[i]);
    123  1.1  mrg 	if (name != "")
    124  1.1  mrg 		print "static " var_type(flags[i]) name ";"
    125  1.1  mrg }
    126  1.1  mrg print ""
    127  1.1  mrg 
    128  1.1  mrg print "const char * const lang_names[] =\n{"
    129  1.1  mrg for (i = 0; i < n_langs; i++) {
    130  1.1  mrg 	macros[i] = "CL_" langs[i]
    131  1.1  mrg 	gsub( "[^A-Za-z0-9_]", "X", macros[i] )
    132  1.1  mrg 	s = substr("         ", length (macros[i]))
    133  1.1  mrg 	print "  " quote langs[i] quote ","
    134  1.1  mrg     }
    135  1.1  mrg 
    136  1.1  mrg print "  0\n};\n"
    137  1.1  mrg print "const unsigned int cl_options_count = N_OPTS;\n"
    138  1.1  mrg print "const unsigned int cl_lang_count = " n_langs ";\n"
    139  1.1  mrg 
    140  1.1  mrg print "const struct cl_option cl_options[] =\n{"
    141  1.1  mrg 
    142  1.1  mrg j = 0
    143  1.1  mrg for (i = 0; i < n_opts; i++) {
    144  1.1  mrg 	back_chain[i] = "N_OPTS";
    145  1.1  mrg 	indices[opts[i]] = j;
    146  1.1  mrg 	# Combine the flags of identical switches.  Switches
    147  1.1  mrg 	# appear many times if they are handled by many front
    148  1.1  mrg 	# ends, for example.
    149  1.1  mrg 	while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
    150  1.1  mrg 		flags[i + 1] = flags[i] " " flags[i + 1];
    151  1.1  mrg 		if (help[i + 1] == "")
    152  1.1  mrg 			help[i + 1] = help[i]
    153  1.1  mrg 		else if (help[i] != "" && help[i + 1] != help[i])
    154  1.1  mrg 			print "warning: multiple different help strings for " \
    155  1.1  mrg 				opts[i] ":\n\t" help[i] "\n\t" help[i + 1] \
    156  1.1  mrg 				| "cat 1>&2"
    157  1.1  mrg 		i++;
    158  1.1  mrg 		back_chain[i] = "N_OPTS";
    159  1.1  mrg 		indices[opts[i]] = j;
    160  1.1  mrg 	}
    161  1.1  mrg 	j++;
    162  1.1  mrg }
    163  1.1  mrg 
    164  1.1  mrg for (i = 0; i < n_opts; i++) {
    165  1.1  mrg 	# With identical flags, pick only the last one.  The
    166  1.1  mrg 	# earlier loop ensured that it has all flags merged,
    167  1.1  mrg 	# and a nonempty help text if one of the texts was nonempty.
    168  1.1  mrg 	while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
    169  1.1  mrg 		i++;
    170  1.1  mrg 	}
    171  1.1  mrg 
    172  1.1  mrg 	len = length (opts[i]);
    173  1.1  mrg 	enum = "OPT_" opts[i]
    174  1.1  mrg 	if (opts[i] == "finline-limit=" || opts[i] == "Wlarger-than=" \
    175  1.1  mrg 	    || opts[i] == "ftemplate-depth=")
    176  1.1  mrg 		enum = enum "eq"
    177  1.1  mrg 	gsub ("[^A-Za-z0-9]", "_", enum)
    178  1.1  mrg 
    179  1.1  mrg 	# If this switch takes joined arguments, back-chain all
    180  1.1  mrg 	# subsequent switches to it for which it is a prefix.  If
    181  1.1  mrg 	# a later switch S is a longer prefix of a switch T, T
    182  1.1  mrg 	# will be back-chained to S in a later iteration of this
    183  1.1  mrg 	# for() loop, which is what we want.
    184  1.1  mrg 	if (flag_set_p("Joined.*", flags[i])) {
    185  1.1  mrg 		for (j = i + 1; j < n_opts; j++) {
    186  1.1  mrg 			if (substr (opts[j], 1, len) != opts[i])
    187  1.1  mrg 				break;
    188  1.1  mrg 			back_chain[j] = enum;
    189  1.1  mrg 		}
    190  1.1  mrg 	}
    191  1.1  mrg 
    192  1.1  mrg 	s = substr("                                  ", length (opts[i]))
    193  1.1  mrg 	if (i + 1 == n_opts)
    194  1.1  mrg 		comma = ""
    195  1.1  mrg 
    196  1.1  mrg 	if (help[i] == "")
    197  1.1  mrg 		hlp = "0"
    198  1.1  mrg 	else
    199  1.1  mrg 		hlp = quote help[i] quote;
    200  1.1  mrg 
    201  1.1  mrg 	neg = opt_args("Negative", flags[i]);
    202  1.1  mrg 	if (neg != "")
    203  1.1  mrg 		idx = indices[neg]
    204  1.1  mrg 	else {
    205  1.1  mrg 		if (flag_set_p("RejectNegative", flags[i]))
    206  1.1  mrg 			idx = -1;
    207  1.1  mrg 		else {
    208  1.1  mrg 			if (opts[i] ~ "^[Wfm]")
    209  1.1  mrg 				idx = indices[opts[i]];
    210  1.1  mrg 			else
    211  1.1  mrg 				idx = -1;
    212  1.1  mrg 		}
    213  1.1  mrg 	}
    214  1.1  mrg 	# Split the printf after %u to work around an ia64-hp-hpux11.23
    215  1.1  mrg 	# awk bug.
    216  1.1  mrg 	printf("  { %c-%s%c,\n    %s,\n    %s, %u,",
    217  1.1  mrg 	       quote, opts[i], quote, hlp, back_chain[i], len)
    218  1.1  mrg 	printf(" %d,\n", idx)
    219  1.1  mrg 	condition = opt_args("Condition", flags[i])
    220  1.1  mrg 	cl_flags = switch_flags(flags[i])
    221  1.1  mrg 	if (condition != "")
    222  1.1  mrg 		printf("#if %s\n" \
    223  1.1  mrg 		       "    %s,\n" \
    224  1.1  mrg 		       "#else\n" \
    225  1.1  mrg 		       "    CL_DISABLED,\n" \
    226  1.1  mrg 		       "#endif\n",
    227  1.1  mrg 		       condition, cl_flags, cl_flags)
    228  1.1  mrg 	else
    229  1.1  mrg 		printf("    %s,\n", cl_flags)
    230  1.1  mrg 	printf("    %s, %s }%s\n", var_ref(opts[i], flags[i]),
    231  1.1  mrg 	       var_set(flags[i]), comma)
    232  1.1  mrg }
    233  1.1  mrg 
    234  1.1  mrg print "};"
    235  1.1  mrg 
    236  1.1  mrg print "";
    237  1.1  mrg print "#if !defined(GCC_DRIVER) && !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS)"
    238  1.1  mrg print "";
    239  1.1  mrg print "/* Save optimization variables into a structure.  */"
    240  1.1  mrg print "void";
    241  1.1  mrg print "cl_optimization_save (struct cl_optimization *ptr)";
    242  1.1  mrg print "{";
    243  1.1  mrg 
    244  1.1  mrg n_opt_char = 2;
    245  1.1  mrg n_opt_short = 0;
    246  1.1  mrg n_opt_int = 0;
    247  1.1  mrg n_opt_other = 0;
    248  1.1  mrg var_opt_char[0] = "optimize";
    249  1.1  mrg var_opt_char[1] = "optimize_size";
    250  1.1  mrg var_opt_range["optimize"] = "0, 255";
    251  1.1  mrg var_opt_range["optimize_size"] = "0, 255";
    252  1.1  mrg 
    253  1.1  mrg # Sort by size to mimic how the structure is laid out to be friendlier to the
    254  1.1  mrg # cache.
    255  1.1  mrg 
    256  1.1  mrg for (i = 0; i < n_opts; i++) {
    257  1.1  mrg 	if (flag_set_p("Optimization", flags[i])) {
    258  1.1  mrg 		name = var_name(flags[i])
    259  1.1  mrg 		if(name == "")
    260  1.1  mrg 			continue;
    261  1.1  mrg 
    262  1.1  mrg 		if(name in var_opt_seen)
    263  1.1  mrg 			continue;
    264  1.1  mrg 
    265  1.1  mrg 		var_opt_seen[name]++;
    266  1.1  mrg 		otype = var_type_struct(flags[i]);
    267  1.1  mrg 		if (otype ~ "^((un)?signed +)?int *$")
    268  1.1  mrg 			var_opt_int[n_opt_int++] = name;
    269  1.1  mrg 
    270  1.1  mrg 		else if (otype ~ "^((un)?signed +)?short *$")
    271  1.1  mrg 			var_opt_short[n_opt_short++] = name;
    272  1.1  mrg 
    273  1.1  mrg 		else if (otype ~ "^((un)?signed +)?char *$") {
    274  1.1  mrg 			var_opt_char[n_opt_char++] = name;
    275  1.1  mrg 			if (otype ~ "^unsigned +char *$")
    276  1.1  mrg 				var_opt_range[name] = "0, 255"
    277  1.1  mrg 			else if (otype ~ "^signed +char *$")
    278  1.1  mrg 				var_opt_range[name] = "-128, 127"
    279  1.1  mrg 		}
    280  1.1  mrg 		else
    281  1.1  mrg 			var_opt_other[n_opt_other++] = name;
    282  1.1  mrg 	}
    283  1.1  mrg }
    284  1.1  mrg 
    285  1.1  mrg for (i = 0; i < n_opt_char; i++) {
    286  1.1  mrg 	name = var_opt_char[i];
    287  1.1  mrg 	if (var_opt_range[name] != "")
    288  1.1  mrg 		print "  gcc_assert (IN_RANGE (" name ", " var_opt_range[name] "));";
    289  1.1  mrg }
    290  1.1  mrg 
    291  1.1  mrg print "";
    292  1.1  mrg for (i = 0; i < n_opt_other; i++) {
    293  1.1  mrg 	print "  ptr->" var_opt_other[i] " = " var_opt_other[i] ";";
    294  1.1  mrg }
    295  1.1  mrg 
    296  1.1  mrg for (i = 0; i < n_opt_int; i++) {
    297  1.1  mrg 	print "  ptr->" var_opt_int[i] " = " var_opt_int[i] ";";
    298  1.1  mrg }
    299  1.1  mrg 
    300  1.1  mrg for (i = 0; i < n_opt_short; i++) {
    301  1.1  mrg 	print "  ptr->" var_opt_short[i] " = " var_opt_short[i] ";";
    302  1.1  mrg }
    303  1.1  mrg 
    304  1.1  mrg for (i = 0; i < n_opt_char; i++) {
    305  1.1  mrg 	print "  ptr->" var_opt_char[i] " = " var_opt_char[i] ";";
    306  1.1  mrg }
    307  1.1  mrg 
    308  1.1  mrg print "}";
    309  1.1  mrg 
    310  1.1  mrg print "";
    311  1.1  mrg print "/* Restore optimization options from a structure.  */";
    312  1.1  mrg print "void";
    313  1.1  mrg print "cl_optimization_restore (struct cl_optimization *ptr)";
    314  1.1  mrg print "{";
    315  1.1  mrg 
    316  1.1  mrg for (i = 0; i < n_opt_other; i++) {
    317  1.1  mrg 	print "  " var_opt_other[i] " = ptr->" var_opt_other[i] ";";
    318  1.1  mrg }
    319  1.1  mrg 
    320  1.1  mrg for (i = 0; i < n_opt_int; i++) {
    321  1.1  mrg 	print "  " var_opt_int[i] " = ptr->" var_opt_int[i] ";";
    322  1.1  mrg }
    323  1.1  mrg 
    324  1.1  mrg for (i = 0; i < n_opt_short; i++) {
    325  1.1  mrg 	print "  " var_opt_short[i] " = ptr->" var_opt_short[i] ";";
    326  1.1  mrg }
    327  1.1  mrg 
    328  1.1  mrg for (i = 0; i < n_opt_char; i++) {
    329  1.1  mrg 	print "  " var_opt_char[i] " = ptr->" var_opt_char[i] ";";
    330  1.1  mrg }
    331  1.1  mrg 
    332  1.1  mrg print "  targetm.override_options_after_change ();";
    333  1.1  mrg print "}";
    334  1.1  mrg 
    335  1.1  mrg print "";
    336  1.1  mrg print "/* Print optimization options from a structure.  */";
    337  1.1  mrg print "void";
    338  1.1  mrg print "cl_optimization_print (FILE *file,";
    339  1.1  mrg print "                       int indent_to,";
    340  1.1  mrg print "                       struct cl_optimization *ptr)";
    341  1.1  mrg print "{";
    342  1.1  mrg 
    343  1.1  mrg print "  fputs (\"\\n\", file);";
    344  1.1  mrg for (i = 0; i < n_opt_other; i++) {
    345  1.1  mrg 	print "  if (ptr->" var_opt_other[i] ")";
    346  1.1  mrg 	print "    fprintf (file, \"%*s%s (0x%lx)\\n\",";
    347  1.1  mrg 	print "             indent_to, \"\",";
    348  1.1  mrg 	print "             \"" var_opt_other[i] "\",";
    349  1.1  mrg 	print "             (unsigned long)ptr->" var_opt_other[i] ");";
    350  1.1  mrg 	print "";
    351  1.1  mrg }
    352  1.1  mrg 
    353  1.1  mrg for (i = 0; i < n_opt_int; i++) {
    354  1.1  mrg 	print "  if (ptr->" var_opt_int[i] ")";
    355  1.1  mrg 	print "    fprintf (file, \"%*s%s (0x%x)\\n\",";
    356  1.1  mrg 	print "             indent_to, \"\",";
    357  1.1  mrg 	print "             \"" var_opt_int[i] "\",";
    358  1.1  mrg 	print "             ptr->" var_opt_int[i] ");";
    359  1.1  mrg 	print "";
    360  1.1  mrg }
    361  1.1  mrg 
    362  1.1  mrg for (i = 0; i < n_opt_short; i++) {
    363  1.1  mrg 	print "  if (ptr->" var_opt_short[i] ")";
    364  1.1  mrg 	print "    fprintf (file, \"%*s%s (0x%x)\\n\",";
    365  1.1  mrg 	print "             indent_to, \"\",";
    366  1.1  mrg 	print "             \"" var_opt_short[i] "\",";
    367  1.1  mrg 	print "             ptr->" var_opt_short[i] ");";
    368  1.1  mrg 	print "";
    369  1.1  mrg }
    370  1.1  mrg 
    371  1.1  mrg for (i = 0; i < n_opt_char; i++) {
    372  1.1  mrg 	print "  if (ptr->" var_opt_char[i] ")";
    373  1.1  mrg 	print "    fprintf (file, \"%*s%s (0x%x)\\n\",";
    374  1.1  mrg 	print "             indent_to, \"\",";
    375  1.1  mrg 	print "             \"" var_opt_char[i] "\",";
    376  1.1  mrg 	print "             ptr->" var_opt_char[i] ");";
    377  1.1  mrg 	print "";
    378  1.1  mrg }
    379  1.1  mrg 
    380  1.1  mrg print "}";
    381  1.1  mrg 
    382  1.1  mrg print "";
    383  1.1  mrg print "/* Save selected option variables into a structure.  */"
    384  1.1  mrg print "void";
    385  1.1  mrg print "cl_target_option_save (struct cl_target_option *ptr)";
    386  1.1  mrg print "{";
    387  1.1  mrg 
    388  1.1  mrg n_target_char = 0;
    389  1.1  mrg n_target_short = 0;
    390  1.1  mrg n_target_int = 0;
    391  1.1  mrg n_target_other = 0;
    392  1.1  mrg 
    393  1.1  mrg if (have_save) {
    394  1.1  mrg 	for (i = 0; i < n_opts; i++) {
    395  1.1  mrg 		if (flag_set_p("Save", flags[i])) {
    396  1.1  mrg 			name = var_name(flags[i])
    397  1.1  mrg 			if(name == "")
    398  1.1  mrg 				name = "target_flags";
    399  1.1  mrg 
    400  1.1  mrg 			if(name in var_save_seen)
    401  1.1  mrg 				continue;
    402  1.1  mrg 
    403  1.1  mrg 			var_save_seen[name]++;
    404  1.1  mrg 			otype = var_type_struct(flags[i])
    405  1.1  mrg 			if (otype ~ "^((un)?signed +)?int *$")
    406  1.1  mrg 				var_target_int[n_target_int++] = name;
    407  1.1  mrg 
    408  1.1  mrg 			else if (otype ~ "^((un)?signed +)?short *$")
    409  1.1  mrg 				var_target_short[n_target_short++] = name;
    410  1.1  mrg 
    411  1.1  mrg 			else if (otype ~ "^((un)?signed +)?char *$") {
    412  1.1  mrg 				var_target_char[n_target_char++] = name;
    413  1.1  mrg 				if (otype ~ "^unsigned +char *$")
    414  1.1  mrg 					var_target_range[name] = "0, 255"
    415  1.1  mrg 				else if (otype ~ "^signed +char *$")
    416  1.1  mrg 					var_target_range[name] = "-128, 127"
    417  1.1  mrg 			}
    418  1.1  mrg 			else
    419  1.1  mrg 				var_target_other[n_target_other++] = name;
    420  1.1  mrg 		}
    421  1.1  mrg 	}
    422  1.1  mrg } else {
    423  1.1  mrg 	var_target_int[n_target_int++] = "target_flags";
    424  1.1  mrg }
    425  1.1  mrg 
    426  1.1  mrg have_assert = 0;
    427  1.1  mrg for (i = 0; i < n_target_char; i++) {
    428  1.1  mrg 	name = var_target_char[i];
    429  1.1  mrg 	if (var_target_range[name] != "") {
    430  1.1  mrg 		have_assert = 1;
    431  1.1  mrg 		print "  gcc_assert (IN_RANGE (" name ", " var_target_range[name] "));";
    432  1.1  mrg 	}
    433  1.1  mrg }
    434  1.1  mrg 
    435  1.1  mrg if (have_assert)
    436  1.1  mrg 	print "";
    437  1.1  mrg 
    438  1.1  mrg print "  if (targetm.target_option.save)";
    439  1.1  mrg print "    targetm.target_option.save (ptr);";
    440  1.1  mrg print "";
    441  1.1  mrg 
    442  1.1  mrg for (i = 0; i < n_target_other; i++) {
    443  1.1  mrg 	print "  ptr->" var_target_other[i] " = " var_target_other[i] ";";
    444  1.1  mrg }
    445  1.1  mrg 
    446  1.1  mrg for (i = 0; i < n_target_int; i++) {
    447  1.1  mrg 	print "  ptr->" var_target_int[i] " = " var_target_int[i] ";";
    448  1.1  mrg }
    449  1.1  mrg 
    450  1.1  mrg for (i = 0; i < n_target_short; i++) {
    451  1.1  mrg 	print "  ptr->" var_target_short[i] " = " var_target_short[i] ";";
    452  1.1  mrg }
    453  1.1  mrg 
    454  1.1  mrg for (i = 0; i < n_target_char; i++) {
    455  1.1  mrg 	print "  ptr->" var_target_char[i] " = " var_target_char[i] ";";
    456  1.1  mrg }
    457  1.1  mrg 
    458  1.1  mrg print "}";
    459  1.1  mrg 
    460  1.1  mrg print "";
    461  1.1  mrg print "/* Restore selected current options from a structure.  */";
    462  1.1  mrg print "void";
    463  1.1  mrg print "cl_target_option_restore (struct cl_target_option *ptr)";
    464  1.1  mrg print "{";
    465  1.1  mrg 
    466  1.1  mrg for (i = 0; i < n_target_other; i++) {
    467  1.1  mrg 	print "  " var_target_other[i] " = ptr->" var_target_other[i] ";";
    468  1.1  mrg }
    469  1.1  mrg 
    470  1.1  mrg for (i = 0; i < n_target_int; i++) {
    471  1.1  mrg 	print "  " var_target_int[i] " = ptr->" var_target_int[i] ";";
    472  1.1  mrg }
    473  1.1  mrg 
    474  1.1  mrg for (i = 0; i < n_target_short; i++) {
    475  1.1  mrg 	print "  " var_target_short[i] " = ptr->" var_target_short[i] ";";
    476  1.1  mrg }
    477  1.1  mrg 
    478  1.1  mrg for (i = 0; i < n_target_char; i++) {
    479  1.1  mrg 	print "  " var_target_char[i] " = ptr->" var_target_char[i] ";";
    480  1.1  mrg }
    481  1.1  mrg 
    482  1.1  mrg # This must occur after the normal variables in case the code depends on those
    483  1.1  mrg # variables.
    484  1.1  mrg print "";
    485  1.1  mrg print "  if (targetm.target_option.restore)";
    486  1.1  mrg print "    targetm.target_option.restore (ptr);";
    487  1.1  mrg 
    488  1.1  mrg print "}";
    489  1.1  mrg 
    490  1.1  mrg print "";
    491  1.1  mrg print "/* Print optimization options from a structure.  */";
    492  1.1  mrg print "void";
    493  1.1  mrg print "cl_target_option_print (FILE *file,";
    494  1.1  mrg print "                        int indent,";
    495  1.1  mrg print "                        struct cl_target_option *ptr)";
    496  1.1  mrg print "{";
    497  1.1  mrg 
    498  1.1  mrg print "  fputs (\"\\n\", file);";
    499  1.1  mrg for (i = 0; i < n_target_other; i++) {
    500  1.1  mrg 	print "  if (ptr->" var_target_other[i] ")";
    501  1.1  mrg 	print "    fprintf (file, \"%*s%s (0x%lx)\\n\",";
    502  1.1  mrg 	print "             indent, \"\",";
    503  1.1  mrg 	print "             \"" var_target_other[i] "\",";
    504  1.1  mrg 	print "             (unsigned long)ptr->" var_target_other[i] ");";
    505  1.1  mrg 	print "";
    506  1.1  mrg }
    507  1.1  mrg 
    508  1.1  mrg for (i = 0; i < n_target_int; i++) {
    509  1.1  mrg 	print "  if (ptr->" var_target_int[i] ")";
    510  1.1  mrg 	print "    fprintf (file, \"%*s%s (0x%x)\\n\",";
    511  1.1  mrg 	print "             indent, \"\",";
    512  1.1  mrg 	print "             \"" var_target_int[i] "\",";
    513  1.1  mrg 	print "             ptr->" var_target_int[i] ");";
    514  1.1  mrg 	print "";
    515  1.1  mrg }
    516  1.1  mrg 
    517  1.1  mrg for (i = 0; i < n_target_short; i++) {
    518  1.1  mrg 	print "  if (ptr->" var_target_short[i] ")";
    519  1.1  mrg 	print "    fprintf (file, \"%*s%s (0x%x)\\n\",";
    520  1.1  mrg 	print "             indent, \"\",";
    521  1.1  mrg 	print "             \"" var_target_short[i] "\",";
    522  1.1  mrg 	print "             ptr->" var_target_short[i] ");";
    523  1.1  mrg 	print "";
    524  1.1  mrg }
    525  1.1  mrg 
    526  1.1  mrg for (i = 0; i < n_target_char; i++) {
    527  1.1  mrg 	print "  if (ptr->" var_target_char[i] ")";
    528  1.1  mrg 	print "    fprintf (file, \"%*s%s (0x%x)\\n\",";
    529  1.1  mrg 	print "             indent, \"\",";
    530  1.1  mrg 	print "             \"" var_target_char[i] "\",";
    531  1.1  mrg 	print "             ptr->" var_target_char[i] ");";
    532  1.1  mrg 	print "";
    533  1.1  mrg }
    534  1.1  mrg 
    535  1.1  mrg print "";
    536  1.1  mrg print "  if (targetm.target_option.print)";
    537  1.1  mrg print "    targetm.target_option.print (file, indent, ptr);";
    538  1.1  mrg 
    539  1.1  mrg print "}";
    540  1.1  mrg print "#endif";
    541  1.1  mrg 
    542  1.1  mrg }
    543