This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Mangled Typedef names in GNU 4.1.2 DWARF data?


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]