From 1f94e0c6f7f5b1066ecb949efa24303719a65278 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 6 May 2011 18:30:11 +0000 Subject: [PATCH] Use backend interface for string types. From-SVN: r173502 --- gcc/go/gofrontend/types.cc | 29 +++++++++++++++++++++-------- 1 file 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 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. -- 2.7.4