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

Reply via email to