/* 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.
#include "system.h"
#include "intl.h"
#include "coretypes.h"
-#include "tm.h" /* Needed by rtl.h and used for DWARF2_DEBUGGING_INFO
- and DBX_DEBUGGING_INFO. */
+#include "tm.h" /* Needed by rtl.h and used for STACK_CHECK_BUILTIN,
+ STACK_CHECK_STATIC_BUILTIN, DEFAULT_GDB_EXTENSIONS,
+ DWARF2_DEBUGGING_INFO and DBX_DEBUGGING_INFO. */
#include "rtl.h" /* Needed by insn-attr.h. */
#include "opts.h"
#include "options.h"
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,
{ OPT_LEVELS_1_PLUS, OPT_ftree_sink, NULL, 1 },
{ OPT_LEVELS_1_PLUS, OPT_ftree_ch, NULL, 1 },
{ OPT_LEVELS_1_PLUS, OPT_fcombine_stack_adjustments, NULL, 1 },
+ { OPT_LEVELS_1_PLUS, OPT_fcompare_elim, NULL, 1 },
/* -O2 optimizations. */
{ OPT_LEVELS_2_PLUS, OPT_finline_small_functions, NULL, 1 },
{ OPT_LEVELS_2_PLUS, OPT_ftree_pre, NULL, 1 },
{ OPT_LEVELS_2_PLUS, OPT_ftree_switch_conversion, NULL, 1 },
{ OPT_LEVELS_2_PLUS, OPT_fipa_cp, NULL, 1 },
+ { OPT_LEVELS_2_PLUS, OPT_fdevirtualize, NULL, 1 },
{ OPT_LEVELS_2_PLUS, OPT_fipa_sra, NULL, 1 },
{ OPT_LEVELS_2_PLUS, OPT_falign_loops, NULL, 1 },
{ OPT_LEVELS_2_PLUS, OPT_falign_jumps, NULL, 1 },
{
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_dump_dir_name)
opts->x_dump_base_name = concat (opts->x_dump_dir_name,
opts->x_dump_base_name, NULL);
- else if (opts->x_aux_base_name)
+ else if (opts->x_aux_base_name
+ && strcmp (opts->x_aux_base_name, HOST_BIT_BUCKET) != 0)
{
const char *aux_base;
opts->x_flag_pic = opts->x_flag_pie;
if (opts->x_flag_pic && !opts->x_flag_pie)
opts->x_flag_shlib = 1;
- opts->x_flag_opts_finished = false;
+ opts->x_flag_opts_finished = true;
}
if (opts->x_optimize == 0)
opts->x_flag_reorder_blocks = 1;
}
+ if (opts->x_flag_reorder_blocks_and_partition
+ && !opts_set->x_flag_reorder_functions)
+ opts->x_flag_reorder_functions = 1;
+
/* Pipelining of outer loops is only possible when general pipelining
capabilities are requested. */
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
opts->x_flag_value_profile_transformations = value;
if (!opts_set->x_flag_inline_functions)
opts->x_flag_inline_functions = value;
+ /* FIXME: Instrumentation we insert makes ipa-reference bitmaps
+ quadratic. Disable the pass until better memory representation
+ is done. */
+ if (!opts_set->x_flag_ipa_reference && in_lto_p)
+ opts->x_flag_ipa_reference = false;
break;
case OPT_fshow_column:
break;
case OPT_flto:
- opts->x_flag_lto = "";
+ opts->x_flag_lto = value ? "" : NULL;
break;
case OPT_w:
/* 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);
}