/* Command line option handling.
- Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
Contributed by Neil Booth.
This file is part of GCC.
/* The default visibility for all symbols (unless overridden) */
enum symbol_visibility default_visibility = VISIBILITY_DEFAULT;
+/* Disable unit-at-a-time for frontends that might be still broken in this
+ respect. */
+
+bool no_unit_at_a_time_default;
+
/* Global visibility options. */
struct visibility_flags visibility_options;
static bool flag_unroll_loops_set, flag_tracer_set;
static bool flag_value_profile_transformations_set;
static bool flag_peel_loops_set, flag_branch_probabilities_set;
-static bool flag_loop_optimize_set;
/* Input file names. */
const char **in_fnames;
unsigned num_in_fnames;
static size_t find_opt (const char *, int);
-static int common_handle_option (size_t scode, const char *arg, int value);
+static int common_handle_option (size_t scode, const char *arg, int value,
+ unsigned int lang_mask);
static void handle_param (const char *);
static void set_Wextra (int);
static unsigned int handle_option (const char **argv, unsigned int lang_mask);
if (mask & (1U << n))
len += strlen (lang_name) + 1;
- result = xmalloc (len);
+ result = XNEWVEC (char, len);
len = 0;
for (n = 0; (lang_name = lang_names[n]) != 0; n++)
if (mask & (1U << n))
/* Drop the "no-" from negative switches. */
size_t len = strlen (opt) - 3;
- dup = xmalloc (len + 1);
+ dup = XNEWVEC (char, len + 1);
dup[0] = '-';
dup[1] = opt[1];
memcpy (dup + 2, opt + 5, len - 2 + 1);
result = 0;
if (result && (option->flags & CL_COMMON))
- if (common_handle_option (opt_index, arg, value) == 0)
+ if (common_handle_option (opt_index, arg, value, lang_mask) == 0)
result = 0;
if (result && (option->flags & CL_TARGET))
#endif
flag_guess_branch_prob = 1;
flag_cprop_registers = 1;
- flag_loop_optimize = 1;
flag_if_conversion = 1;
flag_if_conversion2 = 1;
flag_ipa_pure_const = 1;
flag_tree_copy_prop = 1;
flag_tree_sink = 1;
flag_tree_salias = 1;
- flag_unit_at_a_time = 1;
+ if (!no_unit_at_a_time_default)
+ flag_unit_at_a_time = 1;
if (!optimize_size)
{
flag_gcse = 1;
flag_expensive_optimizations = 1;
flag_ipa_type_escape = 1;
- flag_strength_reduce = 1;
flag_rerun_cse_after_loop = 1;
- flag_rerun_loop_opt = 1;
flag_caller_saves = 1;
flag_peephole2 = 1;
#ifdef INSN_SCHEDULING
VALUE assigned to a variable, it happens automatically. */
static int
-common_handle_option (size_t scode, const char *arg, int value)
+common_handle_option (size_t scode, const char *arg, int value,
+ unsigned int lang_mask)
{
enum opt_code code = (enum opt_code) scode;
set_Wextra (value);
break;
+ case OPT_Werror_:
+ {
+ char *new_option;
+ int option_index;
+ new_option = XNEWVEC (char, strlen (arg) + 2);
+ new_option[0] = 'W';
+ strcpy (new_option+1, arg);
+ option_index = find_opt (new_option, lang_mask);
+ if (option_index == N_OPTS)
+ {
+ error ("-Werror-%s: No option -%s", arg, new_option);
+ }
+ else
+ {
+ int kind = value ? DK_ERROR : DK_WARNING;
+ diagnostic_classify_diagnostic (global_dc, option_index, kind);
+
+ /* -Werror=foo implies -Wfoo. */
+ if (cl_options[option_index].var_type == CLVC_BOOLEAN
+ && cl_options[option_index].flag_var
+ && kind == DK_ERROR)
+ *(int *) cl_options[option_index].flag_var = 1;
+ free (new_option);
+ }
+ }
+ break;
+
case OPT_Wextra:
set_Wextra (value);
break;
flag_branch_probabilities_set = true;
break;
- case OPT_floop_optimize:
- flag_loop_optimize_set = true;
- break;
-
case OPT_fcall_used_:
fix_register (arg, 0, 1);
break;
flag_tracer = value;
if (!flag_value_profile_transformations_set)
flag_value_profile_transformations = value;
- /* Old loop optimizer is incompatible with tree profiling. */
- if (!flag_loop_optimize_set)
- flag_loop_optimize = 0;
break;
case OPT_fprofile_generate:
warning (0, "-f[no-]force-mem is nop and option will be removed in 4.2");
break;
+ case OPT_floop_optimize:
+ case OPT_frerun_loop_opt:
+ case OPT_fstrength_reduce:
+ /* These are no-ops, preserved for backward compatibility. */
+ break;
+
default:
/* If the flag was handled in a standard way, assume the lack of
processing here is intentional. */