diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2012-04-25 07:00:23 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2012-04-25 07:00:23 -0400 |
commit | 44d1a3edfbd65f9da6725921e2425b10477772d8 (patch) | |
tree | 127655e788cf172e26eea4e38b98303c998e0d4a | |
parent | 9481ede909e08418c9379665ee9f25335d20dd06 (diff) |
perf annotate: Disambiguage offsets and addresses in operands
We were using ins_ops->target for callq addresses and jump offsets,
disambiguate by having ins_ops->target.addr and ins_ops->target.offset.
For jumps we'll need both to fixup lines that don't have an offset on
the <> part.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
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-3nlcmstua75u07ao7wja1rwx@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r-- | tools/perf/ui/browsers/annotate.c | 14 | ||||
-rw-r--r-- | tools/perf/util/annotate.c | 20 | ||||
-rw-r--r-- | tools/perf/util/annotate.h | 7 |
3 files changed, 22 insertions, 19 deletions
diff --git a/tools/perf/ui/browsers/annotate.c b/tools/perf/ui/browsers/annotate.c index 4c83fe3d7dad..73e1ef0081d4 100644 --- a/tools/perf/ui/browsers/annotate.c +++ b/tools/perf/ui/browsers/annotate.c | |||
@@ -112,7 +112,7 @@ static void annotate_browser__write(struct ui_browser *self, void *entry, int ro | |||
112 | ui_browser__set_color(self, color); | 112 | ui_browser__set_color(self, color); |
113 | if (dl->ins && dl->ins->ops->scnprintf) { | 113 | if (dl->ins && dl->ins->ops->scnprintf) { |
114 | if (ins__is_jump(dl->ins)) { | 114 | if (ins__is_jump(dl->ins)) { |
115 | bool fwd = dl->ops.target > (u64)dl->offset; | 115 | bool fwd = dl->ops.target.offset > (u64)dl->offset; |
116 | 116 | ||
117 | ui_browser__write_graph(self, fwd ? SLSMG_DARROW_CHAR : | 117 | ui_browser__write_graph(self, fwd ? SLSMG_DARROW_CHAR : |
118 | SLSMG_UARROW_CHAR); | 118 | SLSMG_UARROW_CHAR); |
@@ -156,7 +156,7 @@ static void annotate_browser__draw_current_loop(struct ui_browser *browser) | |||
156 | if (!pos->ins || !ins__is_jump(pos->ins)) | 156 | if (!pos->ins || !ins__is_jump(pos->ins)) |
157 | continue; | 157 | continue; |
158 | 158 | ||
159 | target = ab->offsets[pos->ops.target]; | 159 | target = ab->offsets[pos->ops.target.offset]; |
160 | if (!target) | 160 | if (!target) |
161 | continue; | 161 | continue; |
162 | 162 | ||
@@ -360,7 +360,7 @@ static bool annotate_browser__callq(struct annotate_browser *browser, | |||
360 | if (!ins__is_call(dl->ins)) | 360 | if (!ins__is_call(dl->ins)) |
361 | return false; | 361 | return false; |
362 | 362 | ||
363 | ip = ms->map->map_ip(ms->map, dl->ops.target); | 363 | ip = ms->map->map_ip(ms->map, dl->ops.target.addr); |
364 | target = map__find_symbol(ms->map, ip, NULL); | 364 | target = map__find_symbol(ms->map, ip, NULL); |
365 | if (target == NULL) { | 365 | if (target == NULL) { |
366 | ui_helpline__puts("The called function was not found."); | 366 | ui_helpline__puts("The called function was not found."); |
@@ -411,7 +411,7 @@ static bool annotate_browser__jump(struct annotate_browser *browser) | |||
411 | if (!ins__is_jump(dl->ins)) | 411 | if (!ins__is_jump(dl->ins)) |
412 | return false; | 412 | return false; |
413 | 413 | ||
414 | dl = annotate_browser__find_offset(browser, dl->ops.target, &idx); | 414 | dl = annotate_browser__find_offset(browser, dl->ops.target.offset, &idx); |
415 | if (dl == NULL) { | 415 | if (dl == NULL) { |
416 | ui_helpline__puts("Invallid jump offset"); | 416 | ui_helpline__puts("Invallid jump offset"); |
417 | return true; | 417 | return true; |
@@ -692,14 +692,14 @@ static void annotate_browser__mark_jump_targets(struct annotate_browser *browser | |||
692 | if (!dl || !dl->ins || !ins__is_jump(dl->ins)) | 692 | if (!dl || !dl->ins || !ins__is_jump(dl->ins)) |
693 | continue; | 693 | continue; |
694 | 694 | ||
695 | if (dl->ops.target >= size) { | 695 | if (dl->ops.target.offset >= size) { |
696 | ui__error("jump to after symbol!\n" | 696 | ui__error("jump to after symbol!\n" |
697 | "size: %zx, jump target: %" PRIx64, | 697 | "size: %zx, jump target: %" PRIx64, |
698 | size, dl->ops.target); | 698 | size, dl->ops.target.offset); |
699 | continue; | 699 | continue; |
700 | } | 700 | } |
701 | 701 | ||
702 | dlt = browser->offsets[dl->ops.target]; | 702 | dlt = browser->offsets[dl->ops.target.offset]; |
703 | /* | 703 | /* |
704 | * FIXME: Oops, no jump target? Buggy disassembler? Or do we | 704 | * FIXME: Oops, no jump target? Buggy disassembler? Or do we |
705 | * have to adjust to the previous offset? | 705 | * have to adjust to the previous offset? |
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index b07d7d1425f9..e1e7d0eb6145 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c | |||
@@ -22,7 +22,7 @@ static int call__parse(struct ins_operands *ops) | |||
22 | { | 22 | { |
23 | char *endptr, *tok, *name; | 23 | char *endptr, *tok, *name; |
24 | 24 | ||
25 | ops->target = strtoull(ops->raw, &endptr, 16); | 25 | ops->target.addr = strtoull(ops->raw, &endptr, 16); |
26 | 26 | ||
27 | name = strchr(endptr, '<'); | 27 | name = strchr(endptr, '<'); |
28 | if (name == NULL) | 28 | if (name == NULL) |
@@ -35,17 +35,17 @@ static int call__parse(struct ins_operands *ops) | |||
35 | return -1; | 35 | return -1; |
36 | 36 | ||
37 | *tok = '\0'; | 37 | *tok = '\0'; |
38 | ops->target_name = strdup(name); | 38 | ops->target.name = strdup(name); |
39 | *tok = '>'; | 39 | *tok = '>'; |
40 | 40 | ||
41 | return ops->target_name == NULL ? -1 : 0; | 41 | return ops->target.name == NULL ? -1 : 0; |
42 | 42 | ||
43 | indirect_call: | 43 | indirect_call: |
44 | tok = strchr(endptr, '*'); | 44 | tok = strchr(endptr, '*'); |
45 | if (tok == NULL) | 45 | if (tok == NULL) |
46 | return -1; | 46 | return -1; |
47 | 47 | ||
48 | ops->target = strtoull(tok + 1, NULL, 16); | 48 | ops->target.addr = strtoull(tok + 1, NULL, 16); |
49 | return 0; | 49 | return 0; |
50 | } | 50 | } |
51 | 51 | ||
@@ -55,10 +55,10 @@ static int call__scnprintf(struct ins *ins, char *bf, size_t size, | |||
55 | if (addrs) | 55 | if (addrs) |
56 | return scnprintf(bf, size, "%-6.6s %s", ins->name, ops->raw); | 56 | return scnprintf(bf, size, "%-6.6s %s", ins->name, ops->raw); |
57 | 57 | ||
58 | if (ops->target_name) | 58 | if (ops->target.name) |
59 | return scnprintf(bf, size, "%-6.6s %s", ins->name, ops->target_name); | 59 | return scnprintf(bf, size, "%-6.6s %s", ins->name, ops->target.name); |
60 | 60 | ||
61 | return scnprintf(bf, size, "%-6.6s *%" PRIx64, ins->name, ops->target); | 61 | return scnprintf(bf, size, "%-6.6s *%" PRIx64, ins->name, ops->target.addr); |
62 | } | 62 | } |
63 | 63 | ||
64 | static struct ins_ops call_ops = { | 64 | static struct ins_ops call_ops = { |
@@ -78,7 +78,7 @@ static int jump__parse(struct ins_operands *ops) | |||
78 | if (s++ == NULL) | 78 | if (s++ == NULL) |
79 | return -1; | 79 | return -1; |
80 | 80 | ||
81 | ops->target = strtoll(s, NULL, 16); | 81 | ops->target.offset = strtoll(s, NULL, 16); |
82 | return 0; | 82 | return 0; |
83 | } | 83 | } |
84 | 84 | ||
@@ -88,7 +88,7 @@ static int jump__scnprintf(struct ins *ins, char *bf, size_t size, | |||
88 | if (addrs) | 88 | if (addrs) |
89 | return scnprintf(bf, size, "%-6.6s %s", ins->name, ops->raw); | 89 | return scnprintf(bf, size, "%-6.6s %s", ins->name, ops->raw); |
90 | 90 | ||
91 | return scnprintf(bf, size, "%-6.6s %" PRIx64, ins->name, ops->target); | 91 | return scnprintf(bf, size, "%-6.6s %" PRIx64, ins->name, ops->target.offset); |
92 | } | 92 | } |
93 | 93 | ||
94 | static struct ins_ops jump_ops = { | 94 | static struct ins_ops jump_ops = { |
@@ -289,7 +289,7 @@ void disasm_line__free(struct disasm_line *dl) | |||
289 | { | 289 | { |
290 | free(dl->line); | 290 | free(dl->line); |
291 | free(dl->name); | 291 | free(dl->name); |
292 | free(dl->ops.target_name); | 292 | free(dl->ops.target.name); |
293 | free(dl); | 293 | free(dl); |
294 | } | 294 | } |
295 | 295 | ||
diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h index 8a8af0d82b07..2b9e3e038a84 100644 --- a/tools/perf/util/annotate.h +++ b/tools/perf/util/annotate.h | |||
@@ -11,8 +11,11 @@ struct ins; | |||
11 | 11 | ||
12 | struct ins_operands { | 12 | struct ins_operands { |
13 | char *raw; | 13 | char *raw; |
14 | char *target_name; | 14 | struct { |
15 | u64 target; | 15 | char *name; |
16 | u64 offset; | ||
17 | u64 addr; | ||
18 | } target; | ||
16 | }; | 19 | }; |
17 | 20 | ||
18 | struct ins_ops { | 21 | struct ins_ops { |