diff options
author | Ben Cheng <bccheng@google.com> | 2014-03-25 22:37:19 -0700 |
---|---|---|
committer | Ben Cheng <bccheng@google.com> | 2014-03-25 22:37:19 -0700 |
commit | 1bc5aee63eb72b341f506ad058502cd0361f0d10 (patch) | |
tree | c607e8252f3405424ff15bc2d00aa38dadbb2518 /gcc-4.9/gcc/optc-save-gen.awk | |
parent | 283a0bf58fcf333c58a2a92c3ebbc41fb9eb1fdb (diff) | |
download | toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.gz toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.bz2 toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.zip |
Initial checkin of GCC 4.9.0 from trunk (r208799).
Change-Id: I48a3c08bb98542aa215912a75f03c0890e497dba
Diffstat (limited to 'gcc-4.9/gcc/optc-save-gen.awk')
-rw-r--r-- | gcc-4.9/gcc/optc-save-gen.awk | 420 |
1 files changed, 420 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/optc-save-gen.awk b/gcc-4.9/gcc/optc-save-gen.awk new file mode 100644 index 000000000..a5ec7e486 --- /dev/null +++ b/gcc-4.9/gcc/optc-save-gen.awk @@ -0,0 +1,420 @@ +# Copyright (C) 2003-2014 Free Software Foundation, Inc. +# Contributed by Kelley Cook, June 2004. +# Original code from Neil Booth, May 2003. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3, or (at your option) any +# later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# This Awk script reads in the option records generated from +# opt-gather.awk, combines the flags of duplicate options and generates a +# C file. +# + +# This program uses functions from opt-functions.awk and code from +# opt-read.awk. +# +# Usage: awk -f opt-functions.awk -f opt-read.awk -f optc-save-gen.awk \ +# [-v header_name=header.h] < inputfile > options-save.c + +# Dump that array of options into a C file. +END { +print "/* This file is auto-generated by optc-save-gen.awk. */" +print "" +n_headers = split(header_name, headers, " ") +for (i = 1; i <= n_headers; i++) + print "#include " quote headers[i] quote +print "#include " quote "opts.h" quote +print "#include " quote "intl.h" quote +print "" +print "#include " quote "flags.h" quote +print "#include " quote "target.h" quote +print "" + +if (n_extra_c_includes > 0) { + for (i = 0; i < n_extra_c_includes; i++) { + print "#include " quote extra_c_includes[i] quote + } + print "" +} + +have_save = 0; +if (n_extra_target_vars) + have_save = 1 + +for (i = 0; i < n_opts; i++) { + if (flag_set_p("Save", flags[i])) + have_save = 1; +} + +print "/* Save optimization variables into a structure. */" +print "void"; +print "cl_optimization_save (struct cl_optimization *ptr, struct gcc_options *opts)"; +print "{"; + +n_opt_char = 2; +n_opt_short = 0; +n_opt_int = 0; +n_opt_enum = 1; +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"; +var_opt_enum[0] = "flag_fp_contract_mode"; + +# 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 ~ ("^enum +[_" alnum "]+ *")) + var_opt_enum[n_opt_enum++] = 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 (opts->x_" name ", " var_opt_range[name] "));"; +} + +print ""; +for (i = 0; i < n_opt_other; i++) { + print " ptr->x_" var_opt_other[i] " = opts->x_" var_opt_other[i] ";"; +} + +for (i = 0; i < n_opt_int; i++) { + print " ptr->x_" var_opt_int[i] " = opts->x_" var_opt_int[i] ";"; +} + +for (i = 0; i < n_opt_enum; i++) { + print " ptr->x_" var_opt_enum[i] " = opts->x_" var_opt_enum[i] ";"; +} + +for (i = 0; i < n_opt_short; i++) { + print " ptr->x_" var_opt_short[i] " = opts->x_" var_opt_short[i] ";"; +} + +for (i = 0; i < n_opt_char; i++) { + print " ptr->x_" var_opt_char[i] " = opts->x_" var_opt_char[i] ";"; +} + +print "}"; + +print ""; +print "/* Restore optimization options from a structure. */"; +print "void"; +print "cl_optimization_restore (struct gcc_options *opts, struct cl_optimization *ptr)"; +print "{"; + +for (i = 0; i < n_opt_other; i++) { + print " opts->x_" var_opt_other[i] " = ptr->x_" var_opt_other[i] ";"; +} + +for (i = 0; i < n_opt_int; i++) { + print " opts->x_" var_opt_int[i] " = ptr->x_" var_opt_int[i] ";"; +} + +for (i = 0; i < n_opt_enum; i++) { + print " opts->x_" var_opt_enum[i] " = ptr->x_" var_opt_enum[i] ";"; +} + +for (i = 0; i < n_opt_short; i++) { + print " opts->x_" var_opt_short[i] " = ptr->x_" var_opt_short[i] ";"; +} + +for (i = 0; i < n_opt_char; i++) { + print " opts->x_" var_opt_char[i] " = ptr->x_" 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->x_" var_opt_other[i] ")"; + print " fprintf (file, \"%*s%s (%#lx)\\n\","; + print " indent_to, \"\","; + print " \"" var_opt_other[i] "\","; + print " (unsigned long)ptr->x_" var_opt_other[i] ");"; + print ""; +} + +for (i = 0; i < n_opt_int; i++) { + print " if (ptr->x_" var_opt_int[i] ")"; + print " fprintf (file, \"%*s%s (%#x)\\n\","; + print " indent_to, \"\","; + print " \"" var_opt_int[i] "\","; + print " ptr->x_" var_opt_int[i] ");"; + print ""; +} + +for (i = 0; i < n_opt_enum; i++) { + print " fprintf (file, \"%*s%s (%#x)\\n\","; + print " indent_to, \"\","; + print " \"" var_opt_enum[i] "\","; + print " (int) ptr->x_" var_opt_enum[i] ");"; + print ""; +} + +for (i = 0; i < n_opt_short; i++) { + print " if (ptr->x_" var_opt_short[i] ")"; + print " fprintf (file, \"%*s%s (%#x)\\n\","; + print " indent_to, \"\","; + print " \"" var_opt_short[i] "\","; + print " ptr->x_" var_opt_short[i] ");"; + print ""; +} + +for (i = 0; i < n_opt_char; i++) { + print " if (ptr->x_" var_opt_char[i] ")"; + print " fprintf (file, \"%*s%s (%#x)\\n\","; + print " indent_to, \"\","; + print " \"" var_opt_char[i] "\","; + print " ptr->x_" 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, struct gcc_options *opts)"; +print "{"; + +n_target_char = 0; +n_target_short = 0; +n_target_int = 0; +n_target_enum = 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 ~ ("^enum +[_" alnum "]+ *$")) + var_target_enum[n_target_enum++] = 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" + if (otype == var_type(flags[i])) + var_target_range[name] = "" + } + 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 (opts->x_" name ", " var_target_range[name] "));"; + } +} + +if (have_assert) + print ""; + +print " if (targetm.target_option.save)"; +print " targetm.target_option.save (ptr, opts);"; +print ""; + +for (i = 0; i < n_extra_target_vars; i++) { + print " ptr->x_" extra_target_vars[i] " = opts->x_" extra_target_vars[i] ";"; +} + +for (i = 0; i < n_target_other; i++) { + print " ptr->x_" var_target_other[i] " = opts->x_" var_target_other[i] ";"; +} + +for (i = 0; i < n_target_enum; i++) { + print " ptr->x_" var_target_enum[i] " = opts->x_" var_target_enum[i] ";"; +} + +for (i = 0; i < n_target_int; i++) { + print " ptr->x_" var_target_int[i] " = opts->x_" var_target_int[i] ";"; +} + +for (i = 0; i < n_target_short; i++) { + print " ptr->x_" var_target_short[i] " = opts->x_" var_target_short[i] ";"; +} + +for (i = 0; i < n_target_char; i++) { + print " ptr->x_" var_target_char[i] " = opts->x_" var_target_char[i] ";"; +} + +print "}"; + +print ""; +print "/* Restore selected current options from a structure. */"; +print "void"; +print "cl_target_option_restore (struct gcc_options *opts, struct cl_target_option *ptr)"; +print "{"; + +for (i = 0; i < n_extra_target_vars; i++) { + print " opts->x_" extra_target_vars[i] " = ptr->x_" extra_target_vars[i] ";"; +} + +for (i = 0; i < n_target_other; i++) { + print " opts->x_" var_target_other[i] " = ptr->x_" var_target_other[i] ";"; +} + +for (i = 0; i < n_target_enum; i++) { + print " opts->x_" var_target_enum[i] " = ptr->x_" var_target_enum[i] ";"; +} + +for (i = 0; i < n_target_int; i++) { + print " opts->x_" var_target_int[i] " = ptr->x_" var_target_int[i] ";"; +} + +for (i = 0; i < n_target_short; i++) { + print " opts->x_" var_target_short[i] " = ptr->x_" var_target_short[i] ";"; +} + +for (i = 0; i < n_target_char; i++) { + print " opts->x_" var_target_char[i] " = ptr->x_" 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 (opts, 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->x_" var_target_other[i] ")"; + if (host_wide_int[var_target_other[i]] == "yes") + print " fprintf (file, \"%*s%s (%#\" HOST_WIDE_INT_PRINT \"x)\\n\","; + else + print " fprintf (file, \"%*s%s (%#x)\\n\","; + print " indent, \"\","; + print " \"" var_target_other[i] "\","; + if (host_wide_int[var_target_other[i]] == "yes") + print " ptr->x_" var_target_other[i] ");"; + else + print " (unsigned long)ptr->x_" var_target_other[i] ");"; + print ""; +} + +for (i = 0; i < n_target_enum; i++) { + print " if (ptr->x_" var_target_enum[i] ")"; + print " fprintf (file, \"%*s%s (%#x)\\n\","; + print " indent, \"\","; + print " \"" var_target_enum[i] "\","; + print " ptr->x_" var_target_enum[i] ");"; + print ""; +} + +for (i = 0; i < n_target_int; i++) { + print " if (ptr->x_" var_target_int[i] ")"; + print " fprintf (file, \"%*s%s (%#x)\\n\","; + print " indent, \"\","; + print " \"" var_target_int[i] "\","; + print " ptr->x_" var_target_int[i] ");"; + print ""; +} + +for (i = 0; i < n_target_short; i++) { + print " if (ptr->x_" var_target_short[i] ")"; + print " fprintf (file, \"%*s%s (%#x)\\n\","; + print " indent, \"\","; + print " \"" var_target_short[i] "\","; + print " ptr->x_" var_target_short[i] ");"; + print ""; +} + +for (i = 0; i < n_target_char; i++) { + print " if (ptr->x_" var_target_char[i] ")"; + print " fprintf (file, \"%*s%s (%#x)\\n\","; + print " indent, \"\","; + print " \"" var_target_char[i] "\","; + print " ptr->x_" var_target_char[i] ");"; + print ""; +} + +print ""; +print " if (targetm.target_option.print)"; +print " targetm.target_option.print (file, indent, ptr);"; + +print "}"; + +} |