[PATCH v5 0/7] perf libunwind multiple remote support

Ian Rogers irogers at google.com
Thu May 14 09:51:09 PDT 2026


On Wed, May 13, 2026 at 4:32 PM Ian Rogers <irogers at google.com> 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 will 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.

So the patches failed to apply in Sashiko:
https://sashiko.dev/#/patchset/20260513233151.572332-1-irogers%40google.com
The baseline logs show perf-tools-next was at commit 8c8f20936143
("perf build: Remove NO_GTK2 build test") which is 6 patches
out-of-date compared to the current tip these patches are against. I
ran Sashiko locally, so I don't expect a huge amount from the reviews.
Currently Sashiko is catching up with a backlog because its tokens
have a lower priority and there was high load earlier in the week.
Anyway, I could repost the patches for Sashiko review but given the
backlog I think that would just create noise at the moment. Hopefully
I can get human review so we can move forward with merging these
improvements.

Thanks,
Ian

> v5: Rebase dropping merged loong arch fix patch. Fixes to Sashiko
>     review feedback:
>     - Patch 1: Hooked unwind__configure() into perf_default_config().
>       Standardized unwinder return contracts (>0 success, 0 fallback,
>       <0 fatal).  Fixed UNWIND_STYLE_UNKNOWN fallback and added
>       memset() to clear config array on override.
>     - Patch 2: Dynamically populated FILES list in
>       tools/build/feature/Makefile using LIBUNWIND_ARCHS. Added
>       libunwind cases to FEATURE_TESTS_EXTRA in
>       tools/build/Makefile.feature for proper FEATURE-DUMP caching.
>     - Patch 3: Restored core -lunwind linkage to
>       FEATURE_CHECK_LDFLAGS.  Restored NO_LIBUNWIND fallback
>       validation, corrected EXTLIBS evaluation ordering for
>       BIONIC/Android compatibility, and restored static linking
>       multiple definition flags.
>     - Patch 4: Fixed out-of-bounds array read bugs (>= ARRAY_SIZE) in
>       libunwind-i386.c and libunwind-x86_64.c. Fixed constant typos
>       across LoongArch, PowerPC, and s390x.
>     - Patch 5: Added early EM_NONE and ops validation checks to
>       prevent warnings and NULL dereferences. Checked return value of
>       unwind__prepare_access() in maps__copy_from(). Corrected
>       architecture binding in thread__insert_map() by calculating
>       e_machine after map insertion.
>     - Patch 6: Aligned all remote architecture accessors to match
>       5-argument generic declarations (removing trailing
>       sizeof(unw_word_t)). Prevented frame discard on stack depth
>       limit by returning 0 instead of -1 in unwind_step(). Fixed
>       32-bit big-endian register corruption by replacing memcpy() with
>       conditional type-casted assignment. Fixed max_stack == 1
>       fallback trigger. Fixed .debug_frame layout union corruption by
>       changing di.u.rti to di.u.ti across all DWARF find wrappers.
>     - Patch 7: Applied the same corrections (5-argument accessors,
>       u.ti union accessors, 0 return on max_ips) to the newly
>       introduced libunwind-riscv.c.
>
> v4: Rebase, in particular the zalloc->calloc change conflicted.
> https://lore.kernel.org/linux-perf-users/20260413024805.1316480-1-irogers@google.com/
>
> v3: Minor whitespace clean up and warn when a dynamic choice of libdw
>     or libunwind is selected for unwinding and support is missing (Arnaldo).
> https://lore.kernel.org/lkml/20260404054032.1538095-1-irogers@google.com/
>
> v2: Move two fixes patches to position 1 and 2 in the series. Fix
>     struct naming inconsistency, Andrew Jones
>     <andrew.jones at oss.qualcomm.com>. Fix other inconsistencies and
>     potential non-x86 build issues.
> https://lore.kernel.org/lkml/20260305221927.3237145-1-irogers@google.com/
>
> v1: https://lore.kernel.org/lkml/20260224142938.26088-1-irogers@google.com/
>
> Ian Rogers (7):
>   perf unwind: Refactor get_entries to allow dynamic libdw/libunwind
>     selection
>   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/Makefile.feature                  |  12 +-
>  tools/build/feature/Makefile                  |  46 +-
>  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                    | 226 +++--
>  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          |   2 -
>  .../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/config.c                      |   4 +
>  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                        |  34 +-
>  tools/perf/util/maps.h                        |   4 +-
>  tools/perf/util/symbol_conf.h                 |  10 +
>  tools/perf/util/thread.c                      |  32 +-
>  tools/perf/util/unwind-libdw.c                |  20 +-
>  tools/perf/util/unwind-libunwind-local.c      | 831 ------------------
>  tools/perf/util/unwind-libunwind.c            | 699 +++++++++++++--
>  tools/perf/util/unwind.c                      | 104 +++
>  tools/perf/util/unwind.h                      |  73 +-
>  53 files changed, 4623 insertions(+), 1739 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.54.0.563.g4f69b47b94-goog
>



More information about the linux-riscv mailing list