From 57dfdff000ea0ba6cc47bfbe7afe7b61392ef20d Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Mon, 23 May 2011 20:06:48 +0100 Subject: [PATCH] optc-save-gen.awk: New. * optc-save-gen.awk: New. Based on optc-gen.awk. Don't generate parts of output shared with the driver. * optc-gen.awk: Don't generate parts of output not shared with the driver. * opth-gen.awk: Remove GCC_DRIVER conditionals. * doc/options.texi (SourcerInclude): Mention options-save.c. * Makefile.in (GCC_OBJS): Use options.o instead of gcc-options.o. (OBJS): Add options-save.o. (options-save.c, options-save.o): New. (options.o): Update dependencies. (gcc-options.o): Remove. (mostlyclean): Remove options-save.c. From-SVN: r174085 --- gcc/ChangeLog | 15 ++ gcc/Makefile.in | 19 +- gcc/doc/options.texi | 3 +- gcc/optc-gen.awk | 370 ------------------------------------- gcc/optc-save-gen.awk | 415 ++++++++++++++++++++++++++++++++++++++++++ gcc/opth-gen.awk | 4 +- 6 files changed, 446 insertions(+), 380 deletions(-) create mode 100644 gcc/optc-save-gen.awk diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 623a34770d3..2564a7df092 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2011-05-23 Joseph Myers + + * optc-save-gen.awk: New. Based on optc-gen.awk. Don't generate + parts of output shared with the driver. + * optc-gen.awk: Don't generate parts of output not shared with the + driver. + * opth-gen.awk: Remove GCC_DRIVER conditionals. + * doc/options.texi (SourcerInclude): Mention options-save.c. + * Makefile.in (GCC_OBJS): Use options.o instead of gcc-options.o. + (OBJS): Add options-save.o. + (options-save.c, options-save.o): New. + (options.o): Update dependencies. + (gcc-options.o): Remove. + (mostlyclean): Remove options-save.c. + 2011-05-23 Jakub Jelinek PR debug/49032 diff --git a/gcc/Makefile.in b/gcc/Makefile.in index d3e6ea4aaa9..ef5bc6ccc73 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1168,7 +1168,7 @@ CXX_TARGET_OBJS=@cxx_target_objs@ FORTRAN_TARGET_OBJS=@fortran_target_objs@ # Object files for gcc driver. -GCC_OBJS = gcc.o opts-common.o gcc-options.o vec.o ggc-none.o +GCC_OBJS = gcc.o opts-common.o options.o vec.o ggc-none.o # Language-specific object files shared by all C-family front ends. C_COMMON_OBJS = c-family/c-common.o c-family/c-cppbuiltin.o c-family/c-dump.o \ @@ -1341,6 +1341,7 @@ OBJS = \ omp-low.o \ optabs.o \ options.o \ + options-save.o \ opts-common.o \ opts-global.o \ opts.o \ @@ -2269,6 +2270,12 @@ options.c: optionlist $(srcdir)/opt-functions.awk $(srcdir)/opt-read.awk \ -f $(srcdir)/optc-gen.awk \ -v header_name="config.h system.h coretypes.h tm.h" < $< > $@ +options-save.c: optionlist $(srcdir)/opt-functions.awk $(srcdir)/opt-read.awk \ + $(srcdir)/optc-save-gen.awk + $(AWK) -f $(srcdir)/opt-functions.awk -f $(srcdir)/opt-read.awk \ + -f $(srcdir)/optc-save-gen.awk \ + -v header_name="config.h system.h coretypes.h tm.h" < $< > $@ + options.h: s-options-h ; @true s-options-h: optionlist $(srcdir)/opt-functions.awk $(srcdir)/opt-read.awk \ $(srcdir)/opth-gen.awk @@ -2278,13 +2285,11 @@ s-options-h: optionlist $(srcdir)/opt-functions.awk $(srcdir)/opt-read.awk \ $(SHELL) $(srcdir)/../move-if-change tmp-options.h options.h $(STAMP) $@ -options.o: options.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TARGET_H) $(FLAGS_H) \ +options.o: options.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ $(TM_H) $(OPTS_H) intl.h $(OPTIONS_C_EXTRA) -gcc-options.o: options.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(OPTS_H) intl.h \ - $(OPTIONS_C_EXTRA) - $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(OUTPUT_OPTION) \ - -DGCC_DRIVER options.c +options-save.o: options-save.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TARGET_H) $(FLAGS_H) \ + $(TM_H) $(OPTS_H) intl.h $(OPTIONS_C_EXTRA) dumpvers: dumpvers.c @@ -4443,7 +4448,7 @@ mostlyclean: lang.mostlyclean -rm -f build/* -rm -f mddeps.mk # Delete other built files. - -rm -f specs.h options.c options.h + -rm -f specs.h options.c options.h options-save.c # Delete the stamp and temporary files. -rm -f s-* tmp-* stamp-* stmp-* -rm -f */stamp-* */tmp-* diff --git a/gcc/doc/options.texi b/gcc/doc/options.texi index edab7a9da66..0a54183d831 100644 --- a/gcc/doc/options.texi +++ b/gcc/doc/options.texi @@ -71,7 +71,8 @@ name of the include file. @item A variable record to record any additional files that the -@file{options.c} file should include. This is useful to provide +@file{options.c} or @file{options-save.c} file should include. This +is useful to provide inline functions needed for target variables and/or @code{#ifdef} sequences to properly set up the initialization. These records have two fields: the string @samp{SourceInclude} and the name of the diff --git a/gcc/optc-gen.awk b/gcc/optc-gen.awk index 2c4df708801..519b1e9306c 100644 --- a/gcc/optc-gen.awk +++ b/gcc/optc-gen.awk @@ -38,11 +38,6 @@ for (i = 1; i <= n_headers; i++) print "#include " quote "opts.h" quote print "#include " quote "intl.h" quote print "" -print "#ifndef GCC_DRIVER" -print "#include " quote "flags.h" quote -print "#include " quote "target.h" quote -print "#endif /* GCC_DRIVER */" -print "" if (n_extra_c_includes > 0) { for (i = 0; i < n_extra_c_includes; i++) { @@ -101,10 +96,6 @@ print "};" print "const unsigned int cl_enums_count = " n_enums ";" print "" -have_save = 0; -if (n_extra_target_vars) - have_save = 1 - print "const struct gcc_options global_options_init =\n{" for (i = 0; i < n_extra_vars; i++) { var = extra_vars[i] @@ -122,9 +113,6 @@ for (i = 0; i < n_extra_vars; i++) { print " " init ", /* " name " */" } 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; @@ -332,362 +320,4 @@ 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, 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);"; -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 (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] ")"; - print " fprintf (file, \"%*s%s (%#lx)\\n\","; - print " indent, \"\","; - print " \"" var_target_other[i] "\","; - 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 "}"; -print "#endif"; - } diff --git a/gcc/optc-save-gen.awk b/gcc/optc-save-gen.awk new file mode 100644 index 00000000000..4efc11598bf --- /dev/null +++ b/gcc/optc-save-gen.awk @@ -0,0 +1,415 @@ +# Copyright (C) 2003, 2004, 2007, 2008, 2009, 2010, 2011 +# 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 +# . + +# 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);"; +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 (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] ")"; + print " fprintf (file, \"%*s%s (%#lx)\\n\","; + print " indent, \"\","; + print " \"" var_target_other[i] "\","; + 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 "}"; + +} diff --git a/gcc/opth-gen.awk b/gcc/opth-gen.awk index 7877d033b69..876e0f6336e 100644 --- a/gcc/opth-gen.awk +++ b/gcc/opth-gen.awk @@ -46,7 +46,7 @@ if (n_extra_h_includes > 0) { print "#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) && !defined(IN_RTS)" print "#ifndef GENERATOR_FILE" -print "#if !defined(GCC_DRIVER) && !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS)" +print "#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS)" print "struct GTY(()) gcc_options" print "#else" print "struct gcc_options" @@ -127,7 +127,7 @@ print "" # Also, order the structure so that pointer fields occur first, then int # fields, and then char fields to provide the best packing. -print "#if !defined(GCC_DRIVER) && !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS)" +print "#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS)" print "" print "/* Structure to save/restore optimization and target specific options. */"; print "struct GTY(()) cl_optimization"; -- 2.30.2