Patchwork Options initialization rearrangement

login
register
mail settings
Submitter Joseph S. Myers
Date Oct. 7, 2010, 3:21 p.m.
Message ID <Pine.LNX.4.64.1010071519540.6004@digraph.polyomino.org.uk>
Download mbox | patch
Permalink /patch/67070/
State New
Headers show

Comments

Joseph S. Myers - Oct. 7, 2010, 3:21 p.m.
This patch (including changes to the various front ends) makes some
changes to how options-related initialization is carried out, with a
view to separating code that acts on a gcc_options structure (to be
shared with the driver, except for the front-end parts) from code with
other global effects (generally not to be shared with the driver).

The general idea is that a gcc_options structure is initialized,
updated in the course of processing options, then finalized, and other
compiler state is configured either at an early point without using
the structure, or after it is finalized.  As I noted in
<http://gcc.gnu.org/ml/gcc-patches/2010-06/msg02689.html>, "target"
and "optimize" attributes ought to work using a copy of the structure
from *before* finalization in order to work reliably.

This patch makes the first steps in that general direction rather than
implementing it completely; subsequent patches will build on it.

* The static initializers for options now go in a separate
  global_options_init which is copied to global_options in the
  initialization step, reflecting that there will be more than one
  gcc_options structure to initialize in future.

* There are explicit init_options_once, init_options_struct and
  lang_hooks.init_options_struct steps, each of which has some parts
  moved out from the previous functions.  Thus various parts of
  initialization are reordered, but this is not intended to change the
  behavior of the compiler.

* The Fortran gfc_init_options hook set flag_short_enums to a
  target-dependent default.  This was too early to set it, since the
  target-dependent default may depend on command-line options; the
  default is set in language-independent code in process_options,
  which should suffice for all languages, so the front-end setting is
  removed.  (I think that front-end setting was a relic of when
  Fortran used its own short-enums flag instead of the
  language-independent one.)

* Several variables that are naturally set in the structure
  initialization hooks are moved into the gcc_options structure.  Some
  of these have enum types from flags.h.  This means that options.h
  always has to be included after the enum declarations in flags.h.
  Most files just include flags.h and get options.h from there; some
  include options.h (unnecessarily) after flags.h; those that included
  options.h only were changed to include flags.h instead.  Various
  parts of flags.h and options.h were disabled for target libraries
  because including flags.h instead of options.h in target code (via
  tm.h) caused some problems there.  (I'm not sure what was being used
  in target code, but probably some TARGET_* macro definitions from
  options.h.)

* The setting of options based on the optimization level was moved
  into a new default_options_optimization function.  This is simply a
  convenience separation of functions; it hasn't yet been modified to
  work directly on options structures so asserts that global_options
  and global_options_set are in use.  (It doesn't in fact use the _set
  information at all - but if it (and the target_option.optimization
  hooks) did so, that would provide 90% of a solution to PR 38716
  regarding how optimize attributes work with explicitly overridden
  options.  A full solution would require dealing with cases where a
  -f option is implied by another -f option (which takes precedence
  over implication by a -O option); that would involve _set storing
  information about the closeness of an option that implied another
  option, for the notion of closeness I mentioned in appendix 1 to my
  original multilibs proposal, rather than just storing a binary
  explicit/implicit state.)

* Similarly, what decode_options does after calling option handlers is
  moved into finish_options.  This also has yet to be converted to use
  options structures explicitly, or to be separated into parts working
  on options structures versus those using other state.  Also, there
  is some initialization after decode_options, including in
  process_options called from do_compile and in the target option
  override hook, which again should be split up and moved into the two
  parts of finish_options.

* The rearrangements in this patch eliminate most checks on the
  first_time_p variable that was in decode_options.  It is now in
  finish_options and only checked for flag_pic/flag_shlib
  initialization.  This variable serves to distinguish the initial
  call from calls from "optimize" attributes.  If those attributes
  worked with the options structure from before finish_options, it
  would not be a problem for finish_options to be called more than
  once without needing any checks there on first_time_p.

Bootstrapped with no regressions on x86_64-unknown-linux-gnu.  OK to
commit?

2010-10-07  Joseph Myers  <joseph@codesourcery.com>

	* Makefile.in (TM_H): Include $(FLAGS_H) instead of options.h.
	(TREE_H): Include $(FLAGS_H) instead of options.h.
	(opts-common.o): Depend on $(FLAGS_H) instead of options.h.
	* c-objc-common.h (LANG_HOOKS_INIT_OPTIONS_STRUCT): Define.
	* common.opt (flag_complex_method, flag_evaluation_order,
	flag_ira_algorithm, flag_ira_region, flag_warn_unused_result): New
	Variable declarations.
	* configure.ac (tm_include_list): Include flags.h instead of
	options.h.
	* configure: Regenerate.
	* flags.h: Condition out contents for target libraries.  Include
	options.h at end of file.
	(flag_complex_method, flag_ira_algorithm, flag_ira_region,
	flag_evaluation_order, flag_warn_unused_result): Remove.
	* gcc.c (main): Intialize global_options with global_options_init.
	* langhooks-def.h (lhd_init_options_struct): Declare.
	(LANG_HOOKS_INIT_OPTIONS_STRUCT): Define.
	(LANG_HOOKS_INITIALIZER): Include LANG_HOOKS_INIT_OPTIONS_STRUCT.
	* langhooks.c (lhd_init_options_struct): New.
	* langhooks.h (struct lang_hooks): Add init_options_struct.
	Update comment on init_options.
	* optc-gen.awk: Generate initializer for global_options_init, not
	global_options.
	* opth-gen.awk: Condition out structure declarations for target
	libraries.  Declare global_options_init.
	* opts-common.c: Include flags.h instead of options.h.
	* opts.c (flag_warn_unused_result): Remove.
	(read_cmdline_options): Take gcc_options parameters.  Pass them to
	read_cmdline_option.
	(initial_lang_mask, initial_min_crossjump_insns,
	initial_max_fields_for_field_sensitive,
	initial_loop_invariant_max_bbs_in_loop): Define at file scope.
	(init_options_once): New.  Split out of decode_options.
	(init_options_struct): New.  Split out of decode_options.
	(decode_cmdline_options_to_array_default_mask): New.
	(default_options_optimization): New.  Split out of decode_options.
	(decode_options): Move most code to other functions.  Update call
	to read_cmdline_options.
	(finish_options): New.  Split out of decode_options.
	* opts.h (decode_options): Add gcc_options parameters.
	(init_options_once, init_options_struct,
	decode_cmdline_options_to_array_default_mask): New.
	* toplev.c (flag_complex_method, flag_ira_algorithm,
	flag_ira_region, flag_evaluation_order): Remove.
	(general_init): Use global_options_init for initial flag values
	for global_dc.
	(toplev_main): Call init_options_once, init_options_struct,
	lang_hooks.init_options_struct,
	decode_cmdline_options_to_array_default_mask and
	lang_hooks.init_option before decode_options.  Update arguments to
	decode_options.
	* tree.h: Include flags.h instead of options.h.

ada:
2010-10-07  Joseph Myers  <joseph@codesourcery.com>

	* gcc-interface/misc.c (gnat_init_options_struct): New.  Split out
	from gnat_init_options.
	(LANG_HOOKS_INIT_OPTIONS_STRUCT): Define.

c-family:
2010-10-07  Joseph Myers  <joseph@codesourcery.com>

	* c-common.c (parse_optimize_options): Call
	decode_cmdline_options_to_array_default_mask before
	decode_options.  Update arguments to decode_options.
	* c-common.h (c_common_init_options_struct): Declare.
	* c-opts.c (c_common_init_options_struct): New.  Split out from
	c_common_init_options.

cp:
2010-10-07  Joseph Myers  <joseph@codesourcery.com>

	* cp-objcp-common.h (LANG_HOOKS_INIT_OPTIONS_STRUCT): Define.

fortran:
2010-10-07  Joseph Myers  <joseph@codesourcery.com>

	* f95-lang.c (LANG_HOOKS_INIT_OPTIONS_STRUCT): Define.
	* gfortran.h (gfc_init_options_struct): Declare.
	* options.c (gfc_init_options_struct): New.  Split out from
	gfc_init_options.

java:
2010-10-07  Joseph Myers  <joseph@codesourcery.com>

	* lang.c (java_init_options_struct): New.  Split out from
	java_init_options.
	(LANG_HOOKS_INIT_OPTIONS_STRUCT): Define.

lto:
2010-10-07  Joseph Myers  <joseph@codesourcery.com>

	* lto-lang.c (lto_init_options): Change to
	lto_init_options_struct.  Update parameters.
	(LANG_HOOKS_INIT_OPTIONS): Don't define.
	(LANG_HOOKS_INIT_OPTIONS_STRUCT): Define.
Richard Guenther - Oct. 8, 2010, 9:23 a.m.
On Thu, Oct 7, 2010 at 5:21 PM, Joseph S. Myers <joseph@codesourcery.com> wrote:
> This patch (including changes to the various front ends) makes some
> changes to how options-related initialization is carried out, with a
> view to separating code that acts on a gcc_options structure (to be
> shared with the driver, except for the front-end parts) from code with
> other global effects (generally not to be shared with the driver).
>
> The general idea is that a gcc_options structure is initialized,
> updated in the course of processing options, then finalized, and other
> compiler state is configured either at an early point without using
> the structure, or after it is finalized.  As I noted in
> <http://gcc.gnu.org/ml/gcc-patches/2010-06/msg02689.html>, "target"
> and "optimize" attributes ought to work using a copy of the structure
> from *before* finalization in order to work reliably.
>
> This patch makes the first steps in that general direction rather than
> implementing it completely; subsequent patches will build on it.
>
> * The static initializers for options now go in a separate
>  global_options_init which is copied to global_options in the
>  initialization step, reflecting that there will be more than one
>  gcc_options structure to initialize in future.
>
> * There are explicit init_options_once, init_options_struct and
>  lang_hooks.init_options_struct steps, each of which has some parts
>  moved out from the previous functions.  Thus various parts of
>  initialization are reordered, but this is not intended to change the
>  behavior of the compiler.
>
> * The Fortran gfc_init_options hook set flag_short_enums to a
>  target-dependent default.  This was too early to set it, since the
>  target-dependent default may depend on command-line options; the
>  default is set in language-independent code in process_options,
>  which should suffice for all languages, so the front-end setting is
>  removed.  (I think that front-end setting was a relic of when
>  Fortran used its own short-enums flag instead of the
>  language-independent one.)
>
> * Several variables that are naturally set in the structure
>  initialization hooks are moved into the gcc_options structure.  Some
>  of these have enum types from flags.h.  This means that options.h
>  always has to be included after the enum declarations in flags.h.
>  Most files just include flags.h and get options.h from there; some
>  include options.h (unnecessarily) after flags.h; those that included
>  options.h only were changed to include flags.h instead.  Various
>  parts of flags.h and options.h were disabled for target libraries
>  because including flags.h instead of options.h in target code (via
>  tm.h) caused some problems there.  (I'm not sure what was being used
>  in target code, but probably some TARGET_* macro definitions from
>  options.h.)
>
> * The setting of options based on the optimization level was moved
>  into a new default_options_optimization function.  This is simply a
>  convenience separation of functions; it hasn't yet been modified to
>  work directly on options structures so asserts that global_options
>  and global_options_set are in use.  (It doesn't in fact use the _set
>  information at all - but if it (and the target_option.optimization
>  hooks) did so, that would provide 90% of a solution to PR 38716
>  regarding how optimize attributes work with explicitly overridden
>  options.  A full solution would require dealing with cases where a
>  -f option is implied by another -f option (which takes precedence
>  over implication by a -O option); that would involve _set storing
>  information about the closeness of an option that implied another
>  option, for the notion of closeness I mentioned in appendix 1 to my
>  original multilibs proposal, rather than just storing a binary
>  explicit/implicit state.)
>
> * Similarly, what decode_options does after calling option handlers is
>  moved into finish_options.  This also has yet to be converted to use
>  options structures explicitly, or to be separated into parts working
>  on options structures versus those using other state.  Also, there
>  is some initialization after decode_options, including in
>  process_options called from do_compile and in the target option
>  override hook, which again should be split up and moved into the two
>  parts of finish_options.
>
> * The rearrangements in this patch eliminate most checks on the
>  first_time_p variable that was in decode_options.  It is now in
>  finish_options and only checked for flag_pic/flag_shlib
>  initialization.  This variable serves to distinguish the initial
>  call from calls from "optimize" attributes.  If those attributes
>  worked with the options structure from before finish_options, it
>  would not be a problem for finish_options to be called more than
>  once without needing any checks there on first_time_p.
>
> Bootstrapped with no regressions on x86_64-unknown-linux-gnu.  OK to
> commit?

Ok for the ME pieces.

Thanks,
Richard.

> 2010-10-07  Joseph Myers  <joseph@codesourcery.com>
>
>        * Makefile.in (TM_H): Include $(FLAGS_H) instead of options.h.
>        (TREE_H): Include $(FLAGS_H) instead of options.h.
>        (opts-common.o): Depend on $(FLAGS_H) instead of options.h.
>        * c-objc-common.h (LANG_HOOKS_INIT_OPTIONS_STRUCT): Define.
>        * common.opt (flag_complex_method, flag_evaluation_order,
>        flag_ira_algorithm, flag_ira_region, flag_warn_unused_result): New
>        Variable declarations.
>        * configure.ac (tm_include_list): Include flags.h instead of
>        options.h.
>        * configure: Regenerate.
>        * flags.h: Condition out contents for target libraries.  Include
>        options.h at end of file.
>        (flag_complex_method, flag_ira_algorithm, flag_ira_region,
>        flag_evaluation_order, flag_warn_unused_result): Remove.
>        * gcc.c (main): Intialize global_options with global_options_init.
>        * langhooks-def.h (lhd_init_options_struct): Declare.
>        (LANG_HOOKS_INIT_OPTIONS_STRUCT): Define.
>        (LANG_HOOKS_INITIALIZER): Include LANG_HOOKS_INIT_OPTIONS_STRUCT.
>        * langhooks.c (lhd_init_options_struct): New.
>        * langhooks.h (struct lang_hooks): Add init_options_struct.
>        Update comment on init_options.
>        * optc-gen.awk: Generate initializer for global_options_init, not
>        global_options.
>        * opth-gen.awk: Condition out structure declarations for target
>        libraries.  Declare global_options_init.
>        * opts-common.c: Include flags.h instead of options.h.
>        * opts.c (flag_warn_unused_result): Remove.
>        (read_cmdline_options): Take gcc_options parameters.  Pass them to
>        read_cmdline_option.
>        (initial_lang_mask, initial_min_crossjump_insns,
>        initial_max_fields_for_field_sensitive,
>        initial_loop_invariant_max_bbs_in_loop): Define at file scope.
>        (init_options_once): New.  Split out of decode_options.
>        (init_options_struct): New.  Split out of decode_options.
>        (decode_cmdline_options_to_array_default_mask): New.
>        (default_options_optimization): New.  Split out of decode_options.
>        (decode_options): Move most code to other functions.  Update call
>        to read_cmdline_options.
>        (finish_options): New.  Split out of decode_options.
>        * opts.h (decode_options): Add gcc_options parameters.
>        (init_options_once, init_options_struct,
>        decode_cmdline_options_to_array_default_mask): New.
>        * toplev.c (flag_complex_method, flag_ira_algorithm,
>        flag_ira_region, flag_evaluation_order): Remove.
>        (general_init): Use global_options_init for initial flag values
>        for global_dc.
>        (toplev_main): Call init_options_once, init_options_struct,
>        lang_hooks.init_options_struct,
>        decode_cmdline_options_to_array_default_mask and
>        lang_hooks.init_option before decode_options.  Update arguments to
>        decode_options.
>        * tree.h: Include flags.h instead of options.h.
>
> ada:
> 2010-10-07  Joseph Myers  <joseph@codesourcery.com>
>
>        * gcc-interface/misc.c (gnat_init_options_struct): New.  Split out
>        from gnat_init_options.
>        (LANG_HOOKS_INIT_OPTIONS_STRUCT): Define.
>
> c-family:
> 2010-10-07  Joseph Myers  <joseph@codesourcery.com>
>
>        * c-common.c (parse_optimize_options): Call
>        decode_cmdline_options_to_array_default_mask before
>        decode_options.  Update arguments to decode_options.
>        * c-common.h (c_common_init_options_struct): Declare.
>        * c-opts.c (c_common_init_options_struct): New.  Split out from
>        c_common_init_options.
>
> cp:
> 2010-10-07  Joseph Myers  <joseph@codesourcery.com>
>
>        * cp-objcp-common.h (LANG_HOOKS_INIT_OPTIONS_STRUCT): Define.
>
> fortran:
> 2010-10-07  Joseph Myers  <joseph@codesourcery.com>
>
>        * f95-lang.c (LANG_HOOKS_INIT_OPTIONS_STRUCT): Define.
>        * gfortran.h (gfc_init_options_struct): Declare.
>        * options.c (gfc_init_options_struct): New.  Split out from
>        gfc_init_options.
>
> java:
> 2010-10-07  Joseph Myers  <joseph@codesourcery.com>
>
>        * lang.c (java_init_options_struct): New.  Split out from
>        java_init_options.
>        (LANG_HOOKS_INIT_OPTIONS_STRUCT): Define.
>
> lto:
> 2010-10-07  Joseph Myers  <joseph@codesourcery.com>
>
>        * lto-lang.c (lto_init_options): Change to
>        lto_init_options_struct.  Update parameters.
>        (LANG_HOOKS_INIT_OPTIONS): Don't define.
>        (LANG_HOOKS_INIT_OPTIONS_STRUCT): Define.
>
> Index: gcc/flags.h
> ===================================================================
> --- gcc/flags.h (revision 164991)
> +++ gcc/flags.h (working copy)
> @@ -23,7 +23,8 @@ along with GCC; see the file COPYING3.
>  #define GCC_FLAGS_H
>
>  #include "coretypes.h"
> -#include "options.h"
> +
> +#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) && !defined(IN_RTS)
>
>  enum debug_info_type
>  {
> @@ -147,12 +148,6 @@ extern int flag_print_asm_name;
>
>  /* Now the symbols that are set with `-f' switches.  */
>
> -/* 0 means straightforward implementation of complex divide acceptable.
> -   1 means wide ranges of inputs must work for complex divide.
> -   2 means C99-like requirements for complex multiply and divide.  */
> -
> -extern int flag_complex_method;
> -
>  /* Nonzero if we are only using compiler to check syntax errors.  */
>
>  extern int rtl_dump_and_exit;
> @@ -201,8 +196,6 @@ enum ira_algorithm
>   IRA_ALGORITHM_PRIORITY
>  };
>
> -extern enum ira_algorithm flag_ira_algorithm;
> -
>  /* The regions used for the integrated register allocator (IRA).  */
>  enum ira_region
>  {
> @@ -211,8 +204,6 @@ enum ira_region
>   IRA_REGION_MIXED
>  };
>
> -extern enum ira_region flag_ira_region;
> -
>  /* The options for excess precision.  */
>  enum excess_precision
>  {
> @@ -269,12 +260,6 @@ extern struct target_flag_state *this_ta
>  #define flag_excess_precision \
>   (this_target_flag_state->x_flag_excess_precision)
>
> -/* Nonzero if subexpressions must be evaluated from left-to-right.  */
> -extern int flag_evaluation_order;
> -
> -/* Whether to run the warn_unused_result attribute pass.  */
> -extern bool flag_warn_unused_result;
> -
>  /* Nonzero if we dump in VCG format, not plain text.  */
>  extern int dump_for_graph;
>
> @@ -369,4 +354,10 @@ enum warn_strict_overflow_code
>  /* Whether to emit an overflow warning whose code is C.  */
>  #define issue_strict_overflow_warning(c) (warn_strict_overflow >= (int) (c))
>
> +#endif
> +
> +/* This is included last because options may use types declared
> +   above.  */
> +#include "options.h"
> +
>  #endif /* ! GCC_FLAGS_H */
> Index: gcc/opts-common.c
> ===================================================================
> --- gcc/opts-common.c   (revision 164991)
> +++ gcc/opts-common.c   (working copy)
> @@ -22,7 +22,7 @@ along with GCC; see the file COPYING3.
>  #include "intl.h"
>  #include "coretypes.h"
>  #include "opts.h"
> -#include "options.h"
> +#include "flags.h"
>  #include "diagnostic.h"
>  #include "tm.h" /* For SWITCH_TAKES_ARG, WORD_SWITCH_TAKES_ARG and
>                   TARGET_OPTION_TRANSLATE_TABLE.  */
> Index: gcc/c-family/c-opts.c
> ===================================================================
> --- gcc/c-family/c-opts.c       (revision 164991)
> +++ gcc/c-family/c-opts.c       (working copy)
> @@ -273,6 +273,19 @@ c_common_complain_wrong_lang_p (const st
>   return true;
>  }
>
> +/* Initialize options structure OPTS.  */
> +void
> +c_common_init_options_struct (struct gcc_options *opts)
> +{
> +  opts->x_flag_exceptions = c_dialect_cxx ();
> +  opts->x_warn_pointer_arith = c_dialect_cxx ();
> +  opts->x_warn_write_strings = c_dialect_cxx ();
> +  opts->x_flag_warn_unused_result = true;
> +
> +  /* By default, C99-like requirements for complex multiply and divide.  */
> +  opts->x_flag_complex_method = 2;
> +}
> +
>  /* Common initialization before calling option handlers.  */
>  void
>  c_common_init_options (unsigned int decoded_options_count,
> @@ -294,14 +307,6 @@ c_common_init_options (unsigned int deco
>      before passing on command-line options to cpplib.  */
>   cpp_opts->warn_dollars = 0;
>
> -  flag_exceptions = c_dialect_cxx ();
> -  warn_pointer_arith = c_dialect_cxx ();
> -  warn_write_strings = c_dialect_cxx();
> -  flag_warn_unused_result = true;
> -
> -  /* By default, C99-like requirements for complex multiply and divide.  */
> -  flag_complex_method = 2;
> -
>   deferred_opts = XNEWVEC (struct deferred_opt, decoded_options_count);
>
>   if (c_language == clk_c)
> Index: gcc/c-family/c-common.c
> ===================================================================
> --- gcc/c-family/c-common.c     (revision 164991)
> +++ gcc/c-family/c-common.c     (working copy)
> @@ -7802,8 +7802,11 @@ parse_optimize_options (tree args, bool
>   saved_flag_strict_aliasing = flag_strict_aliasing;
>
>   /* Now parse the options.  */
> -  decode_options (opt_argc, opt_argv, &decoded_options,
> -                 &decoded_options_count);
> +  decode_cmdline_options_to_array_default_mask (opt_argc, opt_argv,
> +                                               &decoded_options,
> +                                               &decoded_options_count);
> +  decode_options (&global_options, &global_options_set,
> +                 decoded_options, decoded_options_count);
>
>   targetm.override_options_after_change();
>
> Index: gcc/c-family/c-common.h
> ===================================================================
> --- gcc/c-family/c-common.h     (revision 164991)
> +++ gcc/c-family/c-common.h     (working copy)
> @@ -743,6 +743,7 @@ extern tree build_va_arg (location_t, tr
>  extern unsigned int c_common_option_lang_mask (void);
>  extern void c_common_initialize_diagnostics (diagnostic_context *);
>  extern bool c_common_complain_wrong_lang_p (const struct cl_option *);
> +extern void c_common_init_options_struct (struct gcc_options *);
>  extern void c_common_init_options (unsigned int, struct cl_decoded_option *);
>  extern bool c_common_post_options (const char **);
>  extern bool c_common_init (void);
> Index: gcc/java/lang.c
> ===================================================================
> --- gcc/java/lang.c     (revision 164991)
> +++ gcc/java/lang.c     (working copy)
> @@ -48,6 +48,7 @@ The Free Software Foundation is independ
>  static bool java_init (void);
>  static void java_finish (void);
>  static unsigned int java_option_lang_mask (void);
> +static void java_init_options_struct (struct gcc_options *);
>  static void java_init_options (unsigned int, struct cl_decoded_option *);
>  static bool java_post_options (const char **);
>
> @@ -126,6 +127,8 @@ struct GTY(()) language_function {
>  #define LANG_HOOKS_FINISH java_finish
>  #undef LANG_HOOKS_OPTION_LANG_MASK
>  #define LANG_HOOKS_OPTION_LANG_MASK java_option_lang_mask
> +#undef LANG_HOOKS_INIT_OPTIONS_STRUCT
> +#define LANG_HOOKS_INIT_OPTIONS_STRUCT java_init_options_struct
>  #undef LANG_HOOKS_INIT_OPTIONS
>  #define LANG_HOOKS_INIT_OPTIONS java_init_options
>  #undef LANG_HOOKS_HANDLE_OPTION
> @@ -535,23 +538,29 @@ java_option_lang_mask (void)
>   return CL_Java;
>  }
>
> +/* Initialize options structure OPTS.  */
> +
>  static void
> -java_init_options (unsigned int decoded_options_count ATTRIBUTE_UNUSED,
> -                  struct cl_decoded_option *decoded_options ATTRIBUTE_UNUSED)
> +java_init_options_struct (struct gcc_options *opts)
>  {
> -  flag_bounds_check = 1;
> -  flag_exceptions = 1;
> -  flag_non_call_exceptions = 1;
> +  opts->x_flag_bounds_check = 1;
> +  opts->x_flag_exceptions = 1;
> +  opts->x_flag_non_call_exceptions = 1;
>
>   /* In Java floating point operations never trap.  */
> -  flag_trapping_math = 0;
> +  opts->x_flag_trapping_math = 0;
>
>   /* In Java arithmetic overflow always wraps around.  */
> -  flag_wrapv = 1;
> +  opts->x_flag_wrapv = 1;
>
>   /* Java requires left-to-right evaluation of subexpressions.  */
> -  flag_evaluation_order = 1;
> +  opts->x_flag_evaluation_order = 1;
> +}
>
> +static void
> +java_init_options (unsigned int decoded_options_count ATTRIBUTE_UNUSED,
> +                  struct cl_decoded_option *decoded_options ATTRIBUTE_UNUSED)
> +{
>   jcf_path_init ();
>  }
>
> Index: gcc/tree.h
> ===================================================================
> --- gcc/tree.h  (revision 164991)
> +++ gcc/tree.h  (working copy)
> @@ -32,7 +32,7 @@ along with GCC; see the file COPYING3.
>  #include "real.h"
>  #include "fixed-value.h"
>  #include "alias.h"
> -#include "options.h"
> +#include "flags.h"
>
>  /* Codes of tree nodes */
>
> Index: gcc/configure
> ===================================================================
> --- gcc/configure       (revision 164991)
> +++ gcc/configure       (working copy)
> @@ -10843,7 +10843,7 @@ tmake_file="${tmake_file_}"
>  out_object_file=`basename $out_file .c`.o
>
>  tm_file_list="options.h"
> -tm_include_list="options.h insn-constants.h"
> +tm_include_list="flags.h insn-constants.h"
>  for f in $tm_file; do
>   case $f in
>     ./* )
> Index: gcc/gcc.c
> ===================================================================
> --- gcc/gcc.c   (revision 164991)
> +++ gcc/gcc.c   (working copy)
> @@ -6135,6 +6135,8 @@ main (int argc, char **argv)
>   if (argv != old_argv)
>     at_file_supplied = true;
>
> +  global_options = global_options_init;
> +
>   decode_cmdline_options_to_array (argc, CONST_CAST2 (const char **, char **,
>                                                      argv),
>                                   CL_DRIVER,
> Index: gcc/toplev.c
> ===================================================================
> --- gcc/toplev.c        (revision 164991)
> +++ gcc/toplev.c        (working copy)
> @@ -198,12 +198,6 @@ unsigned local_tick;
>
>  /* -f flags.  */
>
> -/* 0 means straightforward implementation of complex divide acceptable.
> -   1 means wide ranges of inputs must work for complex divide.
> -   2 means C99-like requirements for complex multiply and divide.  */
> -
> -int flag_complex_method = 1;
> -
>  /* Nonzero means we should be saving declaration info into a .X file.  */
>
>  int flag_gen_aux_info = 0;
> @@ -229,12 +223,6 @@ int flag_next_runtime = 0;
>
>  enum tls_model flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
>
> -/* Set the default region and algorithm for the integrated register
> -   allocator.  */
> -
> -enum ira_algorithm flag_ira_algorithm = IRA_ALGORITHM_CB;
> -enum ira_region flag_ira_region = IRA_REGION_MIXED;
> -
>  /* Set the default for excess precision.  */
>
>  enum excess_precision flag_excess_precision_cmdline = EXCESS_PRECISION_DEFAULT;
> @@ -293,9 +281,6 @@ typedef struct
>  }
>  lang_independent_options;
>
> -/* Nonzero if subexpressions must be evaluated from left-to-right.  */
> -int flag_evaluation_order = 0;
> -
>  /* The user symbol prefix after having resolved same.  */
>  const char *user_label_prefix;
>
> @@ -1661,8 +1646,10 @@ general_init (const char *argv0)
>   /* Set a default printer.  Language specific initializations will
>      override it later.  */
>   pp_format_decoder (global_dc->printer) = &default_tree_printer;
> -  global_dc->show_option_requested = flag_diagnostics_show_option;
> -  global_dc->show_column = flag_show_column;
> +  global_dc->show_option_requested
> +    = global_options_init.x_flag_diagnostics_show_option;
> +  global_dc->show_column
> +    = global_options_init.x_flag_show_column;
>   global_dc->internal_error = plugins_internal_error_function;
>   global_dc->option_enabled = option_enabled;
>   global_dc->option_state = &global_options;
> @@ -2395,10 +2382,29 @@ toplev_main (int argc, char **argv)
>   /* Initialization of GCC's environment, and diagnostics.  */
>   general_init (argv[0]);
>
> +  /* One-off initialization of options that does not need to be
> +     repeated when options are added for particular functions.  */
> +  init_options_once ();
> +
> +  /* Initialize global options structures; this must be repeated for
> +     each structure used for parsing options.  */
> +  init_options_struct (&global_options, &global_options_set);
> +  lang_hooks.init_options_struct (&global_options);
> +
> +  /* Convert the options to an array.  */
> +  decode_cmdline_options_to_array_default_mask (argc,
> +                                               CONST_CAST2 (const char **,
> +                                                            char **, argv),
> +                                               &save_decoded_options,
> +                                               &save_decoded_options_count);
> +
> +  /* Perform language-specific options initialization.  */
> +  lang_hooks.init_options (save_decoded_options_count, save_decoded_options);
> +
>   /* Parse the options and do minimal processing; basically just
>      enough to default flags appropriately.  */
> -  decode_options (argc, CONST_CAST2 (const char **, char **, argv),
> -                 &save_decoded_options, &save_decoded_options_count);
> +  decode_options (&global_options, &global_options_set,
> +                 save_decoded_options, save_decoded_options_count);
>
>   init_local_tick ();
>
> Index: gcc/cp/cp-objcp-common.h
> ===================================================================
> --- gcc/cp/cp-objcp-common.h    (revision 164991)
> +++ gcc/cp/cp-objcp-common.h    (working copy)
> @@ -45,6 +45,8 @@ extern bool cp_function_decl_explicit_p
>  #define LANG_HOOKS_OPTION_LANG_MASK c_common_option_lang_mask
>  #undef LANG_HOOKS_COMPLAIN_WRONG_LANG_P
>  #define LANG_HOOKS_COMPLAIN_WRONG_LANG_P c_common_complain_wrong_lang_p
> +#undef LANG_HOOKS_INIT_OPTIONS_STRUCT
> +#define LANG_HOOKS_INIT_OPTIONS_STRUCT c_common_init_options_struct
>  #undef LANG_HOOKS_INIT_OPTIONS
>  #define LANG_HOOKS_INIT_OPTIONS c_common_init_options
>  #undef LANG_HOOKS_INITIALIZE_DIAGNOSTICS
> Index: gcc/c-objc-common.h
> ===================================================================
> --- gcc/c-objc-common.h (revision 164991)
> +++ gcc/c-objc-common.h (working copy)
> @@ -33,6 +33,8 @@ along with GCC; see the file COPYING3.
>  #define LANG_HOOKS_OPTION_LANG_MASK c_common_option_lang_mask
>  #undef LANG_HOOKS_COMPLAIN_WRONG_LANG_P
>  #define LANG_HOOKS_COMPLAIN_WRONG_LANG_P c_common_complain_wrong_lang_p
> +#undef LANG_HOOKS_INIT_OPTIONS_STRUCT
> +#define LANG_HOOKS_INIT_OPTIONS_STRUCT c_common_init_options_struct
>  #undef LANG_HOOKS_INIT_OPTIONS
>  #define LANG_HOOKS_INIT_OPTIONS c_common_init_options
>  #undef LANG_HOOKS_INITIALIZE_DIAGNOSTICS
> Index: gcc/opts.c
> ===================================================================
> --- gcc/opts.c  (revision 164991)
> +++ gcc/opts.c  (working copy)
> @@ -353,9 +353,6 @@ DEF_VEC_ALLOC_P(const_char_p,heap);
>
>  static VEC(const_char_p,heap) *ignored_options;
>
> -/* Language specific warning pass for unused results.  */
> -bool flag_warn_unused_result = false;
> -
>  /* Input file names.  */
>  const char **in_fnames;
>  unsigned num_in_fnames;
> @@ -613,11 +610,14 @@ flag_instrument_functions_exclude_p (tre
>  }
>
>
> -/* Handle the vector of command line options.  LANG_MASK
> -   contains has a single bit set representing the current
> -   language.  HANDLERS describes what functions to call for the options.  */
> +/* Handle the vector of command line options, storing the results of
> +   processing DECODED_OPTIONS and DECODED_OPTIONS_COUNT in OPTS and
> +   OPTS_SET.  LANG_MASK contains has a single bit set representing the
> +   current language.  HANDLERS describes what functions to call for
> +   the options.  */
>  static void
> -read_cmdline_options (struct cl_decoded_option *decoded_options,
> +read_cmdline_options (struct gcc_options *opts, struct gcc_options *opts_set,
> +                     struct cl_decoded_option *decoded_options,
>                      unsigned int decoded_options_count,
>                      unsigned int lang_mask,
>                      const struct cl_option_handlers *handlers)
> @@ -628,6 +628,11 @@ read_cmdline_options (struct cl_decoded_
>     {
>       if (decoded_options[i].opt_index == OPT_SPECIAL_input_file)
>        {
> +         /* Input files should only ever appear on the main command
> +            line.  */
> +         gcc_assert (opts == &global_options);
> +         gcc_assert (opts_set == &global_options_set);
> +
>          if (main_input_filename == NULL)
>            {
>              main_input_filename = decoded_options[i].arg;
> @@ -638,76 +643,104 @@ read_cmdline_options (struct cl_decoded_
>          continue;
>        }
>
> -      read_cmdline_option (&global_options, &global_options_set,
> +      read_cmdline_option (opts, opts_set,
>                           decoded_options + i, lang_mask, handlers,
>                           global_dc);
>     }
>  }
>
> -/* Parse command line options and set default flag values.  Do minimal
> -   options processing.  The decoded options are placed in *DECODED_OPTIONS
> -   and *DECODED_OPTIONS_COUNT.  */
> +/* Language mask determined at initialization.  */
> +static unsigned int initial_lang_mask;
> +
> +/* Initial values of parameters we reset.  */
> +static int initial_min_crossjump_insns;
> +static int initial_max_fields_for_field_sensitive;
> +static int initial_loop_invariant_max_bbs_in_loop;
> +
> +/* Initialize global options-related settings at start-up.  */
> +
>  void
> -decode_options (unsigned int argc, const char **argv,
> -               struct cl_decoded_option **decoded_options,
> -               unsigned int *decoded_options_count)
> +init_options_once (void)
>  {
> -  static bool first_time_p = true;
> -  static int initial_min_crossjump_insns;
> -  static int initial_max_fields_for_field_sensitive;
> -  static int initial_loop_invariant_max_bbs_in_loop;
> -  static unsigned int initial_lang_mask;
> -  struct cl_option_handlers handlers;
> +  /* Perform language-specific options initialization.  */
> +  initial_lang_mask = lang_hooks.option_lang_mask ();
>
> -  unsigned int i, lang_mask;
> -  int opt1;
> -  int opt2;
> -  int opt3;
> -  int opt1_max;
> -  int ofast = 0;
> -  enum unwind_info_type ui_except;
> +  lang_hooks.initialize_diagnostics (global_dc);
>
> -  if (first_time_p)
> -    {
> -      /* Perform language-specific options initialization.  */
> -      initial_lang_mask = lang_mask = lang_hooks.option_lang_mask ();
> +  /* Save initial values of parameters we reset.  */
> +  initial_min_crossjump_insns
> +    = compiler_params[PARAM_MIN_CROSSJUMP_INSNS].value;
> +  initial_max_fields_for_field_sensitive
> +    = compiler_params[PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE].value;
> +  initial_loop_invariant_max_bbs_in_loop
> +    = compiler_params[PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP].value;
> +}
>
> -      lang_hooks.initialize_diagnostics (global_dc);
> +/* Initialize OPTS and OPTS_SET before using them in parsing options.  */
>
> -      /* Save initial values of parameters we reset.  */
> -      initial_min_crossjump_insns
> -       = compiler_params[PARAM_MIN_CROSSJUMP_INSNS].value;
> -      initial_max_fields_for_field_sensitive
> -       = compiler_params[PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE].value;
> -      initial_loop_invariant_max_bbs_in_loop
> -       = compiler_params[PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP].value;
> -    }
> -  else
> -    lang_mask = initial_lang_mask;
> +void
> +init_options_struct (struct gcc_options *opts, struct gcc_options *opts_set)
> +{
> +  *opts = global_options_init;
> +  memset (opts_set, 0, sizeof (*opts_set));
> +
> +  /* Use priority coloring if cover classes is not defined for the
> +     target.  */
> +  if (targetm.ira_cover_classes == NULL)
> +    opts->x_flag_ira_algorithm = IRA_ALGORITHM_PRIORITY;
> +
> +  /* Initialize whether `char' is signed.  */
> +  opts->x_flag_signed_char = DEFAULT_SIGNED_CHAR;
> +  /* Set this to a special "uninitialized" value.  The actual default
> +     is set after target options have been processed.  */
> +  opts->x_flag_short_enums = 2;
>
> +  /* Initialize target_flags before targetm.target_option.optimization
> +     so the latter can modify it.  */
> +  opts->x_target_flags = targetm.default_target_flags;
> +
> +  /* Some targets have ABI-specified unwind tables.  */
> +  opts->x_flag_unwind_tables = targetm.unwind_tables_default;
> +}
> +
> +/* Decode command-line options to an array, like
> +   decode_cmdline_options_to_array and with the same arguments but
> +   using the default lang_mask.  */
> +
> +void
> +decode_cmdline_options_to_array_default_mask (unsigned int argc,
> +                                             const char **argv,
> +                                             struct cl_decoded_option **decoded_options,
> +                                             unsigned int *decoded_options_count)
> +{
>   decode_cmdline_options_to_array (argc, argv,
> -                                  lang_mask | CL_COMMON | CL_TARGET,
> +                                  initial_lang_mask | CL_COMMON | CL_TARGET,
>                                   decoded_options, decoded_options_count);
> -  if (first_time_p)
> -    /* Perform language-specific options initialization.  */
> -    lang_hooks.init_options (*decoded_options_count, *decoded_options);
> +}
>
> -  handlers.unknown_option_callback = unknown_option_callback;
> -  handlers.wrong_lang_callback = complain_wrong_lang;
> -  handlers.post_handling_callback = post_handling_callback;
> -  handlers.num_handlers = 3;
> -  handlers.handlers[0].handler = lang_handle_option;
> -  handlers.handlers[0].mask = lang_mask;
> -  handlers.handlers[1].handler = common_handle_option;
> -  handlers.handlers[1].mask = CL_COMMON;
> -  handlers.handlers[2].handler = target_handle_option;
> -  handlers.handlers[2].mask = CL_TARGET;
> +/* Default the options in OPTS and OPTS_SET based on the optimization
> +   settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT.  */
> +static void
> +default_options_optimization (struct gcc_options *opts,
> +                             struct gcc_options *opts_set,
> +                             struct cl_decoded_option *decoded_options,
> +                             unsigned int decoded_options_count)
> +{
> +  unsigned int i;
> +  int opt1;
> +  int opt2;
> +  int opt3;
> +  int opt1_max;
> +  int ofast = 0;
> +
> +  gcc_assert (opts == &global_options);
> +  gcc_assert (opts_set = &global_options_set);
>
>   /* Scan to see what optimization level has been specified.  That will
>      determine the default value of many flags.  */
> -  for (i = 1; i < *decoded_options_count; i++)
> +  for (i = 1; i < decoded_options_count; i++)
>     {
> -      struct cl_decoded_option *opt = &(*decoded_options)[i];
> +      struct cl_decoded_option *opt = &decoded_options[i];
>       switch (opt->opt_index)
>        {
>        case OPT_O:
> @@ -755,11 +788,6 @@ decode_options (unsigned int argc, const
>        }
>     }
>
> -  /* Use priority coloring if cover classes is not defined for the
> -     target.  */
> -  if (targetm.ira_cover_classes == NULL)
> -    flag_ira_algorithm = IRA_ALGORITHM_PRIORITY;
> -
>   /* -O1 optimizations.  */
>   opt1 = (optimize >= 1);
>   flag_defer_pop = opt1;
> @@ -879,38 +907,68 @@ decode_options (unsigned int argc, const
>       targetm.handle_ofast ();
>     }
>
> +  /* Allow default optimizations to be specified on a per-machine basis.  */
> +  targetm.target_option.optimization (optimize, optimize_size);
> +}
> +
> +static void finish_options (struct gcc_options *, struct gcc_options *);
> +
> +/* Parse command line options and set default flag values.  Do minimal
> +   options processing.  The decoded options are in *DECODED_OPTIONS
> +   and *DECODED_OPTIONS_COUNT.  */
> +void
> +decode_options (struct gcc_options *opts, struct gcc_options *opts_set,
> +               struct cl_decoded_option *decoded_options,
> +               unsigned int decoded_options_count)
> +{
> +  struct cl_option_handlers handlers;
> +
> +  unsigned int lang_mask;
> +
> +  lang_mask = initial_lang_mask;
> +
> +  handlers.unknown_option_callback = unknown_option_callback;
> +  handlers.wrong_lang_callback = complain_wrong_lang;
> +  handlers.post_handling_callback = post_handling_callback;
> +  handlers.num_handlers = 3;
> +  handlers.handlers[0].handler = lang_handle_option;
> +  handlers.handlers[0].mask = lang_mask;
> +  handlers.handlers[1].handler = common_handle_option;
> +  handlers.handlers[1].mask = CL_COMMON;
> +  handlers.handlers[2].handler = target_handle_option;
> +  handlers.handlers[2].mask = CL_TARGET;
> +
>   /* Enable -Werror=coverage-mismatch by default */
>   enable_warning_as_error ("coverage-mismatch", 1, lang_mask, &handlers,
>                           global_dc);
>
> -  if (first_time_p)
> -    {
> -      /* Initialize whether `char' is signed.  */
> -      flag_signed_char = DEFAULT_SIGNED_CHAR;
> -      /* Set this to a special "uninitialized" value.  The actual default is
> -        set after target options have been processed.  */
> -      flag_short_enums = 2;
> -
> -      /* Initialize target_flags before
> -        targetm.target_option.optimization so the latter can modify
> -        it.  */
> -      target_flags = targetm.default_target_flags;
> -
> -      /* Some targets have ABI-specified unwind tables.  */
> -      flag_unwind_tables = targetm.unwind_tables_default;
> -    }
> +  default_options_optimization (opts, opts_set,
> +                               decoded_options, decoded_options_count);
>
>  #ifdef ENABLE_LTO
>   /* Clear any options currently held for LTO.  */
>   lto_clear_user_options ();
>  #endif
>
> -  /* Allow default optimizations to be specified on a per-machine basis.  */
> -  targetm.target_option.optimization (optimize, optimize_size);
> -
> -  read_cmdline_options (*decoded_options, *decoded_options_count, lang_mask,
> +  read_cmdline_options (opts, opts_set,
> +                       decoded_options, decoded_options_count, lang_mask,
>                        &handlers);
>
> +  finish_options (opts, opts_set);
> +}
> +
> +/* After all options have been read into OPTS and OPTS_SET, finalize
> +   settings of those options and diagnose incompatible
> +   combinations.  */
> +static void
> +finish_options (struct gcc_options *opts, struct gcc_options *opts_set)
> +{
> +  static bool first_time_p = true;
> +  enum unwind_info_type ui_except;
> +
> +  gcc_assert (opts == &global_options);
> +  gcc_assert (opts_set = &global_options_set);
> +
>   if (dump_base_name && ! IS_ABSOLUTE_PATH (dump_base_name))
>     {
>       /* First try to make DUMP_BASE_NAME relative to the DUMP_DIR_NAME
> Index: gcc/opts.h
> ===================================================================
> --- gcc/opts.h  (revision 164991)
> +++ gcc/opts.h  (working copy)
> @@ -208,9 +208,17 @@ extern void decode_cmdline_options_to_ar
>                                             unsigned int lang_mask,
>                                             struct cl_decoded_option **decoded_options,
>                                             unsigned int *decoded_options_count);
> -extern void decode_options (unsigned int argc, const char **argv,
> -                           struct cl_decoded_option **decoded_options,
> -                           unsigned int *decoded_options_count);
> +extern void init_options_once (void);
> +extern void init_options_struct (struct gcc_options *opts,
> +                                struct gcc_options *opts_set);
> +extern void decode_cmdline_options_to_array_default_mask (unsigned int argc,
> +                                                         const char **argv,
> +                                                         struct cl_decoded_option **decoded_options,
> +                                                         unsigned int *decoded_options_count);
> +extern void decode_options (struct gcc_options *opts,
> +                           struct gcc_options *opts_set,
> +                           struct cl_decoded_option *decoded_options,
> +                           unsigned int decoded_options_count);
>  extern int option_enabled (int opt_idx, void *opts);
>  extern bool get_option_state (struct gcc_options *, int,
>                              struct cl_option_state *);
> Index: gcc/optc-gen.awk
> ===================================================================
> --- gcc/optc-gen.awk    (revision 164991)
> +++ gcc/optc-gen.awk    (working copy)
> @@ -83,7 +83,7 @@ print "#endif /* GCC_DRIVER */"
>  print ""
>
>  have_save = 0;
> -print "struct gcc_options global_options =\n{"
> +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]
> @@ -138,6 +138,7 @@ for (i = 0; i < n_opts; i++) {
>  }
>  print "};"
>  print ""
> +print "struct gcc_options global_options;"
>  print "struct gcc_options global_options_set;"
>  print ""
>
> Index: gcc/ada/gcc-interface/misc.c
> ===================================================================
> --- gcc/ada/gcc-interface/misc.c        (revision 164991)
> +++ gcc/ada/gcc-interface/misc.c        (working copy)
> @@ -62,6 +62,7 @@
>
>  static bool gnat_init                  (void);
>  static unsigned int gnat_option_lang_mask (void);
> +static void gnat_init_options_struct   (struct gcc_options *);
>  static void gnat_init_options          (unsigned int,
>                                         struct cl_decoded_option *);
>  static bool gnat_handle_option         (size_t, const char *, int, int,
> @@ -91,6 +92,8 @@ static tree gnat_eh_personality               (void);
>  #define LANG_HOOKS_INIT                        gnat_init
>  #undef  LANG_HOOKS_OPTION_LANG_MASK
>  #define LANG_HOOKS_OPTION_LANG_MASK    gnat_option_lang_mask
> +#undef  LANG_HOOKS_INIT_OPTIONS_STRUCT
> +#define LANG_HOOKS_INIT_OPTIONS_STRUCT gnat_init_options_struct
>  #undef  LANG_HOOKS_INIT_OPTIONS
>  #define LANG_HOOKS_INIT_OPTIONS                gnat_init_options
>  #undef  LANG_HOOKS_HANDLE_OPTION
> @@ -256,6 +259,15 @@ gnat_option_lang_mask (void)
>   return CL_Ada;
>  }
>
> +/* Initialize options structure OPTS.  */
> +
> +static void
> +gnat_init_options_struct (struct gcc_options *opts)
> +{
> +  /* Uninitialized really means uninitialized in Ada.  */
> +  opts->x_flag_zero_initialized_in_bss = 0;
> +}
> +
>  /* Initialize for option processing.  */
>
>  static void
> @@ -298,9 +310,6 @@ gnat_init_options (unsigned int decoded_
>   gnat_argv = (char **) xmalloc (sizeof (save_argv[0]));
>   gnat_argv[0] = xstrdup (save_argv[0]);     /* name of the command */
>   gnat_argc = 1;
> -
> -  /* Uninitialized really means uninitialized in Ada.  */
> -  flag_zero_initialized_in_bss = 0;
>  }
>
>  /* Ada code requires variables for these settings rather than elements
> Index: gcc/fortran/gfortran.h
> ===================================================================
> --- gcc/fortran/gfortran.h      (revision 164991)
> +++ gcc/fortran/gfortran.h      (working copy)
> @@ -2398,6 +2398,7 @@ int get_c_kind (const char *, CInteropKi
>
>  /* options.c */
>  unsigned int gfc_option_lang_mask (void);
> +void gfc_init_options_struct (struct gcc_options *);
>  void gfc_init_options (unsigned int,
>                       struct cl_decoded_option *);
>  bool gfc_handle_option (size_t, const char *, int, int,
> Index: gcc/fortran/f95-lang.c
> ===================================================================
> --- gcc/fortran/f95-lang.c      (revision 164991)
> +++ gcc/fortran/f95-lang.c      (working copy)
> @@ -102,6 +102,7 @@ static void gfc_init_ts (void);
>  #undef LANG_HOOKS_FINISH
>  #undef LANG_HOOKS_WRITE_GLOBALS
>  #undef LANG_HOOKS_OPTION_LANG_MASK
> +#undef LANG_HOOKS_INIT_OPTIONS_STRUCT
>  #undef LANG_HOOKS_INIT_OPTIONS
>  #undef LANG_HOOKS_HANDLE_OPTION
>  #undef LANG_HOOKS_POST_OPTIONS
> @@ -132,6 +133,7 @@ static void gfc_init_ts (void);
>  #define LANG_HOOKS_FINISH               gfc_finish
>  #define LANG_HOOKS_WRITE_GLOBALS       gfc_write_global_declarations
>  #define LANG_HOOKS_OPTION_LANG_MASK    gfc_option_lang_mask
> +#define LANG_HOOKS_INIT_OPTIONS_STRUCT  gfc_init_options_struct
>  #define LANG_HOOKS_INIT_OPTIONS         gfc_init_options
>  #define LANG_HOOKS_HANDLE_OPTION        gfc_handle_option
>  #define LANG_HOOKS_POST_OPTIONS                gfc_post_options
> Index: gcc/fortran/options.c
> ===================================================================
> --- gcc/fortran/options.c       (revision 164991)
> +++ gcc/fortran/options.c       (working copy)
> @@ -62,6 +62,14 @@ gfc_option_lang_mask (void)
>   return CL_Fortran;
>  }
>
> +/* Initialize options structure OPTS.  */
> +
> +void
> +gfc_init_options_struct (struct gcc_options *opts)
> +{
> +  opts->x_flag_errno_math = 0;
> +  opts->x_flag_associative_math = -1;
> +}
>
>  /* Get ready for options handling. Keep in sync with
>    libgfortran/runtime/compile_options.c (init_compile_options). */
> @@ -145,14 +153,8 @@ gfc_init_options (unsigned int decoded_o
>   gfc_option.rtcheck = 0;
>   gfc_option.coarray = GFC_FCOARRAY_NONE;
>
> -  flag_errno_math = 0;
> -  flag_associative_math = -1;
> -
>   set_default_std_flags ();
>
> -  /* -fshort-enums can be default on some targets.  */
> -  flag_short_enums = targetm.default_short_enums ();
> -
>   /* Initialize cpp-related options.  */
>   gfc_cpp_init_options (decoded_options_count, decoded_options);
>  }
> Index: gcc/configure.ac
> ===================================================================
> --- gcc/configure.ac    (revision 164991)
> +++ gcc/configure.ac    (working copy)
> @@ -1609,7 +1609,7 @@ tmake_file="${tmake_file_}"
>  out_object_file=`basename $out_file .c`.o
>
>  tm_file_list="options.h"
> -tm_include_list="options.h insn-constants.h"
> +tm_include_list="flags.h insn-constants.h"
>  for f in $tm_file; do
>   case $f in
>     ./* )
> Index: gcc/langhooks.c
> ===================================================================
> --- gcc/langhooks.c     (revision 164991)
> +++ gcc/langhooks.c     (working copy)
> @@ -337,6 +337,12 @@ lhd_initialize_diagnostics (diagnostic_c
>  {
>  }
>
> +/* Called to perform language-specific options initialization of OPTS.  */
> +void
> +lhd_init_options_struct (struct gcc_options *opts ATTRIBUTE_UNUSED)
> +{
> +}
> +
>  /* Called to perform language-specific options initialization.  */
>  void
>  lhd_init_options (unsigned int decoded_options_count ATTRIBUTE_UNUSED,
> Index: gcc/langhooks.h
> ===================================================================
> --- gcc/langhooks.h     (revision 164991)
> +++ gcc/langhooks.h     (working copy)
> @@ -267,8 +267,12 @@ struct lang_hooks
>      of options.  */
>   unsigned int (*option_lang_mask) (void);
>
> +  /* Initialize variables in an options structure.  */
> +  void (*init_options_struct) (struct gcc_options *opts);
> +
>   /* After the initialize_diagnostics hook is called, do any simple
> -     initialization needed before any calls to handle_option.  */
> +     initialization needed before any calls to handle_option, other
> +     than that done by the init_options_struct hook.  */
>   void (*init_options) (unsigned int decoded_options_count,
>                        struct cl_decoded_option *decoded_options);
>
> Index: gcc/lto/lto-lang.c
> ===================================================================
> --- gcc/lto/lto-lang.c  (revision 164991)
> +++ gcc/lto/lto-lang.c  (working copy)
> @@ -639,14 +639,13 @@ lto_complain_wrong_lang_p (const struct
>  }
>
>  static void
> -lto_init_options (unsigned int decoded_options_count ATTRIBUTE_UNUSED,
> -                 struct cl_decoded_option *decoded_options ATTRIBUTE_UNUSED)
> +lto_init_options_struct (struct gcc_options *opts)
>  {
>   /* By default, C99-like requirements for complex multiply and divide.
>      ???  Until the complex method is encoded in the IL this is the only
>      safe choice.  This will pessimize Fortran code with LTO unless
>      people specify a complex method manually or use -ffast-math.  */
> -  flag_complex_method = 2;
> +  opts->x_flag_complex_method = 2;
>  }
>
>  /* Handle command-line option SCODE.  If the option takes an argument, it is
> @@ -1162,8 +1161,8 @@ static void lto_init_ts (void)
>  #define LANG_HOOKS_OPTION_LANG_MASK lto_option_lang_mask
>  #undef LANG_HOOKS_COMPLAIN_WRONG_LANG_P
>  #define LANG_HOOKS_COMPLAIN_WRONG_LANG_P lto_complain_wrong_lang_p
> -#undef LANG_HOOKS_INIT_OPTIONS
> -#define LANG_HOOKS_INIT_OPTIONS lto_init_options
> +#undef LANG_HOOKS_INIT_OPTIONS_STRUCT
> +#define LANG_HOOKS_INIT_OPTIONS_STRUCT lto_init_options_struct
>  #undef LANG_HOOKS_HANDLE_OPTION
>  #define LANG_HOOKS_HANDLE_OPTION lto_handle_option
>  #undef LANG_HOOKS_POST_OPTIONS
> Index: gcc/opth-gen.awk
> ===================================================================
> --- gcc/opth-gen.awk    (revision 164991)
> +++ gcc/opth-gen.awk    (working copy)
> @@ -73,6 +73,7 @@ print ""
>
>  have_save = 0;
>
> +print "#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) && !defined(IN_RTS)"
>  print "#ifndef GENERATOR_FILE"
>  print "struct gcc_options\n{"
>  print "#endif"
> @@ -125,9 +126,11 @@ for (i = 0; i < n_opts; i++) {
>  print "#ifndef GENERATOR_FILE"
>  print "};"
>  print "extern struct gcc_options global_options;"
> +print "extern const struct gcc_options global_options_init;"
>  print "extern struct gcc_options global_options_set;"
>  print "#define target_flags_explicit global_options_set.x_target_flags"
>  print "#endif"
> +print "#endif"
>  print ""
>
>  # All of the optimization switches gathered together so they can be saved and restored.
> Index: gcc/common.opt
> ===================================================================
> --- gcc/common.opt      (revision 164991)
> +++ gcc/common.opt      (working copy)
> @@ -32,6 +32,29 @@ int optimize
>  Variable
>  int optimize_size
>
> +; 0 means straightforward implementation of complex divide acceptable.
> +; 1 means wide ranges of inputs must work for complex divide.
> +; 2 means C99-like requirements for complex multiply and divide.
> +Variable
> +int flag_complex_method = 1
> +
> +; Nonzero if subexpressions must be evaluated from left-to-right.
> +Variable
> +int flag_evaluation_order = 0
> +
> +; Set the default region and algorithm for the integrated register
> +; allocator.
> +
> +Variable
> +enum ira_algorithm flag_ira_algorithm = IRA_ALGORITHM_CB
> +
> +Variable
> +enum ira_region flag_ira_region = IRA_REGION_MIXED
> +
> +; Language specific warning pass for unused results.
> +Variable
> +bool flag_warn_unused_result = false
> +
>  ###
>  Driver
>
> Index: gcc/Makefile.in
> ===================================================================
> --- gcc/Makefile.in     (revision 164991)
> +++ gcc/Makefile.in     (working copy)
> @@ -823,7 +823,7 @@ CONFIG_H  = config.h  $(host_xm_file_lis
>  TCONFIG_H = tconfig.h $(xm_file_list)
>  TM_P_H    = tm_p.h    $(tm_p_file_list)
>  GTM_H     = tm.h      $(tm_file_list) insn-constants.h
> -TM_H      = $(GTM_H) insn-flags.h options.h
> +TM_H      = $(GTM_H) insn-flags.h $(FLAGS_H)
>
>  # Variables for version information.
>  BASEVER     := $(srcdir)/BASE-VER  # 4.x.y
> @@ -884,7 +884,7 @@ BUILTINS_DEF = builtins.def sync-builtin
>  TREE_H = tree.h all-tree.def tree.def c-family/c-common.def \
>        $(lang_tree_files) $(MACHMODE_H) tree-check.h $(BUILTINS_DEF) \
>        $(INPUT_H) statistics.h $(VEC_H) treestruct.def $(HASHTAB_H) \
> -       double-int.h alias.h $(SYMTAB_H) options.h vecir.h \
> +       double-int.h alias.h $(SYMTAB_H) $(FLAGS_H) vecir.h \
>        $(REAL_H) $(FIXED_VALUE_H)
>  REGSET_H = regset.h $(BITMAP_H) hard-reg-set.h
>  BASIC_BLOCK_H = basic-block.h $(PREDICT_H) $(VEC_H) $(FUNCTION_H) cfghooks.h
> @@ -2821,7 +2821,7 @@ opts.o : opts.c opts.h options.h $(TOPLE
>    output.h $(DIAGNOSTIC_H) $(TM_P_H) $(INSN_ATTR_H) intl.h $(TARGET_H) \
>    $(FLAGS_H) $(PARAMS_H) $(TREE_PASS_H) $(DBGCNT_H) debug.h \
>    $(PLUGIN_H) $(EXCEPT_H) $(LTO_STREAMER_H) opts-diagnostic.h
> -opts-common.o : opts-common.c opts.h options.h $(CONFIG_H) $(SYSTEM_H) \
> +opts-common.o : opts-common.c opts.h $(FLAGS_H) $(CONFIG_H) $(SYSTEM_H) \
>    coretypes.h intl.h $(DIAGNOSTIC_H) $(TM_H)
>  targhooks.o : targhooks.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TREE_H) \
>    $(EXPR_H) $(TM_H) $(RTL_H) $(TM_P_H) $(FUNCTION_H) output.h $(TOPLEV_H) $(DIAGNOSTIC_CORE_H) \
> Index: gcc/langhooks-def.h
> ===================================================================
> --- gcc/langhooks-def.h (revision 164991)
> +++ gcc/langhooks-def.h (working copy)
> @@ -65,6 +65,7 @@ extern tree lhd_builtin_function (tree);
>
>  /* Declarations of default tree inlining hooks.  */
>  extern void lhd_initialize_diagnostics (diagnostic_context *);
> +extern void lhd_init_options_struct (struct gcc_options *);
>  extern void lhd_init_options (unsigned int,
>                              struct cl_decoded_option *);
>  extern bool lhd_complain_wrong_lang_p (const struct cl_option *);
> @@ -87,6 +88,7 @@ extern void lhd_omp_firstprivatize_type_
>  #define LANG_HOOKS_FINISH              lhd_do_nothing
>  #define LANG_HOOKS_PARSE_FILE          lhd_do_nothing_i
>  #define LANG_HOOKS_OPTION_LANG_MASK    hook_uint_void_0
> +#define LANG_HOOKS_INIT_OPTIONS_STRUCT lhd_init_options_struct
>  #define LANG_HOOKS_INIT_OPTIONS                lhd_init_options
>  #define LANG_HOOKS_INITIALIZE_DIAGNOSTICS lhd_initialize_diagnostics
>  #define LANG_HOOKS_COMPLAIN_WRONG_LANG_P lhd_complain_wrong_lang_p
> @@ -262,6 +264,7 @@ extern void lhd_end_section (void);
>   LANG_HOOKS_FREE_LANG_DATA, \
>   LANG_HOOKS_TREE_SIZE, \
>   LANG_HOOKS_OPTION_LANG_MASK, \
> +  LANG_HOOKS_INIT_OPTIONS_STRUCT, \
>   LANG_HOOKS_INIT_OPTIONS, \
>   LANG_HOOKS_INITIALIZE_DIAGNOSTICS, \
>   LANG_HOOKS_COMPLAIN_WRONG_LANG_P, \
>
> --
> Joseph S. Myers
> joseph@codesourcery.com
>
Arnaud Charlet - Oct. 8, 2010, 9:25 a.m.
The Ada changes are OK
Tobias Burnus - Oct. 8, 2010, 9:27 a.m.
On 10/08/2010 11:23 AM, Richard Guenther wrote:
> On Thu, Oct 7, 2010 at 5:21 PM, Joseph S. Myers<joseph@codesourcery.com>  wrote:
>> * The static initializers for options now go in a separate
>>   global_options_init which is copied to global_options in the
>>   initialization step, reflecting that there will be more than one
>>   gcc_options structure to initialize in future.
>>
>> * There are explicit init_options_once, init_options_struct and
>>   lang_hooks.init_options_struct steps, each of which has some parts
>>   moved out from the previous functions.  Thus various parts of
>>   initialization are reordered, but this is not intended to change the
>>   behavior of the compiler.
>>
>> * The Fortran gfc_init_options hook set flag_short_enums to a
>>   target-dependent default.  This was too early to set it, since the
>>   target-dependent default may depend on command-line options; the
>>   default is set in language-independent code in process_options,
>>   which should suffice for all languages, so the front-end setting is
>>   removed.  (I think that front-end setting was a relic of when
>>   Fortran used its own short-enums flag instead of the
>>   language-independent one.)
>>
>> Bootstrapped with no regressions on x86_64-unknown-linux-gnu.  OK to
>> commit?
> Ok for the ME pieces.

The Fortran part is also OK.

Tobias

>> fortran:
>> 2010-10-07  Joseph Myers<joseph@codesourcery.com>
>>
>>         * f95-lang.c (LANG_HOOKS_INIT_OPTIONS_STRUCT): Define.
>>         * gfortran.h (gfc_init_options_struct): Declare.
>>         * options.c (gfc_init_options_struct): New.  Split out from
>>         gfc_init_options.
Richard Sandiford - Oct. 9, 2010, 10:13 a.m.
"Joseph S. Myers" <joseph@codesourcery.com> writes:
> 	* configure.ac (tm_include_list): Include flags.h instead of
> 	options.h.

Not sure if you're already aware, but this change breaks the build
for MIPS.  flags.h includes some state that is in the target_flag_state
structure, but SWITCHABLE_TARGET is no longer defined appropriately.
I suppose target_flag_state now belongs in a different header file.

Richard
Joseph S. Myers - Oct. 9, 2010, 12:10 p.m.
On Sat, 9 Oct 2010, Richard Sandiford wrote:

> "Joseph S. Myers" <joseph@codesourcery.com> writes:
> > 	* configure.ac (tm_include_list): Include flags.h instead of
> > 	options.h.
> 
> Not sure if you're already aware, but this change breaks the build
> for MIPS.  flags.h includes some state that is in the target_flag_state
> structure, but SWITCHABLE_TARGET is no longer defined appropriately.
> I suppose target_flag_state now belongs in a different header file.

My inclination would be that a fix should put the types from flags.h (that 
are the reason that it needs to be included in options.h) in a separate 
flag-types.h header, included by both flags.h and options.h, so that 
options.h can be included on its own again, and then go back to having 
options.h used by tm.h (revert those configure and TM_H changes).  The 
general idea is inspired by 
<http://gcc.gnu.org/ml/gcc-patches/2010-10/msg00754.html>, but I don't 
think there should be much interaction between that fix and the 
HeaderInclude changes in that patch.
Richard Sandiford - Oct. 10, 2010, 9:10 a.m.
"Joseph S. Myers" <joseph@codesourcery.com> writes:
> On Sat, 9 Oct 2010, Richard Sandiford wrote:
>
>> "Joseph S. Myers" <joseph@codesourcery.com> writes:
>> > 	* configure.ac (tm_include_list): Include flags.h instead of
>> > 	options.h.
>> 
>> Not sure if you're already aware, but this change breaks the build
>> for MIPS.  flags.h includes some state that is in the target_flag_state
>> structure, but SWITCHABLE_TARGET is no longer defined appropriately.
>> I suppose target_flag_state now belongs in a different header file.
>
> My inclination would be that a fix should put the types from flags.h (that 
> are the reason that it needs to be included in options.h) in a separate 
> flag-types.h header, included by both flags.h and options.h, so that 
> options.h can be included on its own again, and then go back to having 
> options.h used by tm.h (revert those configure and TM_H changes).  The 
> general idea is inspired by 
> <http://gcc.gnu.org/ml/gcc-patches/2010-10/msg00754.html>, but I don't 
> think there should be much interaction between that fix and the 
> HeaderInclude changes in that patch.

Thanks.  That sounds like a good approach to me FWIW.

Richard

Patch

Index: gcc/flags.h
===================================================================
--- gcc/flags.h	(revision 164991)
+++ gcc/flags.h	(working copy)
@@ -23,7 +23,8 @@  along with GCC; see the file COPYING3.  
 #define GCC_FLAGS_H
 
 #include "coretypes.h"
-#include "options.h"
+
+#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) && !defined(IN_RTS)
 
 enum debug_info_type
 {
@@ -147,12 +148,6 @@  extern int flag_print_asm_name;
 
 /* Now the symbols that are set with `-f' switches.  */
 
-/* 0 means straightforward implementation of complex divide acceptable.
-   1 means wide ranges of inputs must work for complex divide.
-   2 means C99-like requirements for complex multiply and divide.  */
-
-extern int flag_complex_method;
-
 /* Nonzero if we are only using compiler to check syntax errors.  */
 
 extern int rtl_dump_and_exit;
@@ -201,8 +196,6 @@  enum ira_algorithm
   IRA_ALGORITHM_PRIORITY
 };
 
-extern enum ira_algorithm flag_ira_algorithm;
-
 /* The regions used for the integrated register allocator (IRA).  */
 enum ira_region
 {
@@ -211,8 +204,6 @@  enum ira_region
   IRA_REGION_MIXED
 };
 
-extern enum ira_region flag_ira_region;
-
 /* The options for excess precision.  */
 enum excess_precision
 {
@@ -269,12 +260,6 @@  extern struct target_flag_state *this_ta
 #define flag_excess_precision \
   (this_target_flag_state->x_flag_excess_precision)
 
-/* Nonzero if subexpressions must be evaluated from left-to-right.  */
-extern int flag_evaluation_order;
-
-/* Whether to run the warn_unused_result attribute pass.  */
-extern bool flag_warn_unused_result;
-
 /* Nonzero if we dump in VCG format, not plain text.  */
 extern int dump_for_graph;
 
@@ -369,4 +354,10 @@  enum warn_strict_overflow_code
 /* Whether to emit an overflow warning whose code is C.  */
 #define issue_strict_overflow_warning(c) (warn_strict_overflow >= (int) (c))
 
+#endif
+
+/* This is included last because options may use types declared
+   above.  */
+#include "options.h"
+
 #endif /* ! GCC_FLAGS_H */
Index: gcc/opts-common.c
===================================================================
--- gcc/opts-common.c	(revision 164991)
+++ gcc/opts-common.c	(working copy)
@@ -22,7 +22,7 @@  along with GCC; see the file COPYING3.  
 #include "intl.h"
 #include "coretypes.h"
 #include "opts.h"
-#include "options.h"
+#include "flags.h"
 #include "diagnostic.h"
 #include "tm.h" /* For SWITCH_TAKES_ARG, WORD_SWITCH_TAKES_ARG and
 		   TARGET_OPTION_TRANSLATE_TABLE.  */
Index: gcc/c-family/c-opts.c
===================================================================
--- gcc/c-family/c-opts.c	(revision 164991)
+++ gcc/c-family/c-opts.c	(working copy)
@@ -273,6 +273,19 @@  c_common_complain_wrong_lang_p (const st
   return true;
 }
 
+/* Initialize options structure OPTS.  */
+void
+c_common_init_options_struct (struct gcc_options *opts)
+{
+  opts->x_flag_exceptions = c_dialect_cxx ();
+  opts->x_warn_pointer_arith = c_dialect_cxx ();
+  opts->x_warn_write_strings = c_dialect_cxx ();
+  opts->x_flag_warn_unused_result = true;
+
+  /* By default, C99-like requirements for complex multiply and divide.  */
+  opts->x_flag_complex_method = 2;
+}
+
 /* Common initialization before calling option handlers.  */
 void
 c_common_init_options (unsigned int decoded_options_count,
@@ -294,14 +307,6 @@  c_common_init_options (unsigned int deco
      before passing on command-line options to cpplib.  */
   cpp_opts->warn_dollars = 0;
 
-  flag_exceptions = c_dialect_cxx ();
-  warn_pointer_arith = c_dialect_cxx ();
-  warn_write_strings = c_dialect_cxx();
-  flag_warn_unused_result = true;
-
-  /* By default, C99-like requirements for complex multiply and divide.  */
-  flag_complex_method = 2;
-
   deferred_opts = XNEWVEC (struct deferred_opt, decoded_options_count);
 
   if (c_language == clk_c)
Index: gcc/c-family/c-common.c
===================================================================
--- gcc/c-family/c-common.c	(revision 164991)
+++ gcc/c-family/c-common.c	(working copy)
@@ -7802,8 +7802,11 @@  parse_optimize_options (tree args, bool 
   saved_flag_strict_aliasing = flag_strict_aliasing;
 
   /* Now parse the options.  */
-  decode_options (opt_argc, opt_argv, &decoded_options,
-		  &decoded_options_count);
+  decode_cmdline_options_to_array_default_mask (opt_argc, opt_argv,
+						&decoded_options,
+						&decoded_options_count);
+  decode_options (&global_options, &global_options_set,
+		  decoded_options, decoded_options_count);
 
   targetm.override_options_after_change();
 
Index: gcc/c-family/c-common.h
===================================================================
--- gcc/c-family/c-common.h	(revision 164991)
+++ gcc/c-family/c-common.h	(working copy)
@@ -743,6 +743,7 @@  extern tree build_va_arg (location_t, tr
 extern unsigned int c_common_option_lang_mask (void);
 extern void c_common_initialize_diagnostics (diagnostic_context *);
 extern bool c_common_complain_wrong_lang_p (const struct cl_option *);
+extern void c_common_init_options_struct (struct gcc_options *);
 extern void c_common_init_options (unsigned int, struct cl_decoded_option *);
 extern bool c_common_post_options (const char **);
 extern bool c_common_init (void);
Index: gcc/java/lang.c
===================================================================
--- gcc/java/lang.c	(revision 164991)
+++ gcc/java/lang.c	(working copy)
@@ -48,6 +48,7 @@  The Free Software Foundation is independ
 static bool java_init (void);
 static void java_finish (void);
 static unsigned int java_option_lang_mask (void);
+static void java_init_options_struct (struct gcc_options *);
 static void java_init_options (unsigned int, struct cl_decoded_option *);
 static bool java_post_options (const char **);
 
@@ -126,6 +127,8 @@  struct GTY(()) language_function {
 #define LANG_HOOKS_FINISH java_finish
 #undef LANG_HOOKS_OPTION_LANG_MASK
 #define LANG_HOOKS_OPTION_LANG_MASK java_option_lang_mask
+#undef LANG_HOOKS_INIT_OPTIONS_STRUCT
+#define LANG_HOOKS_INIT_OPTIONS_STRUCT java_init_options_struct
 #undef LANG_HOOKS_INIT_OPTIONS
 #define LANG_HOOKS_INIT_OPTIONS java_init_options
 #undef LANG_HOOKS_HANDLE_OPTION
@@ -535,23 +538,29 @@  java_option_lang_mask (void)
   return CL_Java;
 }
 
+/* Initialize options structure OPTS.  */
+
 static void
-java_init_options (unsigned int decoded_options_count ATTRIBUTE_UNUSED,
-		   struct cl_decoded_option *decoded_options ATTRIBUTE_UNUSED)
+java_init_options_struct (struct gcc_options *opts)
 {
-  flag_bounds_check = 1;
-  flag_exceptions = 1;
-  flag_non_call_exceptions = 1;
+  opts->x_flag_bounds_check = 1;
+  opts->x_flag_exceptions = 1;
+  opts->x_flag_non_call_exceptions = 1;
 
   /* In Java floating point operations never trap.  */
-  flag_trapping_math = 0;
+  opts->x_flag_trapping_math = 0;
 
   /* In Java arithmetic overflow always wraps around.  */
-  flag_wrapv = 1;
+  opts->x_flag_wrapv = 1;
 
   /* Java requires left-to-right evaluation of subexpressions.  */
-  flag_evaluation_order = 1;
+  opts->x_flag_evaluation_order = 1;
+}
 
+static void
+java_init_options (unsigned int decoded_options_count ATTRIBUTE_UNUSED,
+		   struct cl_decoded_option *decoded_options ATTRIBUTE_UNUSED)
+{
   jcf_path_init ();
 }
 
Index: gcc/tree.h
===================================================================
--- gcc/tree.h	(revision 164991)
+++ gcc/tree.h	(working copy)
@@ -32,7 +32,7 @@  along with GCC; see the file COPYING3.  
 #include "real.h"
 #include "fixed-value.h"
 #include "alias.h"
-#include "options.h"
+#include "flags.h"
 
 /* Codes of tree nodes */
 
Index: gcc/configure
===================================================================
--- gcc/configure	(revision 164991)
+++ gcc/configure	(working copy)
@@ -10843,7 +10843,7 @@  tmake_file="${tmake_file_}"
 out_object_file=`basename $out_file .c`.o
 
 tm_file_list="options.h"
-tm_include_list="options.h insn-constants.h"
+tm_include_list="flags.h insn-constants.h"
 for f in $tm_file; do
   case $f in
     ./* )
Index: gcc/gcc.c
===================================================================
--- gcc/gcc.c	(revision 164991)
+++ gcc/gcc.c	(working copy)
@@ -6135,6 +6135,8 @@  main (int argc, char **argv)
   if (argv != old_argv)
     at_file_supplied = true;
 
+  global_options = global_options_init;
+
   decode_cmdline_options_to_array (argc, CONST_CAST2 (const char **, char **,
 						      argv),
 				   CL_DRIVER,
Index: gcc/toplev.c
===================================================================
--- gcc/toplev.c	(revision 164991)
+++ gcc/toplev.c	(working copy)
@@ -198,12 +198,6 @@  unsigned local_tick;
 
 /* -f flags.  */
 
-/* 0 means straightforward implementation of complex divide acceptable.
-   1 means wide ranges of inputs must work for complex divide.
-   2 means C99-like requirements for complex multiply and divide.  */
-
-int flag_complex_method = 1;
-
 /* Nonzero means we should be saving declaration info into a .X file.  */
 
 int flag_gen_aux_info = 0;
@@ -229,12 +223,6 @@  int flag_next_runtime = 0;
 
 enum tls_model flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
 
-/* Set the default region and algorithm for the integrated register
-   allocator.  */
-
-enum ira_algorithm flag_ira_algorithm = IRA_ALGORITHM_CB;
-enum ira_region flag_ira_region = IRA_REGION_MIXED;
-
 /* Set the default for excess precision.  */
 
 enum excess_precision flag_excess_precision_cmdline = EXCESS_PRECISION_DEFAULT;
@@ -293,9 +281,6 @@  typedef struct
 }
 lang_independent_options;
 
-/* Nonzero if subexpressions must be evaluated from left-to-right.  */
-int flag_evaluation_order = 0;
-
 /* The user symbol prefix after having resolved same.  */
 const char *user_label_prefix;
 
@@ -1661,8 +1646,10 @@  general_init (const char *argv0)
   /* Set a default printer.  Language specific initializations will
      override it later.  */
   pp_format_decoder (global_dc->printer) = &default_tree_printer;
-  global_dc->show_option_requested = flag_diagnostics_show_option;
-  global_dc->show_column = flag_show_column;
+  global_dc->show_option_requested
+    = global_options_init.x_flag_diagnostics_show_option;
+  global_dc->show_column
+    = global_options_init.x_flag_show_column;
   global_dc->internal_error = plugins_internal_error_function;
   global_dc->option_enabled = option_enabled;
   global_dc->option_state = &global_options;
@@ -2395,10 +2382,29 @@  toplev_main (int argc, char **argv)
   /* Initialization of GCC's environment, and diagnostics.  */
   general_init (argv[0]);
 
+  /* One-off initialization of options that does not need to be
+     repeated when options are added for particular functions.  */
+  init_options_once ();
+
+  /* Initialize global options structures; this must be repeated for
+     each structure used for parsing options.  */
+  init_options_struct (&global_options, &global_options_set);
+  lang_hooks.init_options_struct (&global_options);
+
+  /* Convert the options to an array.  */
+  decode_cmdline_options_to_array_default_mask (argc,
+						CONST_CAST2 (const char **,
+							     char **, argv),
+						&save_decoded_options,
+						&save_decoded_options_count);
+
+  /* Perform language-specific options initialization.  */
+  lang_hooks.init_options (save_decoded_options_count, save_decoded_options);
+
   /* Parse the options and do minimal processing; basically just
      enough to default flags appropriately.  */
-  decode_options (argc, CONST_CAST2 (const char **, char **, argv),
-		  &save_decoded_options, &save_decoded_options_count);
+  decode_options (&global_options, &global_options_set,
+		  save_decoded_options, save_decoded_options_count);
 
   init_local_tick ();
 
Index: gcc/cp/cp-objcp-common.h
===================================================================
--- gcc/cp/cp-objcp-common.h	(revision 164991)
+++ gcc/cp/cp-objcp-common.h	(working copy)
@@ -45,6 +45,8 @@  extern bool cp_function_decl_explicit_p 
 #define LANG_HOOKS_OPTION_LANG_MASK c_common_option_lang_mask
 #undef LANG_HOOKS_COMPLAIN_WRONG_LANG_P
 #define LANG_HOOKS_COMPLAIN_WRONG_LANG_P c_common_complain_wrong_lang_p
+#undef LANG_HOOKS_INIT_OPTIONS_STRUCT
+#define LANG_HOOKS_INIT_OPTIONS_STRUCT c_common_init_options_struct
 #undef LANG_HOOKS_INIT_OPTIONS
 #define LANG_HOOKS_INIT_OPTIONS c_common_init_options
 #undef LANG_HOOKS_INITIALIZE_DIAGNOSTICS
Index: gcc/c-objc-common.h
===================================================================
--- gcc/c-objc-common.h	(revision 164991)
+++ gcc/c-objc-common.h	(working copy)
@@ -33,6 +33,8 @@  along with GCC; see the file COPYING3.  
 #define LANG_HOOKS_OPTION_LANG_MASK c_common_option_lang_mask
 #undef LANG_HOOKS_COMPLAIN_WRONG_LANG_P
 #define LANG_HOOKS_COMPLAIN_WRONG_LANG_P c_common_complain_wrong_lang_p
+#undef LANG_HOOKS_INIT_OPTIONS_STRUCT
+#define LANG_HOOKS_INIT_OPTIONS_STRUCT c_common_init_options_struct
 #undef LANG_HOOKS_INIT_OPTIONS
 #define LANG_HOOKS_INIT_OPTIONS c_common_init_options
 #undef LANG_HOOKS_INITIALIZE_DIAGNOSTICS
Index: gcc/opts.c
===================================================================
--- gcc/opts.c	(revision 164991)
+++ gcc/opts.c	(working copy)
@@ -353,9 +353,6 @@  DEF_VEC_ALLOC_P(const_char_p,heap);
 
 static VEC(const_char_p,heap) *ignored_options;
 
-/* Language specific warning pass for unused results.  */
-bool flag_warn_unused_result = false;
-
 /* Input file names.  */
 const char **in_fnames;
 unsigned num_in_fnames;
@@ -613,11 +610,14 @@  flag_instrument_functions_exclude_p (tre
 }
 
 
-/* Handle the vector of command line options.  LANG_MASK
-   contains has a single bit set representing the current
-   language.  HANDLERS describes what functions to call for the options.  */
+/* Handle the vector of command line options, storing the results of
+   processing DECODED_OPTIONS and DECODED_OPTIONS_COUNT in OPTS and
+   OPTS_SET.  LANG_MASK contains has a single bit set representing the
+   current language.  HANDLERS describes what functions to call for
+   the options.  */
 static void
-read_cmdline_options (struct cl_decoded_option *decoded_options,
+read_cmdline_options (struct gcc_options *opts, struct gcc_options *opts_set,
+		      struct cl_decoded_option *decoded_options,
 		      unsigned int decoded_options_count,
 		      unsigned int lang_mask,
 		      const struct cl_option_handlers *handlers)
@@ -628,6 +628,11 @@  read_cmdline_options (struct cl_decoded_
     {
       if (decoded_options[i].opt_index == OPT_SPECIAL_input_file)
 	{
+	  /* Input files should only ever appear on the main command
+	     line.  */
+	  gcc_assert (opts == &global_options);
+	  gcc_assert (opts_set == &global_options_set);
+
 	  if (main_input_filename == NULL)
 	    {
 	      main_input_filename = decoded_options[i].arg;
@@ -638,76 +643,104 @@  read_cmdline_options (struct cl_decoded_
 	  continue;
 	}
 
-      read_cmdline_option (&global_options, &global_options_set,
+      read_cmdline_option (opts, opts_set,
 			   decoded_options + i, lang_mask, handlers,
 			   global_dc);
     }
 }
 
-/* Parse command line options and set default flag values.  Do minimal
-   options processing.  The decoded options are placed in *DECODED_OPTIONS
-   and *DECODED_OPTIONS_COUNT.  */
+/* Language mask determined at initialization.  */
+static unsigned int initial_lang_mask;
+
+/* Initial values of parameters we reset.  */
+static int initial_min_crossjump_insns;
+static int initial_max_fields_for_field_sensitive;
+static int initial_loop_invariant_max_bbs_in_loop;
+
+/* Initialize global options-related settings at start-up.  */
+
 void
-decode_options (unsigned int argc, const char **argv,
-		struct cl_decoded_option **decoded_options,
-		unsigned int *decoded_options_count)
+init_options_once (void)
 {
-  static bool first_time_p = true;
-  static int initial_min_crossjump_insns;
-  static int initial_max_fields_for_field_sensitive;
-  static int initial_loop_invariant_max_bbs_in_loop;
-  static unsigned int initial_lang_mask;
-  struct cl_option_handlers handlers;
+  /* Perform language-specific options initialization.  */
+  initial_lang_mask = lang_hooks.option_lang_mask ();
 
-  unsigned int i, lang_mask;
-  int opt1;
-  int opt2;
-  int opt3;
-  int opt1_max;
-  int ofast = 0;
-  enum unwind_info_type ui_except;
+  lang_hooks.initialize_diagnostics (global_dc);
 
-  if (first_time_p)
-    {
-      /* Perform language-specific options initialization.  */
-      initial_lang_mask = lang_mask = lang_hooks.option_lang_mask ();
+  /* Save initial values of parameters we reset.  */
+  initial_min_crossjump_insns
+    = compiler_params[PARAM_MIN_CROSSJUMP_INSNS].value;
+  initial_max_fields_for_field_sensitive
+    = compiler_params[PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE].value;
+  initial_loop_invariant_max_bbs_in_loop
+    = compiler_params[PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP].value;
+}
 
-      lang_hooks.initialize_diagnostics (global_dc);
+/* Initialize OPTS and OPTS_SET before using them in parsing options.  */
 
-      /* Save initial values of parameters we reset.  */
-      initial_min_crossjump_insns
-	= compiler_params[PARAM_MIN_CROSSJUMP_INSNS].value;
-      initial_max_fields_for_field_sensitive
-	= compiler_params[PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE].value;
-      initial_loop_invariant_max_bbs_in_loop
-	= compiler_params[PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP].value;
-    }
-  else
-    lang_mask = initial_lang_mask;
+void
+init_options_struct (struct gcc_options *opts, struct gcc_options *opts_set)
+{
+  *opts = global_options_init;
+  memset (opts_set, 0, sizeof (*opts_set));
+
+  /* Use priority coloring if cover classes is not defined for the
+     target.  */
+  if (targetm.ira_cover_classes == NULL)
+    opts->x_flag_ira_algorithm = IRA_ALGORITHM_PRIORITY;
+
+  /* Initialize whether `char' is signed.  */
+  opts->x_flag_signed_char = DEFAULT_SIGNED_CHAR;
+  /* Set this to a special "uninitialized" value.  The actual default
+     is set after target options have been processed.  */
+  opts->x_flag_short_enums = 2;
 
+  /* Initialize target_flags before targetm.target_option.optimization
+     so the latter can modify it.  */
+  opts->x_target_flags = targetm.default_target_flags;
+
+  /* Some targets have ABI-specified unwind tables.  */
+  opts->x_flag_unwind_tables = targetm.unwind_tables_default;
+}
+
+/* Decode command-line options to an array, like
+   decode_cmdline_options_to_array and with the same arguments but
+   using the default lang_mask.  */
+
+void
+decode_cmdline_options_to_array_default_mask (unsigned int argc,
+					      const char **argv, 
+					      struct cl_decoded_option **decoded_options,
+					      unsigned int *decoded_options_count)
+{
   decode_cmdline_options_to_array (argc, argv,
-				   lang_mask | CL_COMMON | CL_TARGET,
+				   initial_lang_mask | CL_COMMON | CL_TARGET,
 				   decoded_options, decoded_options_count);
-  if (first_time_p)
-    /* Perform language-specific options initialization.  */
-    lang_hooks.init_options (*decoded_options_count, *decoded_options);
+}
 
-  handlers.unknown_option_callback = unknown_option_callback;
-  handlers.wrong_lang_callback = complain_wrong_lang;
-  handlers.post_handling_callback = post_handling_callback;
-  handlers.num_handlers = 3;
-  handlers.handlers[0].handler = lang_handle_option;
-  handlers.handlers[0].mask = lang_mask;
-  handlers.handlers[1].handler = common_handle_option;
-  handlers.handlers[1].mask = CL_COMMON;
-  handlers.handlers[2].handler = target_handle_option;
-  handlers.handlers[2].mask = CL_TARGET;
+/* Default the options in OPTS and OPTS_SET based on the optimization
+   settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT.  */
+static void
+default_options_optimization (struct gcc_options *opts,
+			      struct gcc_options *opts_set,
+			      struct cl_decoded_option *decoded_options,
+			      unsigned int decoded_options_count)
+{
+  unsigned int i;
+  int opt1;
+  int opt2;
+  int opt3;
+  int opt1_max;
+  int ofast = 0;
+
+  gcc_assert (opts == &global_options);
+  gcc_assert (opts_set = &global_options_set);
 
   /* Scan to see what optimization level has been specified.  That will
      determine the default value of many flags.  */
-  for (i = 1; i < *decoded_options_count; i++)
+  for (i = 1; i < decoded_options_count; i++)
     {
-      struct cl_decoded_option *opt = &(*decoded_options)[i];
+      struct cl_decoded_option *opt = &decoded_options[i];
       switch (opt->opt_index)
 	{
 	case OPT_O:
@@ -755,11 +788,6 @@  decode_options (unsigned int argc, const
 	}
     }
 
-  /* Use priority coloring if cover classes is not defined for the
-     target.  */
-  if (targetm.ira_cover_classes == NULL)
-    flag_ira_algorithm = IRA_ALGORITHM_PRIORITY;
-
   /* -O1 optimizations.  */
   opt1 = (optimize >= 1);
   flag_defer_pop = opt1;
@@ -879,38 +907,68 @@  decode_options (unsigned int argc, const
       targetm.handle_ofast ();
     }
 
+  /* Allow default optimizations to be specified on a per-machine basis.  */
+  targetm.target_option.optimization (optimize, optimize_size);
+}
+
+static void finish_options (struct gcc_options *, struct gcc_options *);
+
+/* Parse command line options and set default flag values.  Do minimal
+   options processing.  The decoded options are in *DECODED_OPTIONS
+   and *DECODED_OPTIONS_COUNT.  */
+void
+decode_options (struct gcc_options *opts, struct gcc_options *opts_set,
+		struct cl_decoded_option *decoded_options,
+		unsigned int decoded_options_count)
+{
+  struct cl_option_handlers handlers;
+
+  unsigned int lang_mask;
+
+  lang_mask = initial_lang_mask;
+
+  handlers.unknown_option_callback = unknown_option_callback;
+  handlers.wrong_lang_callback = complain_wrong_lang;
+  handlers.post_handling_callback = post_handling_callback;
+  handlers.num_handlers = 3;
+  handlers.handlers[0].handler = lang_handle_option;
+  handlers.handlers[0].mask = lang_mask;
+  handlers.handlers[1].handler = common_handle_option;
+  handlers.handlers[1].mask = CL_COMMON;
+  handlers.handlers[2].handler = target_handle_option;
+  handlers.handlers[2].mask = CL_TARGET;
+
   /* Enable -Werror=coverage-mismatch by default */
   enable_warning_as_error ("coverage-mismatch", 1, lang_mask, &handlers,
 			   global_dc);
 
-  if (first_time_p)
-    {
-      /* Initialize whether `char' is signed.  */
-      flag_signed_char = DEFAULT_SIGNED_CHAR;
-      /* Set this to a special "uninitialized" value.  The actual default is
-	 set after target options have been processed.  */
-      flag_short_enums = 2;
-
-      /* Initialize target_flags before
-	 targetm.target_option.optimization so the latter can modify
-	 it.  */
-      target_flags = targetm.default_target_flags;
-
-      /* Some targets have ABI-specified unwind tables.  */
-      flag_unwind_tables = targetm.unwind_tables_default;
-    }
+  default_options_optimization (opts, opts_set,
+				decoded_options, decoded_options_count);
 
 #ifdef ENABLE_LTO
   /* Clear any options currently held for LTO.  */
   lto_clear_user_options ();
 #endif
 
-  /* Allow default optimizations to be specified on a per-machine basis.  */
-  targetm.target_option.optimization (optimize, optimize_size);
-
-  read_cmdline_options (*decoded_options, *decoded_options_count, lang_mask,
+  read_cmdline_options (opts, opts_set,
+			decoded_options, decoded_options_count, lang_mask,
 			&handlers);
 
+  finish_options (opts, opts_set);
+}
+
+/* After all options have been read into OPTS and OPTS_SET, finalize
+   settings of those options and diagnose incompatible
+   combinations.  */
+static void
+finish_options (struct gcc_options *opts, struct gcc_options *opts_set)
+{
+  static bool first_time_p = true;
+  enum unwind_info_type ui_except;
+
+  gcc_assert (opts == &global_options);
+  gcc_assert (opts_set = &global_options_set);
+
   if (dump_base_name && ! IS_ABSOLUTE_PATH (dump_base_name))
     {
       /* First try to make DUMP_BASE_NAME relative to the DUMP_DIR_NAME
Index: gcc/opts.h
===================================================================
--- gcc/opts.h	(revision 164991)
+++ gcc/opts.h	(working copy)
@@ -208,9 +208,17 @@  extern void decode_cmdline_options_to_ar
 					     unsigned int lang_mask,
 					     struct cl_decoded_option **decoded_options,
 					     unsigned int *decoded_options_count);
-extern void decode_options (unsigned int argc, const char **argv,
-			    struct cl_decoded_option **decoded_options,
-			    unsigned int *decoded_options_count);
+extern void init_options_once (void);
+extern void init_options_struct (struct gcc_options *opts,
+				 struct gcc_options *opts_set);
+extern void decode_cmdline_options_to_array_default_mask (unsigned int argc,
+							  const char **argv, 
+							  struct cl_decoded_option **decoded_options,
+							  unsigned int *decoded_options_count);
+extern void decode_options (struct gcc_options *opts,
+			    struct gcc_options *opts_set,
+			    struct cl_decoded_option *decoded_options,
+			    unsigned int decoded_options_count);
 extern int option_enabled (int opt_idx, void *opts);
 extern bool get_option_state (struct gcc_options *, int,
 			      struct cl_option_state *);
Index: gcc/optc-gen.awk
===================================================================
--- gcc/optc-gen.awk	(revision 164991)
+++ gcc/optc-gen.awk	(working copy)
@@ -83,7 +83,7 @@  print "#endif /* GCC_DRIVER */"
 print ""
 
 have_save = 0;
-print "struct gcc_options global_options =\n{"
+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]
@@ -138,6 +138,7 @@  for (i = 0; i < n_opts; i++) {
 }
 print "};"
 print ""
+print "struct gcc_options global_options;"
 print "struct gcc_options global_options_set;"
 print ""
 
Index: gcc/ada/gcc-interface/misc.c
===================================================================
--- gcc/ada/gcc-interface/misc.c	(revision 164991)
+++ gcc/ada/gcc-interface/misc.c	(working copy)
@@ -62,6 +62,7 @@ 
 
 static bool gnat_init			(void);
 static unsigned int gnat_option_lang_mask (void);
+static void gnat_init_options_struct	(struct gcc_options *);
 static void gnat_init_options		(unsigned int,
 					 struct cl_decoded_option *);
 static bool gnat_handle_option		(size_t, const char *, int, int,
@@ -91,6 +92,8 @@  static tree gnat_eh_personality		(void);
 #define LANG_HOOKS_INIT			gnat_init
 #undef  LANG_HOOKS_OPTION_LANG_MASK
 #define LANG_HOOKS_OPTION_LANG_MASK	gnat_option_lang_mask
+#undef  LANG_HOOKS_INIT_OPTIONS_STRUCT
+#define LANG_HOOKS_INIT_OPTIONS_STRUCT	gnat_init_options_struct
 #undef  LANG_HOOKS_INIT_OPTIONS
 #define LANG_HOOKS_INIT_OPTIONS		gnat_init_options
 #undef  LANG_HOOKS_HANDLE_OPTION
@@ -256,6 +259,15 @@  gnat_option_lang_mask (void)
   return CL_Ada;
 }
 
+/* Initialize options structure OPTS.  */
+
+static void
+gnat_init_options_struct (struct gcc_options *opts)
+{
+  /* Uninitialized really means uninitialized in Ada.  */
+  opts->x_flag_zero_initialized_in_bss = 0;
+}
+
 /* Initialize for option processing.  */
 
 static void
@@ -298,9 +310,6 @@  gnat_init_options (unsigned int decoded_
   gnat_argv = (char **) xmalloc (sizeof (save_argv[0]));
   gnat_argv[0] = xstrdup (save_argv[0]);     /* name of the command */
   gnat_argc = 1;
-
-  /* Uninitialized really means uninitialized in Ada.  */
-  flag_zero_initialized_in_bss = 0;
 }
 
 /* Ada code requires variables for these settings rather than elements
Index: gcc/fortran/gfortran.h
===================================================================
--- gcc/fortran/gfortran.h	(revision 164991)
+++ gcc/fortran/gfortran.h	(working copy)
@@ -2398,6 +2398,7 @@  int get_c_kind (const char *, CInteropKi
 
 /* options.c */
 unsigned int gfc_option_lang_mask (void);
+void gfc_init_options_struct (struct gcc_options *);
 void gfc_init_options (unsigned int,
 		       struct cl_decoded_option *);
 bool gfc_handle_option (size_t, const char *, int, int,
Index: gcc/fortran/f95-lang.c
===================================================================
--- gcc/fortran/f95-lang.c	(revision 164991)
+++ gcc/fortran/f95-lang.c	(working copy)
@@ -102,6 +102,7 @@  static void gfc_init_ts (void);
 #undef LANG_HOOKS_FINISH
 #undef LANG_HOOKS_WRITE_GLOBALS
 #undef LANG_HOOKS_OPTION_LANG_MASK
+#undef LANG_HOOKS_INIT_OPTIONS_STRUCT
 #undef LANG_HOOKS_INIT_OPTIONS
 #undef LANG_HOOKS_HANDLE_OPTION
 #undef LANG_HOOKS_POST_OPTIONS
@@ -132,6 +133,7 @@  static void gfc_init_ts (void);
 #define LANG_HOOKS_FINISH               gfc_finish
 #define LANG_HOOKS_WRITE_GLOBALS	gfc_write_global_declarations
 #define LANG_HOOKS_OPTION_LANG_MASK	gfc_option_lang_mask
+#define LANG_HOOKS_INIT_OPTIONS_STRUCT  gfc_init_options_struct
 #define LANG_HOOKS_INIT_OPTIONS         gfc_init_options
 #define LANG_HOOKS_HANDLE_OPTION        gfc_handle_option
 #define LANG_HOOKS_POST_OPTIONS		gfc_post_options
Index: gcc/fortran/options.c
===================================================================
--- gcc/fortran/options.c	(revision 164991)
+++ gcc/fortran/options.c	(working copy)
@@ -62,6 +62,14 @@  gfc_option_lang_mask (void)
   return CL_Fortran;
 }
 
+/* Initialize options structure OPTS.  */
+
+void
+gfc_init_options_struct (struct gcc_options *opts)
+{
+  opts->x_flag_errno_math = 0;
+  opts->x_flag_associative_math = -1;
+}
 
 /* Get ready for options handling. Keep in sync with
    libgfortran/runtime/compile_options.c (init_compile_options). */
@@ -145,14 +153,8 @@  gfc_init_options (unsigned int decoded_o
   gfc_option.rtcheck = 0;
   gfc_option.coarray = GFC_FCOARRAY_NONE;
 
-  flag_errno_math = 0;
-  flag_associative_math = -1;
-
   set_default_std_flags ();
 
-  /* -fshort-enums can be default on some targets.  */
-  flag_short_enums = targetm.default_short_enums ();
-
   /* Initialize cpp-related options.  */
   gfc_cpp_init_options (decoded_options_count, decoded_options);
 }
Index: gcc/configure.ac
===================================================================
--- gcc/configure.ac	(revision 164991)
+++ gcc/configure.ac	(working copy)
@@ -1609,7 +1609,7 @@  tmake_file="${tmake_file_}"
 out_object_file=`basename $out_file .c`.o
 
 tm_file_list="options.h"
-tm_include_list="options.h insn-constants.h"
+tm_include_list="flags.h insn-constants.h"
 for f in $tm_file; do
   case $f in
     ./* )
Index: gcc/langhooks.c
===================================================================
--- gcc/langhooks.c	(revision 164991)
+++ gcc/langhooks.c	(working copy)
@@ -337,6 +337,12 @@  lhd_initialize_diagnostics (diagnostic_c
 {
 }
 
+/* Called to perform language-specific options initialization of OPTS.  */
+void
+lhd_init_options_struct (struct gcc_options *opts ATTRIBUTE_UNUSED)
+{
+}
+
 /* Called to perform language-specific options initialization.  */
 void
 lhd_init_options (unsigned int decoded_options_count ATTRIBUTE_UNUSED,
Index: gcc/langhooks.h
===================================================================
--- gcc/langhooks.h	(revision 164991)
+++ gcc/langhooks.h	(working copy)
@@ -267,8 +267,12 @@  struct lang_hooks
      of options.  */
   unsigned int (*option_lang_mask) (void);
 
+  /* Initialize variables in an options structure.  */
+  void (*init_options_struct) (struct gcc_options *opts);
+
   /* After the initialize_diagnostics hook is called, do any simple
-     initialization needed before any calls to handle_option.  */
+     initialization needed before any calls to handle_option, other
+     than that done by the init_options_struct hook.  */
   void (*init_options) (unsigned int decoded_options_count,
 			struct cl_decoded_option *decoded_options);
 
Index: gcc/lto/lto-lang.c
===================================================================
--- gcc/lto/lto-lang.c	(revision 164991)
+++ gcc/lto/lto-lang.c	(working copy)
@@ -639,14 +639,13 @@  lto_complain_wrong_lang_p (const struct 
 }
 
 static void
-lto_init_options (unsigned int decoded_options_count ATTRIBUTE_UNUSED,
-		  struct cl_decoded_option *decoded_options ATTRIBUTE_UNUSED)
+lto_init_options_struct (struct gcc_options *opts)
 {
   /* By default, C99-like requirements for complex multiply and divide.
      ???  Until the complex method is encoded in the IL this is the only
      safe choice.  This will pessimize Fortran code with LTO unless
      people specify a complex method manually or use -ffast-math.  */
-  flag_complex_method = 2;
+  opts->x_flag_complex_method = 2;
 }
 
 /* Handle command-line option SCODE.  If the option takes an argument, it is
@@ -1162,8 +1161,8 @@  static void lto_init_ts (void)
 #define LANG_HOOKS_OPTION_LANG_MASK lto_option_lang_mask
 #undef LANG_HOOKS_COMPLAIN_WRONG_LANG_P
 #define LANG_HOOKS_COMPLAIN_WRONG_LANG_P lto_complain_wrong_lang_p
-#undef LANG_HOOKS_INIT_OPTIONS
-#define LANG_HOOKS_INIT_OPTIONS lto_init_options
+#undef LANG_HOOKS_INIT_OPTIONS_STRUCT
+#define LANG_HOOKS_INIT_OPTIONS_STRUCT lto_init_options_struct
 #undef LANG_HOOKS_HANDLE_OPTION
 #define LANG_HOOKS_HANDLE_OPTION lto_handle_option
 #undef LANG_HOOKS_POST_OPTIONS
Index: gcc/opth-gen.awk
===================================================================
--- gcc/opth-gen.awk	(revision 164991)
+++ gcc/opth-gen.awk	(working copy)
@@ -73,6 +73,7 @@  print ""
 
 have_save = 0;
 
+print "#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) && !defined(IN_RTS)"
 print "#ifndef GENERATOR_FILE"
 print "struct gcc_options\n{"
 print "#endif"
@@ -125,9 +126,11 @@  for (i = 0; i < n_opts; i++) {
 print "#ifndef GENERATOR_FILE"
 print "};"
 print "extern struct gcc_options global_options;"
+print "extern const struct gcc_options global_options_init;"
 print "extern struct gcc_options global_options_set;"
 print "#define target_flags_explicit global_options_set.x_target_flags"
 print "#endif"
+print "#endif"
 print ""
 
 # All of the optimization switches gathered together so they can be saved and restored.
Index: gcc/common.opt
===================================================================
--- gcc/common.opt	(revision 164991)
+++ gcc/common.opt	(working copy)
@@ -32,6 +32,29 @@  int optimize
 Variable
 int optimize_size
 
+; 0 means straightforward implementation of complex divide acceptable.
+; 1 means wide ranges of inputs must work for complex divide.
+; 2 means C99-like requirements for complex multiply and divide.
+Variable
+int flag_complex_method = 1
+
+; Nonzero if subexpressions must be evaluated from left-to-right.
+Variable
+int flag_evaluation_order = 0
+
+; Set the default region and algorithm for the integrated register
+; allocator.
+
+Variable
+enum ira_algorithm flag_ira_algorithm = IRA_ALGORITHM_CB
+
+Variable
+enum ira_region flag_ira_region = IRA_REGION_MIXED
+
+; Language specific warning pass for unused results.
+Variable
+bool flag_warn_unused_result = false
+
 ###
 Driver
 
Index: gcc/Makefile.in
===================================================================
--- gcc/Makefile.in	(revision 164991)
+++ gcc/Makefile.in	(working copy)
@@ -823,7 +823,7 @@  CONFIG_H  = config.h  $(host_xm_file_lis
 TCONFIG_H = tconfig.h $(xm_file_list)
 TM_P_H    = tm_p.h    $(tm_p_file_list)
 GTM_H     = tm.h      $(tm_file_list) insn-constants.h
-TM_H      = $(GTM_H) insn-flags.h options.h
+TM_H      = $(GTM_H) insn-flags.h $(FLAGS_H)
 
 # Variables for version information.
 BASEVER     := $(srcdir)/BASE-VER  # 4.x.y
@@ -884,7 +884,7 @@  BUILTINS_DEF = builtins.def sync-builtin
 TREE_H = tree.h all-tree.def tree.def c-family/c-common.def \
 	$(lang_tree_files) $(MACHMODE_H) tree-check.h $(BUILTINS_DEF) \
 	$(INPUT_H) statistics.h $(VEC_H) treestruct.def $(HASHTAB_H) \
-	double-int.h alias.h $(SYMTAB_H) options.h vecir.h \
+	double-int.h alias.h $(SYMTAB_H) $(FLAGS_H) vecir.h \
 	$(REAL_H) $(FIXED_VALUE_H)
 REGSET_H = regset.h $(BITMAP_H) hard-reg-set.h
 BASIC_BLOCK_H = basic-block.h $(PREDICT_H) $(VEC_H) $(FUNCTION_H) cfghooks.h
@@ -2821,7 +2821,7 @@  opts.o : opts.c opts.h options.h $(TOPLE
    output.h $(DIAGNOSTIC_H) $(TM_P_H) $(INSN_ATTR_H) intl.h $(TARGET_H) \
    $(FLAGS_H) $(PARAMS_H) $(TREE_PASS_H) $(DBGCNT_H) debug.h \
    $(PLUGIN_H) $(EXCEPT_H) $(LTO_STREAMER_H) opts-diagnostic.h
-opts-common.o : opts-common.c opts.h options.h $(CONFIG_H) $(SYSTEM_H) \
+opts-common.o : opts-common.c opts.h $(FLAGS_H) $(CONFIG_H) $(SYSTEM_H) \
    coretypes.h intl.h $(DIAGNOSTIC_H) $(TM_H)
 targhooks.o : targhooks.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TREE_H) \
    $(EXPR_H) $(TM_H) $(RTL_H) $(TM_P_H) $(FUNCTION_H) output.h $(TOPLEV_H) $(DIAGNOSTIC_CORE_H) \
Index: gcc/langhooks-def.h
===================================================================
--- gcc/langhooks-def.h	(revision 164991)
+++ gcc/langhooks-def.h	(working copy)
@@ -65,6 +65,7 @@  extern tree lhd_builtin_function (tree);
 
 /* Declarations of default tree inlining hooks.  */
 extern void lhd_initialize_diagnostics (diagnostic_context *);
+extern void lhd_init_options_struct (struct gcc_options *);
 extern void lhd_init_options (unsigned int,
 			      struct cl_decoded_option *);
 extern bool lhd_complain_wrong_lang_p (const struct cl_option *);
@@ -87,6 +88,7 @@  extern void lhd_omp_firstprivatize_type_
 #define LANG_HOOKS_FINISH		lhd_do_nothing
 #define LANG_HOOKS_PARSE_FILE		lhd_do_nothing_i
 #define LANG_HOOKS_OPTION_LANG_MASK	hook_uint_void_0
+#define LANG_HOOKS_INIT_OPTIONS_STRUCT	lhd_init_options_struct
 #define LANG_HOOKS_INIT_OPTIONS		lhd_init_options
 #define LANG_HOOKS_INITIALIZE_DIAGNOSTICS lhd_initialize_diagnostics
 #define LANG_HOOKS_COMPLAIN_WRONG_LANG_P lhd_complain_wrong_lang_p
@@ -262,6 +264,7 @@  extern void lhd_end_section (void);
   LANG_HOOKS_FREE_LANG_DATA, \
   LANG_HOOKS_TREE_SIZE, \
   LANG_HOOKS_OPTION_LANG_MASK, \
+  LANG_HOOKS_INIT_OPTIONS_STRUCT, \
   LANG_HOOKS_INIT_OPTIONS, \
   LANG_HOOKS_INITIALIZE_DIAGNOSTICS, \
   LANG_HOOKS_COMPLAIN_WRONG_LANG_P, \