diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2012-04-20 14:26:47 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2012-04-20 14:26:47 -0400 |
commit | d22328855666464731ee95d9e1e8d35dc7a39d8d (patch) | |
tree | e89d3ad578013909800c084a85886fc5d3ebc99a | |
parent | 97148a97baf71536e15aa0acf3310b7b1409e2f4 (diff) |
perf annotate browser: Suppress the callq address
0.00 | callq ffffffff8112f190 <__mod_zone_page_state>
Becomes:
0.00 | callq __mod_zone_page_state
But if you press 'o' it gets verbose, i.e. as in objdump -dS:
0.00 | ffffffff8116bdda: callq ffffffff8112f190 <__mod_zone_page_state>
Requested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-bwse2wib954y0db7dq91bes5@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r-- | tools/perf/util/annotate.c | 43 | ||||
-rw-r--r-- | tools/perf/util/annotate.h | 1 |
2 files changed, 42 insertions, 2 deletions
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index 7f6c14b3fd7f..b07d7d1425f9 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c | |||
@@ -20,12 +20,50 @@ const char *disassembler_style; | |||
20 | 20 | ||
21 | static int call__parse(struct ins_operands *ops) | 21 | static int call__parse(struct ins_operands *ops) |
22 | { | 22 | { |
23 | ops->target = strtoull(ops->raw, NULL, 16); | 23 | char *endptr, *tok, *name; |
24 | |||
25 | ops->target = strtoull(ops->raw, &endptr, 16); | ||
26 | |||
27 | name = strchr(endptr, '<'); | ||
28 | if (name == NULL) | ||
29 | goto indirect_call; | ||
30 | |||
31 | name++; | ||
32 | |||
33 | tok = strchr(name, '>'); | ||
34 | if (tok == NULL) | ||
35 | return -1; | ||
36 | |||
37 | *tok = '\0'; | ||
38 | ops->target_name = strdup(name); | ||
39 | *tok = '>'; | ||
40 | |||
41 | return ops->target_name == NULL ? -1 : 0; | ||
42 | |||
43 | indirect_call: | ||
44 | tok = strchr(endptr, '*'); | ||
45 | if (tok == NULL) | ||
46 | return -1; | ||
47 | |||
48 | ops->target = strtoull(tok + 1, NULL, 16); | ||
24 | return 0; | 49 | return 0; |
25 | } | 50 | } |
26 | 51 | ||
52 | static int call__scnprintf(struct ins *ins, char *bf, size_t size, | ||
53 | struct ins_operands *ops, bool addrs) | ||
54 | { | ||
55 | if (addrs) | ||
56 | return scnprintf(bf, size, "%-6.6s %s", ins->name, ops->raw); | ||
57 | |||
58 | if (ops->target_name) | ||
59 | return scnprintf(bf, size, "%-6.6s %s", ins->name, ops->target_name); | ||
60 | |||
61 | return scnprintf(bf, size, "%-6.6s *%" PRIx64, ins->name, ops->target); | ||
62 | } | ||
63 | |||
27 | static struct ins_ops call_ops = { | 64 | static struct ins_ops call_ops = { |
28 | .parse = call__parse, | 65 | .parse = call__parse, |
66 | .scnprintf = call__scnprintf, | ||
29 | }; | 67 | }; |
30 | 68 | ||
31 | bool ins__is_call(const struct ins *ins) | 69 | bool ins__is_call(const struct ins *ins) |
@@ -251,6 +289,7 @@ void disasm_line__free(struct disasm_line *dl) | |||
251 | { | 289 | { |
252 | free(dl->line); | 290 | free(dl->line); |
253 | free(dl->name); | 291 | free(dl->name); |
292 | free(dl->ops.target_name); | ||
254 | free(dl); | 293 | free(dl); |
255 | } | 294 | } |
256 | 295 | ||
diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h index a6f60d5c5138..8a8af0d82b07 100644 --- a/tools/perf/util/annotate.h +++ b/tools/perf/util/annotate.h | |||
@@ -11,6 +11,7 @@ struct ins; | |||
11 | 11 | ||
12 | struct ins_operands { | 12 | struct ins_operands { |
13 | char *raw; | 13 | char *raw; |
14 | char *target_name; | ||
14 | u64 target; | 15 | u64 target; |
15 | }; | 16 | }; |
16 | 17 | ||