summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tapsets.cxx48
-rw-r--r--testsuite/systemtap.base/strftime.exp23
-rw-r--r--testsuite/systemtap.exelib/ustack.tcl3
-rw-r--r--translate.cxx11
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;
}
}