diagnostic.c (diagnostic_color_init): New.
authorManuel López-Ibáñez <manu@gcc.gnu.org>
Thu, 4 Dec 2014 23:09:41 +0000 (23:09 +0000)
committerManuel López-Ibáñez <manu@gcc.gnu.org>
Thu, 4 Dec 2014 23:09:41 +0000 (23:09 +0000)
gcc/ChangeLog:

2014-12-04  Manuel López-Ibáñez  <manu@gcc.gnu.org>

* diagnostic.c (diagnostic_color_init): New.
* diagnostic.h: Declare.
* gcc.c (driver::global_initializations): Use it.
(driver_handle_option): Handle -fdiagnostics-color_.
* toplev.c: Do not include diagnostic-color.h.
(process_options): Do not initialize color diagnostics here.
* common.opt (fdiagnostics-color=): Add Driver.
* opts-global.c (init_options_once): Initialize color here.
* opts.c (common_handle_option): Use diagnostics_color_init.
* diagnostic-color.h: Fix comment.

From-SVN: r218406

gcc/ChangeLog
gcc/common.opt
gcc/diagnostic-color.h
gcc/diagnostic.c
gcc/diagnostic.h
gcc/gcc.c
gcc/opts-global.c
gcc/opts.c
gcc/toplev.c

index d086e854dd851305f32ca6cdcff006471c7f0194..54500c5b5d23630a290b8e8fe5c2dceb9b19323d 100644 (file)
@@ -1,3 +1,16 @@
+2014-12-04  Manuel López-Ibáñez  <manu@gcc.gnu.org>
+
+       * diagnostic.c (diagnostic_color_init): New.
+       * diagnostic.h: Declare.
+       * gcc.c (driver::global_initializations): Use it.
+       (driver_handle_option): Handle -fdiagnostics-color_.
+       * toplev.c: Do not include diagnostic-color.h.
+       (process_options): Do not initialize color diagnostics here.
+       * common.opt (fdiagnostics-color=): Add Driver.
+       * opts-global.c (init_options_once): Initialize color here.
+       * opts.c (common_handle_option): Use diagnostics_color_init.
+       * diagnostic-color.h: Fix comment.
+
 2014-12-04  David Malcolm  <dmalcolm@redhat.com>
 
        * tree-pretty-print.c (INDENT): Rename "buffer" to "pp".
index a4dd3b326b12a2676387740fe7a19785511f9ae2..78b796b85570e5a858d991f14a27e9ae9ff4c41a 100644 (file)
@@ -1096,7 +1096,7 @@ Common Alias(fdiagnostics-color=,always,never)
 ;
 
 fdiagnostics-color=
-Common Joined RejectNegative Var(flag_diagnostics_show_color) Enum(diagnostic_color_rule) Init(DIAGNOSTICS_COLOR_NO)
+Driver Common Joined RejectNegative Var(flag_diagnostics_show_color) Enum(diagnostic_color_rule) Init(DIAGNOSTICS_COLOR_NO)
 -fdiagnostics-color=[never|always|auto]        Colorize diagnostics
 
 ; Required for these enum values.
index 63df6921450966c405dc44fc73e9cf0d81394236..d96e085f49c3a60ab78836e6d9d62840076a270b 100644 (file)
@@ -41,11 +41,10 @@ along with GCC; see the file COPYING3.  If not see
 #ifndef GCC_DIAGNOSTIC_COLOR_H
 #define GCC_DIAGNOSTIC_COLOR_H
 
-/* How often diagnostics are prefixed by their locations:
-   o DIAGNOSTICS_SHOW_PREFIX_NEVER: never - not yet supported;
-   o DIAGNOSTICS_SHOW_PREFIX_ONCE: emit only once;
-   o DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE: emit each time a physical
-   line is started.  */
+/* Whether to add color to diagnostics:
+   o DIAGNOSTICS_COLOR_NO: never
+   o DIAGNOSTICS_COLOR_YES: always
+   o DIAGNOSTICS_COLOR_AUTO: depending on the output stream.  */
 typedef enum
 {
   DIAGNOSTICS_COLOR_NO       = 0,
index 0c8fbe5f766cfdc468c7143c8ca6020a66d568b8..07ce6020192a6df970de66ad8432c517363320ef 100644 (file)
@@ -155,6 +155,34 @@ diagnostic_initialize (diagnostic_context *context, int n_opts)
   context->inhibit_notes_p = false;
 }
 
+/* Maybe initialize the color support. We require clients to do this
+   explicitly, since most clients don't want color.  When called
+   without a VALUE, it initializes with DIAGNOSTICS_COLOR_DEFAULT.  */
+
+void
+diagnostic_color_init (diagnostic_context *context, int value /*= -1 */)
+{
+  /* value == -1 is the default value.  */
+  if (value < 0)
+    {
+      /* If DIAGNOSTICS_COLOR_DEFAULT is -1, default to
+        -fdiagnostics-color=auto if GCC_COLORS is in the environment,
+        otherwise default to -fdiagnostics-color=never, for other
+        values default to that
+        -fdiagnostics-color={never,auto,always}.  */
+      if (DIAGNOSTICS_COLOR_DEFAULT == -1)
+       {
+         if (!getenv ("GCC_COLORS"))
+           return;
+         value = DIAGNOSTICS_COLOR_AUTO;
+       }
+      else
+       value = DIAGNOSTICS_COLOR_DEFAULT;
+    }
+  pp_show_color (context->printer)
+    = colorize_init ((diagnostic_color_rule_t) value);
+}
+
 /* Do any cleaning up required after the last diagnostic is emitted.  */
 
 void
index 64f90a79324a05be14a4d91783f976138a0cd701..81e59880169d72f718f0bf506ff95165e22c0fe1 100644 (file)
@@ -266,6 +266,7 @@ extern diagnostic_context *global_dc;
 
 /* Diagnostic related functions.  */
 extern void diagnostic_initialize (diagnostic_context *, int);
+extern void diagnostic_color_init (diagnostic_context *, int value = -1);
 extern void diagnostic_finish (diagnostic_context *);
 extern void diagnostic_report_current_module (diagnostic_context *, location_t);
 extern void diagnostic_show_locus (diagnostic_context *, const diagnostic_info *);
index 4cb4ba32618e1ea2a19d99297ad0692de29c2c14..a5408a48e5a8d41663f29a8724cba2f30ebe724a 100644 (file)
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -3608,6 +3608,10 @@ driver_handle_option (struct gcc_options *opts,
       save_switch (compare_debug_replacement_opt, 0, NULL, validated, true);
       return true;
 
+    case OPT_fdiagnostics_color_:
+      diagnostic_color_init (dc, value);
+      break;
+
     case OPT_Wa_:
       {
        int prev, j;
@@ -6975,6 +6979,7 @@ driver::global_initializations ()
   gcc_init_libintl ();
 
   diagnostic_initialize (global_dc, 0);
+  diagnostic_color_init (global_dc);
 
 #ifdef GCC_DRIVER_HOST_INITIALIZATION
   /* Perform host dependent initialization when needed.  */
index 80a84f629d252f42ff6be2e69d4e7e44ca9b88a3..bb3898e1fe25d9d8987ac9c87d92df3cb3539214 100644 (file)
@@ -261,6 +261,11 @@ init_options_once (void)
   initial_lang_mask = lang_hooks.option_lang_mask ();
 
   lang_hooks.initialize_diagnostics (global_dc);
+  /* ??? Ideally, we should do this earlier and the FEs will override
+     it if desired (none do it so far).  However, the way the FEs
+     construct their pretty-printers means that all previous settings
+     are overriden.  */
+  diagnostic_color_init (global_dc);
 }
 
 /* Decode command-line options to an array, like
index 564b8dc65c2065180109df25f2b20f84596bc136..1b4f97e28d0d534524b91b18cf314d817fd548eb 100644 (file)
@@ -30,7 +30,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "flags.h"
 #include "params.h"
 #include "diagnostic.h"
-#include "diagnostic-color.h"
 #include "opts-diagnostic.h"
 #include "insn-attr-common.h"
 #include "common/common-target.h"
@@ -1771,8 +1770,7 @@ common_handle_option (struct gcc_options *opts,
       break;
 
     case OPT_fdiagnostics_color_:
-      pp_show_color (dc->printer)
-       = colorize_init ((diagnostic_color_rule_t) value);
+      diagnostic_color_init (dc, value);
       break;
 
     case OPT_fdiagnostics_show_option:
index 911084db375cf24343f992dc2f1b793af3d93c67..04f63df4983cd79cb464f5a185894b21fc4e805d 100644 (file)
@@ -86,7 +86,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "gimple-expr.h"
 #include "gimple.h"
 #include "plugin.h"
-#include "diagnostic-color.h"
 #include "context.h"
 #include "pass_manager.h"
 #include "auto-profile.h"
@@ -1268,29 +1267,6 @@ process_options (void)
 
   maximum_field_alignment = initial_max_fld_align * BITS_PER_UNIT;
 
-  /* If DIAGNOSTICS_COLOR_DEFAULT is -1, default to -fdiagnostics-color=auto
-     if GCC_COLORS is in the environment, otherwise default to
-     -fdiagnostics-color=never, for other values default to that
-     -fdiagnostics-color={never,auto,always}.  */
-  if (!global_options_set.x_flag_diagnostics_show_color)
-    switch ((int) DIAGNOSTICS_COLOR_DEFAULT)
-      {
-      case -1:
-       if (!getenv ("GCC_COLORS"))
-         break;
-       /* FALLTHRU */
-      case DIAGNOSTICS_COLOR_AUTO:
-       pp_show_color (global_dc->printer)
-         = colorize_init (DIAGNOSTICS_COLOR_AUTO);
-       break;
-      case DIAGNOSTICS_COLOR_YES:
-       pp_show_color (global_dc->printer)
-         = colorize_init (DIAGNOSTICS_COLOR_YES);
-       break;
-      default:
-       break;
-      }
-
   /* Allow the front end to perform consistency checks and do further
      initialization based on the command line options.  This hook also
      sets the original filename if appropriate (e.g. foo.i -> foo.c)