Add debugging ruler to diagnostic-show-locus.c
authorDavid Malcolm <dmalcolm@redhat.com>
Tue, 10 May 2016 13:28:41 +0000 (13:28 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Tue, 10 May 2016 13:28:41 +0000 (13:28 +0000)
When debugging diagnostic-show-locus.c, it's invaluable to have a
"ruler" showing column numbers.

This patch adds in support via a new "show_ruler_p" flag within
the diagnostic_context.  There's no direct way for end-users to enable
this, but plugins can enable it by setting the flag, so the
plugin that tests the diagnostic subsystem uses this to verify that
the ruler is correctly printed.

gcc/ChangeLog:
* diagnostic-show-locus.c (layout::layout): Call show_ruler
if show_ruler_p was set on the context.
(layout::show_ruler): New method.
* diagnostic.h (struct diagnostic_context): Add field
"show_ruler_p".

gcc/testsuite/ChangeLog:
* gcc.dg/plugin/diagnostic-test-show-locus-bw.c
(test_very_wide_line): Add ruler to expected output.
* gcc.dg/plugin/diagnostic-test-show-locus-color.c
(test_very_wide_line): Likewise.
* gcc.dg/plugin/diagnostic_plugin_test_show_locus.c
(test_show_locus): Within the handling of "test_very_wide_line",
enable show_ruler_p on the diagnostic context.

From-SVN: r236080

gcc/ChangeLog
gcc/diagnostic-show-locus.c
gcc/diagnostic.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw.c
gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-color.c
gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.c

index fa3473d88cb1584eeec51b396cebe84e20586027..cab5f40aef0fa4c2efa733ff8121e2ea2cafd034 100644 (file)
@@ -1,3 +1,11 @@
+2016-05-10  David Malcolm  <dmalcolm@redhat.com>
+
+       * diagnostic-show-locus.c (layout::layout): Call show_ruler
+       if show_ruler_p was set on the context.
+       (layout::show_ruler): New method.
+       * diagnostic.h (struct diagnostic_context): Add field
+       "show_ruler_p".
+
 2016-05-10  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/71039
index bf956661252e63825ab97ef6082de1468b4f9c28..eeccee517160112435192fd722e9fff83eece3f3 100644 (file)
@@ -199,6 +199,8 @@ class layout
   void print_annotation_line (int row, const line_bounds lbounds);
   void print_any_fixits (int row, const rich_location *richloc);
 
+  void show_ruler (int max_column) const;
+
  private:
   void calculate_line_spans ();
 
@@ -653,6 +655,9 @@ layout::layout (diagnostic_context * context,
        m_x_offset = column - right_margin;
       gcc_assert (m_x_offset >= 0);
     }
+
+  if (context->show_ruler_p)
+    show_ruler (m_x_offset + max_width);
 }
 
 /* Return true iff we should print a heading when starting the
@@ -1084,6 +1089,40 @@ layout::move_to_column (int *column, int dest_column)
     }
 }
 
+/* For debugging layout issues, render a ruler giving column numbers
+   (after the 1-column indent).  */
+
+void
+layout::show_ruler (int max_column) const
+{
+  /* Hundreds.  */
+  if (max_column > 99)
+    {
+      pp_space (m_pp);
+      for (int column = 1 + m_x_offset; column <= max_column; column++)
+       if (0 == column % 10)
+         pp_character (m_pp, '0' + (column / 100) % 10);
+       else
+         pp_space (m_pp);
+      pp_newline (m_pp);
+    }
+
+  /* Tens.  */
+  pp_space (m_pp);
+  for (int column = 1 + m_x_offset; column <= max_column; column++)
+    if (0 == column % 10)
+      pp_character (m_pp, '0' + (column / 10) % 10);
+    else
+      pp_space (m_pp);
+  pp_newline (m_pp);
+
+  /* Units.  */
+  pp_space (m_pp);
+  for (int column = 1 + m_x_offset; column <= max_column; column++)
+    pp_character (m_pp, '0' + (column % 10));
+  pp_newline (m_pp);
+}
+
 } /* End of anonymous namespace.  */
 
 /* Print the physical source code corresponding to the location of
index ff5735770849b4a8bedaea52254013225e84d81a..48ae50d68796975a48ac71aef8c8fd16a3826411 100644 (file)
@@ -201,6 +201,10 @@ struct diagnostic_context
      source code (to avoid e.g. colorizing just the first character in
      a token, which would look strange).  */
   bool colorize_source_p;
+
+  /* Usable by plugins; if true, print a debugging ruler above the
+     source output.  */
+  bool show_ruler_p;
 };
 
 static inline void
index 1ab0fce238acf702cd193063e2a1ffb31006c170..c1a2135bfb5c2db52a36bd9cea31a9afffd15a1a 100644 (file)
@@ -1,3 +1,13 @@
+2016-05-10  David Malcolm  <dmalcolm@redhat.com>
+
+       * gcc.dg/plugin/diagnostic-test-show-locus-bw.c
+       (test_very_wide_line): Add ruler to expected output.
+       * gcc.dg/plugin/diagnostic-test-show-locus-color.c
+       (test_very_wide_line): Likewise.
+       * gcc.dg/plugin/diagnostic_plugin_test_show_locus.c
+       (test_show_locus): Within the handling of "test_very_wide_line",
+       enable show_ruler_p on the diagnostic context.
+
 2016-05-10  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/71039
index 8d44078a29dea2cc167a417ebb57916de5c34a36..2748fa1f280d46a1e2cb8d35298b379540b475a9 100644 (file)
@@ -117,6 +117,9 @@ void test_very_wide_line (void)
 #if 0
                                                                                 float f = foo * bar; /* { dg-warning "95: test" } */
 /* { dg-begin-multiline-output "" }
+     0         0         0         0         0         0         1     
+     4         5         6         7         8         9         0     
+ 6789012345678901234567890123456789012345678901234567890123456789012345
                                               float f = foo * bar;
                                                         ~~~~^~~~~
    { dg-end-multiline-output "" } */
index a59025870a6da38bed450df95656c0d3647f2ea7..ff2f4d45c8547034f0e72667caf87db6eb77bccf 100644 (file)
@@ -117,6 +117,9 @@ void test_very_wide_line (void)
 #if 0
                                                                                 float f = foo * bar; /* { dg-warning "95: test" } */
 /* { dg-begin-multiline-output "" }
+     0         0         0         0         0         0         1     
+     4         5         6         7         8         9         0     
+ 6789012345678901234567890123456789012345678901234567890123456789012345
                                               float f = \e[01;35m\e[Kfoo * bar\e[m\e[K;
                                                         \e[01;35m\e[K~~~~^~~~~\e[m\e[K
    { dg-end-multiline-output "" } */
index 95078ce2f2b40639bda56194716efd0e02e44243..a5f8f0cee9374f4630315e8a18d1b3d98519a13a 100644 (file)
@@ -234,9 +234,11 @@ test_show_locus (function *fun)
   if (0 == strcmp (fnname, "test_very_wide_line"))
     {
       const int line = fnstart_line + 2;
+      global_dc->show_ruler_p = true;
       warning_at (make_location (get_loc (line, 94), get_loc (line, 90),
                                 get_loc (line, 98)),
                  0, "test");
+      global_dc->show_ruler_p = false;
     }
 
   /* Example of multiple carets.  */