This is the mail archive of the systemtap@sourceware.org mailing list for the systemtap 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: stap make check - process_test and sched_test failure


Roland McGrath ??:
I tried and found the trouble is that the compiler will optimize some functions e.g. handle_signal as inline. And currently we can't fetch the arguments of an inline function.

Please look into why it's not working. In theory it ought to work. Is the compiler producing the location info?

I use "readelf -w" to get the DWARF info of my kernel: ... <1><671e1>: Abbrev Number: 77 (DW_TAG_subprogram) DW_AT_sibling : <67316> DW_AT_name : (indirect string, offset: 0x5525): handle_signal DW_AT_decl_file : 1 DW_AT_decl_line : 1008 DW_AT_prototyped : 1 DW_AT_type : <5e0be> DW_AT_inline : 1 (inlined) <2><671f3>: Abbrev Number: 78 (DW_TAG_formal_parameter) DW_AT_name : sig DW_AT_decl_file : 1 DW_AT_decl_line : 1005 DW_AT_type : <5e0ab> <2><671ff>: Abbrev Number: 78 (DW_TAG_formal_parameter) DW_AT_name : ka DW_AT_decl_file : 1 DW_AT_decl_line : 1005 DW_AT_type : <64fd0> ...

You can see that no location info is generated.

I wrote a simple program to check how the gcc generate the DWARF info:

inline int foo(int foo_a, int foo_b)
{
        int a;
        printf("in foo\n");
        a=100;
        return foo_a+foo_b+a;
}

int main(void)
{
        printf("%dn", foo(3,5));
        return 0;
}

It shows me that gcc without any optimization option will generate location info for arguments of an inline function:

 <1><4f>: Abbrev Number: 2 (DW_TAG_subprogram)
     DW_AT_sibling     : <b1>
     DW_AT_external    : 1
     DW_AT_name        : foo
     DW_AT_decl_file   : 1
     DW_AT_decl_line   : 2
     DW_AT_prototyped  : 1
     DW_AT_type        : <b1>
     DW_AT_low_pc      : 0x10000418
     DW_AT_high_pc     : 0x1000047c
     DW_AT_frame_base  : 0      (location list)
 <2><6c>: Abbrev Number: 3 (DW_TAG_formal_parameter)
     DW_AT_name        : foo_a
     DW_AT_decl_file   : 1
     DW_AT_decl_line   : 1
     DW_AT_type        : <b1>
     DW_AT_location    : 2 byte block: 91 68    (DW_OP_fbreg: -24)
 <2><7c>: Abbrev Number: 3 (DW_TAG_formal_parameter)
     DW_AT_name        : foo_b
     DW_AT_decl_file   : 1
     DW_AT_decl_line   : 1
     DW_AT_type        : <b1>
     DW_AT_location    : 2 byte block: 91 6c    (DW_OP_fbreg: -20)


While gcc with -O2 or -Os option will not generate the location info:


 <1><25>: Abbrev Number: 2 (DW_TAG_subprogram)
     DW_AT_sibling     : <6c>
     DW_AT_external    : 1
     DW_AT_name        : foo
     DW_AT_decl_file   : 1
     DW_AT_decl_line   : 2
     DW_AT_prototyped  : 1
     DW_AT_type        : <6c>
     DW_AT_inline      : 3      (declared as inline and inlined)
 <2><37>: Abbrev Number: 3 (DW_TAG_formal_parameter)
     DW_AT_name        : (indirect string, offset: 0x38): foo_a
     DW_AT_decl_file   : 1
     DW_AT_decl_line   : 1
     DW_AT_type        : <6c>
 <2><42>: Abbrev Number: 3 (DW_TAG_formal_parameter)
     DW_AT_name        : (indirect string, offset: 0x0): foo_b
     DW_AT_decl_file   : 1
     DW_AT_decl_line   : 1
     DW_AT_type        : <6c>

Is this a bug of GCC?


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