mirror of
https://github.com/torvalds/linux
synced 2024-10-19 01:39:28 +00:00
091037fb77
With clang build kernel (adding LLVM=1 to kernel and selftests/bpf build command line), I hit the following test failure: $ ./test_progs -t btf_dump ... btf_dump_data:PASS:ensure expected/actual match 0 nsec btf_dump_data:FAIL:find type id unexpected find type id: actual -2 < expected 0 btf_dump_data:FAIL:find type id unexpected find type id: actual -2 < expected 0 test_btf_dump_int_data:FAIL:dump __int128 unexpected error: -2 (errno 2) #15/9 btf_dump/btf_dump: int_data:FAIL Further analysis showed gcc build kernel has type "__int128" in dwarf/BTF and it doesn't exist in clang build kernel. Code searching for kernel code found the following: arch/s390/include/asm/types.h: unsigned __int128 pair; crypto/ecc.c: unsigned __int128 m = (unsigned __int128)left * right; include/linux/math64.h: return (u64)(((unsigned __int128)a * mul) >> shift); include/linux/math64.h: return (u64)(((unsigned __int128)a * mul) >> shift); lib/ubsan.h:typedef __int128 s_max; lib/ubsan.h:typedef unsigned __int128 u_max; In my case, CONFIG_UBSAN is not enabled. Even if we only have "unsigned __int128" in the code, somehow gcc still put "__int128" in dwarf while clang didn't. Hence current test works fine for gcc but not for clang. Enabling CONFIG_UBSAN is an option to provide __int128 type into dwarf reliably for both gcc and clang, but not everybody enables CONFIG_UBSAN in their kernel build. So the best choice is to use "unsigned __int128" type which is available in both clang and gcc build kernels. But clang and gcc dwarf encoded names for "unsigned __int128" are different: [$ ~] cat t.c unsigned __int128 a; [$ ~] gcc -g -c t.c && llvm-dwarfdump t.o | grep __int128 DW_AT_type (0x00000031 "__int128 unsigned") DW_AT_name ("__int128 unsigned") [$ ~] clang -g -c t.c && llvm-dwarfdump t.o | grep __int128 DW_AT_type (0x00000033 "unsigned __int128") DW_AT_name ("unsigned __int128") The test change in this patch tries to test type name before doing actual test. Signed-off-by: Yonghong Song <yhs@fb.com> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Reviewed-by: Alan Maguire <alan.maguire@oracle.com> Link: https://lore.kernel.org/bpf/20210924025856.2192476-1-yhs@fb.com |
||
---|---|---|
.. | ||
arm64 | ||
bpf | ||
breakpoints | ||
capabilities | ||
cgroup | ||
clone3 | ||
core | ||
cpu-hotplug | ||
cpufreq | ||
damon | ||
dma | ||
dmabuf-heaps | ||
drivers | ||
efivarfs | ||
exec | ||
filesystems | ||
firmware | ||
fpu | ||
ftrace | ||
futex | ||
gpio | ||
ia64 | ||
intel_pstate | ||
ipc | ||
ir | ||
kcmp | ||
kexec | ||
kmod | ||
kselftest | ||
kvm | ||
landlock | ||
lib | ||
livepatch | ||
lkdtm | ||
locking | ||
media_tests | ||
membarrier | ||
memfd | ||
memory-hotplug | ||
mincore | ||
mount | ||
mount_setattr | ||
move_mount_set_group | ||
mqueue | ||
nci | ||
net | ||
netfilter | ||
nsfs | ||
ntb | ||
openat2 | ||
perf_events | ||
pid_namespace | ||
pidfd | ||
powerpc | ||
prctl | ||
proc | ||
pstore | ||
ptp | ||
ptrace | ||
rcutorture | ||
resctrl | ||
rlimits | ||
rseq | ||
rtc | ||
safesetid | ||
sched | ||
seccomp | ||
sgx | ||
sigaltstack | ||
size | ||
sparc64 | ||
splice | ||
static_keys | ||
sync | ||
syscall_user_dispatch | ||
sysctl | ||
tc-testing | ||
timens | ||
timers | ||
tmpfs | ||
tpm2 | ||
uevent | ||
user | ||
vDSO | ||
vm | ||
watchdog | ||
wireguard | ||
x86 | ||
zram | ||
.gitignore | ||
gen_kselftest_tar.sh | ||
kselftest.h | ||
kselftest_deps.sh | ||
kselftest_harness.h | ||
kselftest_install.sh | ||
kselftest_module.h | ||
lib.mk | ||
Makefile | ||
run_kselftest.sh |