2010-07-10 Mikael Morin <mikael@gcc.gnu.org>
authormikael <mikael@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 10 Jul 2010 18:14:45 +0000 (18:14 +0000)
committermikael <mikael@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 10 Jul 2010 18:14:45 +0000 (18:14 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@162042 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/trans-io.c
gcc/fortran/trans-stmt.c
gcc/fortran/trans-types.c
gcc/fortran/trans-types.h

index e4837b4..6709df3 100644 (file)
@@ -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
index 2624bb2..8626e03 100644 (file)
@@ -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);
index beada6a..bdf4d11 100644 (file)
@@ -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);
index cfc6ab6..741ea2f 100644 (file)
@@ -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)
 \f
 /* 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;
index 0949b77..7e79480 100644 (file)
@@ -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);