summaryrefslogtreecommitdiff
path: root/gcc/go
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2013-07-24 18:25:51 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2013-07-24 18:25:51 +0000
commit5194c57d38c69d0ef64e8d5e701e4c302901af93 (patch)
tree1e8d7d89f596b2528c8896b9976241413c2fcade /gcc/go
parentfe8f8c83d8dce53b0fb8aec5efc91e7ae55b8529 (diff)
downloadgcc-5194c57d38c69d0ef64e8d5e701e4c302901af93.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@201222 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/go')
-rw-r--r--gcc/go/ChangeLog6
-rw-r--r--gcc/go/go-gcc.cc49
2 files changed, 41 insertions, 14 deletions
diff --git a/gcc/go/ChangeLog b/gcc/go/ChangeLog
index ea82d35f83e..db9d4443ac9 100644
--- a/gcc/go/ChangeLog
+++ b/gcc/go/ChangeLog
@@ -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".
diff --git a/gcc/go/go-gcc.cc b/gcc/go/go-gcc.cc
index bd2d0dd0829..27c756e5496 100644
--- a/gcc/go/go-gcc.cc
+++ b/gcc/go/go-gcc.cc
@@ -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:
{