Re: [PATCH 4/4] perf annotate: Use libcapstone to disassemble

From: Namhyung Kim
Date: Fri Mar 29 2024 - 16:00:32 EST


On Thu, Mar 28, 2024 at 7:53 PM duchangbin <changbin.du@xxxxxxxxxx> 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@xxxxxxxxxx>
> > Signed-off-by: Namhyung Kim <namhyung@xxxxxxxxxx>
> > ---
> > 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