From 06f13dc11eae7a9ff64a9412af722a4945f30482 Mon Sep 17 00:00:00 2001 From: froydnj Date: Mon, 17 May 2010 16:03:46 +0000 Subject: [PATCH] * trans-array.c (gfc_trans_array_constructor_value): Use build_constructor instead of build_constructor_from_list. (gfc_build_constant_array_constructor): Likewise. * trans-decl.c (create_main_function): Likewise. * trans-stmt.c (gfc_trans_character_select): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159490 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 8 ++++++++ gcc/fortran/trans-array.c | 21 +++++++++++---------- gcc/fortran/trans-decl.c | 45 ++++++++++++++++++++++++++------------------- gcc/fortran/trans-stmt.c | 33 ++++++++++++++++----------------- 4 files changed, 61 insertions(+), 46 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 2bf6b659b65..a1fec13438f 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2010-05-17 Nathan Froyd + + * trans-array.c (gfc_trans_array_constructor_value): Use + build_constructor instead of build_constructor_from_list. + (gfc_build_constant_array_constructor): Likewise. + * trans-decl.c (create_main_function): Likewise. + * trans-stmt.c (gfc_trans_character_select): Likewise. + 2010-05-17 Janus Weil PR fortran/44044 diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 8ece64327af..a94c8d2b3c5 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -1308,14 +1308,13 @@ gfc_trans_array_constructor_value (stmtblock_t * pblock, tree type, else { /* Collect multiple scalar constants into a constructor. */ - tree list; + VEC(constructor_elt,gc) *v = NULL; tree init; tree bound; tree tmptype; HOST_WIDE_INT idx = 0; p = c; - list = NULL_TREE; /* Count the number of consecutive scalar constants. */ while (p && !(p->iterator || p->expr->expr_type != EXPR_CONSTANT)) @@ -1332,8 +1331,10 @@ gfc_trans_array_constructor_value (stmtblock_t * pblock, tree type, (gfc_get_pchar_type (p->expr->ts.kind), se.expr); - list = tree_cons (build_int_cst (gfc_array_index_type, - idx++), se.expr, list); + CONSTRUCTOR_APPEND_ELT (v, + build_int_cst (gfc_array_index_type, + idx++), + se.expr); c = p; p = gfc_constructor_next (p); } @@ -1344,7 +1345,7 @@ gfc_trans_array_constructor_value (stmtblock_t * pblock, tree type, gfc_index_zero_node, bound); tmptype = build_array_type (type, tmptype); - init = build_constructor_from_list (tmptype, nreverse (list)); + init = build_constructor (tmptype, v); TREE_CONSTANT (init) = 1; TREE_STATIC (init) = 1; /* Create a static variable to hold the data. */ @@ -1671,17 +1672,17 @@ gfc_constant_array_constructor_p (gfc_constructor_base base) tree gfc_build_constant_array_constructor (gfc_expr * expr, tree type) { - tree tmptype, list, init, tmp; + tree tmptype, init, tmp; HOST_WIDE_INT nelem; gfc_constructor *c; gfc_array_spec as; gfc_se se; int i; + VEC(constructor_elt,gc) *v = NULL; /* First traverse the constructor list, converting the constants to tree to build an initializer. */ nelem = 0; - list = NULL_TREE; c = gfc_constructor_first (expr->value.constructor); while (c) { @@ -1692,8 +1693,8 @@ gfc_build_constant_array_constructor (gfc_expr * expr, tree type) else if (POINTER_TYPE_P (type)) se.expr = gfc_build_addr_expr (gfc_get_pchar_type (c->expr->ts.kind), se.expr); - list = tree_cons (build_int_cst (gfc_array_index_type, nelem), - se.expr, list); + CONSTRUCTOR_APPEND_ELT (v, build_int_cst (gfc_array_index_type, nelem), + se.expr); c = gfc_constructor_next (c); nelem++; } @@ -1723,7 +1724,7 @@ gfc_build_constant_array_constructor (gfc_expr * expr, tree type) tmptype = gfc_get_nodesc_array_type (type, &as, PACKED_STATIC, true); - init = build_constructor_from_list (tmptype, nreverse (list)); + init = build_constructor (tmptype, v); TREE_CONSTANT (init) = 1; TREE_STATIC (init) = 1; diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 56c88bc69f8..7facc8dd192 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -4196,6 +4196,7 @@ create_main_function (tree fndecl) language standard parameters. */ { tree array_type, array, var; + VEC(constructor_elt,gc) *v = NULL; /* Passing a new option to the library requires four modifications: + add it to the tree_cons list below @@ -4204,28 +4205,34 @@ create_main_function (tree fndecl) gfor_fndecl_set_options + modify the library (runtime/compile_options.c)! */ - array = tree_cons (NULL_TREE, build_int_cst (integer_type_node, - gfc_option.warn_std), NULL_TREE); - array = tree_cons (NULL_TREE, build_int_cst (integer_type_node, - gfc_option.allow_std), array); - array = tree_cons (NULL_TREE, build_int_cst (integer_type_node, pedantic), - array); - array = tree_cons (NULL_TREE, build_int_cst (integer_type_node, - gfc_option.flag_dump_core), array); - array = tree_cons (NULL_TREE, build_int_cst (integer_type_node, - gfc_option.flag_backtrace), array); - array = tree_cons (NULL_TREE, build_int_cst (integer_type_node, - gfc_option.flag_sign_zero), array); - - array = tree_cons (NULL_TREE, build_int_cst (integer_type_node, - (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS)), array); - - array = tree_cons (NULL_TREE, build_int_cst (integer_type_node, - gfc_option.flag_range_check), array); + CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, + build_int_cst (integer_type_node, + gfc_option.warn_std)); + CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, + build_int_cst (integer_type_node, + gfc_option.allow_std)); + CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, + build_int_cst (integer_type_node, pedantic)); + CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, + build_int_cst (integer_type_node, + gfc_option.flag_dump_core)); + CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, + build_int_cst (integer_type_node, + gfc_option.flag_backtrace)); + CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, + build_int_cst (integer_type_node, + gfc_option.flag_sign_zero)); + CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, + build_int_cst (integer_type_node, + (gfc_option.rtcheck + & GFC_RTCHECK_BOUNDS))); + CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, + build_int_cst (integer_type_node, + gfc_option.flag_range_check)); array_type = build_array_type (integer_type_node, build_index_type (build_int_cst (NULL_TREE, 7))); - array = build_constructor_from_list (array_type, nreverse (array)); + array = build_constructor (array_type, v); TREE_CONSTANT (array) = 1; TREE_STATIC (array) = 1; diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c index 0a2ad536ef1..f618f021bbb 100644 --- a/gcc/fortran/trans-stmt.c +++ b/gcc/fortran/trans-stmt.c @@ -1593,12 +1593,13 @@ gfc_trans_logical_select (gfc_code * code) static tree gfc_trans_character_select (gfc_code *code) { - tree init, node, end_label, tmp, type, case_num, label, fndecl; + tree init, end_label, tmp, type, case_num, label, fndecl; stmtblock_t block, body; gfc_case *cp, *d; gfc_code *c; gfc_se se; int n, k; + VEC(constructor_elt,gc) *inits = NULL; /* The jump table types are stored in static variables to avoid constructing them from scratch every single time. */ @@ -1678,52 +1679,50 @@ gfc_trans_character_select (gfc_code *code) } /* Generate the structure describing the branches */ - init = NULL_TREE; - for(d = cp; d; d = d->right) { - node = NULL_TREE; + VEC(constructor_elt,gc) *node = NULL; gfc_init_se (&se, NULL); if (d->low == NULL) { - node = tree_cons (ss_string1[k], null_pointer_node, node); - node = tree_cons (ss_string1_len[k], integer_zero_node, node); + CONSTRUCTOR_APPEND_ELT (node, ss_string1[k], null_pointer_node); + CONSTRUCTOR_APPEND_ELT (node, ss_string1_len[k], integer_zero_node); } else { gfc_conv_expr_reference (&se, d->low); - node = tree_cons (ss_string1[k], se.expr, node); - node = tree_cons (ss_string1_len[k], se.string_length, node); + CONSTRUCTOR_APPEND_ELT (node, ss_string1[k], se.expr); + CONSTRUCTOR_APPEND_ELT (node, ss_string1_len[k], se.string_length); } if (d->high == NULL) { - node = tree_cons (ss_string2[k], null_pointer_node, node); - node = tree_cons (ss_string2_len[k], integer_zero_node, node); + CONSTRUCTOR_APPEND_ELT (node, ss_string2[k], null_pointer_node); + CONSTRUCTOR_APPEND_ELT (node, ss_string2_len[k], integer_zero_node); } else { gfc_init_se (&se, NULL); gfc_conv_expr_reference (&se, d->high); - node = tree_cons (ss_string2[k], se.expr, node); - node = tree_cons (ss_string2_len[k], se.string_length, node); + CONSTRUCTOR_APPEND_ELT (node, ss_string2[k], se.expr); + CONSTRUCTOR_APPEND_ELT (node, ss_string2_len[k], se.string_length); } - node = tree_cons (ss_target[k], build_int_cst (integer_type_node, d->n), - node); + CONSTRUCTOR_APPEND_ELT (node, ss_target[k], + build_int_cst (integer_type_node, d->n)); - tmp = build_constructor_from_list (select_struct[k], nreverse (node)); - init = tree_cons (NULL_TREE, tmp, init); + tmp = build_constructor (select_struct[k], node); + CONSTRUCTOR_APPEND_ELT (inits, NULL_TREE, tmp); } type = build_array_type (select_struct[k], build_index_type (build_int_cst (NULL_TREE, n-1))); - init = build_constructor_from_list (type, nreverse(init)); + init = build_constructor (type, inits); TREE_CONSTANT (init) = 1; TREE_STATIC (init) = 1; /* Create a static variable to hold the jump table. */ -- 2.11.0