Mangled Typedef names in GNU 4.1.2 DWARF data?
Michael Eager
eager@eagercon.com
Fri Jan 22 21:39:00 GMT 2010
Ron Louzon wrote:
> The GNU 4.1.2 C++ compiler is mangling typedef names to the point that they are not retrievable from the DWARF data.
>
> For example, the type BASE_UNION is defined as
>
> typedef union
> {
> char ch;
> int iVal;
> long IVal;
> } BASE_UNION;
This is an anonymous union which is typedef'ed to BASE_UNION.
>
> The GNU 4.1.2 compiler generates the following DWARF data for this type
>
> <1><1279>: Abbrev Number: 35 (DW_TAG_union_type)
> <127a> DW_AT_sibling : <12a8>
> <127e> DW_AT_name : $_4
> <1282> DW_AT_byte_size : 4
> <1283> DW_AT_decl_file : 35
> <1284> DW_AT_decl_line : 29
This doesn't look correct. The union has no name, so DW_AT_name should
not be present or should be null. From the DWARF v.3 spec:
2.15 Identifier Names
Any debugging information entry representing a program entity that has been
given a name may have a DW_AT_name attribute, whose value is a string
representing the name as it appears in the source program. A debugging
information entry containing no name attribute, or containing a name attribute
whose value consists of a name containing a single null byte, represents a
program entity for which no name was given in the source.
> <2><1285>: Abbrev Number: 36 (DW_TAG_member)
> <1286> DW_AT_name : ch
> <1289> DW_AT_decl_file : 35
> <128a> DW_AT_decl_line : 30
> <128b> DW_AT_type : <c0d>
> <2><128f>: Abbrev Number: 36 (DW_TAG_member)
> <1290> DW_AT_name : iVal
> <1295> DW_AT_decl_file : 35
> <1296> DW_AT_decl_line : 31
> <1297> DW_AT_type : <b7f>
> <2><129b>: Abbrev Number: 36 (DW_TAG_member)
> <129c> DW_AT_name : IVal
> <12a1> DW_AT_decl_file : 35
> <12a2> DW_AT_decl_line : 32
> <12a3> DW_AT_type : <b86>
>
> Notice that the union name has been changed to "$_4" in DIE <1279>.
>
> The GNU 3.4.4 compiler generates the following DWARF data from the same source code:
>
> <1><11d0>: Abbrev Number: 27 (DW_TAG_union_type)
> DW_AT_sibling : <123f>
> DW_AT_name : (indirect string, offset: 0x6e): BASE_UNION
> DW_AT_byte_size : 4
> DW_AT_decl_file : 3
> DW_AT_decl_line : 29
This is similarly incorrect. The union has no name.
> Why is GNU 4.1.2 generating the mangled type name and how do I correct this to generate the real type name?
A better question might by why there is no DW_TAG_typedef
DIE which looks like
DW_TAG_typedef
DW_AT_name: BASE_UNION
DW_AT_type: <1279>
BTW gcc-4.3.2 generates
DW_AT_name: <anonymous union>
which is also incorrect.
--
Michael Eager eager@eagercon.com
1960 Park Blvd., Palo Alto, CA 94306 650-325-8077
More information about the Gcc
mailing list