[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CAM9d7cgnBk03-yBBFtV37ryj13RROmaqjC9S3sUF7QhnRYrenw@mail.gmail.com>
Date: Fri, 29 Mar 2024 13:00:10 -0700
From: Namhyung Kim <namhyung@...nel.org>
To: duchangbin <changbin.du@...wei.com>
Cc: Arnaldo Carvalho de Melo <acme@...nel.org>, Ian Rogers <irogers@...gle.com>,
Kan Liang <kan.liang@...ux.intel.com>, Jiri Olsa <jolsa@...nel.org>,
Adrian Hunter <adrian.hunter@...el.com>, Peter Zijlstra <peterz@...radead.org>,
Ingo Molnar <mingo@...nel.org>, LKML <linux-kernel@...r.kernel.org>,
"linux-perf-users@...r.kernel.org" <linux-perf-users@...r.kernel.org>
Subject: Re: [PATCH 4/4] perf annotate: Use libcapstone to disassemble
On Thu, Mar 28, 2024 at 7:53 PM duchangbin <changbin.du@...wei.com> wrote:
>
> Hi, Namhyung,
> On Thu, Mar 28, 2024 at 04:20:09PM -0700, Namhyung Kim wrote:
> > Now it can use the capstone library to disassemble the instructions.
> > Let's use that (if available) for perf annotate to speed up. Currently
> > it only supports x86 architecture. With this change I can see ~3x speed
> > up in data type profiling.
> >
> > But note that capstone cannot give the source file and line number info.
> > For now, users should use the external objdump for that by specifying
> > the --objdump option explicitly.
> >
> > Cc: Changbin Du <changbin.du@...wei.com>
> > Signed-off-by: Namhyung Kim <namhyung@...nel.org>
> > ---
> > tools/perf/util/disasm.c | 153 +++++++++++++++++++++++++++++++++++++++
> > 1 file changed, 153 insertions(+)
> >
> > diff --git a/tools/perf/util/disasm.c b/tools/perf/util/disasm.c
> > index 59ac37723990..c58ea6d822ed 100644
> > --- a/tools/perf/util/disasm.c
> > +++ b/tools/perf/util/disasm.c
> > @@ -1,6 +1,7 @@
> > // SPDX-License-Identifier: GPL-2.0-only
> > #include <ctype.h>
> > #include <errno.h>
> > +#include <fcntl.h>
> > #include <inttypes.h>
> > #include <libgen.h>
> > #include <regex.h>
> > @@ -18,6 +19,7 @@
> > #include "evsel.h"
> > #include "map.h"
> > #include "maps.h"
> > +#include "namespaces.h"
> > #include "srcline.h"
> > #include "symbol.h"
> >
> > @@ -1341,6 +1343,151 @@ symbol__disassemble_bpf_image(struct symbol *sym,
> > return 0;
> > }
> >
> > +#ifdef HAVE_LIBCAPSTONE_SUPPORT
> > +#include <capstone/capstone.h>
> > +
> > +static int open_capstone_handle(struct annotate_args *args, bool is_64bit,
> > + csh *handle)
> > +{
> > + struct annotation_options *opt = args->options;
> > + cs_mode mode = is_64bit ? CS_MODE_64 : CS_MODE_32;
> > +
> > + /* TODO: support more architectures */
> > + if (!arch__is(args->arch, "x86"))
> > + return -1;
> > +
> > + if (cs_open(CS_ARCH_X86, mode, handle) != CS_ERR_OK)
> > + return -1;
> > +
> > + if (!opt->disassembler_style ||
> > + !strcmp(opt->disassembler_style, "att"))
> > + cs_option(*handle, CS_OPT_SYNTAX, CS_OPT_SYNTAX_ATT);
> > +
> > + /*
> > + * Resolving address operands to symbols is implemented
> > + * on x86 by investigating instruction details.
> > + */
> > + cs_option(*handle, CS_OPT_DETAIL, CS_OPT_ON);
> Enabling CS_OPT_DETAIL is to symbolize branch target address. You can refer to
> print_insn_x86() in print_insn.c.
Right, I think we can add it as a comment.
Thanks,
Namhyung
Powered by blists - more mailing lists