On Thu, Mar 19, 2026 at 2:39 PM Namhyung Kim <[email protected]> wrote:
>
> Hi Ian,
>
> On Thu, Mar 05, 2026 at 02:19:19PM -0800, Ian Rogers wrote:
> > Fix the libunwind build for when libdw and libunwind are feature
> > detected, currently failing with a duplicate symbol.
> >
> > Refactor the libunwind support so that whenever a remote target is
> > available, perf functions using the ELF machine can use that remote
> > target regardless of what the host/local machine is. Migrate existing
> > libunwind supported architectures like powerpc, arm64 and loongarch so
> > that they can work in a cross-architecture way. Add support for
> > RISC-V. Make the code more regular in function names, etc. and avoid
> > including a C-file. This increases the lines of code. It is similar in
> > style to the unwind-libdw implementation. It is hoped that the more
> > uniform nature of the code with help with refactoring the perf
> > registers for SIMD/APX support.
> >
> > Aside from local host testing these patches are under tested, in part
> > as I'm failing to see how to build libunwind with support for multiple
> > remote targets. Please could I get help in testing.
>
> It seems libunwind project is not actively maintained. Assuming libdw
> unwinding is performant enough, we may want to get rid of libunwind
> support.
Guilherme, is it true that libunwind is built into perf with Gentoo?
The performance fix for unwinding with libdw is in commit
6b2658b3f36a ("perf unwind-libdw: Don't discard loaded ELF/DWARF after
every unwind") that is currently only in v7.0-rc[1-4].
In commit 13e17c9ff49119aa ("perf build: Make libunwind opt-in rather
than opt-out"), perf made libunwind opt-in rather than opt-out. This
change is in v6.13.
LLVM has a libunwind project but LLVM scares me because its library
dependencies are so large.
Perhaps we should merge these changes and then delete the libunwind
support in 2 or 3 releases time. I believe this is closer to how
libbpf deprecated the pre-1.0 behaviors. Personally I don't mind if we
just delete everything now, but typically we're not that aggressive.
Thanks,
Ian
> Thanks,
> Namhyung
>
> >
> > v2: Move two fixes patches to position 1 and 2 in the series. Fix
> > struct naming inconsistency, Andrew Jones
> > <[email protected]>. Fix other inconsistencies and
> > potential non-x86 build issues.
> >
> > v1: https://lore.kernel.org/lkml/[email protected]/
> >
> > Ian Rogers (8):
> > perf unwind: Refactor get_entries to allow dynamic libdw/libunwind
> > selection
> > perf build loongarch: Remove reference to missing file
> > tools build: Deduplicate test-libunwind for different architectures
> > perf build: Be more programmatic when setting up libunwind variables
> > perf unwind-libunwind: Make libunwind register reading cross platform
> > perf unwind-libunwind: Move flush/finish access out of local
> > perf unwind-libunwind: Remove libunwind-local
> > perf unwind-libunwind: Add RISC-V libunwind support
> >
> > tools/build/feature/Makefile | 38 +-
> > tools/build/feature/test-libunwind-aarch64.c | 27 -
> > tools/build/feature/test-libunwind-arm.c | 28 -
> > .../test-libunwind-debug-frame-aarch64.c | 17 -
> > .../feature/test-libunwind-debug-frame-arm.c | 17 -
> > .../feature/test-libunwind-debug-frame.c | 1 -
> > tools/build/feature/test-libunwind-x86.c | 28 -
> > tools/build/feature/test-libunwind-x86_64.c | 28 -
> > tools/build/feature/test-libunwind.c | 1 -
> > tools/perf/Makefile.config | 215 ++---
> > tools/perf/arch/arm/util/Build | 2 -
> > tools/perf/arch/arm/util/unwind-libunwind.c | 50 --
> > tools/perf/arch/arm64/util/Build | 1 -
> > tools/perf/arch/arm64/util/unwind-libunwind.c | 17 -
> > tools/perf/arch/loongarch/util/Build | 3 -
> > .../arch/loongarch/util/unwind-libunwind.c | 82 --
> > tools/perf/arch/mips/Build | 1 -
> > tools/perf/arch/mips/util/Build | 1 -
> > tools/perf/arch/mips/util/unwind-libunwind.c | 22 -
> > tools/perf/arch/powerpc/util/Build | 1 -
> > .../perf/arch/powerpc/util/unwind-libunwind.c | 92 --
> > tools/perf/arch/x86/util/Build | 3 -
> > tools/perf/arch/x86/util/unwind-libunwind.c | 115 ---
> > tools/perf/builtin-inject.c | 4 +
> > tools/perf/builtin-report.c | 4 +
> > tools/perf/builtin-script.c | 4 +
> > tools/perf/util/Build | 5 +-
> > tools/perf/util/libunwind-arch/Build | 11 +
> > .../perf/util/libunwind-arch/libunwind-arch.c | 319 +++++++
> > .../perf/util/libunwind-arch/libunwind-arch.h | 296 +++++++
> > .../perf/util/libunwind-arch/libunwind-arm.c | 290 ++++++
> > .../util/libunwind-arch/libunwind-arm64.c | 289 ++++++
> > .../perf/util/libunwind-arch/libunwind-i386.c | 312 +++++++
> > .../util/libunwind-arch/libunwind-loongarch.c | 297 +++++++
> > .../perf/util/libunwind-arch/libunwind-mips.c | 299 +++++++
> > .../util/libunwind-arch/libunwind-ppc32.c | 301 +++++++
> > .../util/libunwind-arch/libunwind-ppc64.c | 303 +++++++
> > .../util/libunwind-arch/libunwind-riscv.c | 297 +++++++
> > .../perf/util/libunwind-arch/libunwind-s390.c | 299 +++++++
> > .../util/libunwind-arch/libunwind-x86_64.c | 320 +++++++
> > tools/perf/util/libunwind/arm64.c | 40 -
> > tools/perf/util/libunwind/x86_32.c | 41 -
> > tools/perf/util/maps.c | 29 +-
> > tools/perf/util/maps.h | 4 +-
> > tools/perf/util/symbol_conf.h | 15 +
> > tools/perf/util/thread.c | 29 +-
> > tools/perf/util/unwind-libdw.c | 2 +-
> > tools/perf/util/unwind-libunwind-local.c | 832 ------------------
> > tools/perf/util/unwind-libunwind.c | 679 ++++++++++++--
> > tools/perf/util/unwind.c | 102 +++
> > tools/perf/util/unwind.h | 56 +-
> > 51 files changed, 4536 insertions(+), 1733 deletions(-)
> > delete mode 100644 tools/build/feature/test-libunwind-aarch64.c
> > delete mode 100644 tools/build/feature/test-libunwind-arm.c
> > delete mode 100644 tools/build/feature/test-libunwind-debug-frame-aarch64.c
> > delete mode 100644 tools/build/feature/test-libunwind-debug-frame-arm.c
> > delete mode 100644 tools/build/feature/test-libunwind-x86.c
> > delete mode 100644 tools/build/feature/test-libunwind-x86_64.c
> > delete mode 100644 tools/perf/arch/arm/util/unwind-libunwind.c
> > delete mode 100644 tools/perf/arch/arm64/util/unwind-libunwind.c
> > delete mode 100644 tools/perf/arch/loongarch/util/unwind-libunwind.c
> > delete mode 100644 tools/perf/arch/mips/Build
> > delete mode 100644 tools/perf/arch/mips/util/Build
> > delete mode 100644 tools/perf/arch/mips/util/unwind-libunwind.c
> > delete mode 100644 tools/perf/arch/powerpc/util/unwind-libunwind.c
> > delete mode 100644 tools/perf/arch/x86/util/unwind-libunwind.c
> > create mode 100644 tools/perf/util/libunwind-arch/Build
> > create mode 100644 tools/perf/util/libunwind-arch/libunwind-arch.c
> > create mode 100644 tools/perf/util/libunwind-arch/libunwind-arch.h
> > create mode 100644 tools/perf/util/libunwind-arch/libunwind-arm.c
> > create mode 100644 tools/perf/util/libunwind-arch/libunwind-arm64.c
> > create mode 100644 tools/perf/util/libunwind-arch/libunwind-i386.c
> > create mode 100644 tools/perf/util/libunwind-arch/libunwind-loongarch.c
> > create mode 100644 tools/perf/util/libunwind-arch/libunwind-mips.c
> > create mode 100644 tools/perf/util/libunwind-arch/libunwind-ppc32.c
> > create mode 100644 tools/perf/util/libunwind-arch/libunwind-ppc64.c
> > create mode 100644 tools/perf/util/libunwind-arch/libunwind-riscv.c
> > create mode 100644 tools/perf/util/libunwind-arch/libunwind-s390.c
> > create mode 100644 tools/perf/util/libunwind-arch/libunwind-x86_64.c
> > delete mode 100644 tools/perf/util/libunwind/arm64.c
> > delete mode 100644 tools/perf/util/libunwind/x86_32.c
> > delete mode 100644 tools/perf/util/unwind-libunwind-local.c
> > create mode 100644 tools/perf/util/unwind.c
> >
> > --
> > 2.53.0.473.g4a7958ca14-goog
> >