diff options
Diffstat (limited to 'gcc/fortran')
| -rw-r--r-- | gcc/fortran/ChangeLog | 11 | ||||
| -rw-r--r-- | gcc/fortran/trans-array.c | 24 | ||||
| -rw-r--r-- | gcc/fortran/trans-common.c | 19 | ||||
| -rw-r--r-- | gcc/fortran/trans-expr.c | 21 | ||||
| -rw-r--r-- | gcc/fortran/trans-stmt.c | 4 |
5 files changed, 39 insertions, 40 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 12c6b2e..80a1538 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,14 @@ +2005-07-20 Giovanni Bajo <giovannibajo@libero.it> + + Make CONSTRUCTOR use VEC to store initializers. + * trans-array.c (gfc_build_null_descriptor, + gfc_trans_array_constructor_value, gfc_conv_array_initializer): + Update to cope with VEC in CONSTRUCTOR_ELTS. + * trans-common.c (create_common): Likewise. + * trans-expr.c (gfc_conv_structure): Likewise. + * trans-stmt.c (gfc_trans_character_select): Use + build_constructor_from_list instead of build_constructor. + 2005-07-19 Paul Thomas <pault@gcc.gnu.org> PR fortran/16940 diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index d54dff3..e634154 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -299,8 +299,7 @@ gfc_build_null_descriptor (tree type) field = TYPE_FIELDS (type); /* Set a NULL data pointer. */ - tmp = tree_cons (field, null_pointer_node, NULL_TREE); - tmp = build1 (CONSTRUCTOR, type, tmp); + tmp = build_constructor_single (type, field, null_pointer_node); TREE_CONSTANT (tmp) = 1; TREE_INVARIANT (tmp) = 1; /* All other fields are ignored. */ @@ -834,7 +833,7 @@ gfc_trans_array_constructor_value (stmtblock_t * pblock, tree type, gfc_index_zero_node, bound); tmptype = build_array_type (type, tmptype); - init = build1 (CONSTRUCTOR, tmptype, nreverse (list)); + init = build_constructor_from_list (tmptype, nreverse (list)); TREE_CONSTANT (init) = 1; TREE_INVARIANT (init) = 1; TREE_STATIC (init) = 1; @@ -2833,15 +2832,14 @@ tree gfc_conv_array_initializer (tree type, gfc_expr * expr) { gfc_constructor *c; - tree list; tree tmp; mpz_t maxval; gfc_se se; HOST_WIDE_INT hi; unsigned HOST_WIDE_INT lo; tree index, range; + VEC(constructor_elt,gc) *v = NULL; - list = NULL_TREE; switch (expr->expr_type) { case EXPR_CONSTANT: @@ -2865,7 +2863,7 @@ gfc_conv_array_initializer (tree type, gfc_expr * expr) /* This will probably eat buckets of memory for large arrays. */ while (hi != 0 || lo != 0) { - list = tree_cons (NULL_TREE, se.expr, list); + CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, se.expr); if (lo == 0) hi--; lo--; @@ -2873,7 +2871,7 @@ gfc_conv_array_initializer (tree type, gfc_expr * expr) break; case EXPR_ARRAY: - /* Create a list of all the elements. */ + /* Create a vector of all the elements. */ for (c = expr->value.constructor; c; c = c->next) { if (c->iterator) @@ -2917,26 +2915,24 @@ gfc_conv_array_initializer (tree type, gfc_expr * expr) case EXPR_CONSTANT: gfc_conv_constant (&se, c->expr); if (range == NULL_TREE) - list = tree_cons (index, se.expr, list); + CONSTRUCTOR_APPEND_ELT (v, index, se.expr); else { if (index != NULL_TREE) - list = tree_cons (index, se.expr, list); - list = tree_cons (range, se.expr, list); + CONSTRUCTOR_APPEND_ELT (v, index, se.expr); + CONSTRUCTOR_APPEND_ELT (v, range, se.expr); } break; case EXPR_STRUCTURE: gfc_conv_structure (&se, c->expr, 1); - list = tree_cons (index, se.expr, list); + CONSTRUCTOR_APPEND_ELT (v, index, se.expr); break; default: gcc_unreachable (); } } - /* We created the list in reverse order. */ - list = nreverse (list); break; default: @@ -2944,7 +2940,7 @@ gfc_conv_array_initializer (tree type, gfc_expr * expr) } /* Create a constructor from the list of elements. */ - tmp = build1 (CONSTRUCTOR, type, list); + tmp = build_constructor (type, v); TREE_CONSTANT (tmp) = 1; TREE_INVARIANT (tmp) = 1; return tmp; diff --git a/gcc/fortran/trans-common.c b/gcc/fortran/trans-common.c index 39b49e2..4defe0f 100644 --- a/gcc/fortran/trans-common.c +++ b/gcc/fortran/trans-common.c @@ -422,10 +422,10 @@ create_common (gfc_common_head *com, segment_info * head, bool saw_equiv) if (is_init) { - tree list, ctor, tmp; + tree ctor, tmp; HOST_WIDE_INT offset = 0; + VEC(constructor_elt,gc) *v = NULL; - list = NULL_TREE; for (s = head; s; s = s->next) { if (s->sym->value) @@ -442,20 +442,25 @@ create_common (gfc_common_head *com, segment_info * head, bool saw_equiv) tmp = gfc_conv_initializer (s->sym->value, &s->sym->ts, TREE_TYPE (s->field), s->sym->attr.dimension, s->sym->attr.pointer || s->sym->attr.allocatable); - list = tree_cons (s->field, tmp, list); + + CONSTRUCTOR_APPEND_ELT (v, s->field, tmp); offset = s->offset + s->length; } } - gcc_assert (list); - ctor = build1 (CONSTRUCTOR, union_type, nreverse(list)); + gcc_assert (!VEC_empty (constructor_elt, v)); + ctor = build_constructor (union_type, v); TREE_CONSTANT (ctor) = 1; TREE_INVARIANT (ctor) = 1; TREE_STATIC (ctor) = 1; DECL_INITIAL (decl) = ctor; #ifdef ENABLE_CHECKING - for (tmp = CONSTRUCTOR_ELTS (ctor); tmp; tmp = TREE_CHAIN (tmp)) - gcc_assert (TREE_CODE (TREE_PURPOSE (tmp)) == FIELD_DECL); + { + tree field, value; + unsigned HOST_WIDE_INT idx; + FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), idx, field, value) + gcc_assert (TREE_CODE (field) == FIELD_DECL); + } #endif } diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index c1863fc..0cd8741 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -1812,11 +1812,10 @@ gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init) { gfc_constructor *c; gfc_component *cm; - tree head; - tree tail; tree val; tree type; tree tmp; + VEC(constructor_elt,gc) *v = NULL; gcc_assert (se->ss == NULL); gcc_assert (expr->expr_type == EXPR_STRUCTURE); @@ -1831,9 +1830,6 @@ gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init) return; } - head = build1 (CONSTRUCTOR, type, NULL_TREE); - tail = NULL_TREE; - cm = expr->ts.derived->components; for (c = expr->value.constructor; c; c = c->next, cm = cm->next) { @@ -1844,19 +1840,10 @@ gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init) val = gfc_conv_initializer (c->expr, &cm->ts, TREE_TYPE (cm->backend_decl), cm->dimension, cm->pointer); - /* Build a TREE_CHAIN to hold it. */ - val = tree_cons (cm->backend_decl, val, NULL_TREE); - - /* Add it to the list. */ - if (tail == NULL_TREE) - TREE_OPERAND(head, 0) = tail = val; - else - { - TREE_CHAIN (tail) = val; - tail = val; - } + /* Append it to the constructor list. */ + CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val); } - se->expr = head; + se->expr = build_constructor (type, v); } diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c index 0ec029f..99467b4 100644 --- a/gcc/fortran/trans-stmt.c +++ b/gcc/fortran/trans-stmt.c @@ -1220,14 +1220,14 @@ gfc_trans_character_select (gfc_code *code) tmp = gfc_build_addr_expr (pvoid_type_node, labels[i]); node = tree_cons (ss_target, tmp, node); - tmp = build1 (CONSTRUCTOR, select_struct, nreverse (node)); + tmp = build_constructor_from_list (select_struct, nreverse (node)); init = tree_cons (NULL_TREE, tmp, init); } type = build_array_type (select_struct, build_index_type (build_int_cst (NULL_TREE, n - 1))); - init = build1 (CONSTRUCTOR, type, nreverse(init)); + init = build_constructor_from_list (type, nreverse(init)); TREE_CONSTANT (init) = 1; TREE_INVARIANT (init) = 1; TREE_STATIC (init) = 1; |
