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. */