From patchwork Sun May 13 03:38:48 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: dwarf2out PATCH for debug/53235 Date: Sat, 12 May 2012 17:38:48 -0000 From: Jason Merrill X-Patchwork-Id: 158801 Message-Id: <4FAF2CC8.90309@redhat.com> To: gcc-patches List According to discussion in the PR, GDB would prefer a DW_TAG_structure_type with DW_AT_signature to a DW_TAG_typedef with DW_AT_type when the type in question is a class. I haven't been able to reproduce the failure with current GDB, but it passes the testsuite after the change as well. Tested x86_64-pc-linux-gnu, applied to trunk. commit d03ef85f43045bd98e0b6c0e2c811896fbc10a3f Author: Jason Merrill Date: Tue May 8 06:15:13 2012 -0400 PR debug/53235 * dwarf2out.c (build_local_stub): Prefer DW_AT_signature for comdat types. diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 1e5e335..9ba65fb 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -6929,36 +6929,31 @@ static int build_local_stub (void **slot, void *data) { struct external_ref *ref_p = (struct external_ref *)*slot; - dw_die_ref cu = (dw_die_ref) data; - dw_die_ref type = ref_p->type; - dw_die_ref stub = NULL; - if (ref_p->stub == NULL && ref_p->n_refs > 1) + if (ref_p->stub == NULL && ref_p->n_refs > 1 && !dwarf_strict) { - if (!dwarf_strict) + /* We have multiple references to this type, so build a small stub. + Both of these forms are a bit dodgy from the perspective of the + DWARF standard, since technically they should have names. */ + dw_die_ref cu = (dw_die_ref) data; + dw_die_ref type = ref_p->type; + dw_die_ref stub = NULL; + + if (type->comdat_type_p) { - /* If we aren't being strict, use a typedef with no name - to just forward to the real type. In strict DWARF, a - typedef must have a name. */ - stub = new_die (DW_TAG_typedef, cu, NULL_TREE); - add_AT_die_ref (stub, DW_AT_type, type); - } - else if (type->comdat_type_p) - { - /* If we refer to this type via sig8, we can use a simple - declaration; this is larger than the typedef, but strictly - correct. */ + /* If we refer to this type via sig8, use AT_signature. */ stub = new_die (type->die_tag, cu, NULL_TREE); - add_AT_string (stub, DW_AT_name, get_AT_string (type, DW_AT_name)); - add_AT_flag (stub, DW_AT_declaration, 1); add_AT_die_ref (stub, DW_AT_signature, type); } - - if (stub) + else { - stub->die_mark++; - ref_p->stub = stub; + /* Otherwise, use a typedef with no name. */ + stub = new_die (DW_TAG_typedef, cu, NULL_TREE); + add_AT_die_ref (stub, DW_AT_type, type); } + + stub->die_mark++; + ref_p->stub = stub; } return 1; }