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]

Per-varray statistics


Hi,
as discussed earlier, this patch implements the statistics about each
varray so we know the worst offenders to shot first.

Honza

	* varray.c:  Include hashtab.h
	(varray_descriptor): New structure.
	(hash_descriptor, eq_descriptor, varray_descriptor,
	print_statistics): New static functions
	(varray_init, varray_grow): Update statistics
	(dump_varray_statistics): New function.
	* varray.h (dump_varray_statistics): Declare.
	* toplev.c (finalize): Call it.
Index: varray.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/varray.c,v
retrieving revision 1.24
diff -c -3 -p -r1.24 varray.c
*** varray.c	16 Jan 2004 07:28:11 -0000	1.24
--- varray.c	20 Jan 2004 19:26:27 -0000
***************
*** 27,35 ****
--- 27,86 ----
  #include "tm.h"
  #include "varray.h"
  #include "ggc.h"
+ #include "hashtab.h"
  
  #define VARRAY_HDR_SIZE (sizeof (struct varray_head_tag) - sizeof (varray_data))
  
+ #ifdef GATHER_STATISTICS
+ 
+ /* Store infromation about each particular varray.  */
+ struct varray_descriptor
+ {
+   const char *name;
+   int allocated;
+   int created;
+   int resized;
+   int copied;
+ };
+ 
+ /* Hashtable mapping varray names to descriptors.  */
+ static htab_t varray_hash;
+ 
+ /* Hashtable helpers.  */
+ static hashval_t
+ hash_descriptor (const void *p)
+ {
+   const struct varray_descriptor *d = p;
+   return htab_hash_pointer (d->name);
+ }
+ static int
+ eq_descriptor (const void *p1, const void *p2)
+ {
+   const struct varray_descriptor *d = p1;
+   return d->name == p2;
+ }
+ 
+ /* For given name, return descriptor, create new if needed.  */
+ static struct varray_descriptor *
+ varray_descriptor (const char *name)
+ {
+   struct varray_descriptor **slot;
+ 
+   if (!varray_hash)
+     varray_hash = htab_create (10, hash_descriptor, eq_descriptor, NULL);
+ 
+   slot = (struct varray_descriptor **)
+     htab_find_slot_with_hash (varray_hash, name,
+ 		    	      htab_hash_pointer (name),
+ 			      1);
+   if (*slot)
+     return *slot;
+   *slot = xcalloc (sizeof (**slot), 1);
+   (*slot)->name = name;
+   return *slot;
+ }
+ #endif
+ 
  /* Do not add any more non-GC items here.  Please either remove or GC
     those items that are not GCed.  */
  
*************** varray_init (size_t num_elements, enum v
*** 67,72 ****
--- 118,129 ----
  {
    size_t data_size = num_elements * element[element_kind].size;
    varray_type ptr;
+ #ifdef GATHER_STATISTICS
+   struct varray_descriptor *desc = varray_descriptor (name);
+ 
+   desc->created++;
+   desc->allocated += data_size + VARRAY_HDR_SIZE;
+ #endif
    if (element[element_kind].uses_ggc)
      ptr = ggc_alloc_cleared (VARRAY_HDR_SIZE + data_size);
    else
*************** varray_type
*** 85,96 ****
  varray_grow (varray_type va, size_t n)
  {
    size_t old_elements = va->num_elements;
- 
    if (n != old_elements)
      {
        size_t elem_size = element[va->type].size;
        size_t old_data_size = old_elements * elem_size;
        size_t data_size = n * elem_size;
  
        if (element[va->type].uses_ggc)
  	va = ggc_realloc (va, VARRAY_HDR_SIZE + data_size);
--- 142,161 ----
  varray_grow (varray_type va, size_t n)
  {
    size_t old_elements = va->num_elements;
    if (n != old_elements)
      {
        size_t elem_size = element[va->type].size;
        size_t old_data_size = old_elements * elem_size;
        size_t data_size = n * elem_size;
+ #ifdef GATHER_STATISTICS
+       struct varray_descriptor *desc = varray_descriptor (va->name);
+       varray_type oldva = va;
+ 
+       if (data_size > old_data_size)
+         desc->allocated += data_size - old_data_size;
+       desc->resized ++;
+ #endif
+ 
  
        if (element[va->type].uses_ggc)
  	va = ggc_realloc (va, VARRAY_HDR_SIZE + data_size);
*************** varray_grow (varray_type va, size_t n)
*** 99,104 ****
--- 164,173 ----
        va->num_elements = n;
        if (n > old_elements)
  	memset (&va->data.c[old_data_size], 0, data_size - old_data_size);
+ #ifdef GATHER_STATISTICS
+       if (oldva != va)
+         desc->copied++;
+ #endif
      }
  
    return va;
*************** varray_underflow (varray_type va, const 
*** 137,139 ****
--- 206,248 ----
  }
  
  #endif
+ 
+ /* Output per-varray statistics.  */
+ #ifdef GATHER_STATISTICS
+ struct output_info
+ {
+   int count;
+   int size;
+ };
+ static int
+ print_statistics (void **slot, void *b)
+ {
+   struct varray_descriptor *d = (struct varray_descriptor *) *slot;
+   struct output_info *i = (struct output_info *) b;
+ 
+   if (d->allocated)
+     {
+       fprintf (stderr, "%-21s %6d %10d %7d %7d\n", d->name,
+ 	       d->created, d->allocated, d->resized, d->copied);
+       i->size += d->allocated;
+       i->count += d->created;
+     }
+   return 1;
+ }
+ #endif
+ void dump_varray_statistics (void)
+ {
+ #ifdef GATHER_STATISTICS
+   struct output_info info;
+ 
+   fprintf (stderr, "\nVARRAY Kind            Count      Bytes  Resized copied\n");
+   fprintf (stderr, "-------------------------------------------------------\n");
+   info.count = 0;
+   info.size = 0;
+   htab_traverse (varray_hash, print_statistics, &info);
+   fprintf (stderr, "-------------------------------------------------------\n");
+   fprintf (stderr, "%-20s %7d %10d\n",
+ 	   "Total", info.count, info.size);
+   fprintf (stderr, "-------------------------------------------------------\n");
+ #endif
+ }
Index: varray.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/varray.h,v
retrieving revision 1.33
diff -c -3 -p -r1.33 varray.h
*** varray.h	13 Jan 2004 02:43:16 -0000	1.33
--- varray.h	20 Jan 2004 19:26:28 -0000
*************** extern varray_type varray_grow (varray_t
*** 223,228 ****
--- 223,230 ----
  
  extern void varray_clear (varray_type);
  
+ extern void dump_varray_statistics (void);
+ 
  /* Check for VARRAY_xxx macros being in bound.  */
  #if defined ENABLE_CHECKING && (GCC_VERSION >= 2007)
  extern void varray_check_failed (varray_type, size_t, const char *, int,
Index: toplev.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/toplev.c,v
retrieving revision 1.865
diff -c -3 -p -r1.865 toplev.c
*** toplev.c	17 Jan 2004 12:28:57 -0000	1.865
--- toplev.c	20 Jan 2004 19:26:42 -0000
*************** finalize (void)
*** 4583,4588 ****
--- 4583,4589 ----
        stringpool_statistics ();
        dump_tree_statistics ();
        dump_rtx_statistics ();
+       dump_varray_statistics ();
      }
  
    /* Free up memory for the benefit of leak detectors.  */


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