Messages in this thread | | | From | Namhyung Kim <> | Date | Fri, 29 Mar 2024 13:00:10 -0700 | Subject | Re: [PATCH 4/4] perf annotate: Use libcapstone to disassemble |
| |
On Thu, Mar 28, 2024 at 7:53 PM duchangbin <changbin.du@huawei.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@huawei.com> > > Signed-off-by: Namhyung Kim <namhyung@kernel.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
| |