diff options
Diffstat (limited to 'contrib/gcc/varray.c')
-rw-r--r-- | contrib/gcc/varray.c | 72 |
1 files changed, 59 insertions, 13 deletions
diff --git a/contrib/gcc/varray.c b/contrib/gcc/varray.c index eef2234..51e3e8b 100644 --- a/contrib/gcc/varray.c +++ b/contrib/gcc/varray.c @@ -22,27 +22,59 @@ #include "config.h" #include "errors.h" #include "system.h" -#include "rtl.h" -#include "tree.h" -#include "bitmap.h" #include "varray.h" +#include "ggc.h" #define VARRAY_HDR_SIZE (sizeof (struct varray_head_tag) - sizeof (varray_data)) +static const size_t element_size[NUM_VARRAY_DATA] = { + sizeof (char), + sizeof (unsigned char), + sizeof (short), + sizeof (unsigned short), + sizeof (int), + sizeof (unsigned int), + sizeof (long), + sizeof (unsigned long), + sizeof (HOST_WIDE_INT), + sizeof (unsigned HOST_WIDE_INT), + sizeof (PTR), + sizeof (char *), + sizeof (struct rtx_def *), + sizeof (struct rtvec_def *), + sizeof (union tree_node *), + sizeof (struct bitmap_head_def *), + sizeof (struct reg_info_def *), + sizeof (struct const_equiv_data), + sizeof (struct basic_block_def *), + sizeof (struct elt_list *) +}; + +static const int uses_ggc[NUM_VARRAY_DATA] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* unsigned HOST_WIDE_INT */ + 1, /* PTR */ + 1, 1, 1, 1, 1, /* bitmap_head_def */ + 0, 0, 0, 1 +}; + /* Allocate a virtual array with NUM_ELEMENT elements, each of which is ELEMENT_SIZE bytes long, named NAME. Array elements are zeroed. */ varray_type -varray_init (num_elements, element_size, name) +varray_init (num_elements, element_kind, name) size_t num_elements; - size_t element_size; + enum varray_data_enum element_kind; const char *name; { - size_t data_size = num_elements * element_size; - varray_type ptr = (varray_type) xcalloc (VARRAY_HDR_SIZE + data_size, 1); + size_t data_size = num_elements * element_size[element_kind]; + varray_type ptr; + if (uses_ggc [element_kind]) + ptr = (varray_type) ggc_alloc_cleared (VARRAY_HDR_SIZE + data_size); + else + ptr = (varray_type) xcalloc (VARRAY_HDR_SIZE + data_size, 1); ptr->num_elements = num_elements; ptr->elements_used = 0; - ptr->element_size = element_size; + ptr->type = element_kind; ptr->name = name; return ptr; } @@ -58,11 +90,14 @@ varray_grow (va, n) if (n != old_elements) { - size_t element_size = va->element_size; - size_t old_data_size = old_elements * element_size; - size_t data_size = n * element_size; - - va = (varray_type) xrealloc ((char *) va, VARRAY_HDR_SIZE + data_size); + size_t elem_size = element_size[va->type]; + size_t old_data_size = old_elements * elem_size; + size_t data_size = n * elem_size; + + if (uses_ggc[va->type]) + va = (varray_type) ggc_realloc (va, VARRAY_HDR_SIZE + data_size); + else + va = (varray_type) xrealloc ((char *) va, VARRAY_HDR_SIZE + data_size); va->num_elements = n; if (n > old_elements) memset (&va->data.c[old_data_size], 0, data_size - old_data_size); @@ -71,6 +106,17 @@ varray_grow (va, n) return va; } +/* Reset a varray to its original state. */ +void +varray_clear (va) + varray_type va; +{ + size_t data_size = element_size[va->type] * va->num_elements; + + memset (va->data.c, 0, data_size); + va->elements_used = 0; +} + /* Check the bounds of a varray access. */ #if defined ENABLE_CHECKING && (GCC_VERSION >= 2007) |