unsigned num_in_fnames;
static int common_handle_option (size_t scode, const char *arg, int value,
- unsigned int lang_mask);
+ unsigned int lang_mask, int kind);
static void handle_param (const char *);
-static unsigned int handle_option (const char **argv, unsigned int lang_mask);
static char *write_langs (unsigned int lang_mask);
static void complain_wrong_lang (const char *, const struct cl_option *,
unsigned int lang_mask);
-static void handle_options (unsigned int, const char **, unsigned int);
static void set_debug_level (enum debug_info_type type, int extended,
const char *arg);
input_location = saved_loc;
}
+
+/* Handle option OPT_INDEX, and argument ARG, for the language
+ indicated by LANG_MASK. VALUE is true, unless no- form of an -f or
+ -W option was given. KIND is the diagnostic_t if this is a
+ diagnostics option, DK_UNSPECIFIED otherwise. Returns false if the
+ switch was invalid. */
+bool
+handle_option (int opt_index, int value, const char *arg,
+ unsigned int lang_mask, int kind)
+{
+ const struct cl_option *option = &cl_options[opt_index];
+
+ if (option->flag_var)
+ set_option (opt_index, value, arg, kind);
+
+ if (option->flags & lang_mask)
+ {
+ if (lang_hooks.handle_option (opt_index, arg, value, kind) == 0)
+ return false;
+#ifdef ENABLE_LTO
+ else
+ lto_register_user_option (opt_index, arg, value, lang_mask);
+ #endif
+ }
+
+ if (option->flags & CL_COMMON)
+ {
+ if (common_handle_option (opt_index, arg, value, lang_mask, kind) == 0)
+ return false;
+#ifdef ENABLE_LTO
+ else
+ lto_register_user_option (opt_index, arg, value, CL_COMMON);
+#endif
+ }
+
+ if (option->flags & CL_TARGET)
+ {
+ if (!targetm.handle_option (opt_index, arg, value))
+ return false;
+#ifdef ENABLE_LTO
+ else
+ lto_register_user_option (opt_index, arg, value, CL_TARGET);
+#endif
+ }
+ return true;
+}
+
/* Handle the switch beginning at ARGV for the language indicated by
LANG_MASK. Returns the number of switches consumed. */
static unsigned int
-handle_option (const char **argv, unsigned int lang_mask)
+read_cmdline_option (const char **argv, unsigned int lang_mask)
{
size_t opt_index;
const char *opt, *arg = 0;
}
}
- if (option->flag_var)
- set_option (option, value, arg);
-
- if (option->flags & lang_mask)
- {
- if (lang_hooks.handle_option (opt_index, arg, value) == 0)
- result = 0;
- else
- lto_register_user_option (opt_index, arg, value, lang_mask);
- }
-
- if (result && (option->flags & CL_COMMON))
- {
- if (common_handle_option (opt_index, arg, value, lang_mask) == 0)
- result = 0;
- else
- lto_register_user_option (opt_index, arg, value, CL_COMMON);
- }
-
- if (result && (option->flags & CL_TARGET))
- {
- if (!targetm.handle_option (opt_index, arg, value))
- result = 0;
- else
- lto_register_user_option (opt_index, arg, value, CL_TARGET);
- }
+ if (!handle_option (opt_index, value, arg, lang_mask, DK_UNSPECIFIED))
+ result = 0;
done:
if (dup)
contains has a single bit set representing the current
language. */
static void
-handle_options (unsigned int argc, const char **argv, unsigned int lang_mask)
+read_cmdline_options (unsigned int argc, const char **argv, unsigned int lang_mask)
{
unsigned int n, i;
continue;
}
- n = handle_option (argv + i, lang_mask);
+ n = read_cmdline_option (argv + i, lang_mask);
if (!n)
{
flag_if_conversion2 = opt1;
flag_ipa_pure_const = opt1;
flag_ipa_reference = opt1;
+ flag_ipa_profile = opt1;
flag_merge_constants = opt1;
flag_split_wide_types = opt1;
flag_tree_ccp = opt1;
else
set_param_value ("min-crossjump-insns", initial_min_crossjump_insns);
+ /* Enable -Werror=coverage-mismatch by default */
+ enable_warning_as_error("coverage-mismatch", 1, lang_mask);
+
if (first_time_p)
{
/* Initialize whether `char' is signed. */
flag_unwind_tables = targetm.unwind_tables_default;
}
+#ifdef ENABLE_LTO
/* Clear any options currently held for LTO. */
lto_clear_user_options ();
+#endif
#ifdef OPTIMIZATION_OPTIONS
/* Allow default optimizations to be specified on a per-machine basis. */
OPTIMIZATION_OPTIONS (optimize, optimize_size);
#endif
- handle_options (argc, argv, lang_mask);
+ read_cmdline_options (argc, argv, lang_mask);
if (dump_base_name && ! IS_ABSOLUTE_PATH (dump_base_name))
{
if (!PARAM_SET_P (PARAM_STACK_FRAME_GROWTH))
PARAM_VALUE (PARAM_STACK_FRAME_GROWTH) = 40;
}
+ if (flag_wpa || flag_ltrans)
+ {
+ /* These passes are not WHOPR compatible yet. */
+ flag_ipa_pta = 0;
+ flag_ipa_struct_reorg = 0;
+ }
if (flag_lto || flag_whopr)
{
static int
common_handle_option (size_t scode, const char *arg, int value,
- unsigned int lang_mask)
+ unsigned int lang_mask, int kind ATTRIBUTE_UNUSED)
{
static bool verbose = false;
enum opt_code code = (enum opt_code) scode;
break;
case OPT_fdiagnostics_show_option:
- global_dc->show_option_requested = true;
+ global_dc->show_option_requested = value;
break;
case OPT_fdump_:
/* Set *OPTION according to VALUE and ARG. */
void
-set_option (const struct cl_option *option, int value, const char *arg)
+set_option (int opt_index, int value, const char *arg, int kind)
{
+ const struct cl_option *option = &cl_options[opt_index];
+
if (!option->flag_var)
return;
*(const char **) option->flag_var = arg;
break;
}
+
+ if ((diagnostic_t)kind != DK_UNSPECIFIED)
+ diagnostic_classify_diagnostic (global_dc, opt_index, (diagnostic_t)kind);
+}
+
+
+/* Callback function, called when -Werror= enables a warning. */
+
+static void (*warning_as_error_callback) (int) = NULL;
+
+/* Register a callback for enable_warning_as_error calls. */
+
+void
+register_warning_as_error_callback (void (*callback) (int))
+{
+ gcc_assert (warning_as_error_callback == NULL || callback == NULL);
+ warning_as_error_callback = callback;
}