From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Alan Maguire <alan.maguire@oracle.com>
Cc: Jiri Olsa <jolsa@kernel.org>,
Clark Williams <williams@redhat.com>,
dwarves@vger.kernel.org, bpf@vger.kernel.org,
Andrii Nakryiko <andrii@kernel.org>,
Yonghong Song <yonghong.song@linux.dev>,
Mark Wieelard <mjw@redhat.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>
Subject: [PATCHES 00/12] pahole: Support more rust tags and references to dwz alternate debug files
Date: Fri, 31 Jul 2026 16:30:48 -0300 [thread overview]
Message-ID: <20260731193102.110693-1-acme@kernel.org> (raw)
Hi,
Add support for Rust discriminated unions (enums with explicit
discriminants).
Rust enums like Option<u32> and Result<i32,u8> are represented in DWARF
as DW_TAG_variant_part containing DW_TAG_variant children with
discriminant values. These patches:
- Load DW_TAG_variant_part containers with discriminant tracking
- Populate DW_TAG_variant children with discriminant values
- Handle DW_FORM_block encoding for discriminant values
- Handle DW_TAG_subprogram inside DW_TAG_enumeration (Rust methods)
- Encode variant parts as BTF_KIND_UNION members
Before: Rust Option<u32> showed as empty struct (0 members)
After: Shows None and Some variants with correct layout
=== pahole --expand_types output ===
struct Option<u32> {
struct None {
} __attribute__((__aligned__(4)));
struct Some {
/* XXX 4 bytes hole, try to pack */
u32 __0 __attribute__((__aligned__(4))); /* 4 4 */
} __attribute__((__aligned__(4)));
} __attribute__((__aligned__(4)));
BTF has no discriminated-union kind, so variant parts are tentatively
encoded as BTF_KIND_UNION with overlapping members at offset 0. Further
discussion is needed to see if we can keep that.
DW_FORM_block byte order fix: uses CU-recorded endianness instead of
assuming little-endian when decoding DW_AT_const_value and
DW_AT_default_value. Fixes cross-endian DWARF processing (e.g. reading
big-endian s390x debug info on x86).
Also add support for cross-CU type references and dwz alternate debug
files.
This is needed to improve the support for, among other things, Rust, as
noticed in the pretty printing or a perf binary that has rust objects
linked, built by clang/llvm that use cross-CU references.
DW_TAG_imported_unit support:
Handle same-file partial units where types are shared across CUs
via DW_TAG_imported_unit. Force-merge CUs that contain inter-CU
references (DW_FORM_ref_addr) so type lookups resolve correctly.
Fix cus__merging_cu failing to detect DW_FORM_ref_addr when
DW_FORM_implicit_const causes dwarf_getabbrevattr() to fail.
dwz alternate debug file support:
Handle DW_FORM_GNU_ref_alt references to dwz-compressed alternate
debug files (.dwz). Pre-processes all alternate partial units with
separate hash tables and dedup tracking.
Before (Firefox): 1774 "has no entry in cu" errors
After: processes cleanly with 0 errors
Firefox uses dwz compression which moves common types into a
separate .dwz file and replaces duplicates with DW_FORM_GNU_ref_alt
references. pahole now pre-loads the alternate file's partial units,
resolves all cross-file references, and processes Firefox DWARF
cleanly.
Includes inter-CU type reference comparison test and
vmlinux_comparison.py for DWARF/BTF analysis across kernel configs.
Known limitations:
- Pruning of unreferenced alt PUs is conservatively over-approximated
- Merged-CU path is single-threaded by design
This makes pahole to be able to support more of the CONFIG_DEBUG_ DWARF
options, including DWARF5 and compression, see the latest patch in the
series for more details about how this table is produced:
┌───────────────────────────┬─────────┬─────┬───────────────────────────────────┬─────────┬───────┬──────────┬────────┬──────────┬─────────┐
│ File │ Size │ Ver │ Producer │ DWARF │ BTF │ DW-Hash │ DW-Out │ BTF-Hash │ BTF-Out │
├───────────────────────────┼─────────┼─────┼───────────────────────────────────┼─────────┼───────┼──────────┼────────┼──────────┼─────────┤
│ vmlinux.dwarf4 │ 835.7MB │ 4 │ GNU C11 16.1.1 -gdwarf-4 │ 599.2MB │ 7.3MB │ 86e1b611 │ 7.6MB │ 52123c24 │ 7.4MB │
│ vmlinux.dwarf5 │ 736.3MB │ 5 │ GNU C11 16.1.1 -gdwarf-5 │ 499.7MB │ 7.3MB │ 86e1b611 │ 7.6MB │ 52123c24 │ 7.4MB │
│ vmlinux.dwarf5.zlib │ 497.8MB │ 5 │ GNU C11 16.1.1 -gdwarf-5 -gz=zlib │ 261.2MB │ 7.3MB │ 86e1b611 │ 7.6MB │ 52123c24 │ 7.4MB │
│ vmlinux.dwarf5.zstd │ 454.7MB │ 5 │ GNU C11 16.1.1 -gdwarf-5 -gz=zstd │ 218.1MB │ 7.3MB │ 86e1b611 │ 7.6MB │ 52123c24 │ 7.4MB │
│ vmlinux.toolchain_default │ 736.3MB │ 5 │ GNU C11 16.1.1 │ 499.7MB │ 7.3MB │ 86e1b611 │ 7.6MB │ 52123c24 │ 7.4MB │
└───────────────────────────┴─────────┴─────┴───────────────────────────────────┴─────────┴───────┴──────────┴────────┴──────────┴─────────┘
Split DWARF support (skeleton CUs) will be supported in upcoming work,
so as to cover all the possibilities the kernel build system offers
for generating DWARF.
- Arnaldo
Arnaldo Carvalho de Melo (12):
dwarf_loader: Initial support for DW_TAG_variant_part
dwarf_loader: Initial support for DW_TAG_subprogram in DW_TAG_enumeration
dwarf_loader: Populate DW_TAG_variant children in DW_TAG_variant_part
btf_encoder: Encode variant parts as union members in BTF
dwarf_loader: Handle DW_FORM_block in attr_numeric for Rust discriminant values
dwarf_loader: Allow forcing the merge of CUs for solving inter CU tag references
dwarf_loader: Support DW_TAG_imported_unit for same-file partial units
dwarf_loader: Fix cus__merging_cu failing to detect DW_FORM_ref_addr
dwarf_loader: Add cu parameter to tag__set_spec() and dwarf_tag__set_attr_type()
dwarf_loader: Support DW_FORM_GNU_ref_alt references to dwz alternate debug files
tests: Add inter-CU type reference comparison test
scripts: Add vmlinux_comparison.py for DWARF/BTF analysis
btf_encoder.c | 66 ++-
ctf_encoder.c | 34 +-
dwarf_loader.c | 873 ++++++++++++++++++++++++++++++----
dwarves.c | 77 ++-
dwarves.h | 63 ++-
dwarves_emit.c | 10 +-
dwarves_fprintf.c | 54 ++-
man-pages/pahole.1 | 18 +-
pahole.c | 20 +-
scripts/vmlinux_comparison.py | 367 ++++++++++++++
tests/block_endian.sh | 146 ++++++
tests/dwz_alt_file.sh | 204 ++++++++
tests/inter_cu_refs.sh | 50 ++
tests/prettify_perf.data.sh | 4 +-
14 files changed, 1854 insertions(+), 132 deletions(-)
create mode 100755 scripts/vmlinux_comparison.py
create mode 100755 tests/block_endian.sh
create mode 100755 tests/dwz_alt_file.sh
create mode 100755 tests/inter_cu_refs.sh
--
2.55.0
next reply other threads:[~2026-07-31 19:31 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-31 19:30 Arnaldo Carvalho de Melo [this message]
2026-07-31 19:30 ` [PATCH 01/12] dwarf_loader: Initial support for DW_TAG_variant_part Arnaldo Carvalho de Melo
2026-07-31 19:30 ` [PATCH 02/12] dwarf_loader: Initial support for DW_TAG_subprogram in DW_TAG_enumeration Arnaldo Carvalho de Melo
2026-07-31 19:30 ` [PATCH 03/12] dwarf_loader: Populate DW_TAG_variant children in DW_TAG_variant_part Arnaldo Carvalho de Melo
2026-07-31 19:30 ` [PATCH 04/12] btf_encoder: Encode variant parts as union members in BTF Arnaldo Carvalho de Melo
2026-07-31 19:30 ` [PATCH 05/12] dwarf_loader: Handle DW_FORM_block in attr_numeric for Rust discriminant values Arnaldo Carvalho de Melo
2026-07-31 19:30 ` [PATCH 06/12] dwarf_loader: Allow forcing the merge of CUs for solving inter CU tag references Arnaldo Carvalho de Melo
2026-07-31 19:30 ` [PATCH 07/12] dwarf_loader: Support DW_TAG_imported_unit for same-file partial units Arnaldo Carvalho de Melo
2026-07-31 19:30 ` [PATCH 08/12] dwarf_loader: Fix cus__merging_cu failing to detect DW_FORM_ref_addr Arnaldo Carvalho de Melo
2026-07-31 19:30 ` [PATCH 09/12] dwarf_loader: Add cu parameter to tag__set_spec() and dwarf_tag__set_attr_type() Arnaldo Carvalho de Melo
2026-07-31 19:30 ` [PATCH 10/12] dwarf_loader: Support DW_FORM_GNU_ref_alt references to dwz alternate debug files Arnaldo Carvalho de Melo
2026-07-31 19:30 ` [PATCH 11/12] tests: Add inter-CU type reference comparison test Arnaldo Carvalho de Melo
2026-07-31 19:31 ` [PATCH 12/12] scripts: Add vmlinux_comparison.py for DWARF/BTF analysis Arnaldo Carvalho de Melo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260731193102.110693-1-acme@kernel.org \
--to=acme@kernel.org \
--cc=alan.maguire@oracle.com \
--cc=andrii@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=dwarves@vger.kernel.org \
--cc=jolsa@kernel.org \
--cc=mjw@redhat.com \
--cc=williams@redhat.com \
--cc=yonghong.song@linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox