diff options
| author | Ihor Solodrai <ihor.solodrai@linux.dev> | 2026-09-29 19:08:51 -0700 |
|---|---|---|
| committer | Alexei Starovoitov <ast@kernel.org> | 2026-09-30 09:06:09 +0000 |
| commit | 99c3e74f8d9695b57bda22a8f2e0ad220dcb78bc (patch) | |
| tree | 522c53730aab2ad48a63b18f36268708c8cccfb0 /tools/testing | |
| parent | c20c470eb620b86acb1e8218b262760b2c0d7401 (diff) | |
selftests/bpf: Skip callx switch table test for clang-22 with cpu=v4
clang-22 miscompiles call_by_switch() when targeting -mcpu=v4: it turns
the switch into an array of pointers to functions and then erroneously
removes the array in BPFAsmPrinter::doFinalization(), breaking the build
with:
error: Undefined temporary symbol .Lswitch.table.call_by_switch
Fixed by llvm commit 9fc458a1d95b ("[BPF] Fix erroneous removal of
non-jump-table globals"), first released in clang-23; older clangs are
fine. test_progs-cpuv4 is built by default whenever clang supports v4,
so selftests/bpf fails to build with any clang-22 release. Guard just
this test with the compiler/cpu check and leave a __skip placeholder
for the broken combination, so the gap is reported as SKIP instead of
silently missing.
Fixes: b018e998e645 ("selftests/bpf: Add tests for callx through pointers in read-only data")
Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://patch.msgid.link/20260930020851.71691-1-ihor.solodrai@linux.dev
Diffstat (limited to 'tools/testing')
| -rw-r--r-- | tools/testing/selftests/bpf/progs/verifier_callx_rodata.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/tools/testing/selftests/bpf/progs/verifier_callx_rodata.c b/tools/testing/selftests/bpf/progs/verifier_callx_rodata.c index db3169a1ddf6..3e7a1c2c2a9a 100644 --- a/tools/testing/selftests/bpf/progs/verifier_callx_rodata.c +++ b/tools/testing/selftests/bpf/progs/verifier_callx_rodata.c @@ -803,6 +803,14 @@ int callx_c_ops_selected(void *ctx) return use_shape(ops, 3); } +/* + * clang-22 with -mcpu=v4 drops the lookup table it builds for this switch + * ("Undefined temporary symbol .Lswitch.table.call_by_switch"). + * Fixed in clang-23 by llvm commit 9fc458a1d95b. + * + * https://github.com/llvm/llvm-project/commit/9fc458a1d95b + */ +#if __clang_major__ != 22 || __BPF_CPU_VERSION__ < 4 /* the compiler might turn the switch into a table that has no symbol */ static __noinline int call_by_switch(unsigned int idx, int x) { @@ -847,6 +855,18 @@ int callx_c_switch_table(void *ctx) return call_by_switch(op_idx - 8, 3); } +#else + +SEC("socket") +__skip("clang-22 bug with -mcpu=v4, switch table test cannot be built") +__success +int callx_c_switch_table(void *ctx) +{ + return 0; +} + +#endif + /* * Misaligned pointers to functions are ignored, the rest of the data is * accessible as before. The program doesn't have callx, so libbpf doesn't |
