Hi,

Thanks for suggestions. I have started incorporating them. As a first:

I have added command line options:
-print-size  to print the size of functions and variables
size of variables is in bits and size of functions is represented as
number of basic blocks.

-print-value  to print the value of initialization of global variables.

-size-sort  to sort the symbol names according to the size.

for example command line options:

 ../stage1-build/gcc/lto-dump test_hello.o -fdump-lto-list -print-size
-print-value -size-sort

the dump is:

Symbol Table
        Name         Type         Visibility        Size     Value

        printf         function        default           0
        main         function        default           3
        foo            function        default           3
        bar            function        default           6

        z               variable        default           8        97
        k               variable        default          32        5
        p               variable        default          32
4.400000095367431640625e+0

I have also tried to make memory allocation dynamic to the best of my knowledge.
I have pushed the changes to the repo. Please find the diff file
attached herewith.

Regards,

Hrishikesh


On Fri, Jun 29, 2018 at 12:55 PM, Martin Liška <mli...@suse.cz> wrote:
> On 06/27/2018 10:06 PM, Hrishikesh Kulkarni wrote:
>> 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
>
> Hi.
>
> Good progress.
>
>>
>> for example:
>>
>> ../stage1-build/gcc/lto-dump test_hello.o -fdump-lto-list -alpha-sort
>> -demangle -defined-only -reverse-sort
>
> Now as you have a separate tool (lto-dump), you can strip 'fdump-lto' prefix
> from the older options.
>
>>
>> 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?
>
> Sent advises via instant messaging.
>
> Martin
>
>>
>> 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
>> <hrishikeshpa...@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
>>> <hrishikeshpa...@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 <mli...@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/lto/lang.opt b/gcc/lto/lang.opt
index 73342ee..23f37a0 100644
--- a/gcc/lto/lang.opt
+++ b/gcc/lto/lang.opt
@@ -86,6 +86,14 @@ defined-only
 LTO Var(flag_lto_dump_defined)
 Dump only the defined symbols.
 
+print-size
+LTO Var(flag_lto_print_size)
+Print the size of the symbols.
+
+print-value
+LTO Var(flag_lto_print_value)
+Print the initial values of the variables.
+
 alpha-sort
 LTO Var(flag_lto_alpha_sort)
 Sort the symbols alphabetically.
@@ -107,11 +115,11 @@ LTO Driver RejectNegative Joined Var(flag_lto_dump_body)
 
 fdump-lto-tree-stats
 LTO Var(flag_lto_tree_stats)
-Dump the statistics of trees
+Dump the statistics of trees.
 
 fdump-lto-gimple-stats
 LTO Var(flag_lto_gimple_stats)
-Dump the statistics of gimple statements
+Dump the statistics of gimple statements.
 
 fresolution=
 LTO Joined
diff --git a/gcc/lto/lto-dump.c b/gcc/lto/lto-dump.c
index 36a7c04..d4c2928 100644
--- a/gcc/lto/lto-dump.c
+++ b/gcc/lto/lto-dump.c
@@ -27,7 +27,9 @@ along with GCC; see the file COPYING3.  If not see
 #include "basic-block.h"
 #include "tree.h"
 #include "gimple.h"
+#include "cfg.h"
 #include "cfghooks.h"
+#include "tree-cfg.h"
 #include "alloc-pool.h"
 #include "tree-pass.h"
 #include "tree-streamer.h"
@@ -56,17 +58,17 @@ 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"
+#include "tree-pretty-print.h"
+#include <map>
+#include <iterator>
+#include <vector>
 
 class entry
 {
 public:
-	char name[20], type_name[20], visibility[20];
+	char *name, *type_name, *visibility;
 	int size;
+	tree value_tree;
 };
 
 int compare(const void * a, const void * b)
@@ -91,44 +93,81 @@ static void dump()
 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)
+  cgraph_node *cnode;
+  varpool_node *vnode;
+  
+  fprintf (stderr, "\t\tName \t\tType \t\tVisibility ");
+  if (flag_lto_print_size)
+	  fprintf(stderr, "\t\tSize ");
+  if (flag_lto_print_value)
+  	fprintf(stderr, "\t\tValue");
+  fprintf(stderr, "\n\n");
+	FOR_EACH_FUNCTION (cnode)
 	{
-		FOR_EACH_SYMBOL (node)
+		entry e;
+		if(!flag_lto_dump_defined || cnode->definition)
 		{
 	    if (flag_lto_dump_demangle)
-				strcpy(e.name,node->name());
+				e.name = xstrdup(cnode->name());
 		  else if (flag_lto_dump_no_demangle)
-				strcpy(e.name,node->asm_name());
+				e.name = xstrdup(cnode->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.name = xstrdup(cnode->asm_name());
+			e.type_name = xstrdup(cnode->dump_type_name ());
+		  e.visibility = xstrdup(cnode->dump_visibility ());
 			e.size = 0;
+		  if (cnode->definition)
+	    {
+	    	cnode->get_untransformed_body ();
+	    	e.size = n_basic_blocks_for_fn(DECL_STRUCT_FUNCTION(cnode->decl));
+	    }
 			vec.push_back(e);
 		}
 	}
-	if (flag_lto_dump_defined)
+	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",i->name, i->type_name, i->visibility );
+			if (flag_lto_print_size)
+				fprintf(stderr, "\t\t%d", i->size);
+			fprintf(stderr, "\n");
+		}
+  else
+  	for (ir = vec.rbegin(); ir != vec.rend(); ++ir)
+  	{
+    	fprintf(stderr, "\t\t%s\t\t%s\t\t%s\n",ir->name, ir->type_name, ir->visibility );	  
+			if (flag_lto_print_size)
+				fprintf(stderr, "\t\t%d\n", ir->size);
+			fprintf(stderr, "\n");
+		}
+  vec.clear();  
+  fprintf(stderr, "\n");
+
+	FOR_EACH_VARIABLE (vnode)
 	{
-		FOR_EACH_DEFINED_SYMBOL (node)
+		entry e;
+  	if(!flag_lto_dump_defined || vnode->definition)
 		{
-	    if (flag_lto_dump_demangle)
-				strcpy(e.name,node->name());
+		  if (flag_lto_dump_demangle)
+				e.name = xstrdup (vnode->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.name = xstrdup (vnode->asm_name());
+			else
+				e.name = xstrdup (vnode->asm_name());
+			e.type_name = xstrdup (vnode->dump_type_name ());
+		  e.visibility = xstrdup (vnode->dump_visibility ());
 			e.size = 0;
+   		if (DECL_SIZE (vnode->decl) && tree_fits_shwi_p (DECL_SIZE (vnode->decl)))
+				e.size = tree_to_shwi (DECL_SIZE (vnode->decl));
+			vnode->get_constructor ();
+			e.value_tree = DECL_INITIAL (vnode->decl);
 			vec.push_back(e);
 		}
 	}
@@ -136,10 +175,26 @@ dump_list ()
 	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 );
+		{
+    	fprintf(stderr, "\t\t%s\t\t%s\t\t%s",i->name, i->type_name, i->visibility );
+      if (flag_lto_print_size)
+				fprintf(stderr, "\t\t%d\t\t", i->size);
+			if (flag_lto_print_value && i->value_tree)
+      	debug_generic_expr (i->value_tree);
+			else
+				fprintf(stderr, "\n");
+		}
   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 );	  
+  	{
+    	fprintf(stderr, "\t\t%s\t\t%s\t\t%s",ir->name, ir->type_name, ir->visibility );	  
+      if (flag_lto_print_size)
+				fprintf(stderr, "\t\t%d\t\t", ir->size);
+			if (flag_lto_print_value && ir->value_tree)
+      	debug_generic_expr (i->value_tree);
+			else
+				fprintf(stderr, "\n");
+		}
 }
 
 /* Dump specific variables and functions used in IL.  */
@@ -151,26 +206,9 @@ 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;
 
@@ -1963,6 +2001,7 @@ lto_read_decls (struct lto_file_decl_data *decl_data, const void *data,
 	  gcc_assert (t && data_in->reader_cache->nodes.length () == from);
 	}
     }
+
   data_in->location_cache.apply_location_cache ();
 
   /* Read in lto_in_decl_state objects.  */
@@ -3475,13 +3514,12 @@ lto_main (void)
      command line.  */
   read_cgraph_and_symbols (num_in_fnames, in_fnames);
 
-  if (flag_lto_gimple_stats)
-	  dump_gimple_statistics();
+  dump_gimple_statistics();
 
   if (flag_lto_tree_stats)
   {
   	fprintf(stderr, "Tree Statistics\n" );
-	dump_tree_statistics();
+		dump_tree_statistics();
   }
 
   /* Dump everything.  */
@@ -3496,11 +3534,6 @@ lto_main (void)
   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);
 
   if (!seen_error ())

Reply via email to