diff mbox

[2/6] don't have gengtype autocreate allocation macros for variably sized types

Message ID 1398769716-8629-3-git-send-email-tsaunders@mozilla.com
State New
Headers show

Commit Message

Trevor Saunders April 29, 2014, 11:08 a.m. UTC
From: Trevor Saunders <tsaunders@mozilla.com>

Hi,

	the template allocation functions won't work with things that are
actually variably sized, so its simpler to stop relying on gengtype for them
first.  However it turns out most of the usage of variably sized things in
gengtype is to deal with gengtype badness instead of actually variably sized
things so the next patch will remove a bit of the mess in this one.

bootstrapped + regtested on x86_64-unknown-linux-gnu, ok?

Trev

gcc/ChangeLog:

2014-04-23  Trevor Saunders  <tsaunders@mozilla.com>

	* gengtype.c (write_typed_alloc_def): Don't write anything if the type
	is variably sized.
	* ggc.h: Adjust.
	* tree-ssa-operands.c (ssa_operand_alloc): Likewise.
	* tree.c (build_string): Likewise.
	(build_omp_clause): Likewise.
	* varasm.c (create_block_symbol): Likewise.

gcc/c/ChangeLog:

2014-04-23  Trevor Saunders  <tsaunders@mozilla.com>

	* c-decl.c (finish_struct): Adjust.
	(finish_enum): Likewise.

gcc/java/ChangeLog:

2014-04-23  Trevor Saunders  <tsaunders@mozilla.com>

	* class.c (add_method_1): Adjust.
	* constants.c (set_constant_entry): Likewise.
	* decl.c (java_dup_lang_specific_decl): Likewise.
	* java-tree.h (MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC): Likewise.
	(MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC): Likewise.
	* jcf-reader.c (jcf_parse_constant_pool): Adjust.

gcc/objc/ChangeLog:

2014-04-23  Trevor Saunders  <tsaunders@mozilla.com>

	* objc-act.h: Adjust.

gcc/cp/ChangeLog:

2014-04-23  Trevor Saunders  <tsaunders@mozilla.com>

	* class.c (sorted_fields_type_new): Adjust.
	* cp-tree.h (more_aggr_init_expr_args_p): Likewise.
	* lex.c (retrofit_lang_decl): Likewise.
	(cxx_dup_lang_specific_decl): Likewise.
	(copy_lang_type): Likewise.
	(cxx_make_type): Likewise.

gcc/fortran/ChangeLog:

2014-04-23  Trevor Saunders  <tsaunders@mozilla.com>

	* trans-decl.c (gfc_allocate_lang_decl): Adjust.
	* trans-types.c (gfc_get_nodesc_array_type): Likewise.
	(gfc_get_array_type_bounds): Likewise.
	(gfc_nonrestricted_type): Likewise.
---
 gcc/c/c-decl.c            |  8 +++++---
 gcc/cp/class.c            |  2 +-
 gcc/cp/cp-tree.h          |  3 ++-
 gcc/cp/lex.c              |  9 +++++----
 gcc/fortran/trans-decl.c  |  5 +++--
 gcc/fortran/trans-types.c | 13 ++++++++-----
 gcc/gengtype.c            |  3 +++
 gcc/ggc.h                 |  2 +-
 gcc/java/class.c          |  3 ++-
 gcc/java/constants.c      |  6 +++---
 gcc/java/decl.c           |  2 +-
 gcc/java/java-tree.h      |  6 ++++--
 gcc/java/jcf-reader.c     |  3 ++-
 gcc/objc/objc-act.h       |  3 ++-
 gcc/tree-ssa-operands.c   |  4 ++--
 gcc/tree.c                |  4 ++--
 gcc/varasm.c              |  2 +-
 17 files changed, 47 insertions(+), 31 deletions(-)

Comments

Richard Biener April 29, 2014, 12:27 p.m. UTC | #1
On Tue, Apr 29, 2014 at 1:08 PM,  <tsaunders@mozilla.com> wrote:
> From: Trevor Saunders <tsaunders@mozilla.com>
>
> Hi,
>
>         the template allocation functions won't work with things that are
> actually variably sized, so its simpler to stop relying on gengtype for them
> first.  However it turns out most of the usage of variably sized things in
> gengtype is to deal with gengtype badness instead of actually variably sized
> things so the next patch will remove a bit of the mess in this one.
>
> bootstrapped + regtested on x86_64-unknown-linux-gnu, ok?
>
> Trev
>
> gcc/ChangeLog:
>
> 2014-04-23  Trevor Saunders  <tsaunders@mozilla.com>
>
>         * gengtype.c (write_typed_alloc_def): Don't write anything if the type
>         is variably sized.
>         * ggc.h: Adjust.
>         * tree-ssa-operands.c (ssa_operand_alloc): Likewise.
>         * tree.c (build_string): Likewise.
>         (build_omp_clause): Likewise.
>         * varasm.c (create_block_symbol): Likewise.
>
> gcc/c/ChangeLog:
>
> 2014-04-23  Trevor Saunders  <tsaunders@mozilla.com>
>
>         * c-decl.c (finish_struct): Adjust.
>         (finish_enum): Likewise.
>
> gcc/java/ChangeLog:
>
> 2014-04-23  Trevor Saunders  <tsaunders@mozilla.com>
>
>         * class.c (add_method_1): Adjust.
>         * constants.c (set_constant_entry): Likewise.
>         * decl.c (java_dup_lang_specific_decl): Likewise.
>         * java-tree.h (MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC): Likewise.
>         (MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC): Likewise.
>         * jcf-reader.c (jcf_parse_constant_pool): Adjust.
>
> gcc/objc/ChangeLog:
>
> 2014-04-23  Trevor Saunders  <tsaunders@mozilla.com>
>
>         * objc-act.h: Adjust.
>
> gcc/cp/ChangeLog:
>
> 2014-04-23  Trevor Saunders  <tsaunders@mozilla.com>
>
>         * class.c (sorted_fields_type_new): Adjust.
>         * cp-tree.h (more_aggr_init_expr_args_p): Likewise.
>         * lex.c (retrofit_lang_decl): Likewise.
>         (cxx_dup_lang_specific_decl): Likewise.
>         (copy_lang_type): Likewise.
>         (cxx_make_type): Likewise.
>
> gcc/fortran/ChangeLog:
>
> 2014-04-23  Trevor Saunders  <tsaunders@mozilla.com>
>
>         * trans-decl.c (gfc_allocate_lang_decl): Adjust.
>         * trans-types.c (gfc_get_nodesc_array_type): Likewise.
>         (gfc_get_array_type_bounds): Likewise.
>         (gfc_nonrestricted_type): Likewise.
> ---
>  gcc/c/c-decl.c            |  8 +++++---
>  gcc/cp/class.c            |  2 +-
>  gcc/cp/cp-tree.h          |  3 ++-
>  gcc/cp/lex.c              |  9 +++++----
>  gcc/fortran/trans-decl.c  |  5 +++--
>  gcc/fortran/trans-types.c | 13 ++++++++-----
>  gcc/gengtype.c            |  3 +++
>  gcc/ggc.h                 |  2 +-
>  gcc/java/class.c          |  3 ++-
>  gcc/java/constants.c      |  6 +++---
>  gcc/java/decl.c           |  2 +-
>  gcc/java/java-tree.h      |  6 ++++--
>  gcc/java/jcf-reader.c     |  3 ++-
>  gcc/objc/objc-act.h       |  3 ++-
>  gcc/tree-ssa-operands.c   |  4 ++--
>  gcc/tree.c                |  4 ++--
>  gcc/varasm.c              |  2 +-
>  17 files changed, 47 insertions(+), 31 deletions(-)
>
> diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c
> index e30876c..e8b8166 100644
> --- a/gcc/c/c-decl.c
> +++ b/gcc/c/c-decl.c
> @@ -7423,8 +7423,9 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes,
>           ensure that this lives as long as the rest of the struct decl.
>           All decls in an inline function need to be saved.  */
>
> -       space = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
> -       space2 = ggc_alloc_sorted_fields_type
> +       space = (struct lang_type *) ggc_internal_cleared_alloc
> +         (sizeof (struct lang_type));
> +       space2 = (sorted_fields_type *) ggc_internal_alloc
>           (sizeof (struct sorted_fields_type) + len * sizeof (tree));

ISTR we went to typed allocs as part of a transition which not
fully materialized?  I actually dislike that we get back the
ugly casts here - so, can we keep the allocators or use
a macro similar to the XNEW family?

>
>         len = 0;
> @@ -7704,7 +7705,8 @@ finish_enum (tree enumtype, tree values, tree attributes)
>
>    /* Record the min/max values so that we can warn about bit-field
>       enumerations that are too small for the values.  */
> -  lt = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
> +  lt = (struct lang_type *) ggc_internal_cleared_alloc
> +    (sizeof (struct lang_type));
>    lt->enum_min = minnode;
>    lt->enum_max = maxnode;
>    TYPE_LANG_SPECIFIC (enumtype) = lt;
> diff --git a/gcc/cp/class.c b/gcc/cp/class.c
> index 334bfd5..86058b5 100644
> --- a/gcc/cp/class.c
> +++ b/gcc/cp/class.c
> @@ -6490,7 +6490,7 @@ static struct sorted_fields_type *
>  sorted_fields_type_new (int n)
>  {
>    struct sorted_fields_type *sft;
> -  sft = ggc_alloc_sorted_fields_type (sizeof (struct sorted_fields_type)
> +  sft = (sorted_fields_type *) ggc_internal_alloc (sizeof (sorted_fields_type)
>                                       + n * sizeof (tree));
>    sft->len = n;
>
> diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
> index f459e55..9fbc7f8 100644
> --- a/gcc/cp/cp-tree.h
> +++ b/gcc/cp/cp-tree.h
> @@ -3586,7 +3586,8 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter)
>    do {                                                                 \
>      if (TYPE_LANG_SPECIFIC (NODE) == NULL)                             \
>        {                                                                        \
> -       TYPE_LANG_SPECIFIC (NODE) = ggc_alloc_cleared_lang_type         \
> +       TYPE_LANG_SPECIFIC (NODE)                                       \
> +       = (struct lang_type *) ggc_internal_cleared_alloc               \
>          (sizeof (struct lang_type_ptrmem));                            \
>         TYPE_LANG_SPECIFIC (NODE)->u.ptrmem.h.is_lang_type_class = 0;   \
>        }                                                                        \
> diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c
> index 3fe275e..46c28ae 100644
> --- a/gcc/cp/lex.c
> +++ b/gcc/cp/lex.c
> @@ -555,7 +555,7 @@ retrofit_lang_decl (tree t)
>    else
>      gcc_unreachable ();
>
> -  ld = ggc_alloc_cleared_lang_decl (size);
> +  ld = (struct lang_decl *) ggc_internal_cleared_alloc (size);
>
>    ld->u.base.selector = sel;
>
> @@ -597,7 +597,7 @@ cxx_dup_lang_specific_decl (tree node)
>    else
>      gcc_unreachable ();
>
> -  ld = ggc_alloc_lang_decl (size);
> +  ld = (struct lang_decl *) ggc_internal_alloc (size);
>    memcpy (ld, DECL_LANG_SPECIFIC (node), size);
>    DECL_LANG_SPECIFIC (node) = ld;
>
> @@ -635,7 +635,7 @@ copy_lang_type (tree node)
>      size = sizeof (struct lang_type);
>    else
>      size = sizeof (struct lang_type_ptrmem);
> -  lt = ggc_alloc_lang_type (size);
> +  lt = (struct lang_type *) ggc_internal_alloc (size);
>    memcpy (lt, TYPE_LANG_SPECIFIC (node), size);
>    TYPE_LANG_SPECIFIC (node) = lt;
>
> @@ -668,7 +668,8 @@ cxx_make_type (enum tree_code code)
>        || code == BOUND_TEMPLATE_TEMPLATE_PARM)
>      {
>        struct lang_type *pi
> -          = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
> +          = (struct lang_type *) ggc_internal_cleared_alloc
> +         (sizeof (struct lang_type));
>
>        TYPE_LANG_SPECIFIC (t) = pi;
>        pi->u.c.h.is_lang_type_class = 1;
> diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
> index cf7b661..beb99a6 100644
> --- a/gcc/fortran/trans-decl.c
> +++ b/gcc/fortran/trans-decl.c
> @@ -615,8 +615,9 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym)
>  void
>  gfc_allocate_lang_decl (tree decl)
>  {
> -  DECL_LANG_SPECIFIC (decl) = ggc_alloc_cleared_lang_decl(sizeof
> -                                                         (struct lang_decl));
> +  DECL_LANG_SPECIFIC (decl)
> +    = (struct lang_decl *) ggc_internal_cleared_alloc (sizeof
> +                                                      (struct lang_decl));
>  }
>
>  /* Remember a symbol to generate initialization/cleanup code at function
> diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c
> index 243feb7..84503ce 100644
> --- a/gcc/fortran/trans-types.c
> +++ b/gcc/fortran/trans-types.c
> @@ -1512,7 +1512,8 @@ gfc_get_nodesc_array_type (tree etype, gfc_array_spec * as, gfc_packed packed,
>
>    GFC_ARRAY_TYPE_P (type) = 1;
>    TYPE_LANG_SPECIFIC (type)
> -      = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
> +      = (struct lang_type *) ggc_internal_cleared_alloc
> +      (sizeof (struct lang_type));
>
>    known_stride = (packed != PACKED_NO);
>    known_offset = 1;
> @@ -1815,7 +1816,8 @@ gfc_get_array_type_bounds (tree etype, int dimen, int codimen, tree * lbound,
>
>    GFC_DESCRIPTOR_TYPE_P (fat_type) = 1;
>    TYPE_LANG_SPECIFIC (fat_type)
> -    = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
> +    = (struct lang_type *) ggc_internal_cleared_alloc
> +    (sizeof (struct lang_type));
>
>    GFC_TYPE_ARRAY_RANK (fat_type) = dimen;
>    GFC_TYPE_ARRAY_CORANK (fat_type) = codimen;
> @@ -1990,7 +1992,8 @@ gfc_nonrestricted_type (tree t)
>
>    if (!TYPE_LANG_SPECIFIC (t))
>      TYPE_LANG_SPECIFIC (t)
> -      = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
> +      = (struct lang_type *) ggc_internal_cleared_alloc
> +      (sizeof (struct lang_type));
>    /* If we're dealing with this very node already further up
>       the call chain (recursion via pointers and struct members)
>       we haven't yet determined if we really need a new type node.
> @@ -2042,8 +2045,8 @@ gfc_nonrestricted_type (tree t)
>                   if (dataptr_type != GFC_TYPE_ARRAY_DATAPTR_TYPE (t))
>                     {
>                       TYPE_LANG_SPECIFIC (ret)
> -                       = ggc_alloc_cleared_lang_type (sizeof (struct
> -                                                              lang_type));
> +                       = (struct lang_type *) ggc_internal_cleared_alloc
> +                       (sizeof (struct lang_type));
>                       *TYPE_LANG_SPECIFIC (ret) = *TYPE_LANG_SPECIFIC (t);
>                       GFC_TYPE_ARRAY_DATAPTR_TYPE (ret) = dataptr_type;
>                     }
> diff --git a/gcc/gengtype.c b/gcc/gengtype.c
> index e8fcd9f..b3c966c 100644
> --- a/gcc/gengtype.c
> +++ b/gcc/gengtype.c
> @@ -4967,6 +4967,9 @@ write_typed_alloc_def (outf_p f,
>                         enum alloc_quantity quantity)
>  {
>    bool two_args = variable_size && (quantity == vector);
> +  if (variable_size)
> +    return;
> +

It appears that two_args will be unused after this change, but as said,
I'd like to keep the typed allocators.

What is the actual problem you are solving?

Thanks,
Richard.

>    gcc_assert (f != NULL);
>    const char *type_name_as_id = filter_type_name (type_name);
>    oprintf (f, "#define ggc_alloc_%s%s", allocator_type, type_name_as_id);
> diff --git a/gcc/ggc.h b/gcc/ggc.h
> index 0af69f5..736305d 100644
> --- a/gcc/ggc.h
> +++ b/gcc/ggc.h
> @@ -230,7 +230,7 @@ extern void stringpool_statistics (void);
>  extern void init_ggc_heuristics (void);
>
>  #define ggc_alloc_rtvec_sized(NELT)                            \
> -  ggc_alloc_rtvec_def (sizeof (struct rtvec_def)               \
> +  (rtvec_def *) ggc_internal_alloc (sizeof (struct rtvec_def)          \
>                        + ((NELT) - 1) * sizeof (rtx))           \
>
>  /* Memory statistics passing versions of some allocators.  Too few of them to
> diff --git a/gcc/java/class.c b/gcc/java/class.c
> index bbe7c86..94c2568 100644
> --- a/gcc/java/class.c
> +++ b/gcc/java/class.c
> @@ -765,7 +765,8 @@ add_method_1 (tree this_class, int access_flags, tree name, tree function_type)
>    DECL_CONTEXT (fndecl) = this_class;
>
>    DECL_LANG_SPECIFIC (fndecl)
> -    = ggc_alloc_cleared_lang_decl(sizeof (struct lang_decl));
> +    = (struct lang_decl *) ggc_internal_cleared_alloc
> +    (sizeof (struct lang_decl));
>    DECL_LANG_SPECIFIC (fndecl)->desc = LANG_DECL_FUNC;
>
>    /* Initialize the static initializer test table.  */
> diff --git a/gcc/java/constants.c b/gcc/java/constants.c
> index c0295e9..51449ef 100644
> --- a/gcc/java/constants.c
> +++ b/gcc/java/constants.c
> @@ -48,9 +48,9 @@ set_constant_entry (CPool *cpool, int index, int tag, jword value)
>        cpool->capacity = 100;
>        cpool->tags = (uint8 *) ggc_internal_cleared_alloc (sizeof (uint8)
>                                                           * cpool->capacity);
> -      cpool->data = ggc_alloc_cleared_vec_cpool_entry (sizeof
> -                                                      (union cpool_entry),
> -                                                      cpool->capacity);
> +      cpool->data = (cpool_entry *) ggc_internal_cleared_alloc (sizeof
> +                                                      (union cpool_entry)
> +                                                      * cpool->capacity);
>        cpool->count = 1;
>      }
>    if (index >= cpool->capacity)
> diff --git a/gcc/java/decl.c b/gcc/java/decl.c
> index 53d6f89..9f2f0ca 100644
> --- a/gcc/java/decl.c
> +++ b/gcc/java/decl.c
> @@ -1646,7 +1646,7 @@ java_dup_lang_specific_decl (tree node)
>      return;
>
>    lang_decl_size = sizeof (struct lang_decl);
> -  x = ggc_alloc_lang_decl (lang_decl_size);
> +  x = (struct lang_decl *) ggc_internal_alloc (lang_decl_size);
>    memcpy (x, DECL_LANG_SPECIFIC (node), lang_decl_size);
>    DECL_LANG_SPECIFIC (node) = x;
>  }
> diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h
> index 806d2d7..43a8258 100644
> --- a/gcc/java/java-tree.h
> +++ b/gcc/java/java-tree.h
> @@ -700,7 +700,8 @@ union GTY((desc ("TREE_CODE (&%h.generic) == IDENTIFIER_NODE"),
>    if (DECL_LANG_SPECIFIC (T) == NULL)                                \
>      {                                                                \
>        DECL_LANG_SPECIFIC ((T))                                       \
> -        = ggc_alloc_cleared_lang_decl (sizeof (struct lang_decl));   \
> +        = (struct lang_decl *) ggc_internal_cleared_alloc            \
> +      (sizeof (struct lang_decl));                                   \
>        DECL_LANG_SPECIFIC (T)->desc = LANG_DECL_VAR;                  \
>      }
>
> @@ -826,7 +827,8 @@ struct GTY((variable_size)) lang_decl {
>  #define MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC(T) \
>    if (TYPE_LANG_SPECIFIC ((T)) == NULL)                \
>       TYPE_LANG_SPECIFIC ((T))                  \
> -       = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
> +       = (struct lang_type *) ggc_internal_cleared_alloc \
> +(sizeof (struct lang_type));     \
>
>  #define TYPE_DUMMY(T)          (TYPE_LANG_SPECIFIC(T)->dummy_class)
>
> diff --git a/gcc/java/jcf-reader.c b/gcc/java/jcf-reader.c
> index 10def13..f25bbab 100644
> --- a/gcc/java/jcf-reader.c
> +++ b/gcc/java/jcf-reader.c
> @@ -341,7 +341,8 @@ jcf_parse_constant_pool (JCF* jcf)
>    int i, n;
>    JPOOL_SIZE (jcf) = (JCF_FILL (jcf, 2), JCF_readu2 (jcf));
>    jcf->cpool.tags = (uint8 *) ggc_alloc_atomic (JPOOL_SIZE (jcf));
> -  jcf->cpool.data = ggc_alloc_cpool_entry (sizeof (jword) * JPOOL_SIZE (jcf));
> +  jcf->cpool.data = (cpool_entry *) ggc_internal_cleared_alloc
> +    (sizeof (jword) * JPOOL_SIZE (jcf));
>    jcf->cpool.tags[0] = 0;
>  #ifdef HANDLE_START_CONSTANT_POOL
>    HANDLE_START_CONSTANT_POOL (JPOOL_SIZE (jcf));
> diff --git a/gcc/objc/objc-act.h b/gcc/objc/objc-act.h
> index 0c7fa04..a050727 100644
> --- a/gcc/objc/objc-act.h
> +++ b/gcc/objc/objc-act.h
> @@ -193,7 +193,8 @@ typedef enum objc_property_assign_semantics {
>  #define ALLOC_OBJC_TYPE_LANG_SPECIFIC(NODE)                            \
>    do {                                                                 \
>      TYPE_LANG_SPECIFIC (NODE)                                          \
> -      = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));       \
> +      = (struct lang_type *) ggc_internal_cleared_alloc     \
> +      (sizeof (struct lang_type));     \
>    } while (0)
>
>  #define TYPE_HAS_OBJC_INFO(TYPE)                               \
> diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c
> index 03d3e4d..492eee7 100644
> --- a/gcc/tree-ssa-operands.c
> +++ b/gcc/tree-ssa-operands.c
> @@ -276,8 +276,8 @@ ssa_operand_alloc (struct function *fn, unsigned size)
>         }
>
>
> -      ptr = ggc_alloc_ssa_operand_memory_d (sizeof (void *)
> -                        + gimple_ssa_operands (fn)->ssa_operand_mem_size);
> +      ptr = (ssa_operand_memory_d *) ggc_internal_alloc
> +       (sizeof (void *) + gimple_ssa_operands (fn)->ssa_operand_mem_size);
>
>        ptr->next = gimple_ssa_operands (fn)->operand_memory;
>        gimple_ssa_operands (fn)->operand_memory = ptr;
> diff --git a/gcc/tree.c b/gcc/tree.c
> index aa74fd0..365faf2 100644
> --- a/gcc/tree.c
> +++ b/gcc/tree.c
> @@ -1656,7 +1656,7 @@ build_string (int len, const char *str)
>
>    record_node_allocation_statistics (STRING_CST, length);
>
> -  s = ggc_alloc_tree_node (length);
> +  s = (tree) ggc_internal_alloc (length);
>
>    memset (s, 0, sizeof (struct tree_typed));
>    TREE_SET_CODE (s, STRING_CST);
> @@ -10368,7 +10368,7 @@ build_omp_clause (location_t loc, enum omp_clause_code code)
>
>    record_node_allocation_statistics (OMP_CLAUSE, size);
>
> -  t = ggc_alloc_tree_node (size);
> +  t = (tree) ggc_internal_alloc (size);
>    memset (t, 0, size);
>    TREE_SET_CODE (t, OMP_CLAUSE);
>    OMP_CLAUSE_SET_CODE (t, code);
> diff --git a/gcc/varasm.c b/gcc/varasm.c
> index 8e8c5f6..3b42faa 100644
> --- a/gcc/varasm.c
> +++ b/gcc/varasm.c
> @@ -381,7 +381,7 @@ create_block_symbol (const char *label, struct object_block *block,
>
>    /* Create the extended SYMBOL_REF.  */
>    size = RTX_HDR_SIZE + sizeof (struct block_symbol);
> -  symbol = ggc_alloc_rtx_def (size);
> +  symbol = (rtx) ggc_internal_alloc (size);
>
>    /* Initialize the normal SYMBOL_REF fields.  */
>    memset (symbol, 0, size);
> --
> 2.0.0.rc0
>
Laurynas Biveinis April 30, 2014, 9:04 a.m. UTC | #2
> ISTR we went to typed allocs as part of a transition which not
> fully materialised?

Yes. I had plans to replace the call-based GC marker routines with a
generic routine that operates on a type marker stored next to the
object. That enables partial, generational, etc GC.

>  I actually dislike that we get back the
> ugly casts here - so, can we keep the allocators or use
> a macro similar to the XNEW family?

My 2c suggestion would be to keep the typed allocators at least until
a new plan for GC is developed.
Richard Biener April 30, 2014, 9:18 a.m. UTC | #3
On Wed, Apr 30, 2014 at 11:04 AM, Laurynas Biveinis
<laurynas.biveinis@gmail.com> wrote:
>> ISTR we went to typed allocs as part of a transition which not
>> fully materialised?
>
> Yes. I had plans to replace the call-based GC marker routines with a
> generic routine that operates on a type marker stored next to the
> object. That enables partial, generational, etc GC.

Ah, ok.  It would also naturally allow finalization.

>>  I actually dislike that we get back the
>> ugly casts here - so, can we keep the allocators or use
>> a macro similar to the XNEW family?
>
> My 2c suggestion would be to keep the typed allocators at least until
> a new plan for GC is developed.

The current patches keep them in some way.  But the use of
C++ (and its more complex types) made types more difficult
to access.  I suppose integrating gengtype with the C++ frontend
would be the only reasonable way out here (eh, and maybe that
then naturally develops to C++11 garbage collection support - who
knows).

Thanks,
Richard.

> --
> Laurynas
Trevor Saunders April 30, 2014, 11:31 p.m. UTC | #4
On Wed, Apr 30, 2014 at 11:18:18AM +0200, Richard Biener wrote:
> On Wed, Apr 30, 2014 at 11:04 AM, Laurynas Biveinis
> <laurynas.biveinis@gmail.com> wrote:
> >> ISTR we went to typed allocs as part of a transition which not
> >> fully materialised?
> >
> > Yes. I had plans to replace the call-based GC marker routines with a
> > generic routine that operates on a type marker stored next to the
> > object. That enables partial, generational, etc GC.
> 
> Ah, ok.  It would also naturally allow finalization.

 Yeah, one thing that occured to me is we could just use a vtable for
 the identifier, and get virtual functions on some types "for free".  We
 could also use the vtable to make inheritance and dispatch simpler
 removing the manual type mangling, but I think we could get most of the
 same benefit just with function overloads.

> >>  I actually dislike that we get back the
> >> ugly casts here - so, can we keep the allocators or use
> >> a macro similar to the XNEW family?
> >
> > My 2c suggestion would be to keep the typed allocators at least until
> > a new plan for GC is developed.
> 
> The current patches keep them in some way.  But the use of
> C++ (and its more complex types) made types more difficult
> to access.  I suppose integrating gengtype with the C++ frontend
> would be the only reasonable way out here (eh, and maybe that
> then naturally develops to C++11 garbage collection support - who
> knows).

Or we could go in the direction of supporting compile time type
introspection in C++, which I think has been asked for by other people.
However even using C++ as it is today we should be able to make gengtype
a good bit simpler if we use c++ more in the code it outputs.

thanks!

Trev

> 
> Thanks,
> Richard.
> 
> > --
> > Laurynas
diff mbox

Patch

diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c
index e30876c..e8b8166 100644
--- a/gcc/c/c-decl.c
+++ b/gcc/c/c-decl.c
@@ -7423,8 +7423,9 @@  finish_struct (location_t loc, tree t, tree fieldlist, tree attributes,
 	  ensure that this lives as long as the rest of the struct decl.
 	  All decls in an inline function need to be saved.  */
 
-	space = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
-	space2 = ggc_alloc_sorted_fields_type
+	space = (struct lang_type *) ggc_internal_cleared_alloc
+	  (sizeof (struct lang_type));
+	space2 = (sorted_fields_type *) ggc_internal_alloc
 	  (sizeof (struct sorted_fields_type) + len * sizeof (tree));
 
 	len = 0;
@@ -7704,7 +7705,8 @@  finish_enum (tree enumtype, tree values, tree attributes)
 
   /* Record the min/max values so that we can warn about bit-field
      enumerations that are too small for the values.  */
-  lt = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
+  lt = (struct lang_type *) ggc_internal_cleared_alloc
+    (sizeof (struct lang_type));
   lt->enum_min = minnode;
   lt->enum_max = maxnode;
   TYPE_LANG_SPECIFIC (enumtype) = lt;
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 334bfd5..86058b5 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -6490,7 +6490,7 @@  static struct sorted_fields_type *
 sorted_fields_type_new (int n)
 {
   struct sorted_fields_type *sft;
-  sft = ggc_alloc_sorted_fields_type (sizeof (struct sorted_fields_type)
+  sft = (sorted_fields_type *) ggc_internal_alloc (sizeof (sorted_fields_type)
 				      + n * sizeof (tree));
   sft->len = n;
 
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index f459e55..9fbc7f8 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -3586,7 +3586,8 @@  more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter)
   do {									\
     if (TYPE_LANG_SPECIFIC (NODE) == NULL)				\
       {									\
-	TYPE_LANG_SPECIFIC (NODE) = ggc_alloc_cleared_lang_type		\
+	TYPE_LANG_SPECIFIC (NODE)                                       \
+	= (struct lang_type *) ggc_internal_cleared_alloc		\
 	 (sizeof (struct lang_type_ptrmem));				\
 	TYPE_LANG_SPECIFIC (NODE)->u.ptrmem.h.is_lang_type_class = 0;	\
       }									\
diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c
index 3fe275e..46c28ae 100644
--- a/gcc/cp/lex.c
+++ b/gcc/cp/lex.c
@@ -555,7 +555,7 @@  retrofit_lang_decl (tree t)
   else
     gcc_unreachable ();
 
-  ld = ggc_alloc_cleared_lang_decl (size);
+  ld = (struct lang_decl *) ggc_internal_cleared_alloc (size);
 
   ld->u.base.selector = sel;
 
@@ -597,7 +597,7 @@  cxx_dup_lang_specific_decl (tree node)
   else
     gcc_unreachable ();
 
-  ld = ggc_alloc_lang_decl (size);
+  ld = (struct lang_decl *) ggc_internal_alloc (size);
   memcpy (ld, DECL_LANG_SPECIFIC (node), size);
   DECL_LANG_SPECIFIC (node) = ld;
 
@@ -635,7 +635,7 @@  copy_lang_type (tree node)
     size = sizeof (struct lang_type);
   else
     size = sizeof (struct lang_type_ptrmem);
-  lt = ggc_alloc_lang_type (size);
+  lt = (struct lang_type *) ggc_internal_alloc (size);
   memcpy (lt, TYPE_LANG_SPECIFIC (node), size);
   TYPE_LANG_SPECIFIC (node) = lt;
 
@@ -668,7 +668,8 @@  cxx_make_type (enum tree_code code)
       || code == BOUND_TEMPLATE_TEMPLATE_PARM)
     {
       struct lang_type *pi
-          = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
+          = (struct lang_type *) ggc_internal_cleared_alloc
+	  (sizeof (struct lang_type));
 
       TYPE_LANG_SPECIFIC (t) = pi;
       pi->u.c.h.is_lang_type_class = 1;
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index cf7b661..beb99a6 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -615,8 +615,9 @@  gfc_finish_var_decl (tree decl, gfc_symbol * sym)
 void
 gfc_allocate_lang_decl (tree decl)
 {
-  DECL_LANG_SPECIFIC (decl) = ggc_alloc_cleared_lang_decl(sizeof
-							  (struct lang_decl));
+  DECL_LANG_SPECIFIC (decl)
+    = (struct lang_decl *) ggc_internal_cleared_alloc (sizeof
+						       (struct lang_decl));
 }
 
 /* Remember a symbol to generate initialization/cleanup code at function
diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c
index 243feb7..84503ce 100644
--- a/gcc/fortran/trans-types.c
+++ b/gcc/fortran/trans-types.c
@@ -1512,7 +1512,8 @@  gfc_get_nodesc_array_type (tree etype, gfc_array_spec * as, gfc_packed packed,
 
   GFC_ARRAY_TYPE_P (type) = 1;
   TYPE_LANG_SPECIFIC (type)
-      = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
+      = (struct lang_type *) ggc_internal_cleared_alloc
+      (sizeof (struct lang_type));
 
   known_stride = (packed != PACKED_NO);
   known_offset = 1;
@@ -1815,7 +1816,8 @@  gfc_get_array_type_bounds (tree etype, int dimen, int codimen, tree * lbound,
 
   GFC_DESCRIPTOR_TYPE_P (fat_type) = 1;
   TYPE_LANG_SPECIFIC (fat_type)
-    = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
+    = (struct lang_type *) ggc_internal_cleared_alloc
+    (sizeof (struct lang_type));
 
   GFC_TYPE_ARRAY_RANK (fat_type) = dimen;
   GFC_TYPE_ARRAY_CORANK (fat_type) = codimen;
@@ -1990,7 +1992,8 @@  gfc_nonrestricted_type (tree t)
 
   if (!TYPE_LANG_SPECIFIC (t))
     TYPE_LANG_SPECIFIC (t)
-      = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
+      = (struct lang_type *) ggc_internal_cleared_alloc
+      (sizeof (struct lang_type));
   /* If we're dealing with this very node already further up
      the call chain (recursion via pointers and struct members)
      we haven't yet determined if we really need a new type node.
@@ -2042,8 +2045,8 @@  gfc_nonrestricted_type (tree t)
 		  if (dataptr_type != GFC_TYPE_ARRAY_DATAPTR_TYPE (t))
 		    {
 		      TYPE_LANG_SPECIFIC (ret)
-			= ggc_alloc_cleared_lang_type (sizeof (struct
-							       lang_type));
+			= (struct lang_type *) ggc_internal_cleared_alloc
+		       	(sizeof (struct lang_type));
 		      *TYPE_LANG_SPECIFIC (ret) = *TYPE_LANG_SPECIFIC (t);
 		      GFC_TYPE_ARRAY_DATAPTR_TYPE (ret) = dataptr_type;
 		    }
diff --git a/gcc/gengtype.c b/gcc/gengtype.c
index e8fcd9f..b3c966c 100644
--- a/gcc/gengtype.c
+++ b/gcc/gengtype.c
@@ -4967,6 +4967,9 @@  write_typed_alloc_def (outf_p f,
                        enum alloc_quantity quantity)
 {
   bool two_args = variable_size && (quantity == vector);
+  if (variable_size)
+    return;
+
   gcc_assert (f != NULL);
   const char *type_name_as_id = filter_type_name (type_name);
   oprintf (f, "#define ggc_alloc_%s%s", allocator_type, type_name_as_id);
diff --git a/gcc/ggc.h b/gcc/ggc.h
index 0af69f5..736305d 100644
--- a/gcc/ggc.h
+++ b/gcc/ggc.h
@@ -230,7 +230,7 @@  extern void stringpool_statistics (void);
 extern void init_ggc_heuristics (void);
 
 #define ggc_alloc_rtvec_sized(NELT)				\
-  ggc_alloc_rtvec_def (sizeof (struct rtvec_def)		\
+  (rtvec_def *) ggc_internal_alloc (sizeof (struct rtvec_def)		\
 		       + ((NELT) - 1) * sizeof (rtx))		\
 
 /* Memory statistics passing versions of some allocators.  Too few of them to
diff --git a/gcc/java/class.c b/gcc/java/class.c
index bbe7c86..94c2568 100644
--- a/gcc/java/class.c
+++ b/gcc/java/class.c
@@ -765,7 +765,8 @@  add_method_1 (tree this_class, int access_flags, tree name, tree function_type)
   DECL_CONTEXT (fndecl) = this_class;
 
   DECL_LANG_SPECIFIC (fndecl)
-    = ggc_alloc_cleared_lang_decl(sizeof (struct lang_decl));
+    = (struct lang_decl *) ggc_internal_cleared_alloc
+    (sizeof (struct lang_decl));
   DECL_LANG_SPECIFIC (fndecl)->desc = LANG_DECL_FUNC;
 
   /* Initialize the static initializer test table.  */
diff --git a/gcc/java/constants.c b/gcc/java/constants.c
index c0295e9..51449ef 100644
--- a/gcc/java/constants.c
+++ b/gcc/java/constants.c
@@ -48,9 +48,9 @@  set_constant_entry (CPool *cpool, int index, int tag, jword value)
       cpool->capacity = 100;
       cpool->tags = (uint8 *) ggc_internal_cleared_alloc (sizeof (uint8)
 							  * cpool->capacity);
-      cpool->data = ggc_alloc_cleared_vec_cpool_entry (sizeof
-						       (union cpool_entry),
-						       cpool->capacity);
+      cpool->data = (cpool_entry *) ggc_internal_cleared_alloc (sizeof
+						       (union cpool_entry)
+						       * cpool->capacity);
       cpool->count = 1;
     }
   if (index >= cpool->capacity)
diff --git a/gcc/java/decl.c b/gcc/java/decl.c
index 53d6f89..9f2f0ca 100644
--- a/gcc/java/decl.c
+++ b/gcc/java/decl.c
@@ -1646,7 +1646,7 @@  java_dup_lang_specific_decl (tree node)
     return;
 
   lang_decl_size = sizeof (struct lang_decl);
-  x = ggc_alloc_lang_decl (lang_decl_size);
+  x = (struct lang_decl *) ggc_internal_alloc (lang_decl_size);
   memcpy (x, DECL_LANG_SPECIFIC (node), lang_decl_size);
   DECL_LANG_SPECIFIC (node) = x;
 }
diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h
index 806d2d7..43a8258 100644
--- a/gcc/java/java-tree.h
+++ b/gcc/java/java-tree.h
@@ -700,7 +700,8 @@  union GTY((desc ("TREE_CODE (&%h.generic) == IDENTIFIER_NODE"),
   if (DECL_LANG_SPECIFIC (T) == NULL)                                \
     {                                                                \
       DECL_LANG_SPECIFIC ((T))                                       \
-        = ggc_alloc_cleared_lang_decl (sizeof (struct lang_decl));   \
+        = (struct lang_decl *) ggc_internal_cleared_alloc            \
+      (sizeof (struct lang_decl));                                   \
       DECL_LANG_SPECIFIC (T)->desc = LANG_DECL_VAR;                  \
     }
 
@@ -826,7 +827,8 @@  struct GTY((variable_size)) lang_decl {
 #define MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC(T) \
   if (TYPE_LANG_SPECIFIC ((T)) == NULL)		\
      TYPE_LANG_SPECIFIC ((T))			\
-       = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
+       = (struct lang_type *) ggc_internal_cleared_alloc \
+(sizeof (struct lang_type));     \
 
 #define TYPE_DUMMY(T)		(TYPE_LANG_SPECIFIC(T)->dummy_class)
 
diff --git a/gcc/java/jcf-reader.c b/gcc/java/jcf-reader.c
index 10def13..f25bbab 100644
--- a/gcc/java/jcf-reader.c
+++ b/gcc/java/jcf-reader.c
@@ -341,7 +341,8 @@  jcf_parse_constant_pool (JCF* jcf)
   int i, n;
   JPOOL_SIZE (jcf) = (JCF_FILL (jcf, 2), JCF_readu2 (jcf));
   jcf->cpool.tags = (uint8 *) ggc_alloc_atomic (JPOOL_SIZE (jcf));
-  jcf->cpool.data = ggc_alloc_cpool_entry (sizeof (jword) * JPOOL_SIZE (jcf));
+  jcf->cpool.data = (cpool_entry *) ggc_internal_cleared_alloc
+    (sizeof (jword) * JPOOL_SIZE (jcf));
   jcf->cpool.tags[0] = 0;
 #ifdef HANDLE_START_CONSTANT_POOL
   HANDLE_START_CONSTANT_POOL (JPOOL_SIZE (jcf));
diff --git a/gcc/objc/objc-act.h b/gcc/objc/objc-act.h
index 0c7fa04..a050727 100644
--- a/gcc/objc/objc-act.h
+++ b/gcc/objc/objc-act.h
@@ -193,7 +193,8 @@  typedef enum objc_property_assign_semantics {
 #define ALLOC_OBJC_TYPE_LANG_SPECIFIC(NODE)				\
   do {									\
     TYPE_LANG_SPECIFIC (NODE)						\
-      = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));	\
+      = (struct lang_type *) ggc_internal_cleared_alloc     \
+      (sizeof (struct lang_type));	\
   } while (0)
 
 #define TYPE_HAS_OBJC_INFO(TYPE)				\
diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c
index 03d3e4d..492eee7 100644
--- a/gcc/tree-ssa-operands.c
+++ b/gcc/tree-ssa-operands.c
@@ -276,8 +276,8 @@  ssa_operand_alloc (struct function *fn, unsigned size)
 	}
 
 
-      ptr = ggc_alloc_ssa_operand_memory_d (sizeof (void *)
-                        + gimple_ssa_operands (fn)->ssa_operand_mem_size);
+      ptr = (ssa_operand_memory_d *) ggc_internal_alloc
+	(sizeof (void *) + gimple_ssa_operands (fn)->ssa_operand_mem_size);
 
       ptr->next = gimple_ssa_operands (fn)->operand_memory;
       gimple_ssa_operands (fn)->operand_memory = ptr;
diff --git a/gcc/tree.c b/gcc/tree.c
index aa74fd0..365faf2 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -1656,7 +1656,7 @@  build_string (int len, const char *str)
 
   record_node_allocation_statistics (STRING_CST, length);
 
-  s = ggc_alloc_tree_node (length);
+  s = (tree) ggc_internal_alloc (length);
 
   memset (s, 0, sizeof (struct tree_typed));
   TREE_SET_CODE (s, STRING_CST);
@@ -10368,7 +10368,7 @@  build_omp_clause (location_t loc, enum omp_clause_code code)
 
   record_node_allocation_statistics (OMP_CLAUSE, size);
 
-  t = ggc_alloc_tree_node (size);
+  t = (tree) ggc_internal_alloc (size);
   memset (t, 0, size);
   TREE_SET_CODE (t, OMP_CLAUSE);
   OMP_CLAUSE_SET_CODE (t, code);
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 8e8c5f6..3b42faa 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -381,7 +381,7 @@  create_block_symbol (const char *label, struct object_block *block,
 
   /* Create the extended SYMBOL_REF.  */
   size = RTX_HDR_SIZE + sizeof (struct block_symbol);
-  symbol = ggc_alloc_rtx_def (size);
+  symbol = (rtx) ggc_internal_alloc (size);
 
   /* Initialize the normal SYMBOL_REF fields.  */
   memset (symbol, 0, size);