statistics.h (ALONE_PASS_MEM_STAT, [...]): New macros.

* statistics.h (ALONE_PASS_MEM_STAT, ALONE_MEM_STAT_INFO,
	ALONE_MEM_STAT_DECL): New macros.
	* bitmap.h: Include statistics.h
	(struct bitmap_head_def): Add variant with pointer to bitmap descriptor.
	(bitmap_initialize_stat): Rename from bitmap_initialize; add statistics.
	(bitmap_obstack_alloc_stat, bitmap_gc_alloc_stat): Declare.
	* bitmap.c: Include hashtab.h
	(bitmap_descriptor): New.
	(bitmap_hash): New static variable
	(hash_descriptor, eq_descriptor, bitmap_descriptor, register_overhead):
	New static functions.
	(bitmap_register): New.
	(bitmap_element_free, bitmap_element_allocate, bitmap_elt_clear_from,
	bitmap_obstack_release): Do accounting.
	(bitmap_obstack_alloc_stat): Rename from bitmap_obstack_alloc ; do
	accounting.
	(bitmap_gc_alloc_stat): Likewise.
	(bitmap_obstack_free, bitmap_find_bit): Do statictics.
	(print_statistics, dump_bitmap_statistics): New functions.
	* toplev.c (finalize): Dump bitmap statistics.

From-SVN: r119573
This commit is contained in:
Jan Hubicka 2006-12-06 02:37:38 +01:00 committed by Jan Hubicka
parent 2372a06257
commit f75709c6f8
5 changed files with 236 additions and 9 deletions

View File

@ -1,3 +1,26 @@
2006-12-06 Jan Hubicka <jh@suse.cz>
* statistics.h (ALONE_PASS_MEM_STAT, ALONE_MEM_STAT_INFO,
ALONE_MEM_STAT_DECL): New macros.
* bitmap.h: Include statistics.h
(struct bitmap_head_def): Add variant with pointer to bitmap descriptor.
(bitmap_initialize_stat): Rename from bitmap_initialize; add statistics.
(bitmap_obstack_alloc_stat, bitmap_gc_alloc_stat): Declare.
* bitmap.c: Include hashtab.h
(bitmap_descriptor): New.
(bitmap_hash): New static variable
(hash_descriptor, eq_descriptor, bitmap_descriptor, register_overhead):
New static functions.
(bitmap_register): New.
(bitmap_element_free, bitmap_element_allocate, bitmap_elt_clear_from,
bitmap_obstack_release): Do accounting.
(bitmap_obstack_alloc_stat): Rename from bitmap_obstack_alloc ; do
accounting.
(bitmap_gc_alloc_stat): Likewise.
(bitmap_obstack_free, bitmap_find_bit): Do statictics.
(print_statistics, dump_bitmap_statistics): New functions.
* toplev.c (finalize): Dump bitmap statistics.
2006-12-06 Bernd Schmidt <bernd.schmidt@analog.com>
* reload1.c (delete_output_reload): Count occurrences in

View File

@ -28,6 +28,94 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
#include "obstack.h"
#include "ggc.h"
#include "bitmap.h"
#include "hashtab.h"
#ifdef GATHER_STATISTICS
/* Store information about each particular bitmap. */
struct bitmap_descriptor
{
const char *function;
const char *file;
int line;
int allocated;
int created;
int peak;
int current;
int nsearches;
};
/* Hashtable mapping bitmap names to descriptors. */
static htab_t bitmap_desc_hash;
/* Hashtable helpers. */
static hashval_t
hash_descriptor (const void *p)
{
const struct bitmap_descriptor *d = p;
return htab_hash_pointer (d->file) + d->line;
}
struct loc
{
const char *file;
const char *function;
int line;
};
static int
eq_descriptor (const void *p1, const void *p2)
{
const struct bitmap_descriptor *d = p1;
const struct loc *l = p2;
return d->file == l->file && d->function == l->function && d->line == l->line;
}
/* For given file and line, return descriptor, create new if needed. */
static struct bitmap_descriptor *
bitmap_descriptor (const char *file, const char *function, int line)
{
struct bitmap_descriptor **slot;
struct loc loc;
loc.file = file;
loc.function = function;
loc.line = line;
if (!bitmap_desc_hash)
bitmap_desc_hash = htab_create (10, hash_descriptor, eq_descriptor, NULL);
slot = (struct bitmap_descriptor **)
htab_find_slot_with_hash (bitmap_desc_hash, &loc,
htab_hash_pointer (file) + line,
1);
if (*slot)
return *slot;
*slot = xcalloc (sizeof (**slot), 1);
(*slot)->file = file;
(*slot)->function = function;
(*slot)->line = line;
return *slot;
}
/* Register new bitmap. */
void
bitmap_register (bitmap b MEM_STAT_DECL)
{
b->desc = bitmap_descriptor (_loc_name, _loc_function, _loc_line);
b->desc->created++;
}
/* Account the overhead. */
static void
register_overhead (bitmap b, int amount)
{
b->desc->current += amount;
if (amount > 0)
b->desc->allocated += amount;
gcc_assert (b->desc->current >= 0);
if (b->desc->peak < b->desc->current)
b->desc->peak = b->desc->current;
}
#endif
/* Global data */
bitmap_element bitmap_zero_bits; /* An element of all zero bits. */
@ -92,6 +180,9 @@ bitmap_element_free (bitmap head, bitmap_element *elt)
else
head->indx = 0;
}
#ifdef GATHER_STATISTICS
register_overhead (head, -((int)sizeof (bitmap_element)));
#endif
bitmap_elem_to_freelist (head, elt);
}
@ -139,6 +230,9 @@ bitmap_element_allocate (bitmap head)
element = GGC_NEW (bitmap_element);
}
#ifdef GATHER_STATISTICS
register_overhead (head, sizeof (bitmap_element));
#endif
memset (element->bits, 0, sizeof (element->bits));
return element;
@ -151,8 +245,17 @@ bitmap_elt_clear_from (bitmap head, bitmap_element *elt)
{
bitmap_element *prev;
bitmap_obstack *bit_obstack = head->obstack;
#ifdef GATHER_STATISTICS
int n;
#endif
if (!elt) return;
#ifdef GATHER_STATISTICS
n = 0;
for (prev = elt; prev; prev = prev->next)
n++;
register_overhead (head, -sizeof (bitmap_element) * n);
#endif
prev = elt->prev;
if (prev)
@ -232,7 +335,7 @@ bitmap_obstack_release (bitmap_obstack *bit_obstack)
it on the default bitmap obstack. */
bitmap
bitmap_obstack_alloc (bitmap_obstack *bit_obstack)
bitmap_obstack_alloc_stat (bitmap_obstack *bit_obstack MEM_STAT_DECL)
{
bitmap map;
@ -243,7 +346,10 @@ bitmap_obstack_alloc (bitmap_obstack *bit_obstack)
bit_obstack->heads = (void *)map->first;
else
map = XOBNEW (&bit_obstack->obstack, bitmap_head);
bitmap_initialize (map, bit_obstack);
bitmap_initialize_stat (map, bit_obstack PASS_MEM_STAT);
#ifdef GATHER_STATISTICS
register_overhead (map, sizeof (bitmap_head));
#endif
return map;
}
@ -251,12 +357,15 @@ bitmap_obstack_alloc (bitmap_obstack *bit_obstack)
/* Create a new GCd bitmap. */
bitmap
bitmap_gc_alloc (void)
bitmap_gc_alloc_stat (ALONE_MEM_STAT_DECL)
{
bitmap map;
map = GGC_NEW (struct bitmap_head_def);
bitmap_initialize (map, NULL);
bitmap_initialize_stat (map, NULL PASS_MEM_STAT);
#ifdef GATHER_STATISTICS
register_overhead (map, sizeof (bitmap_head));
#endif
return map;
}
@ -270,6 +379,9 @@ bitmap_obstack_free (bitmap map)
{
bitmap_clear (map);
map->first = (void *)map->obstack->heads;
#ifdef GATHER_STATISTICS
register_overhead (map, -((int)sizeof (bitmap_head)));
#endif
map->obstack->heads = map;
}
}
@ -430,6 +542,9 @@ bitmap_find_bit (bitmap head, unsigned int bit)
bitmap_element *element;
unsigned int indx = bit / BITMAP_ELEMENT_ALL_BITS;
#ifdef GATHER_STATISTICS
head->desc->nsearches++;
#endif
if (head->current == 0
|| head->indx == indx)
return head->current;
@ -1519,6 +1634,64 @@ bitmap_print (FILE *file, bitmap head, const char *prefix, const char *suffix)
}
fputs (suffix, file);
}
#ifdef GATHER_STATISTICS
/* Used to accumulate statistics about bitmap sizes. */
struct output_info
{
int count;
int size;
};
/* Called via htab_traverse. Output bitmap descriptor pointed out by SLOT
and update statistics. */
static int
print_statistics (void **slot, void *b)
{
struct bitmap_descriptor *d = (struct bitmap_descriptor *) *slot;
struct output_info *i = (struct output_info *) b;
char s[4096];
if (d->allocated)
{
const char *s1 = d->file;
const char *s2;
while ((s2 = strstr (s1, "gcc/")))
s1 = s2 + 4;
sprintf (s, "%s:%i (%s)", s1, d->line, d->function);
s[41] = 0;
fprintf (stderr, "%-41s %6d %10d %10d %10d %10d\n", s,
d->created, d->allocated, d->peak, d->current, d->nsearches);
i->size += d->allocated;
i->count += d->created;
}
return 1;
}
#endif
/* Output per-bitmap memory usage statistics. */
void
dump_bitmap_statistics (void)
{
#ifdef GATHER_STATISTICS
struct output_info info;
if (!bitmap_desc_hash)
return;
fprintf (stderr, "\nBitmap Overall "
"Allocated Peak Leak searched "
" per search\n");
fprintf (stderr, "---------------------------------------------------------------------------------\n");
info.count = 0;
info.size = 0;
htab_traverse (bitmap_desc_hash, print_statistics, &info);
fprintf (stderr, "---------------------------------------------------------------------------------\n");
fprintf (stderr, "%-40s %7d %10d\n",
"Total", info.count, info.size);
fprintf (stderr, "---------------------------------------------------------------------------------\n");
#endif
}
/* Compute hash of bitmap (for purposes of hashing). */
hashval_t

View File

@ -22,6 +22,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
#ifndef GCC_BITMAP_H
#define GCC_BITMAP_H
#include "hashtab.h"
#include "statistics.h"
/* Fundamental storage type for bitmap. */
@ -68,7 +69,13 @@ typedef struct bitmap_element_def GTY(())
BITMAP_WORD bits[BITMAP_ELEMENT_WORDS]; /* Bits that are set. */
} bitmap_element;
/* Head of bitmap linked list. */
struct bitmap_descriptor;
/* Head of bitmap linked list.
The gengtype doesn't cope with ifdefs inside the definition,
but for statistics we need bitmap descriptor pointer in.
Trick it by two copies of the definition. This is safe
because the bitmap descriptor is not grabagecollected. */
#ifndef GATHER_STATISTICS
typedef struct bitmap_head_def GTY(()) {
bitmap_element *first; /* First element in linked list. */
bitmap_element *current; /* Last element looked at. */
@ -76,7 +83,16 @@ typedef struct bitmap_head_def GTY(()) {
bitmap_obstack *obstack; /* Obstack to allocate elements from.
If NULL, then use ggc_alloc. */
} bitmap_head;
#else
typedef struct bitmap_head_def {
bitmap_element *first; /* First element in linked list. */
bitmap_element *current; /* Last element looked at. */
unsigned int indx; /* Index of last element looked at. */
bitmap_obstack *obstack; /* Obstack to allocate elements from.
If NULL, then use ggc_alloc. */
struct bitmap_descriptor *desc;
} bitmap_head;
#endif
/* Global data */
extern bitmap_element bitmap_zero_bits; /* Zero bitmap element */
@ -144,20 +160,28 @@ extern void bitmap_print (FILE *, bitmap, const char *, const char *);
/* Initialize and release a bitmap obstack. */
extern void bitmap_obstack_initialize (bitmap_obstack *);
extern void bitmap_obstack_release (bitmap_obstack *);
extern void bitmap_register (bitmap MEM_STAT_DECL);
extern void dump_bitmap_statistics (void);
/* Initialize a bitmap header. OBSTACK indicates the bitmap obstack
to allocate from, NULL for GC'd bitmap. */
static inline void
bitmap_initialize (bitmap head, bitmap_obstack *obstack)
bitmap_initialize_stat (bitmap head, bitmap_obstack *obstack MEM_STAT_DECL)
{
head->first = head->current = NULL;
head->obstack = obstack;
#ifdef GATHER_STATISTICS
bitmap_register (head PASS_MEM_STAT);
#endif
}
#define bitmap_initialize(h,o) bitmap_initialize_stat (h,o MEM_STAT_INFO)
/* Allocate and free bitmaps from obstack, malloc and gc'd memory. */
extern bitmap bitmap_obstack_alloc (bitmap_obstack *obstack);
extern bitmap bitmap_gc_alloc (void);
extern bitmap bitmap_obstack_alloc_stat (bitmap_obstack *obstack MEM_STAT_DECL);
#define bitmap_obstack_alloc(t) bitmap_obstack_alloc_stat (t MEM_STAT_INFO)
extern bitmap bitmap_gc_alloc_stat (ALONE_MEM_STAT_DECL);
#define bitmap_gc_alloc() bitmap_gc_alloc_stat (ALONE_MEM_STAT_INFO)
extern void bitmap_obstack_free (bitmap);
/* A few compatibility/functions macros for compatibility with sbitmaps */

View File

@ -24,11 +24,17 @@
#define GCC_STATISTICS
#ifdef GATHER_STATISTICS
#define MEM_STAT_DECL , const char * ARG_UNUSED (_loc_name), int ARG_UNUSED (_loc_line), const char * ARG_UNUSED (_loc_function)
#define ALONE_MEM_STAT_DECL const char * ARG_UNUSED (_loc_name), int ARG_UNUSED (_loc_line), const char * ARG_UNUSED (_loc_function)
#define PASS_MEM_STAT , _loc_name, _loc_line, _loc_function
#define ALONE_PASS_MEM_STAT _loc_name, _loc_line, _loc_function
#define MEM_STAT_INFO , __FILE__, __LINE__, __FUNCTION__
#define ALONE_MEM_STAT_INFO __FILE__, __LINE__, __FUNCTION__
#else
#define MEM_STAT_DECL
#define ALONE_MEM_STAT_DECL void
#define PASS_MEM_STAT
#define ALONE_PASS_MEM_STAT
#define MEM_STAT_INFO
#define ALONE_MEM_STAT_INFO
#endif
#endif

View File

@ -1971,6 +1971,7 @@ finalize (void)
dump_rtx_statistics ();
dump_varray_statistics ();
dump_alloc_pool_statistics ();
dump_bitmap_statistics ();
dump_ggc_loc_statistics ();
}