X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Foptc-gen.awk;h=992e4d316aced6135ee1235ae0028e2aa03fe9da;hb=91d1d675bf395ab453b7f147f7fcd36b5ced49f5;hp=f3b41a9677875062dbdec9eb7301a3ebd4591670;hpb=13c2c3942e2eca1c9338fafae5eff0fb0f6cdc17;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/optc-gen.awk b/gcc/optc-gen.awk index f3b41a96778..992e4d316ac 100644 --- a/gcc/optc-gen.awk +++ b/gcc/optc-gen.awk @@ -1,4 +1,4 @@ -# Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc. +# Copyright (C) 2003, 2004, 2007, 2008, 2009 Free Software Foundation, Inc. # Contributed by Kelley Cook, June 2004. # Original code from Neil Booth, May 2003. # @@ -17,7 +17,7 @@ # . # This Awk script reads in the option records generated from -# opt-gather.awk, combines the flags of duplicat options and generates a +# opt-gather.awk, combines the flags of duplicate options and generates a # C file. # # This program uses functions from opt-functions.awk @@ -28,6 +28,7 @@ BEGIN { n_opts = 0 n_langs = 0 + n_target_save = 0 quote = "\042" comma = "," FS=SUBSEP @@ -41,12 +42,19 @@ BEGIN { langs[n_langs] = $2 n_langs++; } + else if ($1 == "TargetSave") { + # Make sure the declarations are put in source order + target_save_decl[n_target_save] = $2 + n_target_save++ + } else { name = opt_args("Mask", $1) if (name == "") { opts[n_opts] = $1 flags[n_opts] = $2 help[n_opts] = $3 + for (i = 4; i <= NF; i++) + help[n_opts] = help[n_opts] " " $i n_opts++; } } @@ -64,10 +72,17 @@ print "#include " quote "intl.h" quote print "" print "#ifdef GCC_DRIVER" print "int target_flags;" +print "#else" +print "#include " quote "flags.h" quote +print "#include " quote "target.h" quote print "#endif /* GCC_DRIVER */" print "" +have_save = 0; for (i = 0; i < n_opts; i++) { + if (flag_set_p("Save", flags[i])) + have_save = 1; + name = var_name(flags[i]); if (name == "") continue; @@ -132,6 +147,12 @@ for (i = 0; i < n_opts; i++) { # ends, for example. while( i + 1 != n_opts && opts[i] == opts[i + 1] ) { flags[i + 1] = flags[i] " " flags[i + 1]; + if (help[i + 1] == "") + help[i + 1] = help[i] + else if (help[i] != "" && help[i + 1] != help[i]) + print "warning: multiple different help strings for " \ + opts[i] ":\n\t" help[i] "\n\t" help[i + 1] \ + | "cat 1>&2" i++; back_chain[i] = "N_OPTS"; indices[opts[i]] = j; @@ -140,11 +161,10 @@ for (i = 0; i < n_opts; i++) { } for (i = 0; i < n_opts; i++) { - # Combine the flags of identical switches. Switches - # appear many times if they are handled by many front - # ends, for example. + # With identical flags, pick only the last one. The + # earlier loop ensured that it has all flags merged, + # and a nonempty help text if one of the texts was nonempty. while( i + 1 != n_opts && opts[i] == opts[i + 1] ) { - flags[i + 1] = flags[i] " " flags[i + 1]; i++; } @@ -210,4 +230,311 @@ for (i = 0; i < n_opts; i++) { } print "};" + +print ""; +print "#if !defined(GCC_DRIVER) && !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS)" +print ""; +print "/* Save optimization variables into a structure. */" +print "void"; +print "cl_optimization_save (struct cl_optimization *ptr)"; +print "{"; + +n_opt_char = 2; +n_opt_short = 0; +n_opt_int = 0; +n_opt_other = 0; +var_opt_char[0] = "optimize"; +var_opt_char[1] = "optimize_size"; +var_opt_range["optimize"] = "0, 255"; +var_opt_range["optimize_size"] = "0, 255"; + +# Sort by size to mimic how the structure is laid out to be friendlier to the +# cache. + +for (i = 0; i < n_opts; i++) { + if (flag_set_p("Optimization", flags[i])) { + name = var_name(flags[i]) + if(name == "") + continue; + + if(name in var_opt_seen) + continue; + + var_opt_seen[name]++; + otype = var_type_struct(flags[i]); + if (otype ~ "^((un)?signed +)?int *$") + var_opt_int[n_opt_int++] = name; + + else if (otype ~ "^((un)?signed +)?short *$") + var_opt_short[n_opt_short++] = name; + + else if (otype ~ "^((un)?signed +)?char *$") { + var_opt_char[n_opt_char++] = name; + if (otype ~ "^unsigned +char *$") + var_opt_range[name] = "0, 255" + else if (otype ~ "^signed +char *$") + var_opt_range[name] = "-128, 127" + } + else + var_opt_other[n_opt_other++] = name; + } +} + +for (i = 0; i < n_opt_char; i++) { + name = var_opt_char[i]; + if (var_opt_range[name] != "") + print " gcc_assert (IN_RANGE (" name ", " var_opt_range[name] "));"; +} + +print ""; +for (i = 0; i < n_opt_other; i++) { + print " ptr->" var_opt_other[i] " = " var_opt_other[i] ";"; +} + +for (i = 0; i < n_opt_int; i++) { + print " ptr->" var_opt_int[i] " = " var_opt_int[i] ";"; +} + +for (i = 0; i < n_opt_short; i++) { + print " ptr->" var_opt_short[i] " = " var_opt_short[i] ";"; +} + +for (i = 0; i < n_opt_char; i++) { + print " ptr->" var_opt_char[i] " = " var_opt_char[i] ";"; +} + +print "}"; + +print ""; +print "/* Restore optimization options from a structure. */"; +print "void"; +print "cl_optimization_restore (struct cl_optimization *ptr)"; +print "{"; + +for (i = 0; i < n_opt_other; i++) { + print " " var_opt_other[i] " = ptr->" var_opt_other[i] ";"; +} + +for (i = 0; i < n_opt_int; i++) { + print " " var_opt_int[i] " = ptr->" var_opt_int[i] ";"; +} + +for (i = 0; i < n_opt_short; i++) { + print " " var_opt_short[i] " = ptr->" var_opt_short[i] ";"; +} + +for (i = 0; i < n_opt_char; i++) { + print " " var_opt_char[i] " = ptr->" var_opt_char[i] ";"; +} + +print " targetm.override_options_after_change ();"; +print "}"; + +print ""; +print "/* Print optimization options from a structure. */"; +print "void"; +print "cl_optimization_print (FILE *file,"; +print " int indent_to,"; +print " struct cl_optimization *ptr)"; +print "{"; + +print " fputs (\"\\n\", file);"; +for (i = 0; i < n_opt_other; i++) { + print " if (ptr->" var_opt_other[i] ")"; + print " fprintf (file, \"%*s%s (0x%lx)\\n\","; + print " indent_to, \"\","; + print " \"" var_opt_other[i] "\","; + print " (unsigned long)ptr->" var_opt_other[i] ");"; + print ""; +} + +for (i = 0; i < n_opt_int; i++) { + print " if (ptr->" var_opt_int[i] ")"; + print " fprintf (file, \"%*s%s (0x%x)\\n\","; + print " indent_to, \"\","; + print " \"" var_opt_int[i] "\","; + print " ptr->" var_opt_int[i] ");"; + print ""; +} + +for (i = 0; i < n_opt_short; i++) { + print " if (ptr->" var_opt_short[i] ")"; + print " fprintf (file, \"%*s%s (0x%x)\\n\","; + print " indent_to, \"\","; + print " \"" var_opt_short[i] "\","; + print " ptr->" var_opt_short[i] ");"; + print ""; +} + +for (i = 0; i < n_opt_char; i++) { + print " if (ptr->" var_opt_char[i] ")"; + print " fprintf (file, \"%*s%s (0x%x)\\n\","; + print " indent_to, \"\","; + print " \"" var_opt_char[i] "\","; + print " ptr->" var_opt_char[i] ");"; + print ""; +} + +print "}"; + +print ""; +print "/* Save selected option variables into a structure. */" +print "void"; +print "cl_target_option_save (struct cl_target_option *ptr)"; +print "{"; + +n_target_char = 0; +n_target_short = 0; +n_target_int = 0; +n_target_other = 0; + +if (have_save) { + for (i = 0; i < n_opts; i++) { + if (flag_set_p("Save", flags[i])) { + name = var_name(flags[i]) + if(name == "") + name = "target_flags"; + + if(name in var_save_seen) + continue; + + var_save_seen[name]++; + otype = var_type_struct(flags[i]) + if (otype ~ "^((un)?signed +)?int *$") + var_target_int[n_target_int++] = name; + + else if (otype ~ "^((un)?signed +)?short *$") + var_target_short[n_target_short++] = name; + + else if (otype ~ "^((un)?signed +)?char *$") { + var_target_char[n_target_char++] = name; + if (otype ~ "^unsigned +char *$") + var_target_range[name] = "0, 255" + else if (otype ~ "^signed +char *$") + var_target_range[name] = "-128, 127" + } + else + var_target_other[n_target_other++] = name; + } + } +} else { + var_target_int[n_target_int++] = "target_flags"; +} + +have_assert = 0; +for (i = 0; i < n_target_char; i++) { + name = var_target_char[i]; + if (var_target_range[name] != "") { + have_assert = 1; + print " gcc_assert (IN_RANGE (" name ", " var_target_range[name] "));"; + } +} + +if (have_assert) + print ""; + +print " if (targetm.target_option.save)"; +print " targetm.target_option.save (ptr);"; +print ""; + +for (i = 0; i < n_target_other; i++) { + print " ptr->" var_target_other[i] " = " var_target_other[i] ";"; +} + +for (i = 0; i < n_target_int; i++) { + print " ptr->" var_target_int[i] " = " var_target_int[i] ";"; +} + +for (i = 0; i < n_target_short; i++) { + print " ptr->" var_target_short[i] " = " var_target_short[i] ";"; +} + +for (i = 0; i < n_target_char; i++) { + print " ptr->" var_target_char[i] " = " var_target_char[i] ";"; +} + +print "}"; + +print ""; +print "/* Restore selected current options from a structure. */"; +print "void"; +print "cl_target_option_restore (struct cl_target_option *ptr)"; +print "{"; + +for (i = 0; i < n_target_other; i++) { + print " " var_target_other[i] " = ptr->" var_target_other[i] ";"; +} + +for (i = 0; i < n_target_int; i++) { + print " " var_target_int[i] " = ptr->" var_target_int[i] ";"; +} + +for (i = 0; i < n_target_short; i++) { + print " " var_target_short[i] " = ptr->" var_target_short[i] ";"; +} + +for (i = 0; i < n_target_char; i++) { + print " " var_target_char[i] " = ptr->" var_target_char[i] ";"; +} + +# This must occur after the normal variables in case the code depends on those +# variables. +print ""; +print " if (targetm.target_option.restore)"; +print " targetm.target_option.restore (ptr);"; + +print "}"; + +print ""; +print "/* Print optimization options from a structure. */"; +print "void"; +print "cl_target_option_print (FILE *file,"; +print " int indent,"; +print " struct cl_target_option *ptr)"; +print "{"; + +print " fputs (\"\\n\", file);"; +for (i = 0; i < n_target_other; i++) { + print " if (ptr->" var_target_other[i] ")"; + print " fprintf (file, \"%*s%s (0x%lx)\\n\","; + print " indent, \"\","; + print " \"" var_target_other[i] "\","; + print " (unsigned long)ptr->" var_target_other[i] ");"; + print ""; +} + +for (i = 0; i < n_target_int; i++) { + print " if (ptr->" var_target_int[i] ")"; + print " fprintf (file, \"%*s%s (0x%x)\\n\","; + print " indent, \"\","; + print " \"" var_target_int[i] "\","; + print " ptr->" var_target_int[i] ");"; + print ""; +} + +for (i = 0; i < n_target_short; i++) { + print " if (ptr->" var_target_short[i] ")"; + print " fprintf (file, \"%*s%s (0x%x)\\n\","; + print " indent, \"\","; + print " \"" var_target_short[i] "\","; + print " ptr->" var_target_short[i] ");"; + print ""; +} + +for (i = 0; i < n_target_char; i++) { + print " if (ptr->" var_target_char[i] ")"; + print " fprintf (file, \"%*s%s (0x%x)\\n\","; + print " indent, \"\","; + print " \"" var_target_char[i] "\","; + print " ptr->" var_target_char[i] ");"; + print ""; +} + +print ""; +print " if (targetm.target_option.print)"; +print " targetm.target_option.print (file, indent, ptr);"; + +print "}"; +print "#endif"; + }