summaryrefslogtreecommitdiffstats
path: root/tapsets.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'tapsets.cxx')
-rw-r--r--tapsets.cxx48
1 files changed, 35 insertions, 13 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);