Patchwork get an order number on -fdump-tree-all

login
register
mail settings
Submitter Pierre Vittet
Date March 23, 2011, 5:10 p.m.
Message ID <4D8A2990.2010402@pvittet.com>
Download mbox | patch
Permalink /patch/88108/
State New
Headers show

Comments

Pierre Vittet - March 23, 2011, 5:10 p.m.
Hello,

When we use fdump-tree-all, we get the dump file, however there is no 
way to know in which order the pass was executed.
We can use gdb with a breakpoint at the good position (something like 
execute_one_pass), however this solution is not satisfiying for plugin 
devellopers for exemple.
There is a number in the name of the dumpped file but from what I know 
it is a static number related to the pass but it has nothing to do with 
the order in which it is executed.

I would enjoy to have a number, giving the pass position, something like :

1.cfile.c.XXXt.pass

I have make a small change in tree-dump.c in order to have this working 
with -fdump-tree-all (patch file in attachment)

The drawback is that, as the pass is called for each function, we get a 
different file for each function, while it was written in the same file 
previously.


I am also surprized to see that the function print_current_pass is only 
called on a fail and that debug_pass doesn't appear to be called at all. 
Maybe in DEBUG, or at least with an f*_dump_all, we could print the 
order of the pass.

thanks

Pierre Vittet

Patch

Index: gcc/tree-dump.c
===================================================================
--- gcc/tree-dump.c	(revision 171340)
+++ gcc/tree-dump.c	(working copy)
@@ -925,21 +925,35 @@ 
   struct dump_file_info *dfi;
   FILE *stream;
 
+  /*allow to know how many pass have already been explored*/
+  static int nb_explored_pass = 0;
+  /*add to the name a position at which the pass is explored*/
+  char * name_with_pass_pos;    
+  int name_with_pass_pos_size;
+ 
   if (phase == TDI_none || !dump_enabled_p (phase))
     return NULL;
 
   name = get_dump_file_name (phase);
+  name_with_pass_pos_size=sizeof(char)*strlen(name)+ sizeof(nb_explored_pass)+1;
+  name_with_pass_pos= (char*) xmalloc(name_with_pass_pos_size);
+
+  snprintf (name_with_pass_pos, name_with_pass_pos_size, "%d.%s", nb_explored_pass, name);
   dfi = get_dump_file_info (phase);
-  stream = fopen (name, dfi->state < 0 ? "w" : "a");
+  stream = fopen (name_with_pass_pos, dfi->state < 0 ? "w" : "a");
+
   if (!stream)
     error ("could not open dump file %qs: %m", name);
   else
     dfi->state = 1;
   free (name);
+  free (name_with_pass_pos);
 
   if (flag_ptr)
     *flag_ptr = dfi->flags;
 
+  nb_explored_pass++;
+
   return stream;
 }