diff options
author | Stan Cox <scox@redhat.com> | 2009-03-08 19:55:05 -0400 |
---|---|---|
committer | Stan Cox <scox@redhat.com> | 2009-03-08 19:55:05 -0400 |
commit | 9b692b91ee25c33281c32c7ba86f5f0734e46be9 (patch) | |
tree | 0b39ae803c95d9d70c63b05e683d3fc3954bf1f3 | |
parent | c12d974f4ad369f8d7585f2f07713dae3654b3fb (diff) | |
download | systemtap-steved-9b692b91ee25c33281c32c7ba86f5f0734e46be9.tar.gz systemtap-steved-9b692b91ee25c33281c32c7ba86f5f0734e46be9.tar.xz systemtap-steved-9b692b91ee25c33281c32c7ba86f5f0734e46be9.zip |
Fix and add tests for function(".so").statement(N)
* tapsets.cxx (query_dwarf_func): die_has_pc (dwarf_haspc) does not expect a
module_start for shared objects so don't call module_address_to_global for the
statement address.
* testsuite/systemtap.base/labels.exp: Add tests for executable .statement(N),
shared object .label("L") and so .statement(N).
-rw-r--r-- | tapsets.cxx | 6 | ||||
-rw-r--r-- | testsuite/systemtap.base/labels.exp | 86 |
2 files changed, 86 insertions, 6 deletions
diff --git a/tapsets.cxx b/tapsets.cxx index 02f0b553..d99eebe2 100644 --- a/tapsets.cxx +++ b/tapsets.cxx @@ -3920,9 +3920,9 @@ query_dwarf_func (Dwarf_Die * func, base_query * bq) else if (q->has_function_num || q->has_statement_num) { Dwarf_Addr query_addr = - q->dw.module_address_to_global(q->has_function_num ? q->function_num_val : - q->has_statement_num ? q->statement_num_val : - (assert(0) , 0)); + (q->has_function_num ? q->function_num_val : + q->has_statement_num ? q->statement_num_val : + (assert(0) , 0)); Dwarf_Die d; q->dw.function_die (&d); diff --git a/testsuite/systemtap.base/labels.exp b/testsuite/systemtap.base/labels.exp index 9c92d69c..54640268 100644 --- a/testsuite/systemtap.base/labels.exp +++ b/testsuite/systemtap.base/labels.exp @@ -13,6 +13,7 @@ if {$utrace_support_found == 0} { untested "$test"; return } # Compile a C program to use as the user-space probing target set label_srcpath "[pwd]/labels.c" set label_exepath "[pwd]/labels.x" +set label_sopath "[pwd]/labels.so" set label_flags "additional_flags=-g" set fp [open $label_srcpath "w"] puts $fp " @@ -54,9 +55,12 @@ if { $res != "" } { pass "compiling labels.c -g" } +# label in an executable + verbose -log "spawn stap -c $label_exepath $label_stppath" spawn stap -c $label_exepath $label_stppath +wait expect { -timeout 180 -re {VARS a=0x0 b=0x0.*VARS a=0x2 b=0x0.*VARS a=0x2 b=0x3 c=0x[a-f01-9]} { incr ok; exp_continue } @@ -64,7 +68,83 @@ expect { eof { } } -wait +if {$ok == 1} { pass "$test exe .label" } { fail "$test exe .label" } + +# address of label in an executable + +set label_shpath "[pwd]/label.sh" +set fp [open $label_shpath "w"] +puts $fp " +readelf --debug-dump $label_exepath | awk \" +/init_another_int/ {have_label=1} +/DW_AT_low_pc/ {if (have_label) {print \$3;exit;}} +\" +" +close $fp +spawn sh $label_shpath +expect { + -re {0x[0-9a-f]*} +} +set ok 0 +spawn stap -p2 -l "process\(\"$label_exepath\"\).statement($expect_out(0,string))" +expect { + -timeout 180 + -re {no match} { incr ok; exp_continue } + timeout { fail "$test (timeout)" } + eof { } +} + +if {$ok == 0} { pass "$test exe .statement" } { xfail "$test exe .statement" } + +set ok 0 + +set label_flags "additional_flags=-g additional_flags=-shared additional_flags=-fPIC" +set res [target_compile $label_srcpath $label_sopath executable $label_flags] +if { $res != "" } { + verbose "target_compile failed: $res" 2 + fail "compiling labels.c -g" + catch {exec rm -f $label_srcpath $label_stppath} + return +} else { + pass "compiling labels.c -g" +} + +# label in a shared object + +spawn stap -p2 -l "process\(\"$label_sopath\"\).function\(\"\*\"\).label\(\"init_another_int\"\)" +expect { + -timeout 180 + -re {process.*function} { incr ok; exp_continue } + timeout { fail "$test (timeout)" } + eof { } +} + +if {$ok == 1} { pass "$test so .label" } { fail "$test so .label" } + +# address of label in a shared object + +set label_shpath "[pwd]/label.sh" +set fp [open $label_shpath "w"] +puts $fp " +readelf --debug-dump $label_sopath | awk \" +/init_another_int/ {have_label=1} +/DW_AT_low_pc/ {if (have_label) {print \$3;exit;}} +\" +" +close $fp +spawn sh $label_shpath +expect { + -re {0x[0-9a-f]*} +} +set ok 0 +spawn stap -p2 -l "process\(\"$label_sopath\"\).statement($expect_out(0,string))" +expect { + -timeout 180 + -re {no match} { incr ok; exp_continue } + timeout { fail "$test (timeout)" } + eof { } +} + +if {$ok == 0} { pass "$test so .statement" } { xfail "$test so .statement" } -if {$ok == 1} { pass "$test" } { fail "$test ($ok)" } -catch {exec rm -f $label_srcpath $label_stppath $label_exepath} +# catch {exec rm -f $label_srcpath $label_stppath $label_exepath} |