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 <i...@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.
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),