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.

From-SVN: r236080
This commit is contained in:
David Malcolm 2016-05-10 13:28:41 +00:00 committed by David Malcolm
parent 4a3255dd43
commit f3352cabb8
7 changed files with 69 additions and 0 deletions

View 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

View 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

View 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

View 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

View 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 "" } */

View 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 "" } */

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