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:
parent
2372a06257
commit
f75709c6f8
5 changed files with 236 additions and 9 deletions
|
@ -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
|
||||
|
|
181
gcc/bitmap.c
181
gcc/bitmap.c
|
@ -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
|
||||
|
|
34
gcc/bitmap.h
34
gcc/bitmap.h
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1971,6 +1971,7 @@ finalize (void)
|
|||
dump_rtx_statistics ();
|
||||
dump_varray_statistics ();
|
||||
dump_alloc_pool_statistics ();
|
||||
dump_bitmap_statistics ();
|
||||
dump_ggc_loc_statistics ();
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue