perf annotate: Use ops->target.name when available for unresolved call targets
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: 4c9cb2c2b4b5530717f74b2252f8cc4c45b2a918 Gitweb: https://git.kernel.org/tip/4c9cb2c2b4b5530717f74b2252f8cc4c45b2a918 Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Fri, 16 Mar 2018 13:28:09 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 19 Mar 2018 13:51:52 -0300
perf annotate: Use ops->target.name when available for unresolved call targets
There is a bug where when using 'perf annotate timerqueue_add' the target for its only routine called with the 'callq' instruction, 'rb_insert_color', doesn't get resolved from its address when parsing that 'callq' instruction.
That symbol resolution works when using 'perf report --tui' and then doing annotation for 'timerqueue_add' from there, the vmlinux dso->symbols rb_tree somehow gets in a state that we can't find that address, that is a bug that has to be further investigated.
But since the objdump output has the function name, i.e. the raw objdump disassembled line looks like:
So, before:
# perf annotate timerqueue_add
│ mov %rbx,%rdi
│ mov %rbx,(%rdx)
│ → callq *ffffffff8184dc80
│ mov 0x8(%rbp),%rdx
│ test %rdx,%rdx
│ ↓ je 67# perf report
│ mov %rbx,%rdi
│ mov %rbx,(%rdx)
│ → callq rb_insert_color
│ mov 0x8(%rbp),%rdx
│ test %rdx,%rdx
│ ↓ je 67And after both look the same:
# perf annotate timerqueue_add
│ mov %rbx,%rdi
│ mov %rbx,(%rdx)
│ → callq rb_insert_color
│ mov 0x8(%rbp),%rdx
│ test %rdx,%rdx
│ ↓ je 67Quoted 1 line
From 'perf report' one can annotate and navigate to that '
rb_insert_color'
function, but not directly from 'perf annotate timerqueue_add', that remains to be investigated and fixed.
--- tools/perf/util/annotate.c | 3 +++ 1 file changed, 3 insertions(+)
tools/perf/util/annotate.c +3 -0
@@ -238,6 +238,9 @@ static int call__scnprintf(struct ins *ins, char *bf, size_t size,if (ops->target.addr ==0 )return ins__raw_scnprintf (ins, bf, size, ops); +if (ops->target.name) +return scnprintf (bf, size,"%-6s %s" , ins->name, ops->target.name); +return scnprintf (bf, size,"%-6s *%" PRIx64, ins->name, ops->target.addr); }