diff options
-rw-r--r-- | tapsets.cxx | 48 | ||||
-rw-r--r-- | testsuite/systemtap.base/strftime.exp | 23 | ||||
-rw-r--r-- | testsuite/systemtap.exelib/ustack.tcl | 3 | ||||
-rw-r--r-- | translate.cxx | 11 |
4 files changed, 46 insertions, 39 deletions
diff --git a/tapsets.cxx b/tapsets.cxx index 39255f50..9e42e4d0 100644 --- a/tapsets.cxx +++ b/tapsets.cxx @@ -675,6 +675,8 @@ struct dwarf_builder: public derived_probe_builder string & mark_name; string probe_name; probe_table(string & mark_name, systemtap_session & sess, dwflpp * dw); + bool is_uprobe() {return probe_type == uprobe_type;}; + bool is_utrace() {return probe_type == utrace_type;}; bool get_next_probe(); void convert_probe(probe *new_base); void convert_location(probe *new_base, probe_point *new_location); @@ -852,9 +854,9 @@ dwarf_builder::probe_table::convert_probe (probe *new_base) betid->left = task_tid; functioncall *arg2tid = new functioncall; arg2tid->tok = new_base->body->tok; - arg2tid->function = "ulong_arg"; + arg2tid->function = "_utrace_syscall_arg"; arg2tid->tok = new_base->body->tok; - literal_number* littid = new literal_number(2); + literal_number* littid = new literal_number(1); littid->tok = new_base->body->tok; arg2tid->args.push_back(littid); @@ -865,9 +867,9 @@ dwarf_builder::probe_table::convert_probe (probe *new_base) // Generate: if (arg1 != mark("label")) next; functioncall *fc = new functioncall; - fc->function = "ulong_arg"; + fc->function = (probe_type == utrace_type) ? "_utrace_syscall_arg" : "ulong_arg"; fc->tok = new_base->body->tok; - literal_number* num = new literal_number(1); + literal_number* num = new literal_number((probe_type == utrace_type) ? 0 : 1); num->tok = new_base->body->tok; fc->args.push_back(num); @@ -888,6 +890,23 @@ dwarf_builder::probe_table::convert_probe (probe *new_base) be->right = new literal_string(mark_name); is->condition = be; b->statements.insert(b->statements.begin(),(statement*) is); + +#ifdef __i386__ + if (probe_type == kprobe_type) + { + functioncall *rp = new functioncall; + rp->tok = new_base->body->tok; + rp->function = "regparm"; + rp->tok = new_base->body->tok; + literal_number* littid = new literal_number(0); + littid->tok = new_base->body->tok; + rp->args.push_back(littid); + expr_statement* es = new expr_statement; + es->tok = new_base->body->tok; + es->value = rp; + b->statements.insert(b->statements.begin(),(statement*) es); + } +#endif } @@ -3333,15 +3352,17 @@ dwarf_derived_probe_group::emit_module_exit (systemtap_session& s) struct sdt_var_expanding_visitor: public var_expanding_visitor { sdt_var_expanding_visitor(string & process_name, string & probe_name, - int arg_count, bool have_reg_args): + int arg_count, bool have_reg_args, bool utrace_probe): process_name (process_name), probe_name (probe_name), - have_reg_args (have_reg_args), arg_count (arg_count) + have_reg_args (have_reg_args), utrace_probe (utrace_probe), + arg_count (arg_count) { assert(!have_reg_args || (arg_count >= 0 && arg_count <= 10)); } string & process_name; string & probe_name; bool have_reg_args; + bool utrace_probe; int arg_count; void visit_target_symbol (target_symbol* e); @@ -3373,10 +3394,10 @@ sdt_var_expanding_visitor::visit_target_symbol (target_symbol *e) // First two args are hidden: 1. pointer to probe name 2. task id if (arg_count < 2) { - fc->function = "ulong_arg"; + fc->function = utrace_probe ? "_utrace_syscall_arg" : "ulong_arg"; fc->type = pe_long; fc->tok = e->tok; - literal_number* num = new literal_number(argno + 2); + literal_number* num = new literal_number(argno + (utrace_probe ? 1 : 2)); num->tok = e->tok; fc->args.push_back(num); } @@ -3387,9 +3408,9 @@ sdt_var_expanding_visitor::visit_target_symbol (target_symbol *e) binary_expression *be = new binary_expression; be->tok = e->tok; functioncall *get_arg1 = new functioncall; - get_arg1->function = "pointer_arg"; + get_arg1->function = utrace_probe ? "_utrace_syscall_arg" : "pointer_arg"; get_arg1->tok = e->tok; - literal_number* num = new literal_number(3); + literal_number* num = new literal_number((utrace_probe ? 2 : 3)); num->tok = e->tok; get_arg1->args.push_back(num); @@ -3461,7 +3482,7 @@ dwarf_builder::build(systemtap_session & sess, if (sess.verbose > 3) clog << "TOK_MARK: " << probe_table.mark_name << endl; - if (probe_table.probe_type == probe_table.uprobe_type) + if (probe_table.is_uprobe()) { do { @@ -3486,7 +3507,7 @@ dwarf_builder::build(systemtap_session & sess, // Now expand the local variables in the probe body sdt_var_expanding_visitor svv (module_name, probe_table.probe_name, - probe_table.probe_arg, false); + probe_table.probe_arg, false, false); new_base->body = svv.require (new_base->body); dwarf_query q(sess, new_base, new_location, *dw, parameters, finished_results); @@ -3526,7 +3547,8 @@ dwarf_builder::build(systemtap_session & sess, // Expand the local variables in the probe body sdt_var_expanding_visitor svv (module_name, probe_table.probe_name, - probe_table.probe_arg, true); + probe_table.probe_arg, true, + probe_table.is_utrace()); new_base->body = svv.require (new_base->body); probe_table.convert_location(new_base, new_location); derive_probes(sess, new_base, finished_results); diff --git a/testsuite/systemtap.base/strftime.exp b/testsuite/systemtap.base/strftime.exp index ad9e471d..decd7a65 100644 --- a/testsuite/systemtap.base/strftime.exp +++ b/testsuite/systemtap.base/strftime.exp @@ -7,15 +7,9 @@ system "rm -f %*" set format %%%S_%T exec stap -o $format -we {probe begin {println("hello");exit()}} -spawn ls -1 -set ok 0 -expect { - -re {%([0-9][0-9])_[0-9][0-9]:[0-9][0-9]:\1} {incr ok} - eof { } -} -wait +set file [glob -nocomplain -types f %\[0-9\]\[0-9\]_\[0-9\]\[0-9\]:\[0-9\]\[0-9\]:\[0-9\]\[0-9\]] -if {$ok == 1} { +if {[llength $file] == 1} { pass "$test (%S and %T)" } else { fail "$test (%S and %T)" @@ -27,19 +21,8 @@ set format %%,%C,%Y,%y,%m,%d,%e,%F,%H,%I,%j,%k,%l,%M,%R,%u,%w set date1 [exec date +$format] # run stapio with strftime exec stap -o $format -we {probe begin {println("hello");exit()}} -# check whether stap outputs stapio pid -set date2 [exec date +$format] - -spawn ls -1 -set ok 0 -expect { - $date1 {incr ok} - $date2 {incr ok} - eof { } -} -wait -if {$ok == 1} { +if {[file exists $date1]} { pass "$test (except %S and %T)" } else { fail "$test (except %S and %T)" diff --git a/testsuite/systemtap.exelib/ustack.tcl b/testsuite/systemtap.exelib/ustack.tcl index 07dcec10..b70b8334 100644 --- a/testsuite/systemtap.exelib/ustack.tcl +++ b/testsuite/systemtap.exelib/ustack.tcl @@ -7,9 +7,6 @@ lib: lib_func=lib_func lib: lib_func=lib_func lib: lib_func=lib_func} -# BUG XXX PR10323 skip all prelink scenarios for now. -if {[string match "*prelink*" "$testname"]} { return } - # Only run on make installcheck if {! [installtest_p]} { untested "ustack-$testname"; return } if {! [utrace_p]} { untested "ustack-$testname"; return } diff --git a/translate.cxx b/translate.cxx index 172c1287..9e2bd99d 100644 --- a/translate.cxx +++ b/translate.cxx @@ -4439,13 +4439,13 @@ struct unwindsym_dump_context // Get the .debug_frame end .eh_frame sections for the given module. // Also returns the lenght of both sections when found, plus the section -// address of the eh_frame data. +// address (offset) of the eh_frame data. static void get_unwind_data (Dwfl_Module *m, void **debug_frame, void **eh_frame, size_t *debug_len, size_t *eh_len, Dwarf_Addr *eh_addr) { - Dwarf_Addr bias = 0; + Dwarf_Addr start, bias = 0; GElf_Ehdr *ehdr, ehdr_mem; GElf_Shdr *shdr, shdr_mem; Elf_Scn *scn; @@ -4453,6 +4453,7 @@ static void get_unwind_data (Dwfl_Module *m, Elf *elf; // fetch .eh_frame info preferably from main elf file. + dwfl_module_info (m, NULL, &start, NULL, NULL, NULL, NULL, NULL); elf = dwfl_module_getelf(m, &bias); ehdr = gelf_getehdr(elf, &ehdr_mem); scn = NULL; @@ -4465,7 +4466,11 @@ static void get_unwind_data (Dwfl_Module *m, data = elf_rawdata(scn, NULL); *eh_frame = data->d_buf; *eh_len = data->d_size; - *eh_addr = shdr->sh_addr; + // For ".dynamic" sections we want the offset, not absolute addr. + if (dwfl_module_relocations (m) > 0) + *eh_addr = shdr->sh_addr - start + bias; + else + *eh_addr = shdr->sh_addr; break; } } |