Messages in this thread |  | | Subject | Re: [PATCH v7 4/6] perf annotate: Support jump instruction with target as second operand | From | Ravi Bangoria <> | Date | Mon, 10 Oct 2016 19:04:15 +0530 |
| |
On Wednesday 05 October 2016 04:58 PM, Arnaldo Carvalho de Melo wrote: > Em Wed, Sep 21, 2016 at 09:17:54PM +0530, Ravi Bangoria escreveu: >> Current perf is not able to parse jump instruction when second operand >> contains target address. Arch like powerpc has such instructions. For >> example, 'bne cr7,0xc0000000000f6154'. >> >> objdump o/p: >> c0000000000f6140: ld r9,1032(r31) >> c0000000000f6144: cmpdi cr7,r9,0 >> c0000000000f6148: bne cr7,0xc0000000000f6154 >> c0000000000f614c: ld r9,2312(r30) >> c0000000000f6150: std r9,1032(r31) >> c0000000000f6154: ld r9,88(r31) > So the above is what is parsed to generate the following? Or these > aren't related?
Yes, following is the perf annotate o/p from above objdump o/p.
-Ravi
> >> Before patch: >> ld r9,1032(r31) >> cmpdi cr7,r9,0 >> v bne 3ffffffffff09f2c >> ld r9,2312(r30) >> std r9,1032(r31) >> 74: ld r9,88(r31) >> >> After patch: >> ld r9,1032(r31) >> cmpdi cr7,r9,0 >> v bne 74 >> ld r9,2312(r30) >> std r9,1032(r31) >> 74: ld r9,88(r31) >> >> Signed-off-by: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com> >> --- >> Changes in v7: >> - Added example in description >> >> tools/perf/util/annotate.c | 6 +++++- >> 1 file changed, 5 insertions(+), 1 deletion(-) >> >> diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c >> index 1ccf26a..a9dbac1 100644 >> --- a/tools/perf/util/annotate.c >> +++ b/tools/perf/util/annotate.c >> @@ -122,8 +122,12 @@ bool ins__is_call(const struct ins *ins) >> static int jump__parse(struct ins_operands *ops, struct map *map __maybe_unused) >> { >> const char *s = strchr(ops->raw, '+'); >> + const char *c = strchr(ops->raw, ','); >> >> - ops->target.addr = strtoull(ops->raw, NULL, 16); >> + if (c++ != NULL) >> + ops->target.addr = strtoull(c, NULL, 16); >> + else >> + ops->target.addr = strtoull(ops->raw, NULL, 16); >> >> if (s++ != NULL) >> ops->target.offset = strtoull(s, NULL, 16); >> -- >> 2.5.5
|  |