diff mbox

Go patch committed: Tweak debug info

Message ID mcry5txa7bf.fsf@dhcp-172-18-216-180.mtv.corp.google.com
State New
Headers show

Commit Message

Ian Lance Taylor Dec. 28, 2011, 12:06 a.m. UTC
This patch to the gcc-specific part of the Go frontend tweaks the debug
info in a couple of ways.

For a named struct or array type, this uses build_distinct_type_copy
rather than build_variant_type_copy.  Using build_variant_type_copy
caused trouble because it wound up causing the main variant to be named
while the copy was unnamed.  The effect was to cause gcc to emit a
typedef defined as itself, which was not useful.

The middle-end currently expects all basic types to have a name.  If
they don't, it uses the name __unknown__, which is not helpful (see
modified_type_die in dwarf2out.c).  In Go all basic types will have a
name anyhow.  This patch ensures that the first time we see a named
builtin basic type, we use that name rather than making a copy.

Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu.
Committed to mainline.

Ian


2011-12-27  Ian Lance Taylor  <iant@google.com>

	* go-gcc.cc (Gcc_backend::set_placeholder_struct_type): Use
	build_distinct_type_copy rather than build_variant_type_copy.
	(Gcc_backend::set_placeholder_array_type): Likewise.
	(Gcc_backend::named_type): Add special handling for builtin
	basic types.
diff mbox

Patch

Index: go-gcc.cc
===================================================================
--- go-gcc.cc	(revision 182696)
+++ go-gcc.cc	(working copy)
@@ -663,7 +663,7 @@  Gcc_backend::set_placeholder_struct_type
   Btype* r = this->fill_in_struct(placeholder, fields);
 
   // Build the data structure gcc wants to see for a typedef.
-  tree copy = build_variant_type_copy(t);
+  tree copy = build_distinct_type_copy(t);
   TYPE_NAME(copy) = NULL_TREE;
   DECL_ORIGINAL_TYPE(TYPE_NAME(t)) = copy;
 
@@ -696,7 +696,7 @@  Gcc_backend::set_placeholder_array_type(
   Btype* r = this->fill_in_array(placeholder, element_btype, length);
 
   // Build the data structure gcc wants to see for a typedef.
-  tree copy = build_variant_type_copy(t);
+  tree copy = build_distinct_type_copy(t);
   TYPE_NAME(copy) = NULL_TREE;
   DECL_ORIGINAL_TYPE(TYPE_NAME(t)) = copy;
 
@@ -712,6 +712,24 @@  Gcc_backend::named_type(const std::strin
   tree type = btype->get_tree();
   if (type == error_mark_node)
     return this->error_type();
+
+  // The middle-end expects a basic type to have a name.  In Go every
+  // basic type will have a name.  The first time we see a basic type,
+  // give it whatever Go name we have at this point.
+  if (TYPE_NAME(type) == NULL_TREE
+      && location.gcc_location() == BUILTINS_LOCATION
+      && (TREE_CODE(type) == INTEGER_TYPE
+	  || TREE_CODE(type) == REAL_TYPE
+	  || TREE_CODE(type) == COMPLEX_TYPE
+	  || TREE_CODE(type) == BOOLEAN_TYPE))
+    {
+      tree decl = build_decl(BUILTINS_LOCATION, TYPE_DECL,
+			     get_identifier_from_string(name),
+			     type);
+      TYPE_NAME(type) = decl;
+      return this->make_type(type);
+    }
+
   tree copy = build_variant_type_copy(type);
   tree decl = build_decl(location.gcc_location(), TYPE_DECL,
 			 get_identifier_from_string(name),