Re: [PATCH v7 4/6] perf annotate: Support jump instruction with target as second operand
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,0xc00f6154'. >> >> objdump o/p: >> c00f6140: ld r9,1032(r31) >> c00f6144: cmpdi cr7,r9,0 >> c00f6148: bnecr7,0xc00f6154 >> c00f614c: ld r9,2312(r30) >> c00f6150: stdr9,1032(r31) >> c00f6154: 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 bne3ff09f2c >> ld r9,2312(r30) >> stdr9,1032(r31) >> 74:ld r9,88(r31) >> >> After patch: >> ld r9,1032(r31) >> cmpdi cr7,r9,0 >> v bne74 >> ld r9,2312(r30) >> stdr9,1032(r31) >> 74:ld r9,88(r31) >> >> Signed-off-by: Ravi Bangoria >> --- >> 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
Re: [PATCH v7 4/6] perf annotate: Support jump instruction with target as second operand
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,0xc00f6154'. > > objdump o/p: > c00f6140: ld r9,1032(r31) > c00f6144: cmpdi cr7,r9,0 > c00f6148: bnecr7,0xc00f6154 > c00f614c: ld r9,2312(r30) > c00f6150: stdr9,1032(r31) > c00f6154: ld r9,88(r31) So the above is what is parsed to generate the following? Or these aren't related? > Before patch: > ld r9,1032(r31) > cmpdi cr7,r9,0 > v bne3ff09f2c > ld r9,2312(r30) > stdr9,1032(r31) > 74:ld r9,88(r31) > > After patch: > ld r9,1032(r31) > cmpdi cr7,r9,0 > v bne74 > ld r9,2312(r30) > stdr9,1032(r31) > 74:ld r9,88(r31) > > Signed-off-by: Ravi Bangoria > --- > 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
[PATCH v7 4/6] perf annotate: Support jump instruction with target as second operand
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,0xc00f6154'. objdump o/p: c00f6140: ld r9,1032(r31) c00f6144: cmpdi cr7,r9,0 c00f6148: bnecr7,0xc00f6154 c00f614c: ld r9,2312(r30) c00f6150: stdr9,1032(r31) c00f6154: ld r9,88(r31) Before patch: ld r9,1032(r31) cmpdi cr7,r9,0 v bne3ff09f2c ld r9,2312(r30) stdr9,1032(r31) 74:ld r9,88(r31) After patch: ld r9,1032(r31) cmpdi cr7,r9,0 v bne74 ld r9,2312(r30) stdr9,1032(r31) 74:ld r9,88(r31) Signed-off-by: Ravi Bangoria --- 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