aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/annotate.h
diff options
context:
space:
mode:
authorJin Yao <yao.jin@linux.intel.com>2017-07-07 01:06:35 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2017-07-18 22:13:49 -0400
commit7e63a13a266da652f82731b845b5c35dd866ec7e (patch)
tree150f53051878fb91e9660a15d67e05d7cb6da252 /tools/perf/util/annotate.h
parent69fb09f6ccdb2f070557fd1f4c56c4d646694c8e (diff)
perf annotate: Implement visual marker for macro fusion
For marking fused instructions clearly this patch adds a line before the first instruction of pair and joins it with the arrow of the jump to its target. For example, when "je" is selected in annotate view, the line before cmpl is displayed and joins the arrow of "je". │ ┌──cmpl $0x0,argp_program_version_hook 81.93 │ ├──je 20 │ │ lock cmpxchg %esi,0x38a9a4(%rip) │ │↓ jne 29 │ │↓ jmp 43 11.47 │20:└─→cmpxch %esi,0x38a999(%rip) That means the cmpl+je is a fused instruction pair and they should be considered together. Changelog: v3: Use Arnaldo's fix to improve the arrow origin rendering. To get the evsel->evlist->env->cpuid, save the evsel in annotate_browser. v2: new function "ins__is_fused" to check if the instructions are fused. Signed-off-by: Yao Jin <yao.jin@linux.intel.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Kan Liang <kan.liang@intel.com> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1499403995-19857-3-git-send-email-yao.jin@linux.intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/annotate.h')
-rw-r--r--tools/perf/util/annotate.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h
index 72d72728a0fc..bac698d7cc6a 100644
--- a/tools/perf/util/annotate.h
+++ b/tools/perf/util/annotate.h
@@ -52,6 +52,7 @@ struct ins_ops {
52bool ins__is_jump(const struct ins *ins); 52bool ins__is_jump(const struct ins *ins);
53bool ins__is_call(const struct ins *ins); 53bool ins__is_call(const struct ins *ins);
54bool ins__is_ret(const struct ins *ins); 54bool ins__is_ret(const struct ins *ins);
55bool ins__is_lock(const struct ins *ins);
55int ins__scnprintf(struct ins *ins, char *bf, size_t size, struct ins_operands *ops); 56int ins__scnprintf(struct ins *ins, char *bf, size_t size, struct ins_operands *ops);
56bool ins__is_fused(struct arch *arch, const char *ins1, const char *ins2); 57bool ins__is_fused(struct arch *arch, const char *ins1, const char *ins2);
57 58