OSDN Git Service

Use backend interface for string types.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 6 May 2011 18:30:11 +0000 (18:30 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 6 May 2011 18:30:11 +0000 (18:30 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@173502 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/go/gofrontend/types.cc

index a03ab1f..fe96741 100644 (file)
@@ -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.