perf annotate: Parse call targets earlier
Commit-ID: d86b0597c4bd41ea3edc6446a855306eed34f93b Gitweb: http://git.kernel.org/tip/d86b0597c4bd41ea3edc6446a855306eed34f93b Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Wed, 18 Apr 2012 16:07:38 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 18 Apr 2012 16:07:38 -0300
perf annotate: Parse call targets earlier
No need to do it everytime the user presses enter/-> on a call instruction.
Cc David Ahern <[email protected]>
Cc Frederic Weisbecker <[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/ui/browsers/annotate.c | 10 +++++----- tools/perf/util/annotate.c | 18 +++++++++++++++++- tools/perf/util/annotate.h | 1 + 3 files changed, 23 insertions(+), 6 deletions(-)
tools/perf/ui/browsers/annotate.c +5 -5
@@ -266,11 +266,10 @@ static bool annotate_browser__callq(struct annotate_browser *browser,struct symbol *target;u64 ip; -if (strcmp (dl->name,"callq" )) +if (!ins__is_call (dl->ins))return false; - ip =strtoull (dl->operands,NULL ,16 ); - ip = ms->map->map_ip (ms->map, ip); + ip = ms->map->map_ip (ms->map, dl->target); target =map__find_symbol (ms->map, ip,NULL );if (target ==NULL ) {ui_helpline__puts ("The called function was not found." );
@@ -318,7 +317,7 @@ static bool annotate_browser__jump(struct annotate_browser *browser)struct disasm_line *dl = browser->selection;s64 idx; -if (!dl->ins || !ins__is_jump (dl->ins)) +if (!ins__is_jump (dl->ins))return false; dl =annotate_browser__find_offset (browser, dl->target, &idx);
@@ -556,7 +555,8 @@ show_help:ui_helpline__puts ("Huh? No selection. Report to [email protected]" ); else if (self->selection->offset == -1) ui_helpline__puts("Actions are only available for assembly lines."); - else if (!(annotate_browser__jump(self) || + else if (!self->selection->ins || + !(annotate_browser__jump(self) || annotate_browser__callq(self, evidx, timer, arg, delay_secs)))ui_helpline__puts ("Actions are only available for the 'callq' and jump instructions." );continue ;
tools/perf/util/annotate.c +17 -1
@@ -18,6 +18,21 @@const char *disassembler_style; +static int call_ops__parse_target (const char *operands,u64 *target) +{ + *target =strtoull (operands,NULL ,16 ); +return 0 ; +} + +static struct ins_ops call_ops = { + .parse_target = call_ops__parse_target, +}; + +bool ins__is_call (const struct ins *ins) +{ +return ins->ops == &call_ops; +} +static int jump_ops__parse_target (const char *operands,u64 *target) {const char *s =strchr (operands,'+' );
@@ -38,11 +53,12 @@ bool ins__is_jump(const struct ins *ins)return ins->ops == &jump_ops; } -/* * Must be sorted by name! */ static struct ins instructions[] = { + { .name ="call" , .ops = &call_ops, }, + { .name ="callq" , .ops = &call_ops, }, { .name ="ja" , .ops = &jump_ops, }, { .name ="je" , .ops = &jump_ops, }, { .name ="jmp" , .ops = &jump_ops, },
tools/perf/util/annotate.h +1 -0
@@ -17,6 +17,7 @@ struct ins { };bool ins__is_jump (const struct ins *ins); +bool ins__is_call (const struct ins *ins);struct disasm_line {struct list_head node;