diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7d186a6492e..7ece57b731b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2010-05-25 Joseph Myers + + * diagnostic.c: Don't include plugin.h. + (diagnostic_report_diagnostic): Don't handle plugins specially + here. Pass context to internal_error callback. + * diagnostic.h (struct diagnostic_context): Add context parameter + to internal_error callback. + * plugin.c (warn_if_plugins, plugins_internal_error_function): + New. + * plugin.h (struct diagnostic_context): Declare. + (warn_if_plugins, plugins_internal_error_function): Declare. + * toplev.c (general_init): Set global_dc->internal_error. + * Makefile.in (diagnostic.o): Update dependencies. + 2010-05-25 Iain Sandoe * config/rs6000/darwin64.h: Update DARWIN_ARCH_SPEC. diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 8f448819ded..f9926fab115 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -2735,7 +2735,7 @@ 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 $(PLUGIN_H) + diagnostic.def opts.h 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) \ diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index d5aa53a0a57..7e1d62d73f6 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2010-05-25 Joseph Myers + + * gcc-interface/misc.c (internal_error_function): Add context + parameter. Use it to access show_column flag and instead of using + global_dc. Call warn_if_plugins. + * gcc-interface/Make-lang.in (ada/misc.o): Update dependencies. + 2010-05-19 Eric Botcazou * gcc-interface/misc.c (LANG_HOOKS_DEEP_UNSHARING): Redefine. diff --git a/gcc/ada/gcc-interface/Make-lang.in b/gcc/ada/gcc-interface/Make-lang.in index 25c0964a1f8..43a3cec1659 100644 --- a/gcc/ada/gcc-interface/Make-lang.in +++ b/gcc/ada/gcc-interface/Make-lang.in @@ -1235,7 +1235,7 @@ ada/decl.o : ada/gcc-interface/decl.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ ada/misc.o : ada/gcc-interface/misc.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ $(TM_H) $(TREE_H) $(DIAGNOSTIC_H) $(TARGET_H) $(EXPR_H) libfuncs.h \ $(FLAGS_H) debug.h $(CGRAPH_H) $(OPTABS_H) toplev.h except.h langhooks.h \ - $(LANGHOOKS_DEF_H) opts.h options.h $(TREE_INLINE_H) \ + $(LANGHOOKS_DEF_H) opts.h options.h $(TREE_INLINE_H) $(PLUGIN_H) \ ada/gcc-interface/ada.h ada/adadecode.h ada/types.h ada/atree.h \ ada/elists.h ada/namet.h ada/nlists.h ada/stringt.h ada/uintp.h ada/fe.h \ ada/sinfo.h ada/einfo.h $(ADA_TREE_H) ada/gcc-interface/gigi.h \ diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c index dba6dca887c..22826ed0b96 100644 --- a/gcc/ada/gcc-interface/misc.c +++ b/gcc/ada/gcc-interface/misc.c @@ -48,6 +48,7 @@ #include "opts.h" #include "options.h" #include "tree-inline.h" +#include "plugin.h" #include "ada.h" #include "adadecode.h" @@ -75,7 +76,8 @@ static const char *gnat_printable_name (tree, int); static const char *gnat_dwarf_name (tree, int); static tree gnat_return_tree (tree); static void gnat_parse_file (int); -static void internal_error_function (const char *, va_list *); +static void internal_error_function (diagnostic_context *, + const char *, va_list *); static tree gnat_type_max_size (const_tree); static void gnat_get_subrange_bounds (const_tree, tree *, tree *); static tree gnat_eh_personality (void); @@ -334,7 +336,8 @@ gnat_post_options (const char **pfilename ATTRIBUTE_UNUSED) /* Here is the function to handle the compiler error processing in GCC. */ static void -internal_error_function (const char *msgid, va_list *ap) +internal_error_function (diagnostic_context *context, + const char *msgid, va_list *ap) { text_info tinfo; char *buffer, *p, *loc; @@ -342,17 +345,20 @@ internal_error_function (const char *msgid, va_list *ap) Fat_Pointer fp, fp_loc; expanded_location s; + /* Warn if plugins present. */ + warn_if_plugins (); + /* Reset the pretty-printer. */ - pp_clear_output_area (global_dc->printer); + pp_clear_output_area (context->printer); /* Format the message into the pretty-printer. */ tinfo.format_spec = msgid; tinfo.args_ptr = ap; tinfo.err_no = errno; - pp_format_verbatim (global_dc->printer, &tinfo); + pp_format_verbatim (context->printer, &tinfo); /* Extract a (writable) pointer to the formatted text. */ - buffer = xstrdup (pp_formatted_text (global_dc->printer)); + buffer = xstrdup (pp_formatted_text (context->printer)); /* Go up to the first newline. */ for (p = buffer; *p; p++) @@ -368,7 +374,7 @@ internal_error_function (const char *msgid, va_list *ap) fp.Array = buffer; s = expand_location (input_location); - if (flag_show_column && s.column != 0) + if (context->show_column && s.column != 0) asprintf (&loc, "%s:%d:%d", s.file, s.line, s.column); else asprintf (&loc, "%s:%d", s.file, s.line); diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c index 7757ace11b0..c16ec7cafe0 100644 --- a/gcc/diagnostic.c +++ b/gcc/diagnostic.c @@ -32,7 +32,6 @@ along with GCC; see the file COPYING3. If not see #include "intl.h" #include "diagnostic.h" #include "opts.h" -#include "plugin.h" #define pedantic_warning_kind(DC) \ ((DC)->pedantic_errors ? DK_ERROR : DK_WARNING) @@ -380,14 +379,6 @@ diagnostic_report_diagnostic (diagnostic_context *context, context->lock++; - if (diagnostic->kind == DK_ICE && plugins_active_p ()) - { - fnotice (stderr, "*** WARNING *** there are active plugins, do not report" - " this as a bug unless you can reproduce it without enabling" - " any plugins.\n"); - dump_active_plugins (stderr); - } - if (diagnostic->kind == DK_ICE) { #ifndef ENABLE_CHECKING @@ -405,7 +396,8 @@ diagnostic_report_diagnostic (diagnostic_context *context, } #endif if (context->internal_error) - (*context->internal_error) (diagnostic->message.format_spec, + (*context->internal_error) (context, + diagnostic->message.format_spec, diagnostic->message.args_ptr); } ++diagnostic_kind_count (context, diagnostic->kind); diff --git a/gcc/diagnostic.h b/gcc/diagnostic.h index 1db91c2cd44..9fd508b78ff 100644 --- a/gcc/diagnostic.h +++ b/gcc/diagnostic.h @@ -112,7 +112,7 @@ struct diagnostic_context diagnostic_finalizer_fn end_diagnostic; /* Client hook to report an internal error. */ - void (*internal_error) (const char *, va_list *); + void (*internal_error) (diagnostic_context *, const char *, va_list *); /* Auxiliary data for client. */ void *x_data; diff --git a/gcc/plugin.c b/gcc/plugin.c index 707d2dd5f66..1c737a5cd25 100644 --- a/gcc/plugin.c +++ b/gcc/plugin.c @@ -810,6 +810,32 @@ debug_active_plugins (void) dump_active_plugins (stderr); } +/* Give a warning if plugins are present, before an ICE message asking + to submit a bug report. */ + +void +warn_if_plugins (void) +{ + if (plugins_active_p ()) + { + fnotice (stderr, "*** WARNING *** there are active plugins, do not report" + " this as a bug unless you can reproduce it without enabling" + " any plugins.\n"); + dump_active_plugins (stderr); + } + +} + +/* Likewise, as a callback from the diagnostics code. */ + +void +plugins_internal_error_function (struct diagnostic_context *context ATTRIBUTE_UNUSED, + const char *msgid ATTRIBUTE_UNUSED, + va_list *ap ATTRIBUTE_UNUSED) +{ + warn_if_plugins (); +} + /* The default version check. Compares every field in VERSION. */ bool diff --git a/gcc/plugin.h b/gcc/plugin.h index 3269641df0a..ec0420346f4 100644 --- a/gcc/plugin.h +++ b/gcc/plugin.h @@ -23,6 +23,7 @@ along with GCC; see the file COPYING3. If not see #include "gcc-plugin.h" struct attribute_spec; +struct diagnostic_context; extern void add_new_plugin (const char *); extern void parse_plugin_arg_opt (const char *); @@ -31,6 +32,9 @@ extern void initialize_plugins (void); extern bool plugins_active_p (void); extern void dump_active_plugins (FILE *); extern void debug_active_plugins (void); +extern void warn_if_plugins (void); +extern void plugins_internal_error_function (struct diagnostic_context *, + const char *, va_list *); extern void print_plugins_versions (FILE *file, const char *indent); extern void print_plugins_help (FILE *file, const char *indent); extern void finalize_plugins (void); diff --git a/gcc/toplev.c b/gcc/toplev.c index 9d3396bc72d..aa3eff3be35 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1697,6 +1697,7 @@ general_init (const char *argv0) override it later. */ pp_format_decoder (global_dc->printer) = &default_tree_printer; global_dc->show_option_requested = flag_diagnostics_show_option; + global_dc->internal_error = plugins_internal_error_function; /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages. */ #ifdef SIGSEGV