godump.c (go_format_type): Output the first field with a usable Go type, if any.
authorIan Lance Taylor <iant@google.com>
Thu, 26 May 2011 04:41:19 +0000 (04:41 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Thu, 26 May 2011 04:41:19 +0000 (04:41 +0000)
* godump.c (go_format_type): Output the first field with a usable
Go type, if any.

From-SVN: r174262

gcc/ChangeLog
gcc/godump.c

index 06d58bdf68626b6e0b1c99b9993ef37da6f2728d..ce1b46448bd248753b948e9dc3fa5158137f851e 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-25  Ian Lance Taylor  <iant@google.com>
+
+       * godump.c (go_format_type): Output the first field with a usable
+       Go type, if any.
+
 2011-05-25  Ian Lance Taylor  <iant@google.com>
 
        * godump.c (go_format_type): Check for invalid type names, pointer
index 05c3064c9efc3b60452b02dd9e71de890e765b1e..e0d50b5d1b0624fd1e627dc36615aa24c055b905 100644 (file)
@@ -685,6 +685,17 @@ go_format_type (struct godump_container *container, tree type,
             field != NULL_TREE;
             field = TREE_CHAIN (field))
          {
+           struct obstack hold_type_obstack;
+           bool field_ok;
+
+           if (TREE_CODE (type) == UNION_TYPE)
+             {
+               hold_type_obstack = container->type_obstack;
+               obstack_init (&container->type_obstack);
+             }
+
+           field_ok = true;
+
            if (DECL_NAME (field) == NULL)
              {
                char buf[100];
@@ -711,7 +722,7 @@ go_format_type (struct godump_container *container, tree type,
            if (DECL_BIT_FIELD (field))
              {
                obstack_grow (ob, "INVALID-bit-field", 17);
-               ret = false;
+               field_ok = false;
              }
            else
               {
@@ -734,7 +745,7 @@ go_format_type (struct godump_container *container, tree type,
                                           IDENTIFIER_POINTER (name),
                                           NO_INSERT);
                    if (slot != NULL)
-                     ret = false;
+                     field_ok = false;
 
                    obstack_1grow (ob, '_');
                    go_append_string (ob, name);
@@ -743,15 +754,39 @@ go_format_type (struct godump_container *container, tree type,
                  {
                    if (!go_format_type (container, TREE_TYPE (field), true,
                                         false))
-                     ret = false;
+                     field_ok = false;
                  }
               }
            obstack_grow (ob, "; ", 2);
 
-           /* Only output the first field of a union, and hope for
-              the best.  */
+           /* Only output the first successful field of a union, and
+              hope for the best.  */
            if (TREE_CODE (type) == UNION_TYPE)
-             break;
+             {
+               if (!field_ok && TREE_CHAIN (field) == NULL_TREE)
+                 {
+                   field_ok = true;
+                   ret = false;
+                 }
+               if (field_ok)
+                 {
+                   unsigned int sz;
+
+                   sz = obstack_object_size (&container->type_obstack);
+                   obstack_grow (&hold_type_obstack,
+                                 obstack_base (&container->type_obstack),
+                                 sz);
+                 }
+               obstack_free (&container->type_obstack, NULL);
+               container->type_obstack = hold_type_obstack;
+               if (field_ok)
+                 break;
+             }
+           else
+             {
+               if (!field_ok)
+                 ret = false;
+             }
          }
        obstack_1grow (ob, '}');
       }