Skip to content

Commit 951e273

Browse files
committed
Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf fixes from Ingo Molnar: "Two last minute tooling fixes" * 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: perf probe: Fix perf probe to find correct variable DIE perf probe: Fix a segfault if asked for variable it doesn't find
2 parents 1c5aefb + 22c91aa commit 951e273

File tree

2 files changed

+7
-4
lines changed

2 files changed

+7
-4
lines changed

tools/perf/util/dwarf-aux.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -747,14 +747,17 @@ struct __find_variable_param {
747747
static int __die_find_variable_cb(Dwarf_Die *die_mem, void *data)
748748
{
749749
struct __find_variable_param *fvp = data;
750+
Dwarf_Attribute attr;
750751
int tag;
751752

752753
tag = dwarf_tag(die_mem);
753754
if ((tag == DW_TAG_formal_parameter ||
754755
tag == DW_TAG_variable) &&
755-
die_compare_name(die_mem, fvp->name))
756+
die_compare_name(die_mem, fvp->name) &&
757+
/* Does the DIE have location information or external instance? */
758+
(dwarf_attr(die_mem, DW_AT_external, &attr) ||
759+
dwarf_attr(die_mem, DW_AT_location, &attr)))
756760
return DIE_FIND_CB_END;
757-
758761
if (dwarf_haspc(die_mem, fvp->addr))
759762
return DIE_FIND_CB_CONTINUE;
760763
else

tools/perf/util/probe-finder.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -511,12 +511,12 @@ static int convert_variable(Dwarf_Die *vr_die, struct probe_finder *pf)
511511

512512
ret = convert_variable_location(vr_die, pf->addr, pf->fb_ops,
513513
&pf->sp_die, pf->tvar);
514-
if (ret == -ENOENT)
514+
if (ret == -ENOENT || ret == -EINVAL)
515515
pr_err("Failed to find the location of %s at this address.\n"
516516
" Perhaps, it has been optimized out.\n", pf->pvar->var);
517517
else if (ret == -ENOTSUP)
518518
pr_err("Sorry, we don't support this variable location yet.\n");
519-
else if (pf->pvar->field) {
519+
else if (ret == 0 && pf->pvar->field) {
520520
ret = convert_variable_fields(vr_die, pf->pvar->var,
521521
pf->pvar->field, &pf->tvar->ref,
522522
&die_mem);

0 commit comments

Comments
 (0)