/* Command line option handling.
- Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+ Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc.
Contributed by Neil Booth.
struct gcc_options *opts_set,
const struct cl_decoded_option *decoded,
unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
- location_t loc ATTRIBUTE_UNUSED,
+ location_t loc,
const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
diagnostic_context *dc)
{
- gcc_assert (opts == &global_options);
- gcc_assert (opts_set == &global_options_set);
gcc_assert (dc == global_dc);
- gcc_assert (decoded->canonical_option_num_elements <= 2);
gcc_assert (kind == DK_UNSPECIFIED);
- /* Although the location is not passed down to
- targetm.handle_option, do not make assertions about its value;
- options may come from optimize attributes and having the correct
- location in the handler is not generally important. */
- return targetm.handle_option (decoded->opt_index, decoded->arg,
- decoded->value);
+ return targetm.handle_option (opts, opts_set, decoded, loc);
}
/* Add comma-separated strings to a char_p vector. */
opts_set->x_param_values = XCNEWVEC (int, num_params);
init_param_values (opts->x_param_values);
- /* 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
lang_mask, DK_UNSPECIFIED, loc,
handlers, dc);
else if (default_opt->arg == NULL
- && !(option->flags & CL_REJECT_NEGATIVE))
+ && !option->cl_reject_negative)
handle_generated_option (opts, opts_set, default_opt->opt_index,
default_opt->arg, !default_opt->value,
lang_mask, DK_UNSPECIFIED, loc,
{
unsigned int i;
int opt2;
- int ofast = 0;
/* Scan to see what optimization level has been specified. That will
determine the default value of many flags. */
{
opts->x_optimize = 1;
opts->x_optimize_size = 0;
- ofast = 0;
+ opts->x_optimize_fast = 0;
}
else
{
if ((unsigned int) opts->x_optimize > 255)
opts->x_optimize = 255;
opts->x_optimize_size = 0;
- ofast = 0;
+ opts->x_optimize_fast = 0;
}
}
break;
/* Optimizing for size forces optimize to be 2. */
opts->x_optimize = 2;
- ofast = 0;
+ opts->x_optimize_fast = 0;
break;
case OPT_Ofast:
/* -Ofast only adds flags to -O3. */
opts->x_optimize_size = 0;
opts->x_optimize = 3;
- ofast = 1;
+ opts->x_optimize_fast = 1;
break;
default:
maybe_default_options (opts, opts_set, default_options_table,
opts->x_optimize, opts->x_optimize_size,
- ofast, lang_mask, handlers, loc, dc);
+ opts->x_optimize_fast, lang_mask, handlers, loc, dc);
/* -O2 param settings. */
opt2 = (opts->x_optimize >= 2);
maybe_default_options (opts, opts_set,
targetm.target_option.optimization_table,
opts->x_optimize, opts->x_optimize_size,
- ofast, lang_mask, handlers, loc, dc);
+ opts->x_optimize_fast, lang_mask, handlers, loc, dc);
}
/* After all options at LOC have been read into OPTS and OPTS_SET,
if (!opts->x_flag_sel_sched_pipelining)
opts->x_flag_sel_sched_pipelining_outer_loops = 0;
- if (!targetm.ira_cover_classes
- && opts->x_flag_ira_algorithm == IRA_ALGORITHM_CB)
- {
- inform (loc,
- "-fira-algorithm=CB does not work on this architecture");
- opts->x_flag_ira_algorithm = IRA_ALGORITHM_PRIORITY;
- }
-
if (opts->x_flag_conserve_stack)
{
maybe_set_param_value (PARAM_LARGE_STACK_FRAME, 100,
{
/* These passes are not WHOPR compatible yet. */
opts->x_flag_ipa_pta = 0;
- opts->x_flag_ipa_struct_reorg = 0;
}
if (opts->x_flag_lto)
opts->x_flag_split_stack = 0;
}
}
+
+ /* Set PARAM_MAX_STORES_TO_SINK to 0 if either vectorization or if-conversion
+ is disabled. */
+ if (!opts->x_flag_tree_vectorize || !opts->x_flag_tree_loop_if_convert)
+ maybe_set_param_value (PARAM_MAX_STORES_TO_SINK, 0,
+ opts->x_param_values, opts_set->x_param_values);
+
+ /* This replaces set_Wunused. */
+ if (opts->x_warn_unused_function == -1)
+ opts->x_warn_unused_function = opts->x_warn_unused;
+ if (opts->x_warn_unused_label == -1)
+ opts->x_warn_unused_label = opts->x_warn_unused;
+ /* Wunused-parameter is enabled if both -Wunused -Wextra are enabled. */
+ if (opts->x_warn_unused_parameter == -1)
+ opts->x_warn_unused_parameter = (opts->x_warn_unused
+ && opts->x_extra_warnings);
+ if (opts->x_warn_unused_variable == -1)
+ opts->x_warn_unused_variable = opts->x_warn_unused;
+ /* Wunused-but-set-parameter is enabled if both -Wunused -Wextra are
+ enabled. */
+ if (opts->x_warn_unused_but_set_parameter == -1)
+ opts->x_warn_unused_but_set_parameter = (opts->x_warn_unused
+ && opts->x_extra_warnings);
+ if (opts->x_warn_unused_but_set_variable == -1)
+ opts->x_warn_unused_but_set_variable = opts->x_warn_unused;
+ if (opts->x_warn_unused_value == -1)
+ opts->x_warn_unused_value = opts->x_warn_unused;
+
+ /* This replaces set_Wextra. */
+ if (opts->x_warn_uninitialized == -1)
+ opts->x_warn_uninitialized = opts->x_extra_warnings;
}
#define LEFT_COLUMN 27
/* No-op. Used by the driver and passed to us because it starts with f.*/
break;
+ case OPT_Wuninitialized:
+ /* Also turn on maybe uninitialized warning. */
+ warn_maybe_uninitialized = value;
+ break;
+
default:
/* If the flag was handled in a standard way, assume the lack of
processing here is intentional. */
static void
set_fast_math_flags (struct gcc_options *opts, int set)
{
- opts->x_flag_unsafe_math_optimizations = set;
- set_unsafe_math_optimizations_flags (opts, set);
- opts->x_flag_finite_math_only = set;
- opts->x_flag_errno_math = !set;
+ if (!opts->frontend_set_flag_unsafe_math_optimizations)
+ {
+ opts->x_flag_unsafe_math_optimizations = set;
+ set_unsafe_math_optimizations_flags (opts, set);
+ }
+ if (!opts->frontend_set_flag_finite_math_only)
+ opts->x_flag_finite_math_only = set;
+ if (!opts->frontend_set_flag_errno_math)
+ opts->x_flag_errno_math = !set;
if (set)
{
- opts->x_flag_signaling_nans = 0;
- opts->x_flag_rounding_math = 0;
- opts->x_flag_cx_limited_range = 1;
+ if (!opts->frontend_set_flag_signaling_nans)
+ opts->x_flag_signaling_nans = 0;
+ if (!opts->frontend_set_flag_rounding_math)
+ opts->x_flag_rounding_math = 0;
+ if (!opts->frontend_set_flag_cx_limited_range)
+ opts->x_flag_cx_limited_range = 1;
}
}
static void
set_unsafe_math_optimizations_flags (struct gcc_options *opts, int set)
{
- opts->x_flag_trapping_math = !set;
- opts->x_flag_signed_zeros = !set;
- opts->x_flag_associative_math = set;
- opts->x_flag_reciprocal_math = set;
+ if (!opts->frontend_set_flag_trapping_math)
+ opts->x_flag_trapping_math = !set;
+ if (!opts->frontend_set_flag_signed_zeros)
+ opts->x_flag_signed_zeros = !set;
+ if (!opts->frontend_set_flag_associative_math)
+ opts->x_flag_associative_math = set;
+ if (!opts->frontend_set_flag_reciprocal_math)
+ opts->x_flag_reciprocal_math = set;
}
/* Return true iff flags in OPTS are set as if -ffast-math. */
control_warning_option (option_index, (int) kind, value,
loc, lang_mask,
handlers, opts, opts_set, dc);
+ if (option_index == OPT_Wuninitialized)
+ enable_warning_as_error ("maybe-uninitialized", value, lang_mask,
+ handlers, opts, opts_set, loc, dc);
}
free (new_option);
}