Message ID | 1474472876-2706-5-git-send-email-ravi.bangoria@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
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? > 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
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
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);
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) 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(-)