<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">