diff options
author | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-07-24 18:25:51 +0000 |
---|---|---|
committer | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-07-24 18:25:51 +0000 |
commit | 5194c57d38c69d0ef64e8d5e701e4c302901af93 (patch) | |
tree | 1e8d7d89f596b2528c8896b9976241413c2fcade /gcc/go | |
parent | fe8f8c83d8dce53b0fb8aec5efc91e7ae55b8529 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/go/go-gcc.cc | 49 |
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: { |