From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17253 invoked by alias); 23 May 2011 19:08:25 -0000 Received: (qmail 17239 invoked by uid 22791); 23 May 2011 19:08:21 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL,BAYES_00,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 23 May 2011 19:08:02 +0000 Received: (qmail 16668 invoked from network); 23 May 2011 19:08:01 -0000 Received: from unknown (HELO digraph.polyomino.org.uk) (joseph@127.0.0.2) by mail.codesourcery.com with ESMTPA; 23 May 2011 19:08:01 -0000 Received: from jsm28 (helo=localhost) by digraph.polyomino.org.uk with local-esmtp (Exim 4.72) (envelope-from ) id 1QOaTf-00074q-GR; Mon, 23 May 2011 19:07:59 +0000 Date: Mon, 23 May 2011 21:58:00 -0000 From: "Joseph S. Myers" To: gcc-patches@gcc.gnu.org cc: Michael Meissner Subject: Split up options.c Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2011-05/txt/msg01680.txt.bz2 This patch splits the generated file options.c into two parts, one shared with the driver and one not, so avoiding the need to build a special gcc-options.o by defining GCC_DRIVER when compiling options.c. The GCC_DRIVER macro, being obsolete, is removed. It ought to be possible to simplify the code in opth-gen.awk further; the inner "#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS)" conditional (determining whether to use GTY(()) on gcc_options) is always true because it's inside a "#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) && !defined(IN_RTS)" conditional. But if I remove it (using GTY(()) unconditionally), gengtype gets confused for reasons I don't understand - although it's fine with changing it to "#if 1". Michael, you added the GTY(()) use in r166947 (PowerPC target attribute support); why does gcc_options need GTY(()) at all and do you know why gengtype doesn't like it if the non-GTY(()) case is removed? Bootstrapped with no regressions on x86_64-unknown-linux-gnu. Applied to mainline. 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. Index: gcc/doc/options.texi =================================================================== --- gcc/doc/options.texi (revision 174063) +++ gcc/doc/options.texi (working copy) @@ -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 Index: gcc/optc-gen.awk =================================================================== --- gcc/optc-gen.awk (revision 174063) +++ gcc/optc-gen.awk (working copy) @@ -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"; - } Index: gcc/optc-save-gen.awk =================================================================== --- gcc/optc-save-gen.awk (revision 174063) +++ gcc/optc-save-gen.awk (working copy) @@ -25,12 +25,12 @@ # 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-gen.awk \ -# [-v header_name=header.h] < inputfile > options.c +# 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-gen.awk. */" +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++) @@ -38,10 +38,8 @@ 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) { @@ -51,290 +49,15 @@ if (n_extra_c_includes > 0) { print "" } -for (i = 0; i < n_enums; i++) { - name = enum_names[i] - type = enum_type[name] - print "static const struct cl_enum_arg cl_enum_" name \ - "_data[] = " - print "{" - print enum_data[name] " { NULL, 0, 0 }" - print "};" - print "" - print "static void" - print "cl_enum_" name "_set (void *var, int value)" - print "{" - print " *((" type " *) var) = (" type ") value;" - print "}" - print "" - print "static int" - print "cl_enum_" name "_get (const void *var)" - print "{" - print " return (int) *((const " type " *) var);" - print "}" - print "" -} - -print "const struct cl_enum cl_enums[] =" -print "{" -for (i = 0; i < n_enums; i++) { - name = enum_names[i] - ehelp = enum_help[name] - if (ehelp == "") - ehelp = "NULL" - else - ehelp = quote ehelp quote - unknown_error = enum_unknown_error[name] - if (unknown_error == "") - unknown_error = "NULL" - else - unknown_error = quote unknown_error quote - print " {" - print " " ehelp "," - print " " unknown_error "," - print " cl_enum_" name "_data," - print " sizeof (" enum_type[name] ")," - print " cl_enum_" name "_set," - print " cl_enum_" name "_get" - print " }," -} -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] - init = extra_vars[i] - if (var ~ "=" ) { - sub(".*= *", "", init) - } else { - init = "0" - } - sub(" *=.*", "", var) - name = var - sub("^.*[ *]", "", name) - sub("\\[.*\\]$", "", name) - var_seen[name] = 1 - 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; - - init = opt_args("Init", flags[i]) - if (init != "") { - if (name in var_init && var_init[name] != init) - print "#error multiple initializers for " name - var_init[name] = init - } -} -for (i = 0; i < n_opts; i++) { - name = var_name(flags[i]); - if (name == "") - continue; - - if (name in var_seen) - continue; - - if (name in var_init) - init = var_init[name] - else - init = "0" - - print " " init ", /* " name " */" - - var_seen[name] = 1; -} -for (i = 0; i < n_opts; i++) { - name = static_var(opts[i], flags[i]); - if (name != "") { - print " 0, /* " name " (private state) */" - print "#undef x_" name - } -} -for (i = 0; i < n_opts; i++) { - if (flag_set_p("SetByCombined", flags[i])) - print " false, /* frontend_set_" var_name(flags[i]) " */" -} -print "};" -print "" -print "struct gcc_options global_options;" -print "struct gcc_options global_options_set;" -print "" - -print "const char * const lang_names[] =\n{" -for (i = 0; i < n_langs; i++) { - macros[i] = "CL_" langs[i] - gsub( "[^" alnum "_]", "X", macros[i] ) - s = substr(" ", length (macros[i])) - print " " quote langs[i] quote "," - } - -print " 0\n};\n" -print "const unsigned int cl_options_count = N_OPTS;\n" -print "const unsigned int cl_lang_count = " n_langs ";\n" - -print "const struct cl_option cl_options[] =\n{" - -j = 0 -for (i = 0; i < n_opts; i++) { - back_chain[i] = "N_OPTS"; - indices[opts[i]] = j; - # Combine the flags of identical switches. Switches - # appear many times if they are handled by many front - # 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; - } - j++; } -for (i = 0; i < n_opts; i++) { - # 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] ) { - i++; - } - - len = length (opts[i]); - enum = opt_enum(opts[i]) - - # If this switch takes joined arguments, back-chain all - # subsequent switches to it for which it is a prefix. If - # a later switch S is a longer prefix of a switch T, T - # will be back-chained to S in a later iteration of this - # for() loop, which is what we want. - if (flag_set_p("Joined.*", flags[i])) { - for (j = i + 1; j < n_opts; j++) { - if (substr (opts[j], 1, len) != opts[i]) - break; - back_chain[j] = enum; - } - } - - s = substr(" ", length (opts[i])) - if (i + 1 == n_opts) - comma = "" - - if (help[i] == "") - hlp = "0" - else - hlp = quote help[i] quote; - - missing_arg_error = opt_args("MissingArgError", flags[i]) - if (missing_arg_error == "") - missing_arg_error = "0" - else - missing_arg_error = quote missing_arg_error quote - - - warn_message = opt_args("Warn", flags[i]) - if (warn_message == "") - warn_message = "0" - else - warn_message = quote warn_message quote - - alias_arg = opt_args("Alias", flags[i]) - if (alias_arg == "") { - if (flag_set_p("Ignore", flags[i])) - alias_data = "NULL, NULL, OPT_SPECIAL_ignore" - else - alias_data = "NULL, NULL, N_OPTS" - } else { - alias_opt = nth_arg(0, alias_arg) - alias_posarg = nth_arg(1, alias_arg) - alias_negarg = nth_arg(2, alias_arg) - - if (var_ref(opts[i], flags[i]) != "-1") - print "#error Alias setting variable" - - if (alias_posarg != "" && alias_negarg == "") { - if (!flag_set_p("RejectNegative", flags[i]) \ - && opts[i] ~ "^[Wfm]") - print "#error Alias with single argument " \ - "allowing negative form" - } - if (alias_posarg != "" \ - && flag_set_p("NegativeAlias", flags[i])) { - print "#error Alias with multiple arguments " \ - "used with NegativeAlias" - } - - alias_opt = opt_enum(alias_opt) - if (alias_posarg == "") - alias_posarg = "NULL" - else - alias_posarg = quote alias_posarg quote - if (alias_negarg == "") - alias_negarg = "NULL" - else - alias_negarg = quote alias_negarg quote - alias_data = alias_posarg ", " alias_negarg ", " alias_opt - } - - neg = opt_args("Negative", flags[i]); - if (neg != "") - idx = indices[neg] - else { - if (flag_set_p("RejectNegative", flags[i])) - idx = -1; - else { - if (opts[i] ~ "^[Wfm]") - idx = indices[opts[i]]; - else - idx = -1; - } - } - # Split the printf after %u to work around an ia64-hp-hpux11.23 - # awk bug. - printf(" { %c-%s%c,\n %s,\n %s,\n %s,\n %s, %s, %u,", - quote, opts[i], quote, hlp, missing_arg_error, warn_message, - alias_data, back_chain[i], len) - printf(" %d,\n", idx) - condition = opt_args("Condition", flags[i]) - cl_flags = switch_flags(flags[i]) - cl_bit_fields = switch_bit_fields(flags[i]) - cl_zero_bit_fields = switch_bit_fields("") - if (condition != "") - printf("#if %s\n" \ - " %s,\n" \ - " 0, %s,\n" \ - "#else\n" \ - " 0,\n" \ - " 1 /* Disabled. */, %s,\n" \ - "#endif\n", - condition, cl_flags, cl_bit_fields, cl_zero_bit_fields) - else - printf(" %s,\n" \ - " 0, %s,\n", - cl_flags, cl_bit_fields) - printf(" %s, %s }%s\n", var_ref(opts[i], flags[i]), - var_set(flags[i]), comma) -} - -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)"; @@ -688,6 +411,5 @@ print " if (targetm.target_option.print print " targetm.target_option.print (file, indent, ptr);"; print "}"; -print "#endif"; } Index: gcc/opth-gen.awk =================================================================== --- gcc/opth-gen.awk (revision 174063) +++ gcc/opth-gen.awk (working copy) @@ -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"; Index: gcc/Makefile.in =================================================================== --- gcc/Makefile.in (revision 174063) +++ gcc/Makefile.in (working copy) @@ -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-func -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-fu $(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 @@ -4442,7 +4447,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-* -- Joseph S. Myers joseph@codesourcery.com