diff options
-rw-r--r-- | gcc/fortran/ChangeLog | 17 | ||||
-rw-r--r-- | gcc/fortran/trans-io.c | 14 | ||||
-rw-r--r-- | gcc/fortran/trans-stmt.c | 9 | ||||
-rw-r--r-- | gcc/fortran/trans-types.c | 62 | ||||
-rw-r--r-- | gcc/fortran/trans-types.h | 2 |
5 files changed, 48 insertions, 56 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index e4837b4..6709df3 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,20 @@ +2010-07-10 Mikael Morin <mikael@gcc.gnu.org> + + * trans-io.c (gfc_build_st_parameter): Update calls to + gfc_add_field_to_struct. + * trans-stmt.c (ADD_FIELD): Ditto. + * trans-types.c + (gfc_get_derived_type): Ditto. Don't create backend_decl for C_PTR's + C_ADDRESS field. + (gfc_add_field_to_struct_1): Set TYPE_FIELDS(context) instead of + fieldlist, remove fieldlist from argument list. + (gfc_add_field_to_struct): Update call to gfc_add_field_to_struct_1 + and remove fieldlist from argument list. + (gfc_get_desc_dim_type, gfc_get_array_descriptor_base, + gfc_get_mixed_entry_union): Move setting + TYPE_FIELDS to gfc_add_field_to_struct_1 and update calls to it. + * trans-types.h (gfc_add_field_to_struct): Update prototype. + 2010-07-10 Paul Thomas <pault@gcc.gnu.org> PR fortran/44773 diff --git a/gcc/fortran/trans-io.c b/gcc/fortran/trans-io.c index 2624bb2..8626e03 100644 --- a/gcc/fortran/trans-io.c +++ b/gcc/fortran/trans-io.c @@ -176,13 +176,11 @@ gfc_build_st_parameter (enum ioparam_type ptype, tree *types) case IOPARM_type_parray: case IOPARM_type_pchar: case IOPARM_type_pad: - p->field = gfc_add_field_to_struct (&TYPE_FIELDS (t), t, - get_identifier (p->name), + p->field = gfc_add_field_to_struct (t, get_identifier (p->name), types[p->type], &chain); break; case IOPARM_type_char1: - p->field = gfc_add_field_to_struct (&TYPE_FIELDS (t), t, - get_identifier (p->name), + p->field = gfc_add_field_to_struct (t, get_identifier (p->name), pchar_type_node, &chain); /* FALLTHROUGH */ case IOPARM_type_char2: @@ -190,18 +188,16 @@ gfc_build_st_parameter (enum ioparam_type ptype, tree *types) gcc_assert (len <= sizeof (name) - sizeof ("_len")); memcpy (name, p->name, len); memcpy (name + len, "_len", sizeof ("_len")); - p->field_len = gfc_add_field_to_struct (&TYPE_FIELDS (t), t, - get_identifier (name), + p->field_len = gfc_add_field_to_struct (t, get_identifier (name), gfc_charlen_type_node, &chain); if (p->type == IOPARM_type_char2) - p->field = gfc_add_field_to_struct (&TYPE_FIELDS (t), t, - get_identifier (p->name), + p->field = gfc_add_field_to_struct (t, get_identifier (p->name), pchar_type_node, &chain); break; case IOPARM_type_common: p->field - = gfc_add_field_to_struct (&TYPE_FIELDS (t), t, + = gfc_add_field_to_struct (t, get_identifier (p->name), st_parameter[IOPARM_ptype_common].type, &chain); diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c index beada6a..bdf4d11 100644 --- a/gcc/fortran/trans-stmt.c +++ b/gcc/fortran/trans-stmt.c @@ -1643,10 +1643,11 @@ gfc_trans_character_select (gfc_code *code) gcc_unreachable (); #undef ADD_FIELD -#define ADD_FIELD(NAME, TYPE) \ - ss_##NAME[k] = gfc_add_field_to_struct \ - (&(TYPE_FIELDS (select_struct[k])), select_struct[k], \ - get_identifier (stringize(NAME)), TYPE, &chain) +#define ADD_FIELD(NAME, TYPE) \ + ss_##NAME[k] = gfc_add_field_to_struct (select_struct[k], \ + get_identifier (stringize(NAME)), \ + TYPE, \ + &chain) ADD_FIELD (string1, pchartype); ADD_FIELD (string1_len, gfc_charlen_type_node); diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index cfc6ab6..741ea2f 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -87,7 +87,7 @@ gfc_character_info gfc_character_kinds[MAX_CHARACTER_KINDS + 1]; static GTY(()) tree gfc_character_types[MAX_CHARACTER_KINDS + 1]; static GTY(()) tree gfc_pcharacter_types[MAX_CHARACTER_KINDS + 1]; -static tree gfc_add_field_to_struct_1 (tree *, tree, tree, tree, tree **); +static tree gfc_add_field_to_struct_1 (tree, tree, tree, tree **); /* The integer kind to use for array indices. This will be set to the proper value based on target information from the backend. */ @@ -1234,7 +1234,7 @@ static tree gfc_get_desc_dim_type (void) { tree type; - tree fieldlist = NULL_TREE, decl, *chain = NULL; + tree decl, *chain = NULL; if (gfc_desc_dim_type) return gfc_desc_dim_type; @@ -1246,24 +1246,22 @@ gfc_get_desc_dim_type (void) TYPE_PACKED (type) = 1; /* Consists of the stride, lbound and ubound members. */ - decl = gfc_add_field_to_struct_1 (&fieldlist, type, + decl = gfc_add_field_to_struct_1 (type, get_identifier ("stride"), gfc_array_index_type, &chain); TREE_NO_WARNING (decl) = 1; - decl = gfc_add_field_to_struct_1 (&fieldlist, type, + decl = gfc_add_field_to_struct_1 (type, get_identifier ("lbound"), gfc_array_index_type, &chain); TREE_NO_WARNING (decl) = 1; - decl = gfc_add_field_to_struct_1 (&fieldlist, type, + decl = gfc_add_field_to_struct_1 (type, get_identifier ("ubound"), gfc_array_index_type, &chain); TREE_NO_WARNING (decl) = 1; /* Finish off the type. */ - TYPE_FIELDS (type) = fieldlist; - gfc_finish_type (type); TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type)) = 1; @@ -1535,7 +1533,7 @@ gfc_get_nodesc_array_type (tree etype, gfc_array_spec * as, gfc_packed packed, static tree gfc_get_array_descriptor_base (int dimen, int codimen, bool restricted) { - tree fat_type, fieldlist = NULL_TREE, decl, arraytype, *chain = NULL; + tree fat_type, decl, arraytype, *chain = NULL; char name[16 + 2*GFC_RANK_DIGITS + 1 + 1]; int idx = 2 * (codimen + dimen - 1) + restricted; @@ -1550,20 +1548,20 @@ gfc_get_array_descriptor_base (int dimen, int codimen, bool restricted) TYPE_NAME (fat_type) = get_identifier (name); /* Add the data member as the first element of the descriptor. */ - decl = gfc_add_field_to_struct_1 (&fieldlist, fat_type, + decl = gfc_add_field_to_struct_1 (fat_type, get_identifier ("data"), (restricted ? prvoid_type_node : ptr_type_node), &chain); /* Add the base component. */ - decl = gfc_add_field_to_struct_1 (&fieldlist, fat_type, + decl = gfc_add_field_to_struct_1 (fat_type, get_identifier ("offset"), gfc_array_index_type, &chain); TREE_NO_WARNING (decl) = 1; /* Add the dtype component. */ - decl = gfc_add_field_to_struct_1 (&fieldlist, fat_type, + decl = gfc_add_field_to_struct_1 (fat_type, get_identifier ("dtype"), gfc_array_index_type, &chain); TREE_NO_WARNING (decl) = 1; @@ -1575,14 +1573,12 @@ gfc_get_array_descriptor_base (int dimen, int codimen, bool restricted) gfc_index_zero_node, gfc_rank_cst[codimen + dimen - 1])); - decl = gfc_add_field_to_struct_1 (&fieldlist, fat_type, + decl = gfc_add_field_to_struct_1 (fat_type, get_identifier ("dim"), arraytype, &chain); TREE_NO_WARNING (decl) = 1; /* Finish off the type. */ - TYPE_FIELDS (fat_type) = fieldlist; - gfc_finish_type (fat_type); TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (fat_type)) = 1; @@ -1843,20 +1839,19 @@ gfc_finish_type (tree type) /* Add a field of given NAME and TYPE to the context of a UNION_TYPE or RECORD_TYPE pointed to by CONTEXT. The new field is chained - to the fieldlist pointed to by FIELDLIST through *CHAIN. + to the end of the field list pointed to by *CHAIN. Returns a pointer to the new field. */ static tree -gfc_add_field_to_struct_1 (tree *fieldlist, tree context, - tree name, tree type, tree **chain) +gfc_add_field_to_struct_1 (tree context, tree name, tree type, tree **chain) { tree decl = build_decl (input_location, FIELD_DECL, name, type); DECL_CONTEXT (decl) = context; TREE_CHAIN (decl) = NULL_TREE; - if (*fieldlist == NULL_TREE) - *fieldlist = decl; + if (TYPE_FIELDS (context) == NULL_TREE) + TYPE_FIELDS (context) = decl; if (chain != NULL) { if (*chain != NULL) @@ -1871,11 +1866,9 @@ gfc_add_field_to_struct_1 (tree *fieldlist, tree context, information. */ tree -gfc_add_field_to_struct (tree *fieldlist, tree context, - tree name, tree type, tree **chain) +gfc_add_field_to_struct (tree context, tree name, tree type, tree **chain) { - tree decl = gfc_add_field_to_struct_1 (fieldlist, context, - name, type, chain); + tree decl = gfc_add_field_to_struct_1 (context, name, type, chain); DECL_INITIAL (decl) = 0; DECL_ALIGN (decl) = 0; @@ -1955,7 +1948,7 @@ gfc_get_ppc_type (gfc_component* c) tree gfc_get_derived_type (gfc_symbol * derived) { - tree typenode = NULL, field = NULL, field_type = NULL, fieldlist = NULL; + tree typenode = NULL, field = NULL, field_type = NULL; tree canonical = NULL_TREE; tree *chain = NULL; bool got_canonical = false; @@ -1977,14 +1970,6 @@ gfc_get_derived_type (gfc_symbol * derived) else derived->backend_decl = pfunc_type_node; - /* Create a backend_decl for the __c_ptr_c_address field. */ - derived->components->backend_decl = - gfc_add_field_to_struct (&(derived->backend_decl->type.values), - derived->backend_decl, - get_identifier (derived->components->name), - gfc_typenode_for_spec ( - &(derived->components->ts)), NULL); - derived->ts.kind = gfc_index_integer_kind; derived->ts.type = BT_INTEGER; /* Set the f90_type to BT_VOID as a way to recognize something of type @@ -2106,7 +2091,6 @@ gfc_get_derived_type (gfc_symbol * derived) /* Build the type member list. Install the newly created RECORD_TYPE node as DECL_CONTEXT of each FIELD_DECL. */ - fieldlist = NULL_TREE; for (c = derived->components; c; c = c->next) { if (c->attr.proc_pointer) @@ -2158,7 +2142,7 @@ gfc_get_derived_type (gfc_symbol * derived) field_type = build_pointer_type_for_mode (TREE_TYPE (field_type), ptr_mode, true); - field = gfc_add_field_to_struct (&fieldlist, typenode, + field = gfc_add_field_to_struct (typenode, get_identifier (c->name), field_type, &chain); if (c->loc.lb) @@ -2173,9 +2157,7 @@ gfc_get_derived_type (gfc_symbol * derived) c->backend_decl = field; } - /* Now we have the final fieldlist. Record it, then lay out the - derived type, including the fields. */ - TYPE_FIELDS (typenode) = fieldlist; + /* Now lay out the derived type, including the fields. */ if (canonical) TYPE_CANONICAL (typenode) = canonical; @@ -2238,7 +2220,6 @@ static tree gfc_get_mixed_entry_union (gfc_namespace *ns) { tree type; - tree fieldlist; tree *chain = NULL; char name[GFC_MAX_SYMBOL_LEN + 1]; gfc_entry_list *el, *el2; @@ -2252,7 +2233,6 @@ gfc_get_mixed_entry_union (gfc_namespace *ns) type = make_node (UNION_TYPE); TYPE_NAME (type) = get_identifier (name); - fieldlist = NULL; for (el = ns->entries; el; el = el->next) { @@ -2262,14 +2242,12 @@ gfc_get_mixed_entry_union (gfc_namespace *ns) break; if (el == el2) - gfc_add_field_to_struct_1 (&fieldlist, type, + gfc_add_field_to_struct_1 (type, get_identifier (el->sym->result->name), gfc_sym_type (el->sym->result), &chain); } /* Finish off the type. */ - TYPE_FIELDS (type) = fieldlist; - gfc_finish_type (type); TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type)) = 1; return type; diff --git a/gcc/fortran/trans-types.h b/gcc/fortran/trans-types.h index 0949b77..7e79480 100644 --- a/gcc/fortran/trans-types.h +++ b/gcc/fortran/trans-types.h @@ -77,7 +77,7 @@ tree gfc_get_array_type_bounds (tree, int, int, tree *, tree *, int, tree gfc_get_nodesc_array_type (tree, gfc_array_spec *, gfc_packed, bool); /* Add a field of given name and type to a UNION_TYPE or RECORD_TYPE. */ -tree gfc_add_field_to_struct (tree *, tree, tree, tree, tree **); +tree gfc_add_field_to_struct (tree, tree, tree, tree **); /* Layout and output debugging info for a type. */ void gfc_finish_type (tree); |