Skip to contentSkip to conversation

perf annotate: Use ops->target.name when available for unresolved call targets

tip:perf/core tip-bot for Arnaldo Carvalho de Melo 1 participant 1 message Mar 20, 2018 perf events

lore
Share & tools
lore
#0 lore raw
Commit-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     67

And 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     67
Quoted 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
index ddad87f34a68..535357c6ce02 100644
@@ -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);
 }