This is the mail archive of the gcc@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: [GSOC] LTO dump tool project


Hi,

I have added new command line options:
-no-demangle -> for the default non demangled output
-no-sort -> for the list of symbols in order of their occurrence
-alpha-sort -> for the list of symbols in their alphabetical order
-reverse-sort -> for the list of symbols in reversed order
-defined-only -> for only the defined symbols

for example:

../stage1-build/gcc/lto-dump test_hello.o -fdump-lto-list -alpha-sort
-demangle -defined-only -reverse-sort

will dump

Symbol Table
        Name         Type         Visibility         Size
        main        function        default
        k        variable        default
        foo        function        default
        bar        function        default

It is a reversed alphabetical order of demangled symbol names which
have been defined(hence printf excluded).
Along with this I have also added all previous progress with reference
to symbol table to the new branch.

For further options to add like -size-sort and -print-size I tried to
access size of the symbol with symtab node using
TREE_INT_CST_LOW(DECL_SIZE(node->decl));
but I am unable to do so.
So how should I proceed with it?

Please find the diff file attached herewith. I have also pushed the
changes to the new branch.

Please advise,

Hrishikesh

On Wed, Jun 27, 2018 at 1:15 AM, Hrishikesh Kulkarni
<hrishikeshparag@gmail.com> wrote:
> Hi,
>
> I have created another branch lto-dump-tool-improved as suggested.
> I have applied the patch for separation to lto-dump binary, made a few
> necessary changes in other files and it is running successfully.
> I will keep on adding previous work to this branch incrementally.
>
> Please find the diff file attached for dumping of TREE statistics and
> GIMPLE statistics.
>
> for example:
> (after configuring with --enable-gather-detailed-mem-stats)
> -fdump-lto-gimple-stats will dump
> GIMPLE statements
> Kind                   Stmts      Bytes
> ---------------------------------------
> assignments                0          0
> phi nodes                  0          0
> conditionals               0          0
> everything else            0          0
> ---------------------------------------
> Total                      0          0
> ---------------------------------------
>
> -fdump-lto-tree-stats will dump
>
> Tree Statistics
>
> Kind                   Nodes      Bytes
> ----------------------------------------
> decls                   4327     932672
> types                   1531     257208
> blocks                     0          0
> stmts                      0          0
> refs                       0          0
> exprs                      4        128
> constants                 82       2060
> identifiers             4430     177200
> vecs                      16      28544
> binfos                     0          0
> ssa names                  0          0
> constructors               0          0
> random kinds            7301     291952
> lang_decl kinds            0          0
> lang_type kinds            0          0
> omp clauses                0          0
> ----------------------------------------
> Total                  17691    1689764
>
>
>
> Please advise,
>
> Hrishikesh
>
> On Wed, Jun 27, 2018 at 1:00 AM, Hrishikesh Kulkarni
> <hrishikeshparag@gmail.com> wrote:
>> Hi,
>>
>> I have created another branch lto-dump-tool-improved as suggested.
>> I have applied the patch for separation to lto-dump binary, made a few
>> necessary changes in other files and it is running successfully.
>> I will keep on adding previous work to this branch incrementally.
>>
>> Please find the diff file attached for dumping of TREE statistics and GIMPLE
>> statistics.
>>
>> for example:
>> (after configuring with --enable-gather-detailed-mem-stats)
>> -fdump-lto-gimple-stats will dump
>> GIMPLE statements
>> Kind                   Stmts      Bytes
>> ---------------------------------------
>> assignments                0          0
>> phi nodes                  0          0
>> conditionals               0          0
>> everything else            0          0
>> ---------------------------------------
>> Total                      0          0
>> ---------------------------------------
>>
>> -fdump-lto-tree-stats will dump
>>
>> Tree Statistics
>>
>> Kind                   Nodes      Bytes
>> ----------------------------------------
>> decls                   4327     932672
>> types                   1531     257208
>> blocks                     0          0
>> stmts                      0          0
>> refs                       0          0
>> exprs                      4        128
>> constants                 82       2060
>> identifiers             4430     177200
>> vecs                      16      28544
>> binfos                     0          0
>> ssa names                  0          0
>> constructors               0          0
>> random kinds            7301     291952
>> lang_decl kinds            0          0
>> lang_type kinds            0          0
>> omp clauses                0          0
>> ----------------------------------------
>> Total                  17691    1689764
>>
>>
>>
>> Please advise,
>>
>> Hrishikesh
>>
>>
>> On Fri, Jun 22, 2018 at 2:29 PM, Martin Liška <mliska@suse.cz> wrote:
>>>
>>> On 06/18/2018 10:45 AM, Martin Jambor wrote:
>>> > Hi,
>>> >
>>> > On Sun, Jun 17 2018, Hrishikesh Kulkarni wrote:
>>> >> Hi,
>>> >>
>>> >> I am trying to isolate the dump tool into real lto-dump tool. I have
>>> >> started with the copy&paste of lto.c into lto-dump.c and done the
>>> >> changes to Make-lang.in and config-lang.in suggested by Martin (patch
>>> >> attached). However when I try to build, I get the following error:
>>> >>
>>> >> In file included from ../../gcc/gcc/lto/lto-dump.c:24:0:
>>> >>
>>> >> ../../gcc/gcc/coretypes.h:397:24: fatal error: insn-modes.h: No such
>>> >>
>>> >> file or directory
>>> >>
>>> >> compilation terminated.
>>> >>
>>> >>
>>> >> I am unable to find the missing dependencies and would be grateful for
>>> >> suggestions on how to resolve the issue.
>>> >
>>> > insn-modes.h is one of header files which are generated at build time,
>>> > you will find it in the gcc subdirectory of your build directory (as
>>> > opposed to the source directory).
>>> >
>>> > Martin
>>> >
>>>
>>> Hi.
>>>
>>> There's patch that works for me.
>>> Needed dependency is here:
>>>
>>> +lto/lto-dump.o: $(LTO_EXE)
>>>
>>> It's bit artificial, but for now it works. Please start working
>>> on separation of dump infrastructure to lto-dump.c. You'll need
>>> to factor out common code shared in between lto.c and lto-dump.c.
>>>
>>> Martin
>>
>>
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index ee7ebb4..ebef347 100644
--- a/gcc/cgraph.h
+++ b/gcc/cgraph.h
@@ -109,6 +109,12 @@ public:
   /* Return dump name with assembler name.  */
   const char *dump_asm_name () const;
 
+  /* Return visibility name.  */
+  const char *dump_visibility () const;
+
+  /* Return type_name name.  */
+  const char *dump_type_name () const;
+
   /* Add node into symbol table.  This function is not used directly, but via
      cgraph/varpool node creation routines.  */
   void register_symbol (void);
diff --git a/gcc/lto/lang.opt b/gcc/lto/lang.opt
index a38850a..73342ee 100644
--- a/gcc/lto/lang.opt
+++ b/gcc/lto/lang.opt
@@ -67,6 +67,44 @@ fdump
 LTO Var(flag_lto_dump)
 Call the dump function
 
+fdump-lto-list
+LTO Var(flag_lto_dump_list)
+Call the dump function for variables and function in IL.
+
+fdump-lto-symbol=
+LTO Driver RejectNegative Joined Var(flag_lto_dump_symbol)
+
+demangle
+LTO Var(flag_lto_dump_demangle)
+Dump the demangled output.
+
+no-demangle
+LTO Var(flag_lto_dump_no_demangle)
+Dump the non-demangled output.
+
+defined-only
+LTO Var(flag_lto_dump_defined)
+Dump only the defined symbols.
+
+alpha-sort
+LTO Var(flag_lto_alpha_sort)
+Sort the symbols alphabetically.
+
+size-sort
+LTO Var(flag_lto_size_sort)
+Sort the symbols according to size.
+
+reverse-sort
+LTO Var(flag_lto_reverse_sort)
+Display the symbols in reverse order.
+
+no-sort
+LTO Var(flag_lto_no_sort)
+Display the symbols in order of occurence.
+
+fdump-lto-body=
+LTO Driver RejectNegative Joined Var(flag_lto_dump_body)
+
 fdump-lto-tree-stats
 LTO Var(flag_lto_tree_stats)
 Dump the statistics of trees
diff --git a/gcc/lto/lto-dump.c b/gcc/lto/lto-dump.c
index 8f7fdd9..36a7c04 100644
--- a/gcc/lto/lto-dump.c
+++ b/gcc/lto/lto-dump.c
@@ -56,12 +56,121 @@ along with GCC; see the file COPYING3.  If not see
 #include "attribs.h"
 #include "builtins.h"
 #include "print-tree.h"
+#include "stdio.h"
+#include "tree-cfg.h"
+#include "string.h"
+#include "iostream"
+#include "vector"
 
+class entry
+{
+public:
+	char name[20], type_name[20], visibility[20];
+	int size;
+};
+
+int compare(const void * a, const void * b)
+{
+	entry* ep1 = (entry*)a;
+	entry* ep2 = (entry*)b;
+	if (flag_lto_alpha_sort)
+		return strcmp(ep1->name,ep2->name);
+	else if (flag_lto_size_sort)
+		return ep1->size - ep2->size;
+	else
+		return strcmp(ep1->name,ep2->name);
+}
+
+/* Dump everything.  */
 static void dump()
 {
 	fprintf(stderr, "\nHello World!\n");
 }
 
+/* Dump variables and functions used in IL.  */
+void
+dump_list ()
+{
+	entry e;
+	std::vector <entry> vec;
+	std::vector <entry> :: iterator i;
+	std::vector <entry> :: reverse_iterator ir;
+	fprintf (stderr, "Symbol Table\n");
+    symtab_node *node;
+    fprintf (stderr, "\t\tName \t\tType \t\tVisibility \t\tSize\n");
+	if (!flag_lto_dump_defined)
+	{
+		FOR_EACH_SYMBOL (node)
+		{
+	    if (flag_lto_dump_demangle)
+				strcpy(e.name,node->name());
+		  else if (flag_lto_dump_no_demangle)
+				strcpy(e.name,node->asm_name());
+			else			
+				strcpy(e.name,node->asm_name());
+			strcpy(e.type_name, node->dump_type_name ());
+		  strcpy(e.visibility, node->dump_visibility ());
+			//e.size = TREE_INT_CST_LOW(DECL_SIZE(node->decl));
+			e.size = 0;
+			vec.push_back(e);
+		}
+	}
+	if (flag_lto_dump_defined)
+	{
+		FOR_EACH_DEFINED_SYMBOL (node)
+		{
+	    if (flag_lto_dump_demangle)
+				strcpy(e.name,node->name());
+		  else if (flag_lto_dump_no_demangle)
+				strcpy(e.name,node->asm_name());
+			else			
+				strcpy(e.name,node->asm_name());
+			strcpy(e.type_name, node->dump_type_name ());
+		  strcpy(e.visibility, node->dump_visibility ());
+			//e.size = TREE_INT_CST_LOW(DECL_SIZE(node->decl));
+			e.size = 0;
+			vec.push_back(e);
+		}
+	}
+	if (!flag_lto_no_sort)	
+	qsort(&vec.front(), vec.size(), sizeof(entry), compare);
+	if (!flag_lto_reverse_sort)
+		for (i = vec.begin(); i != vec.end(); ++i)
+    	fprintf(stderr, "\t\t%s\t\t%s\t\t%s\t\t\n",i->name, i->type_name, i->visibility );
+  else
+  	for (ir = vec.rbegin(); ir != vec.rend(); ++ir)
+    	fprintf(stderr, "\t\t%s\t\t%s\t\t%s\t\t\n",ir->name, ir->type_name, ir->visibility );	  
+}
+
+/* Dump specific variables and functions used in IL.  */
+void
+dump_symbol ()
+{
+	symtab_node *node;
+    fprintf (stderr, "Symbol:\t%s\n", flag_lto_dump_symbol);
+	FOR_EACH_SYMBOL (node)
+		if (!strcmp (flag_lto_dump_symbol, node->name ()))
+			node->debug ();
+   // node = symtab->find_symbol_by_name(flag_lto_dump_symbol);
+   //  if (node)
+	  //  node->debug ();
+	  fprintf(stderr, "\n" );
+}
+
+/* Dump gimple body of specific function.  */
+void
+dump_body ()
+{
+	fprintf(stderr, "Gimple body of function: %s\n", flag_lto_dump_body);
+	cgraph_node *cnode;
+	FOR_EACH_FUNCTION (cnode)
+		if (!strcmp (cnode->name (), flag_lto_dump_body))
+		{
+			cnode->get_untransformed_body ();
+			debug_function (cnode->decl, 0);
+		}
+}
+
 /* Number of parallel tasks to run, -1 if we want to use GNU Make jobserver.  */
 static int lto_parallelism;
 
@@ -3368,15 +3477,29 @@ lto_main (void)
 
   if (flag_lto_gimple_stats)
 	  dump_gimple_statistics();
+
   if (flag_lto_tree_stats)
   {
   	fprintf(stderr, "Tree Statistics\n" );
 	dump_tree_statistics();
   }
+
+  /* Dump everything.  */
   if (flag_lto_dump)
-  {
     dump();
-  }
+
+    /* Dump variables and functions used in IL.  */
+  if (flag_lto_dump_list)
+    dump_list ();
+
+  /* Dump specific variables and functions used in IL.  */
+  if (flag_lto_dump_symbol)
+    dump_symbol ();
+
+  /* Dump gimple body of specific function.  */
+  if (flag_lto_dump_body)
+    dump_body ();
+
 
   timevar_stop (TV_PHASE_STREAM_IN);
 
diff --git a/gcc/lto/lto-dump.h b/gcc/lto/lto-dump.h
index 9bc3842..b2199d2 100644
--- a/gcc/lto/lto-dump.h
+++ b/gcc/lto/lto-dump.h
@@ -20,9 +20,8 @@ along with GCC; see the file COPYING3.  If not see
 #ifndef GCC_LTO_DUMP_H_
 #define GCC_LTO_DUMP_H_
 
-void dump();
-
 /* A file.  */
+
 struct lto_file
 {
   /* The name of the file.  */
diff --git a/gcc/symtab.c b/gcc/symtab.c
index c153308..4b8d8e5 100644
--- a/gcc/symtab.c
+++ b/gcc/symtab.c
@@ -808,6 +808,24 @@ symtab_node::dump_referring (FILE *file)
 
 static const char * const symtab_type_names[] = {"symbol", "function", "variable"};
 
+/* Dump the visibility of the symbol.  */
+const char *
+symtab_node::dump_visibility () const
+{
+  static const char * const visibility_types[] = {
+    "default", "protected", "hidden", "internal"
+  };
+
+  return visibility_types[DECL_VISIBILITY (decl)];
+}
+
+/* Dump the type_name of the symbol.  */
+const char *
+symtab_node::dump_type_name () const
+{
+  return symtab_type_names[type];
+}
+
 /* Dump base fields of symtab nodes to F.  Not to be used directly.  */
 
 void
diff --git a/gcc/tree-cfg.h b/gcc/tree-cfg.h
index 73237a6..3e10d15 100644
--- a/gcc/tree-cfg.h
+++ b/gcc/tree-cfg.h
@@ -81,7 +81,7 @@ extern void fold_loop_internal_call (gimple *, tree);
 extern basic_block move_sese_region_to_fn (struct function *, basic_block,
 				           basic_block, tree);
 extern void dump_function_to_file (tree, FILE *, dump_flags_t);
-extern void debug_function (tree, int) ;
+extern void debug_function (tree, dump_flags_t) ;
 extern void print_loops_bb (FILE *, basic_block, int, int);
 extern void print_loops (FILE *, int);
 extern void debug (struct loop &ref);

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