Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 218642
b: refs/heads/master
c: 378eeaa
h: refs/heads/master
v: v3
  • Loading branch information
Masami Hiramatsu authored and Arnaldo Carvalho de Melo committed Oct 21, 2010
1 parent f05d4e1 commit 827c902
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 9 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 4046b8bb5ffae9ee916e504cdadee804f10e0c56
refs/heads/master: 378eeaad3e1cfea7f6614018fb335de93df2ba1f
26 changes: 18 additions & 8 deletions trunk/tools/perf/util/probe-finder.c
Original file line number Diff line number Diff line change
Expand Up @@ -329,25 +329,35 @@ static Dwarf_Die *die_find_inlinefunc(Dwarf_Die *sp_die, Dwarf_Addr addr,
return die_find_child(sp_die, __die_find_inline_cb, &addr, die_mem);
}

struct __find_variable_param {
const char *name;
Dwarf_Addr addr;
};

static int __die_find_variable_cb(Dwarf_Die *die_mem, void *data)
{
const char *name = data;
struct __find_variable_param *fvp = data;
int tag;

tag = dwarf_tag(die_mem);
if ((tag == DW_TAG_formal_parameter ||
tag == DW_TAG_variable) &&
die_compare_name(die_mem, name))
die_compare_name(die_mem, fvp->name))
return DIE_FIND_CB_FOUND;

return DIE_FIND_CB_CONTINUE;
if (dwarf_haspc(die_mem, fvp->addr))
return DIE_FIND_CB_CONTINUE;
else
return DIE_FIND_CB_SIBLING;
}

/* Find a variable called 'name' */
static Dwarf_Die *die_find_variable(Dwarf_Die *sp_die, const char *name,
Dwarf_Die *die_mem)
/* Find a variable called 'name' at given address */
static Dwarf_Die *die_find_variable_at(Dwarf_Die *sp_die, const char *name,
Dwarf_Addr addr, Dwarf_Die *die_mem)
{
return die_find_child(sp_die, __die_find_variable_cb, (void *)name,
struct __find_variable_param fvp = { .name = name, .addr = addr};

return die_find_child(sp_die, __die_find_variable_cb, (void *)&fvp,
die_mem);
}

Expand Down Expand Up @@ -731,7 +741,7 @@ static int find_variable(Dwarf_Die *sp_die, struct probe_finder *pf)
pr_debug("Searching '%s' variable in context.\n",
pf->pvar->var);
/* Search child die for local variables and parameters. */
if (die_find_variable(sp_die, pf->pvar->var, &vr_die))
if (die_find_variable_at(sp_die, pf->pvar->var, pf->addr, &vr_die))
ret = convert_variable(&vr_die, pf);
else {
/* Search upper class */
Expand Down

0 comments on commit 827c902

Please sign in to comment.