[Dwarf-discuss] Difference in DWARF Info generated by GCC 3.4.6 and GCC 4.1.1

Rohit Arul Raj rohitarulraj at gmail.com
Mon Apr 16 04:52:15 PDT 2007


Hello all,

I ran a sample program with gcc 3.4.6 and gcc 4.1.1 compiler. I need
some clarifications regarding the DWARFinfo generated by these 2
compilers.

Sample Program:

#include <stdio.h>

int fun(const char*, ...);

/* Variadic function */
int fun(const char *raj,...)
{
  return 9;
}

int main()
{
  fun("Hello world",3,2);
  return 0;

}

################# Readelf O/P for 3.4.6 ##############

<1><e3>: Abbrev Number: 6 (DW_TAG_subprogram)
     DW_AT_sibling     : <10e>	
     DW_AT_external    : 1	
     DW_AT_name        : fun	
     DW_AT_decl_file   : 7	
     DW_AT_decl_line   : 7	
     DW_AT_prototyped  : 1	
     DW_AT_type        : <4c>	
     DW_AT_low_pc      : 0	
     DW_AT_high_pc     : 0x14	
     DW_AT_frame_base  : 1 byte block: 5e 	(DW_OP_reg14)

 <2><fe>: Abbrev Number: 7 (DW_TAG_formal_parameter)
     DW_AT_name        : raj	
     DW_AT_decl_file   : 7	
     DW_AT_decl_line   : 6	
     DW_AT_type        : <a8>	
     DW_AT_location    : 2 byte block: 91 4 	(DW_OP_fbreg: 4)

################# Readelf O/P for 4.1.1 ##############

1><103>: Abbrev Number: 6 (DW_TAG_subprogram)
     DW_AT_sibling     : <12e>	
     DW_AT_external    : 1	
     DW_AT_name        : fun	
     DW_AT_decl_file   : 10	
     DW_AT_decl_line   : 7	
     DW_AT_prototyped  : 1	
     DW_AT_type        : <53>	
     DW_AT_low_pc      : 0	
     DW_AT_high_pc     : 0x14	
     DW_AT_frame_base  : 1 byte block: 5f 	(DW_OP_reg15)

 <2><11e>: Abbrev Number: 7 (DW_TAG_formal_parameter)
     DW_AT_name        : raj	
     DW_AT_decl_file   : 10	
     DW_AT_decl_line   : 6	
     DW_AT_type        : <b9>	
     DW_AT_location    : 2 byte block: 91 0 	(DW_OP_fbreg: 0)

###########################################################

1. In DIE for fun, with 3.4.6, the frame base is taken in terms of
Frame Pointer (DW_OP_reg14), where is in 4.1.1, it is taken in terms
of Stack Pointer (DW_OP_reg15).

(For my backend, reg-no 14 is Frame Pointer and reg-no 15 is Stack Pointer)

Is this the expected behavior?

2. For the variable, const char *raj, the DIE for 3.4.6 has the
location mentioned as (fbreg  + 4 [offset] ) whereas for 4.1.1,
location is mentioned as (fbreg + 0).

Any specific reason for this behavior in GCC 4.1.1

Regards,
Rohit



More information about the Dwarf-Discuss mailing list