summaryrefslogtreecommitdiff
path: root/gcc/alloc-pool.c
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2004-01-30 11:36:05 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2004-01-30 11:36:05 +0000
commit7fec61de214d7c5c0e686f33992d280781aeaadc (patch)
treea35d691168463d8f2f27f6683446c3a04b212411 /gcc/alloc-pool.c
parent605e65d94842fcee1361eade4b0946d17b7e4a00 (diff)
downloadgcc-7fec61de214d7c5c0e686f33992d280781aeaadc.tar.gz
* alloc-pool.c: Include hashtab.h
(alloc_pool_descriptor): New structure (alloc_pool_hash): New global variable. (hash_descriptor, eq_descriptor, alloc_pool_descriptor): New. (create_alloc_pool): Update statistics. (free_alloc_pool): Likewise. (pool_alloc): Likewise. (output_info): New structure (print_statistics, dump_alloc_pool_statistics): New function. * alloc-pool.h (alloc_pool_def): Turn name to be constant. (dump_alloc_pool_statistics): Declare. * toplev.c (finalize): Dump statistics. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@76951 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/alloc-pool.c')
-rw-r--r--gcc/alloc-pool.c125
1 files changed, 122 insertions, 3 deletions
diff --git a/gcc/alloc-pool.c b/gcc/alloc-pool.c
index bdcd42fd139..6a2fa65f4ea 100644
--- a/gcc/alloc-pool.c
+++ b/gcc/alloc-pool.c
@@ -23,6 +23,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "config.h"
#include "system.h"
#include "alloc-pool.h"
+#include "hashtab.h"
/* Redefine abort to report an internal error w/o coredump, and
reporting the location of the error in the source file. This logic
@@ -72,6 +73,56 @@ typedef struct allocation_object_def
static ALLOC_POOL_ID_TYPE last_id;
#endif
+#ifdef GATHER_STATISTICS
+
+/* Store infromation about each particular alloc_pool. */
+struct alloc_pool_descriptor
+{
+ const char *name;
+ int allocated;
+ int created;
+ int peak;
+ int current;
+};
+
+/* Hashtable mapping alloc_pool names to descriptors. */
+static htab_t alloc_pool_hash;
+
+/* Hashtable helpers. */
+static hashval_t
+hash_descriptor (const void *p)
+{
+ const struct alloc_pool_descriptor *d = p;
+ return htab_hash_pointer (d->name);
+}
+static int
+eq_descriptor (const void *p1, const void *p2)
+{
+ const struct alloc_pool_descriptor *d = p1;
+ return d->name == p2;
+}
+
+/* For given name, return descriptor, create new if needed. */
+static struct alloc_pool_descriptor *
+alloc_pool_descriptor (const char *name)
+{
+ struct alloc_pool_descriptor **slot;
+
+ if (!alloc_pool_hash)
+ alloc_pool_hash = htab_create (10, hash_descriptor, eq_descriptor, NULL);
+
+ slot = (struct alloc_pool_descriptor **)
+ htab_find_slot_with_hash (alloc_pool_hash, name,
+ htab_hash_pointer (name),
+ 1);
+ if (*slot)
+ return *slot;
+ *slot = xcalloc (sizeof (**slot), 1);
+ (*slot)->name = name;
+ return *slot;
+}
+#endif
+
/* Create a pool of things of size SIZE, with NUM in each block we
allocate. */
@@ -80,6 +131,9 @@ create_alloc_pool (const char *name, size_t size, size_t num)
{
alloc_pool pool;
size_t pool_size, header_size;
+#ifdef GATHER_STATISTICS
+ struct alloc_pool_descriptor *desc;
+#endif
if (!name)
abort ();
@@ -107,7 +161,11 @@ create_alloc_pool (const char *name, size_t size, size_t num)
pool = xmalloc (pool_size);
/* Now init the various pieces of our pool structure. */
- pool->name = xstrdup (name);
+ pool->name = /*xstrdup (name)*/name;
+#ifdef GATHER_STATISTICS
+ desc = alloc_pool_descriptor (name);
+ desc->created++;
+#endif
pool->elt_size = size;
pool->elts_per_block = num;
@@ -139,6 +197,9 @@ void
free_alloc_pool (alloc_pool pool)
{
alloc_pool_list block, next_block;
+#ifdef GATHER_STATISTICS
+ struct alloc_pool_descriptor *desc = alloc_pool_descriptor (pool->name);
+#endif
#ifdef ENABLE_CHECKING
if (!pool)
@@ -150,12 +211,14 @@ free_alloc_pool (alloc_pool pool)
{
next_block = block->next;
free (block);
+#ifdef GATHER_STATISTICS
+ desc->current -= pool->block_size;
+#endif
}
- /* Lastly, free the pool and the name. */
- free (pool->name);
#ifdef ENABLE_CHECKING
memset (pool, 0xaf, sizeof (*pool));
#endif
+ /* Lastly, free the pool. */
free (pool);
}
@@ -165,6 +228,11 @@ pool_alloc (alloc_pool pool)
{
alloc_pool_list header;
char *block;
+#ifdef GATHER_STATISTICS
+ struct alloc_pool_descriptor *desc = alloc_pool_descriptor (pool->name);
+
+ desc->allocated+=pool->elt_size;
+#endif
#ifdef ENABLE_CHECKING
if (!pool)
@@ -181,6 +249,11 @@ pool_alloc (alloc_pool pool)
block = xmalloc (pool->block_size);
block_header = (alloc_pool_list) block;
block += align_eight (sizeof (struct alloc_pool_list_def));
+#ifdef GATHER_STATISTICS
+ desc->current += pool->block_size;
+ if (desc->peak < desc->current)
+ desc->peak = desc->current;
+#endif
/* Throw it on the block list. */
block_header->next = pool->block_list;
@@ -246,3 +319,49 @@ pool_free (alloc_pool pool, void *ptr)
pool->free_list = header;
pool->elts_free++;
}
+/* Output per-alloc_pool statistics. */
+#ifdef GATHER_STATISTICS
+
+/* Used to accumulate statistics about alloc_pool sizes. */
+struct output_info
+{
+ int count;
+ int size;
+};
+
+/* Called via htab_traverse. Output alloc_pool descriptor pointed out by SLOT
+ and update statistics. */
+static int
+print_statistics (void **slot, void *b)
+{
+ struct alloc_pool_descriptor *d = (struct alloc_pool_descriptor *) *slot;
+ struct output_info *i = (struct output_info *) b;
+
+ if (d->allocated)
+ {
+ fprintf (stderr, "%-21s %6d %10d %10d %10d\n", d->name,
+ d->created, d->allocated, d->peak, d->current);
+ i->size += d->allocated;
+ i->count += d->created;
+ }
+ return 1;
+}
+#endif
+
+/* Output per-alloc_pool memory usage statistics. */
+void dump_alloc_pool_statistics (void)
+{
+#ifdef GATHER_STATISTICS
+ struct output_info info;
+
+ fprintf (stderr, "\nAlloc-pool Kind Pools Allocated Peak Leak\n");
+ fprintf (stderr, "-------------------------------------------------------------\n");
+ info.count = 0;
+ info.size = 0;
+ htab_traverse (alloc_pool_hash, print_statistics, &info);
+ fprintf (stderr, "-------------------------------------------------------------\n");
+ fprintf (stderr, "%-20s %7d %10d\n",
+ "Total", info.count, info.size);
+ fprintf (stderr, "-------------------------------------------------------------\n");
+#endif
+}