Re: [PATCH] Properly interpret indirect call in perf annotate.
From: Arnaldo Carvalho de Melo <acme@kernel.org>
Date: 2018-08-23 14:12:24
Also in:
lkml
Em Thu, Aug 23, 2018 at 02:29:34PM +0200, Martin Liška escreveu:
The patch changes interpretation of: callq *0x8(%rbx) from: 0.26 │ → callq *8 to: 0.26 │ → callq *0x8(%rbx) in this can an address is followed by a register, thus one can't parse only address.
Please mention one or two functions where such sequence appears, so that others can reproduce your before/after more quickly, - Arnaldo
Signed-off-by: Martin Liška <redacted> --- tools/perf/util/annotate.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
quoted hunk ↗ jump to hunk
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index e4268b948e0e..e32ead4744bd 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c@@ -246,8 +246,14 @@ static int call__parse(struct arch *arch, struct ins_operands *ops, struct map_s indirect_call: tok = strchr(endptr, '*'); - if (tok != NULL) - ops->target.addr = strtoull(tok + 1, NULL, 16); + if (tok != NULL) { + endptr++; + + /* Indirect call can use a non-rip register and offset: callq *0x8(%rbx). + * Do not parse such instruction. */ + if (strstr(endptr, "(%r") == NULL) + ops->target.addr = strtoull(endptr, NULL, 16); + } goto find_target; }