On Tue, Apr 29, 2014 at 1:08 PM,  <tsaund...@mozilla.com> wrote:
> From: Trevor Saunders <tsaund...@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  <tsaund...@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  <tsaund...@mozilla.com>
>
>         * c-decl.c (finish_struct): Adjust.
>         (finish_enum): Likewise.
>
> gcc/java/ChangeLog:
>
> 2014-04-23  Trevor Saunders  <tsaund...@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  <tsaund...@mozilla.com>
>
>         * objc-act.h: Adjust.
>
> gcc/cp/ChangeLog:
>
> 2014-04-23  Trevor Saunders  <tsaund...@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  <tsaund...@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
>

Reply via email to