Commit 35151cd5 by Mikael Morin

trans-io.c (gfc_build_st_parameter): Update calls to gfc_add_field_to_struct.

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.

From-SVN: r162042
parent 022e30c0
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> 2010-07-10 Paul Thomas <pault@gcc.gnu.org>
PR fortran/44773 PR fortran/44773
......
...@@ -176,13 +176,11 @@ gfc_build_st_parameter (enum ioparam_type ptype, tree *types) ...@@ -176,13 +176,11 @@ gfc_build_st_parameter (enum ioparam_type ptype, tree *types)
case IOPARM_type_parray: case IOPARM_type_parray:
case IOPARM_type_pchar: case IOPARM_type_pchar:
case IOPARM_type_pad: case IOPARM_type_pad:
p->field = gfc_add_field_to_struct (&TYPE_FIELDS (t), t, p->field = gfc_add_field_to_struct (t, get_identifier (p->name),
get_identifier (p->name),
types[p->type], &chain); types[p->type], &chain);
break; break;
case IOPARM_type_char1: case IOPARM_type_char1:
p->field = gfc_add_field_to_struct (&TYPE_FIELDS (t), t, p->field = gfc_add_field_to_struct (t, get_identifier (p->name),
get_identifier (p->name),
pchar_type_node, &chain); pchar_type_node, &chain);
/* FALLTHROUGH */ /* FALLTHROUGH */
case IOPARM_type_char2: case IOPARM_type_char2:
...@@ -190,18 +188,16 @@ gfc_build_st_parameter (enum ioparam_type ptype, tree *types) ...@@ -190,18 +188,16 @@ gfc_build_st_parameter (enum ioparam_type ptype, tree *types)
gcc_assert (len <= sizeof (name) - sizeof ("_len")); gcc_assert (len <= sizeof (name) - sizeof ("_len"));
memcpy (name, p->name, len); memcpy (name, p->name, len);
memcpy (name + len, "_len", sizeof ("_len")); memcpy (name + len, "_len", sizeof ("_len"));
p->field_len = gfc_add_field_to_struct (&TYPE_FIELDS (t), t, p->field_len = gfc_add_field_to_struct (t, get_identifier (name),
get_identifier (name),
gfc_charlen_type_node, gfc_charlen_type_node,
&chain); &chain);
if (p->type == IOPARM_type_char2) if (p->type == IOPARM_type_char2)
p->field = gfc_add_field_to_struct (&TYPE_FIELDS (t), t, p->field = gfc_add_field_to_struct (t, get_identifier (p->name),
get_identifier (p->name),
pchar_type_node, &chain); pchar_type_node, &chain);
break; break;
case IOPARM_type_common: case IOPARM_type_common:
p->field p->field
= gfc_add_field_to_struct (&TYPE_FIELDS (t), t, = gfc_add_field_to_struct (t,
get_identifier (p->name), get_identifier (p->name),
st_parameter[IOPARM_ptype_common].type, st_parameter[IOPARM_ptype_common].type,
&chain); &chain);
......
...@@ -1643,10 +1643,11 @@ gfc_trans_character_select (gfc_code *code) ...@@ -1643,10 +1643,11 @@ gfc_trans_character_select (gfc_code *code)
gcc_unreachable (); gcc_unreachable ();
#undef ADD_FIELD #undef ADD_FIELD
#define ADD_FIELD(NAME, TYPE) \ #define ADD_FIELD(NAME, TYPE) \
ss_##NAME[k] = gfc_add_field_to_struct \ ss_##NAME[k] = gfc_add_field_to_struct (select_struct[k], \
(&(TYPE_FIELDS (select_struct[k])), select_struct[k], \ get_identifier (stringize(NAME)), \
get_identifier (stringize(NAME)), TYPE, &chain) TYPE, \
&chain)
ADD_FIELD (string1, pchartype); ADD_FIELD (string1, pchartype);
ADD_FIELD (string1_len, gfc_charlen_type_node); ADD_FIELD (string1_len, gfc_charlen_type_node);
......
...@@ -87,7 +87,7 @@ gfc_character_info gfc_character_kinds[MAX_CHARACTER_KINDS + 1]; ...@@ -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_character_types[MAX_CHARACTER_KINDS + 1];
static GTY(()) tree gfc_pcharacter_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 /* The integer kind to use for array indices. This will be set to the
proper value based on target information from the backend. */ proper value based on target information from the backend. */
...@@ -1234,7 +1234,7 @@ static tree ...@@ -1234,7 +1234,7 @@ static tree
gfc_get_desc_dim_type (void) gfc_get_desc_dim_type (void)
{ {
tree type; tree type;
tree fieldlist = NULL_TREE, decl, *chain = NULL; tree decl, *chain = NULL;
if (gfc_desc_dim_type) if (gfc_desc_dim_type)
return gfc_desc_dim_type; return gfc_desc_dim_type;
...@@ -1246,24 +1246,22 @@ gfc_get_desc_dim_type (void) ...@@ -1246,24 +1246,22 @@ gfc_get_desc_dim_type (void)
TYPE_PACKED (type) = 1; TYPE_PACKED (type) = 1;
/* Consists of the stride, lbound and ubound members. */ /* 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"), get_identifier ("stride"),
gfc_array_index_type, &chain); gfc_array_index_type, &chain);
TREE_NO_WARNING (decl) = 1; 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"), get_identifier ("lbound"),
gfc_array_index_type, &chain); gfc_array_index_type, &chain);
TREE_NO_WARNING (decl) = 1; 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"), get_identifier ("ubound"),
gfc_array_index_type, &chain); gfc_array_index_type, &chain);
TREE_NO_WARNING (decl) = 1; TREE_NO_WARNING (decl) = 1;
/* Finish off the type. */ /* Finish off the type. */
TYPE_FIELDS (type) = fieldlist;
gfc_finish_type (type); gfc_finish_type (type);
TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type)) = 1; 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, ...@@ -1535,7 +1533,7 @@ gfc_get_nodesc_array_type (tree etype, gfc_array_spec * as, gfc_packed packed,
static tree static tree
gfc_get_array_descriptor_base (int dimen, int codimen, bool restricted) 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]; char name[16 + 2*GFC_RANK_DIGITS + 1 + 1];
int idx = 2 * (codimen + dimen - 1) + restricted; int idx = 2 * (codimen + dimen - 1) + restricted;
...@@ -1550,20 +1548,20 @@ gfc_get_array_descriptor_base (int dimen, int codimen, bool restricted) ...@@ -1550,20 +1548,20 @@ gfc_get_array_descriptor_base (int dimen, int codimen, bool restricted)
TYPE_NAME (fat_type) = get_identifier (name); TYPE_NAME (fat_type) = get_identifier (name);
/* Add the data member as the first element of the descriptor. */ /* 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"), get_identifier ("data"),
(restricted (restricted
? prvoid_type_node ? prvoid_type_node
: ptr_type_node), &chain); : ptr_type_node), &chain);
/* Add the base component. */ /* 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"), get_identifier ("offset"),
gfc_array_index_type, &chain); gfc_array_index_type, &chain);
TREE_NO_WARNING (decl) = 1; TREE_NO_WARNING (decl) = 1;
/* Add the dtype component. */ /* 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"), get_identifier ("dtype"),
gfc_array_index_type, &chain); gfc_array_index_type, &chain);
TREE_NO_WARNING (decl) = 1; TREE_NO_WARNING (decl) = 1;
...@@ -1575,14 +1573,12 @@ gfc_get_array_descriptor_base (int dimen, int codimen, bool restricted) ...@@ -1575,14 +1573,12 @@ gfc_get_array_descriptor_base (int dimen, int codimen, bool restricted)
gfc_index_zero_node, gfc_index_zero_node,
gfc_rank_cst[codimen + dimen - 1])); 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"), get_identifier ("dim"),
arraytype, &chain); arraytype, &chain);
TREE_NO_WARNING (decl) = 1; TREE_NO_WARNING (decl) = 1;
/* Finish off the type. */ /* Finish off the type. */
TYPE_FIELDS (fat_type) = fieldlist;
gfc_finish_type (fat_type); gfc_finish_type (fat_type);
TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (fat_type)) = 1; TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (fat_type)) = 1;
...@@ -1843,20 +1839,19 @@ gfc_finish_type (tree type) ...@@ -1843,20 +1839,19 @@ gfc_finish_type (tree type)
/* Add a field of given NAME and TYPE to the context of a UNION_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 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. */ Returns a pointer to the new field. */
static tree static tree
gfc_add_field_to_struct_1 (tree *fieldlist, tree context, gfc_add_field_to_struct_1 (tree context, tree name, tree type, tree **chain)
tree name, tree type, tree **chain)
{ {
tree decl = build_decl (input_location, FIELD_DECL, name, type); tree decl = build_decl (input_location, FIELD_DECL, name, type);
DECL_CONTEXT (decl) = context; DECL_CONTEXT (decl) = context;
TREE_CHAIN (decl) = NULL_TREE; TREE_CHAIN (decl) = NULL_TREE;
if (*fieldlist == NULL_TREE) if (TYPE_FIELDS (context) == NULL_TREE)
*fieldlist = decl; TYPE_FIELDS (context) = decl;
if (chain != NULL) if (chain != NULL)
{ {
if (*chain != NULL) if (*chain != NULL)
...@@ -1871,11 +1866,9 @@ gfc_add_field_to_struct_1 (tree *fieldlist, tree context, ...@@ -1871,11 +1866,9 @@ gfc_add_field_to_struct_1 (tree *fieldlist, tree context,
information. */ information. */
tree tree
gfc_add_field_to_struct (tree *fieldlist, tree context, gfc_add_field_to_struct (tree context, tree name, tree type, tree **chain)
tree name, tree type, tree **chain)
{ {
tree decl = gfc_add_field_to_struct_1 (fieldlist, context, tree decl = gfc_add_field_to_struct_1 (context, name, type, chain);
name, type, chain);
DECL_INITIAL (decl) = 0; DECL_INITIAL (decl) = 0;
DECL_ALIGN (decl) = 0; DECL_ALIGN (decl) = 0;
...@@ -1955,7 +1948,7 @@ gfc_get_ppc_type (gfc_component* c) ...@@ -1955,7 +1948,7 @@ gfc_get_ppc_type (gfc_component* c)
tree tree
gfc_get_derived_type (gfc_symbol * derived) 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 canonical = NULL_TREE;
tree *chain = NULL; tree *chain = NULL;
bool got_canonical = false; bool got_canonical = false;
...@@ -1977,14 +1970,6 @@ gfc_get_derived_type (gfc_symbol * derived) ...@@ -1977,14 +1970,6 @@ gfc_get_derived_type (gfc_symbol * derived)
else else
derived->backend_decl = pfunc_type_node; 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.kind = gfc_index_integer_kind;
derived->ts.type = BT_INTEGER; derived->ts.type = BT_INTEGER;
/* Set the f90_type to BT_VOID as a way to recognize something of type /* 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) ...@@ -2106,7 +2091,6 @@ gfc_get_derived_type (gfc_symbol * derived)
/* Build the type member list. Install the newly created RECORD_TYPE /* Build the type member list. Install the newly created RECORD_TYPE
node as DECL_CONTEXT of each FIELD_DECL. */ node as DECL_CONTEXT of each FIELD_DECL. */
fieldlist = NULL_TREE;
for (c = derived->components; c; c = c->next) for (c = derived->components; c; c = c->next)
{ {
if (c->attr.proc_pointer) if (c->attr.proc_pointer)
...@@ -2158,7 +2142,7 @@ gfc_get_derived_type (gfc_symbol * derived) ...@@ -2158,7 +2142,7 @@ gfc_get_derived_type (gfc_symbol * derived)
field_type = build_pointer_type_for_mode (TREE_TYPE (field_type), field_type = build_pointer_type_for_mode (TREE_TYPE (field_type),
ptr_mode, true); ptr_mode, true);
field = gfc_add_field_to_struct (&fieldlist, typenode, field = gfc_add_field_to_struct (typenode,
get_identifier (c->name), get_identifier (c->name),
field_type, &chain); field_type, &chain);
if (c->loc.lb) if (c->loc.lb)
...@@ -2173,9 +2157,7 @@ gfc_get_derived_type (gfc_symbol * derived) ...@@ -2173,9 +2157,7 @@ gfc_get_derived_type (gfc_symbol * derived)
c->backend_decl = field; c->backend_decl = field;
} }
/* Now we have the final fieldlist. Record it, then lay out the /* Now lay out the derived type, including the fields. */
derived type, including the fields. */
TYPE_FIELDS (typenode) = fieldlist;
if (canonical) if (canonical)
TYPE_CANONICAL (typenode) = canonical; TYPE_CANONICAL (typenode) = canonical;
...@@ -2238,7 +2220,6 @@ static tree ...@@ -2238,7 +2220,6 @@ static tree
gfc_get_mixed_entry_union (gfc_namespace *ns) gfc_get_mixed_entry_union (gfc_namespace *ns)
{ {
tree type; tree type;
tree fieldlist;
tree *chain = NULL; tree *chain = NULL;
char name[GFC_MAX_SYMBOL_LEN + 1]; char name[GFC_MAX_SYMBOL_LEN + 1];
gfc_entry_list *el, *el2; gfc_entry_list *el, *el2;
...@@ -2252,7 +2233,6 @@ gfc_get_mixed_entry_union (gfc_namespace *ns) ...@@ -2252,7 +2233,6 @@ gfc_get_mixed_entry_union (gfc_namespace *ns)
type = make_node (UNION_TYPE); type = make_node (UNION_TYPE);
TYPE_NAME (type) = get_identifier (name); TYPE_NAME (type) = get_identifier (name);
fieldlist = NULL;
for (el = ns->entries; el; el = el->next) for (el = ns->entries; el; el = el->next)
{ {
...@@ -2262,14 +2242,12 @@ gfc_get_mixed_entry_union (gfc_namespace *ns) ...@@ -2262,14 +2242,12 @@ gfc_get_mixed_entry_union (gfc_namespace *ns)
break; break;
if (el == el2) if (el == el2)
gfc_add_field_to_struct_1 (&fieldlist, type, gfc_add_field_to_struct_1 (type,
get_identifier (el->sym->result->name), get_identifier (el->sym->result->name),
gfc_sym_type (el->sym->result), &chain); gfc_sym_type (el->sym->result), &chain);
} }
/* Finish off the type. */ /* Finish off the type. */
TYPE_FIELDS (type) = fieldlist;
gfc_finish_type (type); gfc_finish_type (type);
TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type)) = 1; TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type)) = 1;
return type; return type;
......
...@@ -77,7 +77,7 @@ tree gfc_get_array_type_bounds (tree, int, int, tree *, tree *, int, ...@@ -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); 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. */ /* 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. */ /* Layout and output debugging info for a type. */
void gfc_finish_type (tree); void gfc_finish_type (tree);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment