aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@google.com>2011-05-26 04:41:19 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2011-05-26 04:41:19 +0000
commit53febcba13e4e7e8aecab1e90396d674d9277602 (patch)
tree13f45216cc160d808538fc1862644a36a41d2c24 /gcc
parent7d7766a0ba454aa4da0cbcae4139fc14560d3d38 (diff)
downloadgcc-53febcba13e4e7e8aecab1e90396d674d9277602.zip
gcc-53febcba13e4e7e8aecab1e90396d674d9277602.tar.gz
gcc-53febcba13e4e7e8aecab1e90396d674d9277602.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/godump.c47
2 files changed, 46 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 06d58bd..ce1b464 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
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
target types, and struct field types.
diff --git a/gcc/godump.c b/gcc/godump.c
index 05c3064..e0d50b5 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, '}');
}