This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Make lto-dump dump symtab callgraph in graphviz format


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.belinassi@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.belinassi@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)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]