Messages in this thread Patch in this message | | | From | Martin Liška <> | Subject | [PATCH] Properly interpret indirect call in perf annotate. | Date | Thu, 23 Aug 2018 14:29:34 +0200 |
| |
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.
Signed-off-by: Martin Liška <mliska@suse.cz> --- tools/perf/util/annotate.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
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; }
| |