perf annotate: Mark jump instructions with no offset
Commit-ID: fb29fa58e36df09c807d252247d64a221fcd5bbb Gitweb: http://git.kernel.org/tip/fb29fa58e36df09c807d252247d64a221fcd5bbb Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Wed, 25 Apr 2012 14:16:03 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 25 Apr 2012 14:16:03 -0300
perf annotate: Mark jump instructions with no offset
I.e. jumps that go to code outside the current function, that is denoted in objdump -dS as:
399f877a9f: jne 399f87bcf4 <_L_lock_5154>
I.e. without the + after the name of the current function, like in:
399f877aa5: jmp 399f877ab2 <_int_free+0x412>
The browser will use that info to avoid drawing connectors to the start of the function, since ops.target.addr was zero.
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/util/annotate.c | 9 ++++++--- tools/perf/util/annotate.h | 6 ++++++ 2 files changed, 12 insertions(+), 3 deletions(-)
tools/perf/util/annotate.c +6 -3
@@ -75,10 +75,13 @@ static int jump__parse(struct ins_operands *ops) {const char *s =strchr (ops->raw,'+' ); -if (s++ ==NULL ) -return -1 ; + ops->target.addr =strtoll (ops->raw,NULL ,16 ); + +if (s++ !=NULL ) + ops->target.offset =strtoll (s,NULL ,16 ); +else + ops->target.offset =UINT64_MAX ; - ops->target.offset =strtoll (s,NULL ,16 );return 0 ; }
tools/perf/util/annotate.h +6 -0
@@ -2,6 +2,7 @@#define __PERF_ANNOTATE_H#include <stdbool.h> +#include <stdint.h> #include "types.h" #include "symbol.h" #include <linux/list.h>
@@ -41,6 +42,11 @@ struct disasm_line {struct ins_operands ops; }; +static inline bool disasm_line__has_offset (const struct disasm_line *dl) +{ +return dl->ops.target.offset !=UINT64_MAX ; +} +void disasm_line__free (struct disasm_line *dl);struct disasm_line *disasm__get_next_ip_line (struct list_head *head,struct disasm_line *pos);size_t disasm__fprintf (struct list_head *head,FILE *fp);