aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/diagnostic-show-locus.c39
-rw-r--r--gcc/diagnostic.h4
-rw-r--r--gcc/testsuite/ChangeLog10
-rw-r--r--gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw.c3
-rw-r--r--gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-color.c3
-rw-r--r--gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.c2
7 files changed, 69 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fa3473d..cab5f40 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/diagnostic-show-locus.c b/gcc/diagnostic-show-locus.c
index bf95666..eeccee5 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 ff57357..48ae50d 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 1ab0fce..c1a2135 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
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 8d44078..2748fa1 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 a590258..ff2f4d4 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 95078ce..a5f8f0c 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. */