Hi, On 07/01, Martin Jambor wrote: > On Sat, Jun 29 2019, Giuliano Belinassi wrote: > > This patch makes lto-dump dump the symbol table callgraph in graphviz > > format. > > -ENOPATCH Sorry, I forgot the most important. Here it is.
> > Martin > > > > > I've not added any test to this because I couldn't find a way to call > > lto-dump from the testsuite. Also, any feedback with regard to how can > > I improve this is welcome. > > > > gcc/ChangeLog > > 2019-06-29 Giuliano Belinassi <giuliano.belina...@usp.br> > > > > * cgraph.c (dump_graphviz): New function > > * cgraph.h (dump_graphviz): New function > > * symtab.c (dump_graphviz): New function > > * varpool.c (dump_graphviz): New function > > > > gcc/lto/ChangeLog > > 2019-06-29 Giuliano Belinassi <giuliano.belina...@usp.br> > > > > * lang.opt (flag_dump_callgraph): New flag > > * lto-dump.c (dump_symtab_graphviz): New function > > * lto-dump.c (dump_tool_help): New option > > * lto-dump.c (lto_main): New option Giuliano
diff --git gcc/cgraph.c gcc/cgraph.c index 28019aba434..55f4ee0bdaa 100644 --- gcc/cgraph.c +++ gcc/cgraph.c @@ -2204,6 +2204,22 @@ cgraph_node::dump (FILE *f) } } +/* Dump call graph node to file F in graphviz format. */ + +void +cgraph_node::dump_graphviz (FILE *f) +{ + cgraph_edge *edge; + + for (edge = callees; edge; edge = edge->next_callee) + { + cgraph_node *callee = edge->callee; + + fprintf(f, "\t\"%s\" -> \"%s\"\n", name (), callee->name ()); + } +} + + /* Dump call graph node NODE to stderr. */ DEBUG_FUNCTION void diff --git gcc/cgraph.h gcc/cgraph.h index 18839a4a5ec..181c00a3bd8 100644 --- gcc/cgraph.h +++ gcc/cgraph.h @@ -135,6 +135,9 @@ public: /* Dump symtab node to F. */ void dump (FILE *f); + /* Dump symtab callgraph in graphviz format*/ + void dump_graphviz (FILE *f); + /* Dump symtab node to stderr. */ void DEBUG_FUNCTION debug (void); @@ -1106,6 +1109,9 @@ public: /* Dump call graph node to file F. */ void dump (FILE *f); + /* Dump call graph node to file F. */ + void dump_graphviz (FILE *f); + /* Dump call graph node to stderr. */ void DEBUG_FUNCTION debug (void); @@ -1861,6 +1867,9 @@ public: /* Dump given varpool node to F. */ void dump (FILE *f); + /* Dump given varpool node in graphviz format to F. */ + void dump_graphviz (FILE *f); + /* Dump given varpool node to stderr. */ void DEBUG_FUNCTION debug (void); @@ -2279,6 +2288,9 @@ public: /* Dump symbol table to F. */ void dump (FILE *f); + /* Dump symbol table to F in graphviz format. */ + void dump_graphviz (FILE *f); + /* Dump symbol table to stderr. */ void DEBUG_FUNCTION debug (void); diff --git gcc/lto/lang.opt gcc/lto/lang.opt index 5bacef349e3..c62dd5aac08 100644 --- gcc/lto/lang.opt +++ gcc/lto/lang.opt @@ -127,6 +127,9 @@ help LTODump Var(flag_lto_dump_tool_help) Dump the dump tool command line options. +callgraph +LTODump Var(flag_dump_callgraph) +Dump the symtab callgraph. fresolution= LTO Joined diff --git gcc/lto/lto-dump.c gcc/lto/lto-dump.c index 691d109ff34..bc20120f2d5 100644 --- gcc/lto/lto-dump.c +++ gcc/lto/lto-dump.c @@ -197,6 +197,12 @@ void dump_list_variables (void) e->dump (); } +/* Dump symbol table in graphviz format. */ +void dump_symtab_graphviz (void) +{ + symtab->dump_graphviz (stdout); +} + /* Dump symbol list. */ void dump_list (void) @@ -251,26 +257,27 @@ void dump_body () /* List of command line options for dumping. */ void dump_tool_help () { - printf ("Usage: lto-dump [OPTION]... SUB_COMMAND [OPTION]...\n\n"); - printf ("LTO dump tool command line options.\n\n"); - printf (" -list [options] Dump the symbol list.\n"); - printf (" -demangle Dump the demangled output.\n"); - printf (" -defined-only Dump only the defined symbols.\n"); - printf (" -print-value Dump initial values of the " - "variables.\n"); - printf (" -name-sort Sort the symbols alphabetically.\n"); - printf (" -size-sort Sort the symbols according to size.\n"); - printf (" -reverse-sort Dump the symbols in reverse order.\n"); - printf (" -symbol= Dump the details of specific symbol.\n"); - printf (" -objects Dump the details of LTO objects.\n"); - printf (" -type-stats Dump statistics of tree types.\n"); - printf (" -tree-stats Dump statistics of trees.\n"); - printf (" -gimple-stats Dump statistics of gimple " - "statements.\n"); - printf (" -dump-body= Dump the specific gimple body.\n"); - printf (" -dump-level= Deciding the optimization level " - "of body.\n"); - printf (" -help Display the dump tool help.\n"); + const char *msg = + "Usage: lto-dump [OPTION]... SUB_COMMAND [OPTION]...\n\n" + "LTO dump tool command line options.\n\n" + " -list [options] Dump the symbol list.\n" + " -demangle Dump the demangled output.\n" + " -defined-only Dump only the defined symbols.\n" + " -print-value Dump initial values of the variables.\n" + " -name-sort Sort the symbols alphabetically.\n" + " -size-sort Sort the symbols according to size.\n" + " -reverse-sort Dump the symbols in reverse order.\n" + " -symbol= Dump the details of specific symbol.\n" + " -objects Dump the details of LTO objects.\n" + " -callgraph Dump the callgraph in graphviz format.\n" + " -type-stats Dump statistics of tree types.\n" + " -tree-stats Dump statistics of trees.\n" + " -gimple-stats Dump statistics of gimple statements.\n" + " -dump-body= Dump the specific gimple body.\n" + " -dump-level= Deciding the optimization level of body.\n" + " -help Display the dump tool help.\n"; + + fputs(msg, stdout); return; } @@ -344,4 +351,9 @@ lto_main (void) dump_body (); return; } + else if (flag_dump_callgraph) + { + dump_symtab_graphviz (); + return; + } } diff --git gcc/symtab.c gcc/symtab.c index 905ca05e578..13882b40ad3 100644 --- gcc/symtab.c +++ gcc/symtab.c @@ -955,6 +955,15 @@ symtab_node::dump (FILE *f) vnode->dump (f); } +void +symtab_node::dump_graphviz (FILE *f) +{ + if (cgraph_node *cnode = dyn_cast <cgraph_node *> (this)) + cnode->dump_graphviz (f); + else if (varpool_node *vnode = dyn_cast <varpool_node *> (this)) + vnode->dump_graphviz (f); +} + void symbol_table::dump (FILE *f) { @@ -964,6 +973,16 @@ symbol_table::dump (FILE *f) node->dump (f); } +void +symbol_table::dump_graphviz (FILE *f) +{ + symtab_node *node; + fprintf (f, "digraph symtab {\n"); + FOR_EACH_SYMBOL (node) + node->dump_graphviz (f); + fprintf (f, "}\n"); +} + DEBUG_FUNCTION void symbol_table::debug (void) { diff --git gcc/varpool.c gcc/varpool.c index 8e5a9372656..645236293f5 100644 --- gcc/varpool.c +++ gcc/varpool.c @@ -237,6 +237,12 @@ varpool_node::dump (FILE *f) fprintf (f, "\n"); } +/* Dump given varpool node to F in graphviz format. */ +void +varpool_node::dump_graphviz (FILE *f) +{ + return; +} /* Dump given varpool node to stderr. */ void varpool_node::debug (void)