[PATCH 11/12] tests: Add inter-CU type reference comparison test
Arnaldo Carvalho de Melo <[email protected]> Fri, 31 Jul 2026 16:30:59 -0300
| Newsgroups | org.kernel.vger.dwarves,org.kernel.vger.bpf |
|---|---|
| Message-ID | <[email protected]> |
From: Arnaldo Carvalho de Melo <[email protected]> When the perf binary includes Rust CUs, some DWARF types reference types in other CUs via DW_FORM_ref_addr. The parallel loading path processes each CU independently, so cross-CU references fail during cu__recode_dwarf_types() and the types become unresolved (void). The force_cu_merging feature worked around this by serializing loading into a mega-CU, but disables parallel DIE processing. This test compares both outputs to validate that cross-CU references are correctly resolved without needing force_cu_merging. Before the preceding fix, 314 cross-CU references failed, producing 70 lines of output difference across 12 diff hunks: $ pahole -F dwarf ~/bin/perf 2>/dev/null > parallel.txt $ pahole --features=force_cu_merging -F dwarf ~/bin/perf 2>/dev/null > merged.txt $ diff parallel.txt merged.txt | grep '^[<>]' | wc -l 70 $ diff -u parallel.txt merged.txt | head -20 --- parallel.txt +++ merged.txt @@ -10821,7 +10821,11 @@ usize __0 __attribute__((__aligned__(8))); struct ThreadInfo __1 __attribute__((__aligned__(8))); + /* XXX last struct has 8 bytes of padding, 1 hole */ + /* size: 48, cachelines: 1, members: 2 */ + /* member types with holes: 1, total: 1 */ + /* paddings: 1, sum paddings: 8 */ /* forced alignments: 2 */ /* last cacheline: 48 bytes */ } __attribute__((__aligned__(8))); The preceding commit fixed the detection of DW_FORM_ref_addr in cus__merging_cu(), making this test pass. Assisted-by: Claude:claude-sonnet-4-5 Signed-off-by: Arnaldo Carvalho de Melo <[email protected]> --- tests/inter_cu_refs.sh | 50 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100755 tests/inter_cu_refs.sh diff --git a/tests/inter_cu_refs.sh b/tests/inter_cu_refs.sh new file mode 100755 index 0000000000000000..6827bf83931eb3ed --- /dev/null +++ b/tests/inter_cu_refs.sh @@ -0,0 +1,50 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0-only +# Copyright © 2026 Red Hat Inc, Arnaldo Carvalho de Melo <[email protected]> +# +# Compare default CU loading with explicit force_cu_merging for binaries +# with inter-CU type references (e.g. Rust CUs in perf). +# +# When cus__merging_cu() correctly detects DW_FORM_ref_addr usage, it +# automatically falls back to the merged CU path. This test verifies +# that the automatic detection produces the same output as explicitly +# forcing CU merging. + +. ./test_lib.sh + +outdir=$(make_tmpdir) +trap cleanup EXIT + +title_log "Compare parallel vs merged CU loading for inter-CU type references." + +perf=$(which perf 2>/dev/null) +if [ -z "$perf" ] ; then + info_log "skip: No 'perf' binary available" + test_skip +fi + +if ! pahole --features=force_cu_merging -F dwarf -C perf_event_header "$perf" 2>/dev/null | grep -q "^struct perf_event_header {" ; then + info_log "skip: $perf doesn't have 'struct perf_event_header' type info" + test_skip +fi + +parallel_out=$outdir/parallel.txt +merged_out=$outdir/merged.txt + +if ! pahole -F dwarf "$perf" > "$parallel_out" 2>/dev/null ; then + error_log "FAIL: pahole failed processing $perf (parallel mode)" + test_fail +fi + +if ! pahole --features=force_cu_merging -F dwarf "$perf" > "$merged_out" 2>/dev/null ; then + error_log "FAIL: pahole failed processing $perf (merged mode)" + test_fail +fi + +if diff -u "$parallel_out" "$merged_out" > /dev/null 2>&1 ; then + test_pass +else + nr_diff=$(diff "$parallel_out" "$merged_out" | grep '^[<>]' | wc -l) + error_log "FAIL: $nr_diff lines differ between parallel and merged CU loading" + test_fail +fi -- 2.55.0