summaryrefslogtreecommitdiffstats
path: root/tools/perf/util/probe-finder.c
diff options
context:
space:
mode:
authorMasami Hiramatsu2010-04-12 19:16:53 +0200
committerArnaldo Carvalho de Melo2010-04-14 22:26:04 +0200
commit48481938b02471d505296d7557ed296eb093d496 (patch)
tree7549d861d76621d1e3d2ddd75eae4575901f1fd0 /tools/perf/util/probe-finder.c
parentperf tools: Fix accidentally preprocessed snprintf callback (diff)
downloadkernel-qcow2-linux-48481938b02471d505296d7557ed296eb093d496.tar.gz
kernel-qcow2-linux-48481938b02471d505296d7557ed296eb093d496.tar.xz
kernel-qcow2-linux-48481938b02471d505296d7557ed296eb093d496.zip
perf probe: Support argument name
Set given names to event arguments. The syntax is same as kprobe-tracer, you can add 'NAME=' right before each argument. e.g. ./perf probe vfs_read foo=file then, 'foo' is set to the argument name as below. ./perf probe -l probe:vfs_read (on vfs_read@linux-2.6-tip/fs/read_write.c with foo) Cc: Ingo Molnar <mingo@elte.hu> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Mike Galbraith <efault@gmx.de> Cc: Frederic Weisbecker <fweisbec@gmail.com> LKML-Reference: <20100412171653.3790.74624.stgit@localhost6.localdomain6> Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/probe-finder.c')
-rw-r--r--tools/perf/util/probe-finder.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index a8513772df08..105e95c95eeb 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -484,35 +484,40 @@ static void convert_variable(Dwarf_Die *vr_die, struct probe_finder *pf)
convert_location(expr, pf);
if (pf->pvar->field)
- convert_variable_fields(vr_die, pf->pvar->name,
+ convert_variable_fields(vr_die, pf->pvar->var,
pf->pvar->field, &pf->tvar->ref);
/* *expr will be cached in libdw. Don't free it. */
return ;
error:
/* TODO: Support const_value */
die("Failed to find the location of %s at this address.\n"
- " Perhaps, it has been optimized out.", pf->pvar->name);
+ " Perhaps, it has been optimized out.", pf->pvar->var);
}
/* Find a variable in a subprogram die */
static void find_variable(Dwarf_Die *sp_die, struct probe_finder *pf)
{
Dwarf_Die vr_die;
- char buf[128];
+ char buf[32];
- /* TODO: Support struct members and arrays */
- if (!is_c_varname(pf->pvar->name)) {
+ /* TODO: Support arrays */
+ if (pf->pvar->name)
+ pf->tvar->name = xstrdup(pf->pvar->name);
+ else {
+ synthesize_perf_probe_arg(pf->pvar, buf, 32);
+ pf->tvar->name = xstrdup(buf);
+ }
+
+ if (!is_c_varname(pf->pvar->var)) {
/* Copy raw parameters */
- pf->tvar->value = xstrdup(pf->pvar->name);
+ pf->tvar->value = xstrdup(pf->pvar->var);
} else {
- synthesize_perf_probe_arg(pf->pvar, buf, 128);
- pf->tvar->name = xstrdup(buf);
pr_debug("Searching '%s' variable in context.\n",
- pf->pvar->name);
+ pf->pvar->var);
/* Search child die for local variables and parameters. */
- if (!die_find_variable(sp_die, pf->pvar->name, &vr_die))
+ if (!die_find_variable(sp_die, pf->pvar->var, &vr_die))
die("Failed to find '%s' in this function.",
- pf->pvar->name);
+ pf->pvar->var);
convert_variable(&vr_die, pf);
}
}