X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fvec.c;h=c638ead9bf5e9de7d2159926e6a09615e7cb8e96;hb=6a9bcd3e9b7a532cebce25af24999b7e3d8da123;hp=45acc84803b35409319a10b30dcfa0ec1cf92666;hpb=7ae73a2b8ea1baf82ae0fb809750b110d275ba66;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/vec.c b/gcc/vec.c index 45acc84803b..c638ead9bf5 100644 --- a/gcc/vec.c +++ b/gcc/vec.c @@ -1,5 +1,5 @@ /* Vector API for GNU compiler. - Copyright (C) 2004 Free Software Foundation, Inc. + Copyright (C) 2004, 2005 Free Software Foundation, Inc. Contributed by Nathan Sidwell This file is part of GCC. @@ -29,8 +29,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA struct vec_prefix { - size_t num; - size_t alloc; + unsigned num; + unsigned alloc; void *vec[1]; }; @@ -39,25 +39,25 @@ struct vec_prefix VEC can be NULL, to create a new vector. */ void * -vec_p_reserve (void *vec, int reserve MEM_STAT_DECL) +vec_gc_p_reserve (void *vec, int reserve MEM_STAT_DECL) { - return vec_o_reserve (vec, reserve, - offsetof (struct vec_prefix, vec), sizeof (void *) - PASS_MEM_STAT); + return vec_gc_o_reserve (vec, reserve, + offsetof (struct vec_prefix, vec), sizeof (void *) + PASS_MEM_STAT); } /* Ensure there are at least RESERVE free slots in VEC, if RESERVE >= 0. If RESERVE < 0, increase the current allocation exponentially. VEC can be NULL, in which case a new vector is created. The - vector's trailing array is at VEC_OFFSET offset and consistes of + vector's trailing array is at VEC_OFFSET offset and consists of ELT_SIZE sized elements. */ void * -vec_o_reserve (void *vec, int reserve, size_t vec_offset, size_t elt_size - MEM_STAT_DECL) +vec_gc_o_reserve (void *vec, int reserve, size_t vec_offset, size_t elt_size + MEM_STAT_DECL) { struct vec_prefix *pfx = vec; - size_t alloc = pfx ? pfx->num : 0; + unsigned alloc = pfx ? pfx->num : 0; if (reserve >= 0) alloc += reserve; @@ -66,8 +66,7 @@ vec_o_reserve (void *vec, int reserve, size_t vec_offset, size_t elt_size else alloc = 4; - if (pfx && pfx->alloc >= alloc) - abort (); + gcc_assert (!pfx || pfx->alloc < alloc); vec = ggc_realloc_stat (vec, vec_offset + alloc * elt_size PASS_MEM_STAT); ((struct vec_prefix *)vec)->alloc = alloc; @@ -77,6 +76,64 @@ vec_o_reserve (void *vec, int reserve, size_t vec_offset, size_t elt_size return vec; } +/* Explicitly release a vector. */ + +void +vec_gc_free (void *vec) +{ + ggc_free (vec); +} + +/* Ensure there are at least RESERVE free slots in VEC, if RESERVE >= + 0. If RESERVE < 0 increase the current allocation exponentially. + VEC can be NULL, to create a new vector. */ + +void * +vec_heap_p_reserve (void *vec, int reserve MEM_STAT_DECL) +{ + return vec_heap_o_reserve (vec, reserve, + offsetof (struct vec_prefix, vec), sizeof (void *) + PASS_MEM_STAT); +} + +/* Ensure there are at least RESERVE free slots in VEC, if RESERVE >= + 0. If RESERVE < 0, increase the current allocation exponentially. + VEC can be NULL, in which case a new vector is created. The + vector's trailing array is at VEC_OFFSET offset and consists of + ELT_SIZE sized elements. */ + +void * +vec_heap_o_reserve (void *vec, int reserve, size_t vec_offset, size_t elt_size + MEM_STAT_DECL) +{ + struct vec_prefix *pfx = vec; + unsigned alloc = pfx ? pfx->num : 0; + + if (reserve >= 0) + alloc += reserve; + else if (alloc) + alloc *= 2; + else + alloc = 4; + + gcc_assert (!pfx || pfx->alloc < alloc); + + vec = xrealloc (vec, vec_offset + alloc * elt_size); + ((struct vec_prefix *)vec)->alloc = alloc; + if (!pfx) + ((struct vec_prefix *)vec)->num = 0; + + return vec; +} + +/* Explicitly release a vector. */ + +void +vec_heap_free (void *vec) +{ + free (vec); +} + #if ENABLE_CHECKING /* Issue a vector domain error, and then fall over. */