Re: Mangled Typedef names in GNU 4.1.2 DWARF data?

2010-01-25 Thread Ron Louzon
The use of anonymous structure does seem to be the problem.  I also missed the 
fact that the TYPE_DEF DIE is missing from the DWARF data.  If the TYPE
_DEF DIE was in the DWARF data, I could still parse the anonymous type.

Do you think the TYPE_DEF DIE should be part of the output?  Is this a GNU 
bug or just an unsupported feature?

Thanks.


--- On Fri, 1/22/10, Michael Eager  wrote:

> From: Michael Eager 
> Subject: Re: Mangled Typedef names in GNU 4.1.2 DWARF data?
> To: "Ron Louzon" 
> Cc: gcc@gcc.gnu.org
> Date: Friday, January 22, 2010, 4:39 PM
> 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        :
>     
> >  <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        :
>     
> >  <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        :
>     
> > 
> > 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: 
> 
> which is also incorrect.
> 
> 
> 
> -- Michael eager ea...@eagercon.com
> 1960 Park Blvd., Palo Alto, CA 94306  650-325-8077
> 





Mangled Typedef names in GNU 4.1.2 DWARF data?

2010-01-22 Thread Ron Louzon
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;

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 
 <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:   
 <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:   
 <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:   

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 
 <2><11dc>: Abbrev Number: 28 (DW_TAG_member)
 DW_AT_name: ch 
 DW_AT_decl_file   : 3  
 DW_AT_decl_line   : 30 
 DW_AT_type:   
 <2><11e6>: Abbrev Number: 28 (DW_TAG_member)
 DW_AT_name: iVal   
 DW_AT_decl_file   : 3  
 DW_AT_decl_line   : 31 
 DW_AT_type:   
 <2><11f2>: Abbrev Number: 28 (DW_TAG_member)
 DW_AT_name: IVal   
 DW_AT_decl_file   : 3  
 DW_AT_decl_line   : 32 
 DW_AT_type:   
 <2><11fe>: Abbrev Number: 29 (DW_TAG_subprogram)
 DW_AT_sibling : <1219> 
 DW_AT_name: (indirect string, offset: 0x79): operator= 
 DW_AT_type: <123f> 
 DW_AT_artificial  : 1  
 DW_AT_declaration : 1  
 <3><120d>: Abbrev Number: 9 (DW_TAG_formal_parameter)
 DW_AT_type: <1245> 
 DW_AT_artificial  : 1  
 <3><1213>: Abbrev Number: 10 (DW_TAG_formal_parameter)
 DW_AT_type: <124b> 
 <2><1219>: Abbrev Number: 30 (DW_TAG_subprogram)
 DW_AT_sibling : <1230> 
 DW_AT_name: $_4
 DW_AT_artificial  : 1  
 DW_AT_declaration : 1  
 <3><1224>: Abbrev Number: 9 (DW_TAG_formal_parameter)
 DW_AT_type: <1245> 
 DW_AT_artificial  : 1  
 <3><122a>: Abbrev Number: 10 (DW_TAG_formal_parameter)
 DW_AT_type: <124b> 
 <2><1230>: Abbrev Number: 31 (DW_TAG_subprogram)
 DW_AT_name: $_4
 DW_AT_artificial  : 1  
 DW_AT_declaration : 1  
 <3><1237>: Abbrev Number: 9 (DW_TAG_formal_parameter)
 DW_AT_type: <1245> 
 DW_AT_artificial  : 1  


Notice that DIE <11D0> contains the correct type name.  Also notice that 
coincidently, DIE <1230> has a constructor with the "$_4" name which was used 
as the type name in GNU 4.1.2.  

Why is GNU 4.1.2 generating the mangled type name and how do I correct this to 
generate the real type name?