diff options
Diffstat (limited to 'gcc/go')
-rw-r--r-- | gcc/go/gofrontend/types.cc | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc index a03ab1f..fe96741 100644 --- a/gcc/go/gofrontend/types.cc +++ b/gcc/go/gofrontend/types.cc @@ -2172,14 +2172,27 @@ Type::lookup_complex_type(const char* name) // struct with two fields: a pointer to the characters and a length. tree -String_type::do_get_tree(Gogo*) -{ - static tree struct_type; - return Gogo::builtin_struct(&struct_type, "__go_string", NULL_TREE, 2, - "__data", - build_pointer_type(unsigned_char_type_node), - "__length", - integer_type_node); +String_type::do_get_tree(Gogo* gogo) +{ + static Btype* backend_string_type; + if (backend_string_type == NULL) + { + std::vector<Backend::Btyped_identifier> fields(2); + + Type* b = gogo->lookup_global("byte")->type_value(); + Type* pb = Type::make_pointer_type(b); + fields[0].name = "__data"; + fields[0].btype = tree_to_type(pb->get_tree(gogo)); + fields[0].location = UNKNOWN_LOCATION; + + Type* int_type = Type::lookup_integer_type("int"); + fields[1].name = "__length"; + fields[1].btype = tree_to_type(int_type->get_tree(gogo)); + fields[1].location = UNKNOWN_LOCATION; + + backend_string_type = gogo->backend()->struct_type(fields); + } + return type_to_tree(backend_string_type); } // Return a tree for the length of STRING. |