diff options
author | nathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-09-08 08:08:56 +0000 |
---|---|---|
committer | nathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-09-08 08:08:56 +0000 |
commit | 07e8c04c5c9fd05187e0135a6c00b55daea82410 (patch) | |
tree | 82cf8d02cbdec1663fdfa61ae2f02250a8f504bc /gcc/vec.c | |
parent | 611234b4a911bea129f06d829c2077155c3ed5ae (diff) | |
download | gcc-07e8c04c5c9fd05187e0135a6c00b55daea82410.tar.gz |
* vec.c (vec_p_reserve, vec_o_reserve): Rename to ...
(vec_gc_p_reserve, vec_gc_o_reserve): ... here. Clone to
(vec_heap_p_reserve, vec_heap_o_reserve): ... here, adjust.
(vec_gc_free, vec_heap_free): New.
* vec.h (DEF_VEC_GC_P, DEF_VEC_MALLOC_P): New.
(DEF_VEC_P): Add allocator argument. Adjust.
(DEF_VEC_GC_O, DEF_VEC_MALLOC_O): New.
(DEF_VEC_O): Add allocator argument. Adjust.
(VEC(free)): New.
* tree.h (tree): Define a GC'd vector.
* lamba-code.c (lambda_loop): Likewise.
* value-prof.h (histogram_value): Likewise.
* cp/cp-tree.h (tree_pair_s): Likewise.
* cp/name-lookup.h (cxx_saved_binding, cp_class_binding): Likewise.
* cp/semantics.c (deferred_access): Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@87179 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/vec.c')
-rw-r--r-- | gcc/vec.c | 71 |
1 files changed, 65 insertions, 6 deletions
diff --git a/gcc/vec.c b/gcc/vec.c index 1f9ac206282..72480dcd6fe 100644 --- a/gcc/vec.c +++ b/gcc/vec.c @@ -39,11 +39,11 @@ 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 >= @@ -53,8 +53,8 @@ vec_p_reserve (void *vec, int reserve MEM_STAT_DECL) 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; unsigned alloc = pfx ? pfx->num : 0; @@ -77,6 +77,65 @@ 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; + + if (pfx && pfx->alloc >= alloc) + abort (); + + 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. */ |