This patch fixes an issue with the output of -fdump-analyzer-supergraph on BBs with no statements, where the resulting files were unreadable by dot e.g.:
Error: syntax error in line 1 ... <TABLE BORDER="0"></TABLE> ... in label of node node_10 Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu. Pushed to the dmalcolm/analyzer branch on the GCC git mirror. gcc/analyzer/ChangeLog: * supergraph.cc (supernode::dump_dot): Ensure that the TABLE element has at least one TR. gcc/testsuite/ChangeLog: * gcc.dg/analyzer/dot-output.c: Add test coverage for a BB with no statements. --- gcc/analyzer/supergraph.cc | 16 ++++++++++++++++ gcc/testsuite/gcc.dg/analyzer/dot-output.c | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/gcc/analyzer/supergraph.cc b/gcc/analyzer/supergraph.cc index ba7f7c6d2994..dc20a0234cb6 100644 --- a/gcc/analyzer/supergraph.cc +++ b/gcc/analyzer/supergraph.cc @@ -444,6 +444,8 @@ supernode::dump_dot (graphviz_out *gv, const dump_args_t &args) const pp_string (pp, "<TABLE BORDER=\"0\">"); pp_write_text_to_stream (pp); + bool had_row = false; + if (m_returning_call) { gv->begin_tr (); @@ -458,18 +460,22 @@ supernode::dump_dot (graphviz_out *gv, const dump_args_t &args) const if (args.m_node_annotator) args.m_node_annotator->add_stmt_annotations (gv, m_returning_call); pp_newline (pp); + + had_row = true; } if (entry_p ()) { pp_string (pp, "<TR><TD>ENTRY</TD></TR>"); pp_newline (pp); + had_row = true; } if (return_p ()) { pp_string (pp, "<TR><TD>EXIT</TD></TR>"); pp_newline (pp); + had_row = true; } /* Phi nodes. */ @@ -486,6 +492,7 @@ supernode::dump_dot (graphviz_out *gv, const dump_args_t &args) const args.m_node_annotator->add_stmt_annotations (gv, stmt); pp_newline (pp); + had_row = true; } /* Statements. */ @@ -502,6 +509,15 @@ supernode::dump_dot (graphviz_out *gv, const dump_args_t &args) const args.m_node_annotator->add_stmt_annotations (gv, stmt); pp_newline (pp); + had_row = true; + } + + /* Graphviz requires a TABLE element to have at least one TR + (and each TR to have at least one TD). */ + if (!had_row) + { + pp_string (pp, "<TR><TD>(empty)</TD></TR>"); + pp_newline (pp); } pp_string (pp, "</TABLE>>];\n\n"); diff --git a/gcc/testsuite/gcc.dg/analyzer/dot-output.c b/gcc/testsuite/gcc.dg/analyzer/dot-output.c index 586e14421e0e..25cb31f2d894 100644 --- a/gcc/testsuite/gcc.dg/analyzer/dot-output.c +++ b/gcc/testsuite/gcc.dg/analyzer/dot-output.c @@ -27,6 +27,22 @@ int *test (int *buf, int n, int *out) return result; } +/* Test that we can generate valid .dot files given a BB with no + statements. */ +extern int func (); +int test_2 (void) +{ + int c1; + do + { + c1 = func (); + if (c1 == '\0') + break; + } + while (c1); + return c1; +} + /* { dg-final { dg-check-dot "dot-output.c.callgraph.dot" } } */ /* { dg-final { dg-check-dot "dot-output.c.eg.dot" } } */ /* { dg-final { dg-check-dot "dot-output.c.state-purge.dot" } } */ -- 2.21.0