perf annotate browser: Suppress the callq address
Commit-ID: d22328855666464731ee95d9e1e8d35dc7a39d8d Gitweb: http://git.kernel.org/tip/d22328855666464731ee95d9e1e8d35dc7a39d8d Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Fri, 20 Apr 2012 15:26:47 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Fri, 20 Apr 2012 15:26:47 -0300
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 <[email protected]>
Cc David Ahern <[email protected]>
Cc Frederic Weisbecker <[email protected]>
Cc Linus Torvalds <[email protected]>
Cc Mike Galbraith <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Paul Mackerras <[email protected]>
Cc Peter Zijlstra <[email protected]>
Cc Stephane Eranian <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/annotate.c | 43 +++++++++++++++++++++++++++++++++++++++++-- tools/perf/util/annotate.h | 1 + 2 files changed, 42 insertions(+), 2 deletions(-)
tools/perf/util/annotate.c +41 -2
@@ -20,12 +20,50 @@ const char *disassembler_style;static int call__parse (struct ins_operands *ops) { - ops->target =strtoull (ops->raw,NULL ,16 ); +char *endptr, *tok, *name; + + ops->target =strtoull (ops->raw, &endptr,16 ); + + name =strchr (endptr,'<' ); +if (name ==NULL ) + goto indirect_call; + + name++; + + tok =strchr (name,'>' ); +if (tok ==NULL ) +return -1 ; + + *tok ='\0' ; + ops->target_name =strdup (name); + *tok ='>' ; + +return ops->target_name ==NULL ?-1 :0 ; + +indirect_call: + tok =strchr (endptr,'*' ); +if (tok ==NULL ) +return -1 ; + + ops->target =strtoull (tok +1 ,NULL ,16 );return 0 ; } +static int call__scnprintf (struct ins *ins,char *bf,size_t size, +struct ins_operands *ops,bool addrs) +{ +if (addrs) +return scnprintf (bf, size,"%-6.6s %s" , ins->name, ops->raw); + +if (ops->target_name) +return scnprintf (bf, size,"%-6.6s %s" , ins->name, ops->target_name); + +return scnprintf (bf, size,"%-6.6s *%" PRIx64, ins->name, ops->target); +} +static struct ins_ops call_ops = { - .parse = call__parse, + .parse = call__parse, + .scnprintf = call__scnprintf, };bool ins__is_call (const struct ins *ins)
@@ -251,6 +289,7 @@ void disasm_line__free(struct disasm_line *dl) {free (dl->line);free (dl->name); +free (dl->ops.target_name);free (dl); }
tools/perf/util/annotate.h +1 -0
@@ -11,6 +11,7 @@ struct ins;struct ins_operands {char *raw; +char *target_name;u64 target; };