diff options
author | Ian Lance Taylor <iant@google.com> | 2011-05-26 04:41:19 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2011-05-26 04:41:19 +0000 |
commit | 53febcba13e4e7e8aecab1e90396d674d9277602 (patch) | |
tree | 13f45216cc160d808538fc1862644a36a41d2c24 /gcc | |
parent | 7d7766a0ba454aa4da0cbcae4139fc14560d3d38 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/godump.c | 47 |
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, '}'); } |