Hi all,

I need some clarification regarding the debug info generated for
var_arg function.

Target: fr30
Compiler version : v4.1.1
binutils              : v2.16
newlib               : v1.14.0

<<<<<<<<<<    SAMPLE TEST PROGRAM   >>>>>>>>>>>>

#include <stdio.h>
int fun(const char *name,...)
{
 return 9;
}

int main()
{
 fun("Rohit",4,5,6,7);
 return 0;
}


<<<<<<<<<<<<        OBJDUMP           >>>>>>>>>>>>>>>

00010110 <fun>:
#include <stdio.h>

/* Variadic function */
int fun(const char *name,...)
{
  10110:        17 07           st r7,@-r15               // value 6
  10112:        17 06           st r6,@-r15               // value 5
  10114:        17 05           st r5,@-r15               // value 4
  10116:        17 04           st r4,@-r15               // contents of name
  10118:        0f 01           enter 0x4
 return 9;
  1011a:        c0 91           ldi:8 0x9,r1
}
  1011c:        8b 14           mov r1,r4
  1011e:        07 0e           ld @r15+,r14
  10120:        a3 04           addsp 16
  10122:        97 20           ret

00010124 <main>:

int main()
{
  10124:        17 81           st rp,@-r15
  10126:        0f 02           enter 0x8
 fun("Rohit",4,5,6,7);
  10128:        c0 71           ldi:8 0x7,r1
  1012a:        14 f1           st r1,@r15
  1012c:        9f 84 00 01     ldi:32 0x10f60,r4
  10130:        0f 60
  10132:        c0 45           ldi:8 0x4,r5
  10134:        c0 56           ldi:8 0x5,r6
  10136:        c0 67           ldi:8 0x6,r7
  10138:        9f 81 00 01     ldi:32 0x10110,r1
  1013c:        01 10
  1013e:        97 11           call @r1
 return 0;
  10140:        c0 01           ldi:8 0x0,r1

}
  10142:        8b 14           mov r1,r4
  10144:        9f 90           leave
  10146:        07 81           ld @r15+,rp
  10148:        97 20           ret
        ...
<<<<<<<<<<<<<<        READELF DUMP     >>>>>>>>>>>>>>>

1><fb>: Abbrev Number: 6 (DW_TAG_subprogram)
 <fc>     DW_AT_sibling     : <129> 
 <100>     DW_AT_external    : 1  
 <101>     DW_AT_name        : fun        
 <105>     DW_AT_decl_file   : 10 
 <106>     DW_AT_decl_line   : 5  
 <107>     DW_AT_prototyped  : 1  
 <108>     DW_AT_type        : <4b> 
 <10c>     DW_AT_low_pc      : 0x10110    
 <110>     DW_AT_high_pc     : 0x10124    
 <114>     DW_AT_frame_base  : 0  (location list)

<2><118>: Abbrev Number: 7 (DW_TAG_formal_parameter)
 <119>     DW_AT_name        : name       
 <11e>     DW_AT_decl_file   : 10 
 <11f>     DW_AT_decl_line   : 4  
 <120>     DW_AT_type        : <b1> 
 <124>     DW_AT_location    : 2 byte block: 91 0         (DW_OP_fbreg: 0)

<debug_loc section>
Offset   Begin    End      Expression
   00000000 00010110 00010112 (DW_OP_reg15)
   00000000 00010112 00010114 (DW_OP_breg15: 4)
   00000000 00010114 00010116 (DW_OP_breg15: 8)
   00000000 00010116 00010118 (DW_OP_breg15: 12)
   00000000 00010118 0001011a (DW_OP_breg15: 16)
   00000000 0001011a 00010124 (DW_OP_breg14: 20)

From the readelf output, the location information for variable "name"
is generated by location lists.
For address range 0x00010110 - 0x00010112, the expression for variable
"name" is in terms of stack pointer.But at that instant, the stack
pointer contains the value 7.

For address range 0x00010118 - 0x0001011a, the expression is set as SP
+ 16, when it should have been SP + 0.

1. Have i overseen any details while interpreting the debug info?
2. Is the compiler generating proper debug info?

Regards,
Rohit

Reply via email to