varray.c: Include hashtab.h
* 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. * Makefile.in (varray.o): Add dependency. From-SVN: r76232
This commit is contained in:
parent
d5d2603ff4
commit
9b57b627f0
@ -1,3 +1,15 @@
|
||||
2004-01-20 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* 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.
|
||||
* Makefile.in (varray.o): Add dependency.
|
||||
|
||||
2004-01-20 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* cselib.c: Include alloc-pool.h
|
||||
|
@ -1731,7 +1731,8 @@ bitmap.o : bitmap.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(GTM_H) $(RTL_H) flags
|
||||
global.o : global.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) flags.h \
|
||||
reload.h function.h $(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h insn-config.h output.h \
|
||||
toplev.h $(TM_P_H)
|
||||
varray.o : varray.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) varray.h $(GGC_H) errors.h
|
||||
varray.o : varray.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) varray.h $(GGC_H) errors.h \
|
||||
$(HASHTAB_H)
|
||||
ra.o : ra.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(TM_P_H) insn-config.h \
|
||||
$(RECOG_H) $(INTEGRATE_H) function.h $(REGS_H) $(OBSTACK_H) hard-reg-set.h \
|
||||
$(BASIC_BLOCK_H) df.h $(EXPR_H) output.h toplev.h flags.h reload.h ra.h
|
||||
|
@ -4586,6 +4586,7 @@ finalize (void)
|
||||
stringpool_statistics ();
|
||||
dump_tree_statistics ();
|
||||
dump_rtx_statistics ();
|
||||
dump_varray_statistics ();
|
||||
}
|
||||
|
||||
/* Free up memory for the benefit of leak detectors. */
|
||||
|
118
gcc/varray.c
118
gcc/varray.c
@ -27,9 +27,60 @@
|
||||
#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. */
|
||||
|
||||
@ -67,6 +118,12 @@ varray_init (size_t num_elements, enum varray_data_enum element_kind,
|
||||
{
|
||||
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
|
||||
@ -85,12 +142,20 @@ varray_type
|
||||
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);
|
||||
@ -99,6 +164,10 @@ varray_grow (varray_type va, size_t n)
|
||||
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;
|
||||
@ -137,3 +206,50 @@ varray_underflow (varray_type va, const char *file, int line,
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* Output per-varray statistics. */
|
||||
#ifdef GATHER_STATISTICS
|
||||
|
||||
/* Used to accumulate statistics about varray sizes. */
|
||||
struct output_info
|
||||
{
|
||||
int count;
|
||||
int size;
|
||||
};
|
||||
|
||||
/* Called via htab_traverse. Output varray descriptor pointed out by SLOT
|
||||
and update statistics. */
|
||||
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
|
||||
|
||||
/* Output per-varray memory usage statistics. */
|
||||
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
|
||||
}
|
||||
|
@ -223,6 +223,8 @@ extern varray_type varray_grow (varray_type, size_t);
|
||||
|
||||
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,
|
||||
|
Loading…
Reference in New Issue
Block a user