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 ea...@eagercon.com
1960 Park Blvd., Palo Alto, CA 94306 650-325-8077