From 718930c0c8f8d25d185cb65e38c79a19458b6628 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Fri, 20 Dec 2019 13:29:56 -0500 Subject: [PATCH] analyzer: ensure .dot output is valid for an empty BB 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 ...
... in label of node node_10 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/ChangeLog | 5 +++++ gcc/analyzer/supergraph.cc | 16 ++++++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/analyzer/dot-output.c | 16 ++++++++++++++++ 4 files changed, 42 insertions(+) diff --git a/gcc/analyzer/ChangeLog b/gcc/analyzer/ChangeLog index 2f91cd116e2..08c16b70128 100644 --- a/gcc/analyzer/ChangeLog +++ b/gcc/analyzer/ChangeLog @@ -1,3 +1,8 @@ +2020-01-14 David Malcolm + + * supergraph.cc (supernode::dump_dot): Ensure that the TABLE + element has at least one TR. + 2020-01-14 David Malcolm PR analyzer/58237 diff --git a/gcc/analyzer/supergraph.cc b/gcc/analyzer/supergraph.cc index fd905ea05f4..1dcc2742568 100644 --- a/gcc/analyzer/supergraph.cc +++ b/gcc/analyzer/supergraph.cc @@ -450,6 +450,8 @@ supernode::dump_dot (graphviz_out *gv, const dump_args_t &args) const pp_string (pp, ""); pp_write_text_to_stream (pp); + bool had_row = false; + if (m_returning_call) { gv->begin_tr (); @@ -464,18 +466,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, ""); pp_newline (pp); + had_row = true; } if (return_p ()) { pp_string (pp, ""); pp_newline (pp); + had_row = true; } /* Phi nodes. */ @@ -492,6 +498,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. */ @@ -508,6 +515,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, ""); + pp_newline (pp); } pp_string (pp, "
ENTRY
EXIT
(empty)
>];\n\n"); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ac0cd2dd67f..135dae08078 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-01-14 David Malcolm + + * gcc.dg/analyzer/dot-output.c: Add test coverage for a BB with + no statements. + 2020-01-14 David Malcolm PR analyzer/58237 diff --git a/gcc/testsuite/gcc.dg/analyzer/dot-output.c b/gcc/testsuite/gcc.dg/analyzer/dot-output.c index 586e14421e0..25cb31f2d89 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.30.2