[PATCH] perf report: Fix wrong jump arrow

From: Jin Yao
Date: Sun Jan 28 2018 - 22:03:15 EST


When we use perf report interactive annotate view, we can see
the position of jump arrow is not correct. For example,

1. perf record -b ...
2. perf report
3. In interactive mode, select Annotate 'function'

Percentâ IPC Cycle
â if (flag)
1.37 â0.4âââ 1 â je 82
â â x += x / y + y / x;
0.00 â0.4â 1310 movsd (%rsp),%xmm0
0.00 â0.4â 565 movsd 0x8(%rsp),%xmm4
â0.4â movsd 0x8(%rsp),%xmm1
â0.4â movsd (%rsp),%xmm3
â0.4â divsd %xmm4,%xmm0
0.00 â0.4â 579 divsd %xmm3,%xmm1
â0.4â movsd (%rsp),%xmm2
â0.4â addsd %xmm1,%xmm0
â0.4â addsd %xmm2,%xmm0
0.00 â0.4â movsd %xmm0,(%rsp)
â â volatile double x = 1212121212, y = 121212;
â â
â â s_randseed = time(0);
â â srand(s_randseed);
â â
â â for (i = 0; i < 2000000000; i++) {
1.37 â0.4âââ 82: sub $0x1,%ebx
28.21 â0.48 17 â jne 38

The jump arrow in above example is not correct. It should add the
width of IPC and Cycle.

With this patch, the result is:

Percentâ IPC Cycle
â if (flag)
1.37 â0.48 1 âââje 82
â â x += x / y + y / x;
0.00 â0.48 1310 â movsd (%rsp),%xmm0
0.00 â0.48 565 â movsd 0x8(%rsp),%xmm4
â0.48 â movsd 0x8(%rsp),%xmm1
â0.48 â movsd (%rsp),%xmm3
â0.48 â divsd %xmm4,%xmm0
0.00 â0.48 579 â divsd %xmm3,%xmm1
â0.48 â movsd (%rsp),%xmm2
â0.48 â addsd %xmm1,%xmm0
â0.48 â addsd %xmm2,%xmm0
0.00 â0.48 â movsd %xmm0,(%rsp)
â â volatile double x = 1212121212, y = 121212;
â â
â â s_randseed = time(0);
â â srand(s_randseed);
â â
â â for (i = 0; i < 2000000000; i++) {
1.37 â0.48 82:âââsub $0x1,%ebx
28.21 â0.48 17 â jne 38

Signed-off-by: Jin Yao <yao.jin@xxxxxxxxxxxxxxx>
---
tools/perf/ui/browsers/annotate.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/tools/perf/ui/browsers/annotate.c b/tools/perf/ui/browsers/annotate.c
index 2864279..e2f6663 100644
--- a/tools/perf/ui/browsers/annotate.c
+++ b/tools/perf/ui/browsers/annotate.c
@@ -319,6 +319,7 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)
struct map_symbol *ms = ab->b.priv;
struct symbol *sym = ms->sym;
u8 pcnt_width = annotate_browser__pcnt_width(ab);
+ int width = 0;

/* PLT symbols contain external offsets */
if (strstr(sym->name, "@plt"))
@@ -340,13 +341,17 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)
to = (u64)btarget->idx;
}

+ if (ab->have_cycles)
+ width = IPC_WIDTH + CYCLES_WIDTH;
+
ui_browser__set_color(browser, HE_COLORSET_JUMP_ARROWS);
- __ui_browser__line_arrow(browser, pcnt_width + 2 + ab->addr_width,
+ __ui_browser__line_arrow(browser,
+ pcnt_width + 2 + ab->addr_width + width,
from, to);

if (is_fused(ab, cursor)) {
ui_browser__mark_fused(browser,
- pcnt_width + 3 + ab->addr_width,
+ pcnt_width + 3 + ab->addr_width + width,
from - 1,
to > from ? true : false);
}
--
2.7.4