From 3c6a9715a98d0ee9da8bf24324d0a8a4bba990f0 Mon Sep 17 00:00:00 2001 From: jsm28 Date: Wed, 26 May 2010 13:40:53 +0000 Subject: [PATCH] * diagnostic.c: Don't include opts.h. (permissive_error_option): Define. (diagnostic_initialize): Take n_opts parameter. Allocate memory for classify_diagnostic. Don't use memset for classify_diagnostic. Initialize new and recently added fields. (diagnostic_classify_diagnostic): Use context->n_opts instead of N_OPTS. (diagnostic_report_diagnostic): Pass context parameter to diagnostic_report_warnings_p. Use option_enabled and option_name hooks from context. (emit_diagnostic): Use permissive_error_option. (permerror): Likewise. * diagnostic.h: Don't include options.h. (struct diagnostic_context): Add n_opts, opt_permissive, inhibit_warnings, warn_system_headers, option_enabled and option_name fields. Change classify_diagnostic to a pointer. * opts-diagnostic.h: New file. * opts.c: Include opts-diagnostic.h. (common_handle_option): Set global_dc fields for -Wfatal-errors, -Wsystem-headers, -fshow-column, -pedantic-errors and -w. (option_name): New function. * c-opts.c (c_common_init_options): Set global_dc->opt_permissive. (c_common_handle_option): Set global_dc->permissive for -fpermissive. * c-common.c (c_cpp_error): Save and restore global_dc->warn_system_headers, not variable warn_system_headers. * toplev.c: Include opts-diagnostic.h. (general_init): Update call to diagnostic_initialize. Set global_dc->show_column, global_dc->option_enabled and global_dc->option_name. (process_options): Don't set global_dc fields here. * Makefile.in (DIAGNOSTIC_H): Remove options.h. (diagnostic.o, opts.o, toplev.o): Update dependencies. fortran: * cpp.c (cb_cpp_error): Save and restore global_dc->warn_system_headers, not variable warn_system_headers. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159869 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 36 ++++++++++++++++++++++++++ gcc/Makefile.in | 8 +++--- gcc/c-common.c | 6 ++--- gcc/c-opts.c | 4 ++- gcc/diagnostic.c | 71 ++++++++++++++++++++++++--------------------------- gcc/diagnostic.h | 48 ++++++++++++++++++++++++++-------- gcc/fortran/ChangeLog | 5 ++++ gcc/fortran/cpp.c | 8 +++--- gcc/opts-diagnostic.h | 25 ++++++++++++++++++ gcc/opts.c | 54 ++++++++++++++++++++++++++++++++++++++- gcc/toplev.c | 11 ++++---- 11 files changed, 208 insertions(+), 68 deletions(-) create mode 100644 gcc/opts-diagnostic.h diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f0c6e852524..becf94a1ae2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,39 @@ +2010-05-26 Joseph Myers + + * diagnostic.c: Don't include opts.h. + (permissive_error_option): Define. + (diagnostic_initialize): Take n_opts parameter. Allocate memory + for classify_diagnostic. Don't use memset for + classify_diagnostic. Initialize new and recently added fields. + (diagnostic_classify_diagnostic): Use context->n_opts instead of + N_OPTS. + (diagnostic_report_diagnostic): Pass context parameter to + diagnostic_report_warnings_p. Use option_enabled and option_name + hooks from context. + (emit_diagnostic): Use permissive_error_option. + (permerror): Likewise. + * diagnostic.h: Don't include options.h. + (struct diagnostic_context): Add n_opts, opt_permissive, + inhibit_warnings, warn_system_headers, option_enabled and + option_name fields. Change classify_diagnostic to a pointer. + * opts-diagnostic.h: New file. + * opts.c: Include opts-diagnostic.h. + (common_handle_option): Set global_dc fields for -Wfatal-errors, + -Wsystem-headers, -fshow-column, -pedantic-errors and -w. + (option_name): New function. + * c-opts.c (c_common_init_options): Set global_dc->opt_permissive. + (c_common_handle_option): Set global_dc->permissive for + -fpermissive. + * c-common.c (c_cpp_error): Save and restore + global_dc->warn_system_headers, not variable warn_system_headers. + * toplev.c: Include opts-diagnostic.h. + (general_init): Update call to diagnostic_initialize. Set + global_dc->show_column, global_dc->option_enabled and + global_dc->option_name. + (process_options): Don't set global_dc fields here. + * Makefile.in (DIAGNOSTIC_H): Remove options.h. + (diagnostic.o, opts.o, toplev.o): Update dependencies. + 2010-04-30 Hariharan Sandanagobalane * config/picochip/picochip.md (movsi): Split a movsi from a diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 6e32d8115f2..bbb16f9a743 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -942,7 +942,7 @@ TREE_SSA_LIVE_H = tree-ssa-live.h $(PARTITION_H) vecprim.h TREE_VECTORIZER_H = tree-vectorizer.h $(TREE_DATA_REF_H) SSAEXPAND_H = ssaexpand.h $(TREE_SSA_LIVE_H) PRETTY_PRINT_H = pretty-print.h $(INPUT_H) $(OBSTACK_H) -DIAGNOSTIC_H = diagnostic.h diagnostic.def $(PRETTY_PRINT_H) options.h +DIAGNOSTIC_H = diagnostic.h diagnostic.def $(PRETTY_PRINT_H) C_PRETTY_PRINT_H = c-pretty-print.h $(PRETTY_PRINT_H) $(C_COMMON_H) $(TREE_H) SCEV_H = tree-scalar-evolution.h $(GGC_H) tree-chrec.h $(PARAMS_H) LAMBDA_H = lambda.h $(TREE_H) vec.h $(GGC_H) @@ -2735,12 +2735,12 @@ fold-const.o : fold-const.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ $(GIMPLE_H) realmpfr.h diagnostic.o : diagnostic.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ version.h $(INPUT_H) $(TOPLEV_H) intl.h $(DIAGNOSTIC_H) \ - diagnostic.def opts.h + diagnostic.def opts.o : opts.c opts.h options.h $(TOPLEV_H) $(CONFIG_H) $(SYSTEM_H) \ coretypes.h $(TREE_H) $(TM_H) langhooks.h $(GGC_H) $(EXPR_H) $(RTL_H) \ 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) + $(PLUGIN_H) $(EXCEPT_H) $(LTO_STREAMER_H) opts-diagnostic.h opts-common.o : opts-common.c opts.h $(CONFIG_H) $(SYSTEM_H) \ coretypes.h intl.h targhooks.o : targhooks.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TREE_H) \ @@ -2766,7 +2766,7 @@ toplev.o : toplev.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \ $(CGRAPH_H) $(COVERAGE_H) alloc-pool.h $(GGC_H) $(INTEGRATE_H) \ opts.h params.def tree-mudflap.h $(TREE_PASS_H) $(GIMPLE_H) \ tree-ssa-alias.h $(PLUGIN_H) realmpfr.h tree-diagnostic.h \ - tree-pretty-print.h + tree-pretty-print.h opts-diagnostic.h $(COMPILER) $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) \ -DTARGET_NAME=\"$(target_noncanonical)\" \ -c $(srcdir)/toplev.c $(OUTPUT_OPTION) diff --git a/gcc/c-common.c b/gcc/c-common.c index 04b2909535d..cadf7574ccd 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -8364,7 +8364,7 @@ c_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level, int reason, { diagnostic_info diagnostic; diagnostic_t dlevel; - int save_warn_system_headers = warn_system_headers; + bool save_warn_system_headers = global_dc->warn_system_headers; bool ret; switch (level) @@ -8372,7 +8372,7 @@ c_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level, int reason, case CPP_DL_WARNING_SYSHDR: if (flag_no_output) return false; - warn_system_headers = 1; + global_dc->warn_system_headers = 1; /* Fall through. */ case CPP_DL_WARNING: if (flag_no_output) @@ -8409,7 +8409,7 @@ c_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level, int reason, c_option_controlling_cpp_error (reason)); ret = report_diagnostic (&diagnostic); if (level == CPP_DL_WARNING_SYSHDR) - warn_system_headers = save_warn_system_headers; + global_dc->warn_system_headers = save_warn_system_headers; return ret; } diff --git a/gcc/c-opts.c b/gcc/c-opts.c index fb2b8e2349e..d83045be48c 100644 --- a/gcc/c-opts.c +++ b/gcc/c-opts.c @@ -304,6 +304,8 @@ c_common_init_options (unsigned int argc, const char **argv) diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE; } + global_dc->opt_permissive = OPT_fpermissive; + parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89, ident_hash, line_table); cb = cpp_get_callbacks (parse_in); @@ -848,7 +850,7 @@ c_common_handle_option (size_t scode, const char *arg, int value, break; case OPT_fpermissive: - flag_permissive = value; + global_dc->permissive = flag_permissive = value; break; case OPT_fpreprocessed: diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c index c16ec7cafe0..0fbf58fa928 100644 --- a/gcc/diagnostic.c +++ b/gcc/diagnostic.c @@ -31,11 +31,11 @@ along with GCC; see the file COPYING3. If not see #include "toplev.h" #include "intl.h" #include "diagnostic.h" -#include "opts.h" #define pedantic_warning_kind(DC) \ ((DC)->pedantic_errors ? DK_ERROR : DK_WARNING) #define permissive_error_kind(DC) ((DC)->permissive ? DK_WARNING : DK_ERROR) +#define permissive_error_option(DC) ((DC)->opt_permissive) /* Prototypes. */ static char *build_message_string (const char *, ...) ATTRIBUTE_PRINTF_1; @@ -77,8 +77,10 @@ file_name_as_prefix (const char *f) /* Initialize the diagnostic message outputting machinery. */ void -diagnostic_initialize (diagnostic_context *context) +diagnostic_initialize (diagnostic_context *context, int n_opts) { + int i; + /* Allocate a basic pretty-printer. Clients will replace this a much more elaborated pretty-printer if they wish. */ context->printer = XNEW (pretty_printer); @@ -91,13 +93,24 @@ diagnostic_initialize (diagnostic_context *context) memset (context->diagnostic_count, 0, sizeof context->diagnostic_count); context->some_warnings_are_errors = false; context->warning_as_error_requested = false; - memset (context->classify_diagnostic, DK_UNSPECIFIED, - sizeof context->classify_diagnostic); + context->n_opts = n_opts; + context->classify_diagnostic = XNEWVEC (diagnostic_t, n_opts); + for (i = 0; i < n_opts; i++) + context->classify_diagnostic[i] = DK_UNSPECIFIED; context->show_option_requested = false; context->abort_on_error = false; + context->show_column = false; + context->pedantic_errors = false; + context->permissive = false; + context->opt_permissive = 0; + context->fatal_errors = false; + context->inhibit_warnings = false; + context->warn_system_headers = false; context->internal_error = NULL; diagnostic_starter (context) = default_diagnostic_starter; diagnostic_finalizer (context) = default_diagnostic_finalizer; + context->option_enabled = NULL; + context->option_name = NULL; context->last_module = 0; context->x_data = NULL; context->lock = 0; @@ -295,7 +308,7 @@ diagnostic_classify_diagnostic (diagnostic_context *context, diagnostic_t old_kind; if (option_index <= 0 - || option_index >= N_OPTS + || option_index >= context->n_opts || new_kind >= DK_LAST_DIAGNOSTIC_KIND) return DK_UNSPECIFIED; @@ -322,7 +335,7 @@ diagnostic_report_diagnostic (diagnostic_context *context, /* Give preference to being able to inhibit warnings, before they get reclassified to something else. */ if ((diagnostic->kind == DK_WARNING || diagnostic->kind == DK_PEDWARN) - && !diagnostic_report_warnings_p (location)) + && !diagnostic_report_warnings_p (context, location)) return false; if (diagnostic->kind == DK_PEDWARN) @@ -360,7 +373,7 @@ diagnostic_report_diagnostic (diagnostic_context *context, { /* This tests if the user provided the appropriate -Wfoo or -Wno-foo option. */ - if (! option_enabled (diagnostic->option_index)) + if (! context->option_enabled (diagnostic->option_index)) return false; /* This tests if the user provided the appropriate -Werror=foo option. */ @@ -405,38 +418,20 @@ diagnostic_report_diagnostic (diagnostic_context *context, saved_format_spec = diagnostic->message.format_spec; if (context->show_option_requested) { - const char * option_text = NULL; + char *option_text; - if (diagnostic->option_index) - { - /* A warning classified as an error. */ - if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN) - && diagnostic->kind == DK_ERROR) - option_text - = ACONCAT ((cl_options[OPT_Werror_].opt_text, - /* Skip over "-W". */ - cl_options[diagnostic->option_index].opt_text + 2, - NULL)); - /* A warning with option. */ - else - option_text = cl_options[diagnostic->option_index].opt_text; - } - /* A warning without option classified as an error. */ - else if (orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN - || diagnostic->kind == DK_WARNING) - { - if (context->warning_as_error_requested) - option_text = cl_options[OPT_Werror].opt_text; - else - option_text = _("enabled by default"); - } + option_text = context->option_name (context, diagnostic->option_index, + orig_diag_kind, diagnostic->kind); if (option_text) - diagnostic->message.format_spec - = ACONCAT ((diagnostic->message.format_spec, - " ", - "[", option_text, "]", - NULL)); + { + diagnostic->message.format_spec + = ACONCAT ((diagnostic->message.format_spec, + " ", + "[", option_text, "]", + NULL)); + free (option_text); + } } diagnostic->message.locus = &diagnostic->location; diagnostic->message.x_data = &diagnostic->x_data; @@ -519,7 +514,7 @@ emit_diagnostic (diagnostic_t kind, location_t location, int opt, { diagnostic_set_info (&diagnostic, gmsgid, &ap, location, permissive_error_kind (global_dc)); - diagnostic.option_index = OPT_fpermissive; + diagnostic.option_index = permissive_error_option (global_dc); } else { diagnostic_set_info (&diagnostic, gmsgid, &ap, location, kind); @@ -638,7 +633,7 @@ permerror (location_t location, const char *gmsgid, ...) va_start (ap, gmsgid); diagnostic_set_info (&diagnostic, gmsgid, &ap, location, permissive_error_kind (global_dc)); - diagnostic.option_index = OPT_fpermissive; + diagnostic.option_index = permissive_error_option (global_dc); va_end (ap); return report_diagnostic (&diagnostic); } diff --git a/gcc/diagnostic.h b/gcc/diagnostic.h index 9fd508b78ff..7aa053188d4 100644 --- a/gcc/diagnostic.h +++ b/gcc/diagnostic.h @@ -23,7 +23,6 @@ along with GCC; see the file COPYING3. If not see #define GCC_DIAGNOSTIC_H #include "pretty-print.h" -#include "options.h" /* Constants used to discriminate diagnostics. */ typedef enum @@ -73,12 +72,17 @@ struct diagnostic_context /* True if it has been requested that warnings be treated as errors. */ bool warning_as_error_requested; - /* For each option index that can be passed to warning() et all - (OPT_* from options.h), this array may contain a new kind that - the diagnostic should be changed to before reporting, or - DK_UNSPECIFIED to leave it as the reported kind, or DK_IGNORED to - not report it at all. N_OPTS is from . */ - diagnostic_t classify_diagnostic[N_OPTS]; + /* The number of option indexes that can be passed to warning() et + al. */ + int n_opts; + + /* For each option index that can be passed to warning() et al + (OPT_* from options.h when using this code with the core GCC + options), this array may contain a new kind that the diagnostic + should be changed to before reporting, or DK_UNSPECIFIED to leave + it as the reported kind, or DK_IGNORED to not report it at + all. */ + diagnostic_t *classify_diagnostic; /* True if we should print the command line option which controls each diagnostic, if known. */ @@ -96,9 +100,19 @@ struct diagnostic_context /* True if permerrors are warnings. */ bool permissive; + /* The index of the option to associate with turning permerrors into + warnings. */ + int opt_permissive; + /* True if errors are fatal. */ bool fatal_errors; + /* True if all warnings should be disabled. */ + bool inhibit_warnings; + + /* True if warnings should be given in system headers. */ + bool warn_system_headers; + /* This function is called before any message is printed out. It is responsible for preparing message prefix and such. For example, it might say: @@ -114,6 +128,18 @@ struct diagnostic_context /* Client hook to report an internal error. */ void (*internal_error) (diagnostic_context *, const char *, va_list *); + /* Client hook to say whether the option controlling a diagnostic is + enabled. Returns nonzero if enabled, zero if disabled. */ + int (*option_enabled) (int); + + /* Client hook to return the name of an option that controls a + diagnostic. Returns malloced memory. The first diagnostic_t + argument is the kind of diagnostic before any reclassification + (of warnings as errors, etc.); the second is the kind after any + reclassification. May return NULL if no name is to be printed. + May be passed 0 as well as the index of a particular option. */ + char *(*option_name) (diagnostic_context *, int, diagnostic_t, diagnostic_t); + /* Auxiliary data for client. */ void *x_data; @@ -187,9 +213,9 @@ extern diagnostic_context *global_dc; #define sorrycount diagnostic_kind_count (global_dc, DK_SORRY) /* Returns nonzero if warnings should be emitted. */ -#define diagnostic_report_warnings_p(LOC) \ - (!inhibit_warnings \ - && !(in_system_header_at (LOC) && !warn_system_headers)) +#define diagnostic_report_warnings_p(DC, LOC) \ + (!(DC)->inhibit_warnings \ + && !(in_system_header_at (LOC) && !(DC)->warn_system_headers)) #define report_diagnostic(D) diagnostic_report_diagnostic (global_dc, D) @@ -203,7 +229,7 @@ extern diagnostic_context *global_dc; ((DI)->option_index = (OPTIDX)) /* Diagnostic related functions. */ -extern void diagnostic_initialize (diagnostic_context *); +extern void diagnostic_initialize (diagnostic_context *, int); extern void diagnostic_finish (diagnostic_context *); extern void diagnostic_report_current_module (diagnostic_context *); diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index be0f29f8a12..1566d08f9b6 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2010-05-26 Joseph Myers + + * cpp.c (cb_cpp_error): Save and restore + global_dc->warn_system_headers, not variable warn_system_headers. + 2010-05-26 Steven Bosscher * fortran/f95-lang.c: Do not include libfuncs.h, expr.h, and except.h. diff --git a/gcc/fortran/cpp.c b/gcc/fortran/cpp.c index 6ff464a8cf0..6361085372e 100644 --- a/gcc/fortran/cpp.c +++ b/gcc/fortran/cpp.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2008, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. This file is part of GCC. @@ -975,13 +975,13 @@ cb_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level, int reason, { diagnostic_info diagnostic; diagnostic_t dlevel; - int save_warn_system_headers = warn_system_headers; + bool save_warn_system_headers = global_dc->warn_system_headers; bool ret; switch (level) { case CPP_DL_WARNING_SYSHDR: - warn_system_headers = 1; + global_dc->warn_system_headers = 1; /* Fall through. */ case CPP_DL_WARNING: dlevel = DK_WARNING; @@ -1012,7 +1012,7 @@ cb_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level, int reason, diagnostic_override_option_index (&diagnostic, OPT_Wcpp); ret = report_diagnostic (&diagnostic); if (level == CPP_DL_WARNING_SYSHDR) - warn_system_headers = save_warn_system_headers; + global_dc->warn_system_headers = save_warn_system_headers; return ret; } diff --git a/gcc/opts-diagnostic.h b/gcc/opts-diagnostic.h new file mode 100644 index 00000000000..5d23c71a1f9 --- /dev/null +++ b/gcc/opts-diagnostic.h @@ -0,0 +1,25 @@ +/* Command line option handling. Interactions with diagnostics code. + Copyright (C) 2010 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +. */ + +#ifndef GCC_OPTS_DIAGNOSTIC_H +#define GCC_OPTS_DIAGNOSTIC_H + +extern char *option_name (diagnostic_context *context, int option_index, + diagnostic_t orig_diag_kind, diagnostic_t diag_kind); +#endif diff --git a/gcc/opts.c b/gcc/opts.c index 2e788d28fdd..65121a4222e 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -36,6 +36,7 @@ along with GCC; see the file COPYING3. If not see #include "toplev.h" #include "params.h" #include "diagnostic.h" +#include "opts-diagnostic.h" #include "tm_p.h" /* For OPTIMIZATION_OPTIONS. */ #include "insn-attr.h" /* For INSN_SCHEDULING. */ #include "target.h" @@ -1703,6 +1704,10 @@ common_handle_option (size_t scode, const char *arg, int value, warn_larger_than = value != -1; break; + case OPT_Wfatal_errors: + global_dc->fatal_errors = value; + break; + case OPT_Wframe_larger_than_: frame_larger_than_size = value; warn_frame_larger_than = value != -1; @@ -1726,6 +1731,10 @@ common_handle_option (size_t scode, const char *arg, int value, warn_strict_overflow = value; break; + case OPT_Wsystem_headers: + global_dc->warn_system_headers = value; + break; + case OPT_Wunused: warn_unused = value; break; @@ -1955,6 +1964,10 @@ common_handle_option (size_t scode, const char *arg, int value, flag_profile_values_set = true; break; + case OPT_fshow_column: + global_dc->show_column = value; + break; + case OPT_fvisibility_: { if (!strcmp(arg, "default")) @@ -2168,13 +2181,17 @@ common_handle_option (size_t scode, const char *arg, int value, break; case OPT_pedantic_errors: - flag_pedantic_errors = pedantic = 1; + global_dc->pedantic_errors = flag_pedantic_errors = pedantic = 1; break; case OPT_fwhopr: flag_whopr = value; break; + case OPT_w: + global_dc->inhibit_warnings = true; + break; + case OPT_fsee: case OPT_fcse_skip_blocks: case OPT_floop_optimize: @@ -2510,3 +2527,38 @@ enable_warning_as_error (const char *arg, int value, unsigned int lang_mask) } free (new_option); } + +/* Return malloced memory for the name of the option OPTION_INDEX + which enabled a diagnostic (context CONTEXT), originally of type + ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such + as -Werror. */ + +char * +option_name (diagnostic_context *context, int option_index, + diagnostic_t orig_diag_kind, diagnostic_t diag_kind) +{ + if (option_index) + { + /* A warning classified as an error. */ + if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN) + && diag_kind == DK_ERROR) + return concat (cl_options[OPT_Werror_].opt_text, + /* Skip over "-W". */ + cl_options[option_index].opt_text + 2, + NULL); + /* A warning with option. */ + else + return xstrdup (cl_options[option_index].opt_text); + } + /* A warning without option classified as an error. */ + else if (orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN + || diag_kind == DK_WARNING) + { + if (context->warning_as_error_requested) + return xstrdup (cl_options[OPT_Werror].opt_text); + else + return xstrdup (_("enabled by default")); + } + else + return NULL; +} diff --git a/gcc/toplev.c b/gcc/toplev.c index aa3eff3be35..83008da3a6b 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -78,6 +78,7 @@ along with GCC; see the file COPYING3. If not see #include "hosthooks.h" #include "cgraph.h" #include "opts.h" +#include "opts-diagnostic.h" #include "coverage.h" #include "value-prof.h" #include "alloc-pool.h" @@ -1691,13 +1692,16 @@ general_init (const char *argv0) /* Initialize the diagnostics reporting machinery, so option parsing can give warnings and errors. */ - diagnostic_initialize (global_dc); + diagnostic_initialize (global_dc, N_OPTS); diagnostic_starter (global_dc) = default_tree_diagnostic_starter; /* 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->internal_error = plugins_internal_error_function; + global_dc->option_enabled = option_enabled; + global_dc->option_name = option_name; /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages. */ #ifdef SIGSEGV @@ -1828,11 +1832,6 @@ process_options (void) if (flag_compare_debug) diagnostic_inhibit_notes (global_dc); - global_dc->show_column = flag_show_column; - global_dc->pedantic_errors = flag_pedantic_errors; - global_dc->permissive = flag_permissive; - global_dc->fatal_errors = flag_fatal_errors; - if (flag_section_anchors && !target_supports_section_anchors_p ()) { warning (OPT_fsection_anchors, -- 2.11.4.GIT