[PATCH 0/3] perf: script: use capstone to show disassembly instructions for samples

From: Changbin Du
Date: Fri Sep 09 2022 - 04:57:23 EST


Currently, the instructions of samples are shown as raw hex strings
which are hard to read. x86 has a special option '--xed' to disassemble
the hex string via intel XED.

Here we use capstone as our disassembly engine to do that. We select
libcapstone because capstone can provide more insn details.

The improvements compared to xed:
* support arm, arm64, x86-32, x86_64 (more could be supported),
xed only for x86_64.
* immediate address operands are shown as symbol+offs.

Before:
$ sudo perf script --insn-trace
perf 17423 [000] 423271.557970005: 7f2d95f16217 __GI___ioctl+0x7 (/lib/x86_64-linux-gnu/libc-2.27.so) insn: 48 3d 01 f0 ff ff
perf 17423 [000] 423271.557970005: 7f2d95f1621d __GI___ioctl+0xd (/lib/x86_64-linux-gnu/libc-2.27.so) insn: 73 01
perf 17423 [000] 423271.557970338: 7f2d95f1621f __GI___ioctl+0xf (/lib/x86_64-linux-gnu/libc-2.27.so) insn: c3
perf 17423 [000] 423271.557970338: 5593ad3346d7 perf_evsel__enable_cpu+0x97 (/work/linux/tools/perf/perf) insn: 85 c0
perf 17423 [000] 423271.557970338: 5593ad3346d9 perf_evsel__enable_cpu+0x99 (/work/linux/tools/perf/perf) insn: 75 12
perf 17423 [000] 423271.557970338: 5593ad3346db perf_evsel__enable_cpu+0x9b (/work/linux/tools/perf/perf) insn: 49 8b 84 24 a8 00 00 00
perf 17423 [000] 423271.557970338: 5593ad3346e3 perf_evsel__enable_cpu+0xa3 (/work/linux/tools/perf/perf) insn: 48 8b 50 20

After:
$ sudo perf script --insn-trace
perf 17423 [000] 423271.557970005: 7f2d95f16217 __GI___ioctl+0x7 (/lib/x86_64-linux-gnu/libc-2.27.so) insn: cmpq $-0xfff, %rax
perf 17423 [000] 423271.557970005: 7f2d95f1621d __GI___ioctl+0xd (/lib/x86_64-linux-gnu/libc-2.27.so) insn: jae __GI___ioctl+0x10
perf 17423 [000] 423271.557970338: 7f2d95f1621f __GI___ioctl+0xf (/lib/x86_64-linux-gnu/libc-2.27.so) insn: retq
perf 17423 [000] 423271.557970338: 5593ad3346d7 perf_evsel__enable_cpu+0x97 (/work/linux/tools/perf/perf) insn: testl %eax, %eax
perf 17423 [000] 423271.557970338: 5593ad3346d9 perf_evsel__enable_cpu+0x99 (/work/linux/tools/perf/perf) insn: jne perf_evsel__enable_cpu+0xad
perf 17423 [000] 423271.557970338: 5593ad3346db perf_evsel__enable_cpu+0x9b (/work/linux/tools/perf/perf) insn: movq 0xa8(%r12), %rax
perf 17423 [000] 423271.557970338: 5593ad3346e3 perf_evsel__enable_cpu+0xa3 (/work/linux/tools/perf/perf) insn: movq 0x20(%rax), %rdx
perf 17423 [000] 423271.557970338: 5593ad3346e7 perf_evsel__enable_cpu+0xa7 (/work/linux/tools/perf/perf) insn: cmpl %edx, %ebx

Changbin Du (3):
perf: build: introduce the libcapstone
perf: script: use capstone disasm engine to show disassembly
instructions
perf: script: Deprecate the '--xed' option

tools/build/Makefile.feature | 2 +
tools/build/feature/Makefile | 4 +
tools/build/feature/test-all.c | 4 +
tools/build/feature/test-libcapstone.c | 11 ++
tools/perf/Documentation/build-xed.txt | 19 ----
tools/perf/Documentation/perf-intel-pt.txt | 17 +--
tools/perf/Documentation/perf-script.txt | 5 +-
tools/perf/Documentation/tips.txt | 2 +-
tools/perf/Makefile.config | 21 ++++
tools/perf/Makefile.perf | 3 +
tools/perf/builtin-script.c | 15 +--
tools/perf/ui/browsers/res_sample.c | 2 +-
tools/perf/ui/browsers/scripts.c | 4 +-
tools/perf/util/Build | 1 +
tools/perf/util/print_insn.c | 126 +++++++++++++++++++++
tools/perf/util/print_insn.h | 13 +++
16 files changed, 201 insertions(+), 48 deletions(-)
create mode 100644 tools/build/feature/test-libcapstone.c
delete mode 100644 tools/perf/Documentation/build-xed.txt
create mode 100644 tools/perf/util/print_insn.c
create mode 100644 tools/perf/util/print_insn.h

--
2.17.1