<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/62252>62252</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Using `__builtin_clz` and `__builtin_ctz` in bpf target lead to segfault
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
thinkingfish
</td>
</tr>
</table>
<pre>
When using `__builtin_clz` and `__builtin_ctz` in a simple bpf function (see below), Clang exits on 139 due to segfault. In contrast,`__builtin_popcount` is correctly compiled with a portable implementation.
Looks like the bpf backend lacks portable implementations for these two builtins, and also doesn't handle the error gracefully by returning early with an informative error message but instead crashes.
Here's the minimal bpf program to reproduce using the C scaffolding in [libbpf-bootstrap](https://github.com/libbpf/libbpf-bootstrap), the accompanying `clz.c` and `Makefile` changes are trivial and omitted:
```
# content of clz.bpf.c
#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>
SEC("tracepoint/syscalls/sys_enter_execve")
int bpf_prog(void *ctx)
{
unsigned long i = 1;
bpf_printk("number of leading zeros: %u\n", __builtin_clz(i));
return 0;
}
char LICENSE[] SEC("license") = "Dual BSD/GPL";
```
Here's the error message when invoking `make clz` :
```
BPF .output/clz.bpf.o
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0. Program arguments: clang -g -O2 -target bpf -D__TARGET_ARCH_arm64 -I.output -I../../libbpf/include/uapi -I../../vmlinux/arm64/ -idirafter /usr/lib64/clang/14.0.6/include -idirafter /usr/local/include -idirafter /usr/include -c clz.bpf.c -o .output/clz.tmp.bpf.o
1. <eof> parser at end of file
2. Code generation
3. Running pass 'Function Pass Manager' on module 'clz.bpf.c'.
4. Running pass 'BPF DAG->DAG Pattern Instruction Selection' on function '@clz'
#0 0x0000ffffb22f8f98 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/lib64/libLLVM-14.so+0xb48f98)
#1 0x0000ffffb22f70e0 llvm::sys::RunSignalHandlers() (/lib64/libLLVM-14.so+0xb470e0)
#2 0x0000ffffb22334cc (/lib64/libLLVM-14.so+0xa834cc)
#3 0x0000ffffb95d37d0 (linux-vdso.so.1+0x7d0)
#4 0x0000ffffb2979e38 llvm::SelectionDAG::createOperands(llvm::SDNode*, llvm::ArrayRef<llvm::SDValue>) (/lib64/libLLVM-14.so+0x11c9e38)
#5 0x0000ffffb2999054 llvm::SelectionDAG::getNode(unsigned int, llvm::SDLoc const&, llvm::SDVTList, llvm::ArrayRef<llvm::SDValue>, llvm::SDNodeFlags) (/lib64/libLLVM-14.so+0x11e9054)
#6 0x0000ffffb439ba3c (/lib64/libLLVM-14.so+0x2beba3c)
#7 0x0000ffffb28b3b0c (/lib64/libLLVM-14.so+0x1103b0c)
#8 0x0000ffffb28b34f4 llvm::SelectionDAG::Legalize() (/lib64/libLLVM-14.so+0x11034f4)
#9 0x0000ffffb29aeb28 llvm::SelectionDAGISel::CodeGenAndEmitDAG() (/lib64/libLLVM-14.so+0x11feb28)
#10 0x0000ffffb29ae2d4 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/lib64/libLLVM-14.so+0x11fe2d4)
#11 0x0000ffffb29ac3a4 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (/lib64/libLLVM-14.so+0x11fc3a4)
#12 0x0000ffffb2615fc8 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/lib64/libLLVM-14.so+0xe65fc8)
#13 0x0000ffffb2425fe4 llvm::FPPassManager::runOnFunction(llvm::Function&) (/lib64/libLLVM-14.so+0xc75fe4)
#14 0x0000ffffb242b694 llvm::FPPassManager::runOnModule(llvm::Module&) (/lib64/libLLVM-14.so+0xc7b694)
#15 0x0000ffffb2426500 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/lib64/libLLVM-14.so+0xc76500)
#16 0x0000ffffb7c348f4 clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::StringRef, llvm::Module*, clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream> >) (/lib64/libclang-cpp.so.14+0x17a78f4)
#17 0x0000ffffb7f1ff34 (/lib64/libclang-cpp.so.14+0x1a92f34)
#18 0x0000ffffb6e7b618 clang::ParseAST(clang::Sema&, bool, bool) (/lib64/libclang-cpp.so.14+0x9ee618)
#19 0x0000ffffb8599c40 clang::FrontendAction::Execute() (/lib64/libclang-cpp.so.14+0x210cc40)
#20 0x0000ffffb853ae74 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/lib64/libclang-cpp.so.14+0x20ade74)
#21 0x0000ffffb85fbcf4 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/lib64/libclang-cpp.so.14+0x216ecf4)
#22 0x0000aaaab2b331b0 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/usr/bin/clang-14+0x131b0)
#23 0x0000aaaab2b2ffe4 (/usr/bin/clang-14+0xffe4)
#24 0x0000ffffb8293b3c (/lib64/libclang-cpp.so.14+0x1e06b3c)
#25 0x0000ffffb22331d4 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/lib64/libLLVM-14.so+0xa831d4)
#26 0x0000ffffb829439c (/lib64/libclang-cpp.so.14+0x1e0739c)
#27 0x0000ffffb826e21c clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&) const (/lib64/libclang-cpp.so.14+0x1de121c)
#28 0x0000ffffb826e920 clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*> >&) const (/lib64/libclang-cpp.so.14+0x1de1920)
#29 0x0000ffffb82777b0 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*> >&) (/lib64/libclang-cpp.so.14+0x1dea7b0)
#30 0x0000aaaab2b2daa0 main (/usr/bin/clang-14+0xdaa0)
#31 0x0000ffffb13fa79c __libc_start_call_main (/lib64/libc.so.6+0x2c79c)
#32 0x0000ffffb13fa86c __libc_start_main@GLIBC_2.17 (/lib64/libc.so.6+0x2c86c)
#33 0x0000aaaab2b2f530 _start (/usr/bin/clang-14+0xf530)
clang-14: error: clang frontend command failed with exit code 139 (use -v to see invocation)
clang version 14.0.6 (Red Hat 14.0.6-4.el9_1)
Target: bpf
Thread model: posix
InstalledDir: /usr/bin
clang-14: note: diagnostic msg:
********************
PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang-14: note: diagnostic msg: /tmp/clz-de7f1c.c
clang-14: note: diagnostic msg: /tmp/clz-de7f1c.sh
clang-14: note: diagnostic msg:
********************
make: *** [Makefile:111: .output/clz.bpf.o] Error 139
```
My teammate pointed out this is due to a NULL reference.
```
(lldb) register read
General Purpose Registers:
rax = 0x000000000051d0e0
rbx = 0x00007fffffffc9f0
rcx = 0x0000000000000002
rdx = 0x0000000000000000
rdi = 0x0000000000000000
rsi = 0x0000000000000005
rbp = 0x000000000051d100
rsp = 0x00007fffffffc840
r8 = 0x00007fffffffc8c0
r9 = 0x0000000000000000
r10 = 0x000000000051bf48
r11 = 0x00000000004d0328
r12 = 0x0000000000000005
r13 = 0x0000000000000000
r14 = 0x00000000004d0260
r15 = 0x000000000051c2f0
rip = 0x00007ffff2cf919f libLLVM-14.so.1`llvm::SelectionDAG::createOperands(llvm::SDNode*, llvm::ArrayRef<llvm::SDValue>) + 303
rflags = 0x0000000000010202
cs = 0x0000000000000033
fs = 0x0000000000000000
gs = 0x0000000000000000
ss = 0x000000000000002b
ds = 0x0000000000000000
es = 0x0000000000000000
(lldb) disassemble --pc
libLLVM-14.so.1`llvm::SelectionDAG::createOperands:
-> 0x7ffff2cf919f <+303>: movq 0x30(%rdx), %rdi
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEWl9T47iy_zTmpSspW3bi-IGHkBCGU8xCAbvnMSXL7UQX2fKRZAbm09-S7CRWCEN29tS9KQqM1Or-9X9ZCtWab2rEy2ByFUyWF7Q1W6kuzZbXL7zelFxvL3JZvF_-e4s1tJrXGwim4Xqdt1wYXq-Z-BlMQ6B1cTRu3DivgYLmVSMQ8qaEsq2Z4bKGgMw0IuQo5I-AZAFZwELQegP4xo0GWUMUZ1C0CEaCxk1JW2HGcFsDk7VRVJuALDyJjWyYbGvjxGpgUilkRrwDk1XDBRbwg5stUGikMjQXCA5WhbWhFtI4CJdBOO9-30n5okHwFwSz7aDnlL1gXYCg7EV_xkRDKZVdohHMDwk9OG31szaiQksoJOo6IKmBLa0L0YlApaSCjaIMy1aId8jfQaFpVW1tjlSJ916BGnhdSlVRw1936yrUmm4Q8tYAr7VBWgBTVG9Re3p9Q4UBSbUTWfGaV1Q47RolN4pW1toKGyWLlmHvb0u6AM1oWUpR2BFeQzC5EjzPm3KUS2m0UbQJJsuAzLbGNDqI5wFZBWS14Wbb5mMmq4CsugX7h8HKLgCsIMqsu2j93kcaEz_HbBBh3-kLllygHWJbWm9QA1UIRvFXToUjkxU3BgsLolN9GvY_3b8kdkGEtQFZgpWQN-WYDe0UkJjXTLQFQhAvBK_bt4CsLNk2iK9P0XSa5U253qJoUOkhpfv9dL0IyCwgxFgnN5LXJiAr_a4ZFUJ3j2usDao1viF7xYAQa5kBC14b66219VZAZq-SFxCQOTNvB8L0qnsAAGhrl94FCGndBkG8hCiIdxQdK16blw5Y3VY5KmsUgdR5-icqab0JAZm0wWRRO0wL8AsAmXHnwuzAugtdCPcjQbocasK2VMHd7eL6j6frrvbA3j6CM6x1r77DHBCybKmAq6dlQFY3D3d2bs_5yL0fA93PkR-2lPH6Vb70MVbRF4S-kH0WNABXDytwn7FsTdNa3-1CR3Y0D3fX86dr0G1ecQMU8nZjk0kqY9PqV4khXnd_Ro2S_4PMcudat2jjwgX1LtSsPi6zXUFyoWQd0risZag1FqBlq7phV3O0loxTgwWotgbNFG9MXxWeDGUvULRVs1c8HAdh9tCXA6o2rS1uLgaYK9CjDYzuCYwMVRt04Qij5Xr9PH-8uX5ezx8X39ZUVdMERre9pezTOCAr92tfBHqFArJqacM9mtdql3GOkzXBiBdc0dKgArtCq46Vm3S4ArKKknE4nh5Yn14kGRVf0Ozn2KE6wEgeed5UzdD7kbVbEC9QlkF8DQ1VGhVQA7ZpyBJc1XKUxFIuZIGwwRqVaxzdTGxnHtva1fyGag0BSVe7nvlgB77Tmm5QBSS1TbKSRSvQUh3KGEl75yanuNkwXs5vRkF8vZzfwAM1BlUNt7U2qu3kPKFA99QLGTTtNEhCl_FpnxYBiUMI38IwDMuyLHNCylmZzcCFdDwP4rl-193Dg600LuCeu6idHYgU_bGW2iikVUCmNnJddczAVYS9pwXP7-7--j6KkrGWAbkK3_LEittXP4snOsKThhiewvPY1k98U1PxzXVhpZ2sc0Rajp5I4ouM44SxL_nQmSXz-MRDPtmkiNMitHxcOoxeCy3HWo4jtzwtfAyJhyFLM4yHbtg7dTm_6UaYQmrwvkFF60J77nha_iFtas6tJw7Dc6Xo-yOWtiUOaP-iokXb7M4wXhQxC8xDPvGRZ1k4SX6JfIOmwzfbNzgXLkOsT8s7yWyftzvF6fHcX893XJu_qZ3PwiJYCbrR56mNVitP7elQ7STOchp_HTQkR0vnMUo9-83yOA-_ZhRFoaXzGM2OGSXlrx1xhxsq-E88M3OszKT0rZD5zqeYk8_C9vYJRTdqi-cN1vO6uK64sXDOBVBa_ofNEomj8BgAKT5T-gCgG50LcUU1Z1dCshc_g_ZF-xCB58EjReLBi47gsZh-DU-19X39nbItr3GHxIP3Ye5cfFa8h88vfdNoUrKh_44E2RY2gHgS298EhVMr0sPklVGSkEmJQ5utHiyMXSP976JhqRXmoUmO0OTT7Bw0311r973WD52JxArykEyOkEwn4bAzCtxQ9t436wOm26o5hNU_wWPFeXi8CpiyOJmVSbfL7Pjb5L7qXrvv-53XbDC95HRTS20409f1htfYF_oByTekBaonpIpt75vuDX3YEwakfU35gurZ7Xq_ILqj9eYUySBtjeL1xjYbb3hn0PkRw94I8z4SF6BN0c20Nf9Pi-vGKK9t2f1U80Nxg-vdrmqwqEB3nLIuUKDBLxbG1_BZb3cIR6xp3K4k6WpEStNZ6ced16DSMirLODmTG81IGfvcvC41xTSfRrOhsR7sznv-9OwHyxNWtHdDLqU4_D1TrwxxGvllxmtds0mWsSQcAlkpd8qwc1sX0m_IWvNpwzwlmUQhY4mXOST0RccU08QPZnfmpey2ntYMPeG7MJp9jvWTlD4JL6QFpp6LSOTDK3N2lNgdkAPKV8noR1AftLCJcbbVpsj8OCS7XkUppTnJ4zjKQ2AsWleU-5VtsBd0JxV9Fs_7faA_RhbwKnnhoeteJHPLtns_He0i2gr1UMU-KlLabvUFl_KoyRCvycxIFuenNpMnUwzDaT7YUVpuk-P3mcjbEy0U1dtHZPIV1fvCBs6bObxT0RLFu2fN3QvkWjmL9sdWLpnOe2ugM4vAgzg9UjiJs_MVTuPMVzj1uU2RRGwYsIXir7vu3EUl_ZDTC1lVtC78ED5aaAk-6xq_IJ33Cen-PVPLAiMS-VrOjrXMSPh3tfyXzPXnKv5L5vbF6rOuV1Eh_kJmZL-pWOxbUkO57WD9a9y5Vtn1pt8xTkb8NPSrOUnTNP_UOMvBs1fLThSxz4z6f2ucc81CU7867U93dtWpoDQEWy-_KlGW0OPkNYUoLmmaMVivLZa1NlSZNaNCrAe8h3AtzGlX2VnqZ69__GI5z6ZHnF2BT8Kbu9urxZqMo_QLCbOpL-FDjZ7EIXS8vyzVk_hgh_1MPO9OpQ_nqmXfgYH1jizp4dYK37hNqgLdtVhAZq1GGL12l2PoTrN3DXQoCV5RafsW2h2N2oWPWMA3avqRUTJGka2j_bJuf2tR5U3ZD20V0gIqWbjXS2ik5m_dlGvMQmCx5Kq7JRjY4YPCtbSbzTkU-307VHrj1vWG_gc_g7P__hx-_vw8X3yD52_XsLq_u7v_9-0fN7C6vbt-gud7N3z15w08Xj_cPz7vT78fTp2jz9wZz6dn6XsChSCsH7AAavYszzQBWZmq6Y6WRwWmZcR2V1K_z0Bvf8ML_yVfVPQFO1z9MASTq_31XTyPoshOn7pNmSzh2l3ZRHH2izue7-9gkFYVNQjuOg0LkK0Bs-UauN7dHlP448-7O1BYosKa4dhX9PhycCZEkVt3KtxwbVCBDf9u9sad1wt4aFUjNcJjT6L3zu6uiEDRN3dx1VWN7jOJihBDnywfkqVl92FZeUTGPnJzH-KTFZ-QHXEr-Flk-hOyyZEKzSlNow_cmlOazhKfDNTsJBk7JsvOUiEKT2DLy2R2RBZ9IEuKMCbHZOQsg0TxediSU0LJ9JhsckIFRo4jhH8wL2FlFmUleLvpcRRMw_-HS4EriMP4gFiVgm70RzNFIdnHNDsxH4ZhHPuRUJ4mO7I2nJJ2gkyfJiO5T1acxw1_Tfah4hRcU62xygXCaNT05f8fOXBXl0Z2Oxi-eZERxIuAXFnHxNe2FFfy9T8AEL7ZDcssIBNVvPVfzXD_8F_U4oviMi6yOKMXeBlNZ1E2TUIyudhe5nERERIlCcVpGbFwVqTFNC_SkuappbvglyQkcZiQMEyiOJmM0yycxrNJmoVFkkzzWZCEWFEuxlbtsVSbC3czfjklZEIuBM1RaPf9JUJq_AFuMiAkmCwv1KW7U8_bjQ6SUHBt9IGL4Ubg5Z-_852mvCmhv_8Wdm80-I7SRavE5e_f9Tul_jcAAP__YIjoxA">