This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
Re: stap make check - process_test and sched_test failure
- From: Li Guanglei <guanglei at cn dot ibm dot com>
- To: Roland McGrath <roland at redhat dot com>
- Cc: Hien Nguyen <hien at us dot ibm dot com>, SystemTAP <systemtap at sources dot redhat dot com>
- Date: Tue, 25 Jul 2006 18:26:36 +0800
- Subject: Re: stap make check - process_test and sched_test failure
- Organization: IBM CSTL
- References: <20060724205011.6A07A18007A@magilla.sf.frob.com>
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?