From 263e39ce99c9c39313d2d7428f55dffd3b6b3edc Mon Sep 17 00:00:00 2001 From: dberlin Date: Thu, 19 Dec 2002 15:53:46 +0000 Subject: [PATCH] 2002-12-18 Daniel Berlin * Makefile.in (OBJS): Add alloc-pool.o (alloc-pool.o): New object. * alloc-pool.c: New file. * alloc-pool.h: New file. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@60312 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 9 ++- gcc/Makefile.in | 7 ++- gcc/alloc-pool.c | 166 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ gcc/alloc-pool.h | 48 ++++++++++++++++ 4 files changed, 226 insertions(+), 4 deletions(-) create mode 100644 gcc/alloc-pool.c create mode 100644 gcc/alloc-pool.h diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 143b5c2..073b662 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2002-12-18 Daniel Berlin + + * Makefile.in (OBJS): Add alloc-pool.o + (alloc-pool.o): New object. + + * alloc-pool.c: New file. + * alloc-pool.h: New file. + 2002-12-18 Loren James Rittle * gcc.c (validate_switches): Robustify against skipping past '\0'. @@ -2263,7 +2271,6 @@ Fri Nov 15 14:54:19 CET 2002 Jan Hubicka * gthr-posix.h: Fix formatting. 2002-11-12 Devang Patel - * gcc.c (display_help): Two new options -Xpreprocessor and -Xassembler. (process_command): Same. * doc/invoke.texi: Info about these two new options. diff --git a/gcc/Makefile.in b/gcc/Makefile.in index dcae106..4d3a24f 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -752,7 +752,7 @@ OBJS = alias.o bb-reorder.o bitmap.o builtins.o caller-save.o calls.o \ genrtl.o ggc-common.o global.o graph.o gtype-desc.o \ haifa-sched.o hashtable.o hooks.o ifcvt.o insn-attrtab.o insn-emit.o \ insn-extract.o insn-opinit.o insn-output.o insn-peep.o insn-recog.o \ - integrate.o intl.o jump.o langhooks.o lcm.o lists.o local-alloc.o \ + integrate.o intl.o jump.o langhooks.o lcm.o lists.o local-alloc.o \ loop.o mbchar.o optabs.o params.o predict.o print-rtl.o print-tree.o \ profile.o ra.o ra-build.o ra-colorize.o ra-debug.o ra-rewrite.o \ real.o recog.o reg-stack.o regclass.o regmove.o regrename.o \ @@ -761,7 +761,7 @@ OBJS = alias.o bb-reorder.o bitmap.o builtins.o caller-save.o calls.o \ sibcall.o simplify-rtx.o ssa.o ssa-ccp.o ssa-dce.o stmt.o \ stor-layout.o stringpool.o timevar.o toplev.o tracer.o tree.o tree-dump.o \ tree-inline.o unroll.o varasm.o varray.o version.o vmsdbgout.o xcoffout.o \ - et-forest.o $(GGC) $(out_object_file) $(EXTRA_OBJS) + alloc-pool.o et-forest.o $(GGC) $(out_object_file) $(EXTRA_OBJS) BACKEND = main.o libbackend.a @@ -1541,6 +1541,7 @@ doloop.o : doloop.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) flags.h unroll.o : unroll.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) insn-config.h \ function.h $(INTEGRATE_H) $(REGS_H) $(RECOG_H) flags.h $(EXPR_H) $(LOOP_H) toplev.h \ hard-reg-set.h varray.h $(BASIC_BLOCK_H) $(TM_P_H) $(PREDICT_H) $(PARAMS_H) +alloc-pool.o : alloc-pool.c $(CONFIG_H) $(SYSTEM_H) alloc-pool.h flow.o : flow.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(TREE_H) \ flags.h insn-config.h $(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h output.h toplev.h \ $(RECOG_H) function.h except.h $(EXPR_H) ssa.h $(GGC_H) $(TM_P_H) @@ -1562,7 +1563,7 @@ cfgloop.o : cfgloop.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \ $(BASIC_BLOCK_H) hard-reg-set.h dominance.o : dominance.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \ hard-reg-set.h $(BASIC_BLOCK_H) et-forest.h -et-forest.o : et-forest.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) et-forest.h +et-forest.o : et-forest.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) et-forest.h alloc-pool.h combine.o : combine.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) flags.h \ function.h insn-config.h $(INSN_ATTR_H) $(REGS_H) $(EXPR_H) \ $(BASIC_BLOCK_H) $(RECOG_H) real.h hard-reg-set.h toplev.h $(TM_P_H) diff --git a/gcc/alloc-pool.c b/gcc/alloc-pool.c new file mode 100644 index 0000000..b84780a --- /dev/null +++ b/gcc/alloc-pool.c @@ -0,0 +1,166 @@ +/* Functions to support a pool of allocatable objects. + Copyright (C) 1987, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. + Contributed by Daniel Berlin + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. */ + +#include "libiberty.h" +#include "config.h" +#include "system.h" +#include "alloc-pool.h" + +#define align_four(x) (((x+3) >> 2) << 2) +#define align_eight(x) (((x+7) >> 3) << 3) + +/* Create a pool of things of size SIZE, with NUM in each block we + allocate. */ + +alloc_pool +create_alloc_pool (name, size, num) + const char *name; + size_t size; + size_t num; +{ + alloc_pool pool; + size_t pool_size, header_size; + + if (!name) + abort (); + + /* Make size large enough to store the list header. */ + if (size < sizeof (alloc_pool_list)) + size = sizeof (alloc_pool_list); + + /* Now align the size to a multiple of 4. */ + size = align_four (size); + + /* Um, we can't really allocate 0 elements per block. */ + if (num == 0) + abort (); + + /* Find the size of the pool structure, and the name. */ + pool_size = sizeof (struct alloc_pool_def); + + /* and allocate that much memory. */ + pool = (alloc_pool) xmalloc (pool_size); + + /* Now init the various pieces of our pool structure. */ + pool->name = xstrdup (name); + pool->elt_size = size; + pool->elts_per_block = num; + + /* List header size should be a multiple of 8 */ + header_size = align_eight (sizeof (struct alloc_pool_list_def)); + + pool->block_size = (size * num) + header_size; + pool->free_list = NULL; + pool->elts_allocated = 0; + pool->elts_free = 0; + pool->blocks_allocated = 0; + pool->block_list = NULL; + + return (pool); +} + +/* Free all memory allocated for the given memory pool. */ +void +free_alloc_pool (pool) + alloc_pool pool; +{ + alloc_pool_list block, next_block; + + if (!pool) + abort (); + + /* Free each block allocated to the pool. */ + for (block = pool->block_list; block != NULL; block = next_block) + { + next_block = block->next; + free (block); + } + /* Lastly, free the pool and the name. */ + free (pool->name); + free (pool); +} + +/* Allocates one element from the pool specified. */ +void * +pool_alloc (pool) + alloc_pool pool; +{ + alloc_pool_list header; + char *block; + + if (!pool) + abort (); + + /* If there are no more free elements, make some more!. */ + if (!pool->free_list) + { + size_t i; + alloc_pool_list block_header; + + /* Make the block */ + block = (char *) xmalloc (pool->block_size); + block_header = (alloc_pool_list) block; + block += align_eight (sizeof (struct alloc_pool_list_def)); + + /* Throw it on the block list */ + block_header->next = pool->block_list; + pool->block_list = block_header; + + /* Now put the actual block pieces onto the free list. */ + for (i = 0; i < pool->elts_per_block; i++, block += pool->elt_size) + { + header = (alloc_pool_list) block; + header->next = pool->free_list; + pool->free_list = header; + } + /* Also update the number of elements we have free/allocated, and + increment the allocated block count. */ + pool->elts_allocated += pool->elts_per_block; + pool->elts_free += pool->elts_per_block; + pool->blocks_allocated += 1; + } + + /* Pull the first free element from the free list, and return it. */ + header = pool->free_list; + pool->free_list = header->next; + pool->elts_free--; + return ((void *) header); +} + +/* Puts PTR back on POOL's free list. */ +void +pool_free (pool, ptr) + alloc_pool pool; + void *ptr; +{ + alloc_pool_list header; + + if (!ptr) + abort (); + + /* Check if we free more than we allocated, which is Bad (TM). */ + if (pool->elts_free + 1 > pool->elts_allocated) + abort (); + header = (alloc_pool_list) ptr; + header->next = pool->free_list; + pool->free_list = header; + pool->elts_free++; +} diff --git a/gcc/alloc-pool.h b/gcc/alloc-pool.h new file mode 100644 index 0000000..6038a03 --- /dev/null +++ b/gcc/alloc-pool.h @@ -0,0 +1,48 @@ + +/* Functions to support a pool of allocatable objects + Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. + Contributed by Daniel Berlin +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ +#ifndef ALLOC_POOL_H +#define ALLOC_POOL_H + +typedef struct alloc_pool_list_def +{ + struct alloc_pool_list_def *next; +} + *alloc_pool_list; + +typedef struct alloc_pool_def +{ + char *name; + size_t elts_per_block; + alloc_pool_list free_list; + size_t elts_allocated; + size_t elts_free; + size_t blocks_allocated; + alloc_pool_list block_list; + size_t block_size; + size_t elt_size; +} + *alloc_pool; + +extern alloc_pool create_alloc_pool PARAMS ((const char *, size_t, size_t)); +extern void free_alloc_pool PARAMS ((alloc_pool)); +extern void *pool_alloc PARAMS ((alloc_pool)); +extern void pool_free PARAMS ((alloc_pool, void *)); +#endif -- 2.7.4