From abf93a25eaaf3b72cefe41565f6cd319dbffcc4b Mon Sep 17 00:00:00 2001 From: dmalcolm Date: Tue, 10 May 2016 13:28:41 +0000 Subject: [PATCH] Add debugging ruler to diagnostic-show-locus.c 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@236080 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 8 +++++ gcc/diagnostic-show-locus.c | 39 ++++++++++++++++++++++ gcc/diagnostic.h | 4 +++ gcc/testsuite/ChangeLog | 10 ++++++ .../gcc.dg/plugin/diagnostic-test-show-locus-bw.c | 3 ++ .../plugin/diagnostic-test-show-locus-color.c | 3 ++ .../plugin/diagnostic_plugin_test_show_locus.c | 2 ++ 7 files changed, 69 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fa3473d88cb..cab5f40aef0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2016-05-10 David Malcolm + + * 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 PR tree-optimization/71039 diff --git a/gcc/diagnostic-show-locus.c b/gcc/diagnostic-show-locus.c index bf956661252..eeccee51716 100644 --- a/gcc/diagnostic-show-locus.c +++ b/gcc/diagnostic-show-locus.c @@ -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 diff --git a/gcc/diagnostic.h b/gcc/diagnostic.h index ff573577084..48ae50d6879 100644 --- a/gcc/diagnostic.h +++ b/gcc/diagnostic.h @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1ab0fce238a..c1a2135bfb5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2016-05-10 David Malcolm + + * 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 PR tree-optimization/71039 diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw.c b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw.c index 8d44078a29d..2748fa1f280 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw.c +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw.c @@ -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 "" } */ diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-color.c b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-color.c index a59025870a6..ff2f4d45c85 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-color.c +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-color.c @@ -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 "" } */ diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.c b/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.c index 95078ce2f2b..a5f8f0cee93 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.c +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.c @@ -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. */ -- 2.11.4.GIT