From 53febcba13e4e7e8aecab1e90396d674d9277602 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 26 May 2011 04:41:19 +0000 Subject: [PATCH] godump.c (go_format_type): Output the first field with a usable Go type, if any. * godump.c (go_format_type): Output the first field with a usable Go type, if any. From-SVN: r174262 --- gcc/ChangeLog | 5 +++++ gcc/godump.c | 47 +++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 06d58bdf686..ce1b46448bd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2011-05-25 Ian Lance Taylor + + * godump.c (go_format_type): Output the first field with a usable + Go type, if any. + 2011-05-25 Ian Lance Taylor * godump.c (go_format_type): Check for invalid type names, pointer diff --git a/gcc/godump.c b/gcc/godump.c index 05c3064c9ef..e0d50b5d1b0 100644 --- a/gcc/godump.c +++ b/gcc/godump.c @@ -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, '}'); } -- 2.30.2