go-gcc.cc (Gcc_backend::non_zero_size_type): If a struct has a fields...
authorIan Lance Taylor <iant@google.com>
Wed, 24 Jul 2013 18:25:51 +0000 (18:25 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 24 Jul 2013 18:25:51 +0000 (18:25 +0000)
* go-gcc.cc (Gcc_backend::non_zero_size_type): If a struct has a
fields, recreate those fields with the first one with a non-zero
size.

From-SVN: r201222

gcc/go/ChangeLog
gcc/go/go-gcc.cc

index ea82d35..db9d444 100644 (file)
@@ -1,3 +1,9 @@
+2013-07-24  Ian Lance Taylor  <iant@google.com>
+
+       * go-gcc.cc (Gcc_backend::non_zero_size_type): If a struct has a
+       fields, recreate those fields with the first one with a non-zero
+       size.
+
 2013-07-23  Ian Lance Taylor  <iant@google.com>
 
        * go-backend.c: Don't #include "rtl.h".
index bd2d0dd..27c756e 100644 (file)
@@ -1242,20 +1242,41 @@ Gcc_backend::non_zero_size_type(tree type)
   switch (TREE_CODE(type))
     {
     case RECORD_TYPE:
-      {
-       if (go_non_zero_struct == NULL_TREE)
-         {
-           type = make_node(RECORD_TYPE);
-           tree field = build_decl(UNKNOWN_LOCATION, FIELD_DECL,
-                                   get_identifier("dummy"),
-                                   boolean_type_node);
-           DECL_CONTEXT(field) = type;
-           TYPE_FIELDS(type) = field;
-           layout_type(type);
-           go_non_zero_struct = type;
-         }
-       return go_non_zero_struct;
-      }
+      if (TYPE_FIELDS(type) != NULL_TREE)
+       {
+         tree ns = make_node(RECORD_TYPE);
+         tree field_trees = NULL_TREE;
+         tree *pp = &field_trees;
+         for (tree field = TYPE_FIELDS(type);
+              field != NULL_TREE;
+              field = DECL_CHAIN(field))
+           {
+             tree ft = TREE_TYPE(field);
+             if (field == TYPE_FIELDS(type))
+               ft = non_zero_size_type(ft);
+             tree f = build_decl(DECL_SOURCE_LOCATION(field), FIELD_DECL,
+                                 DECL_NAME(field), ft);
+             DECL_CONTEXT(f) = ns;
+             *pp = f;
+             pp = &DECL_CHAIN(f);
+           }
+         TYPE_FIELDS(ns) = field_trees;
+         layout_type(ns);
+         return ns;
+       }
+
+      if (go_non_zero_struct == NULL_TREE)
+       {
+         type = make_node(RECORD_TYPE);
+         tree field = build_decl(UNKNOWN_LOCATION, FIELD_DECL,
+                                 get_identifier("dummy"),
+                                 boolean_type_node);
+         DECL_CONTEXT(field) = type;
+         TYPE_FIELDS(type) = field;
+         layout_type(type);
+         go_non_zero_struct = type;
+       }
+      return go_non_zero_struct;
 
     case ARRAY_TYPE:
       {