[all-commits] [llvm/llvm-project] 23907a: [BPF] Allow libcalls behind a feature gate (#168442)
Lucas Ste via All-commits
all-commits at lists.llvm.org
Mon Nov 24 09:03:11 PST 2025
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: 23907a20a5fa5c6e065b73f4515a2a072675dad5
https://github.com/llvm/llvm-project/commit/23907a20a5fa5c6e065b73f4515a2a072675dad5
Author: Lucas Ste <38472950+LucasSte at users.noreply.github.com>
Date: 2025-11-24 (Mon, 24 Nov 2025)
Changed paths:
M llvm/lib/Target/BPF/BPF.td
M llvm/lib/Target/BPF/BPFISelLowering.cpp
M llvm/lib/Target/BPF/BPFISelLowering.h
M llvm/lib/Target/BPF/BPFSubtarget.cpp
M llvm/lib/Target/BPF/BPFSubtarget.h
M llvm/test/CodeGen/BPF/atomic-oversize.ll
A llvm/test/CodeGen/BPF/builtin_calls.ll
M llvm/test/CodeGen/BPF/struct_ret1.ll
M llvm/test/CodeGen/BPF/struct_ret2.ll
Log Message:
-----------
[BPF] Allow libcalls behind a feature gate (#168442)
**Problem**
In Rust, checked math functions (like `checked_mul`, `overflowing_mul`,
`saturating_mul`) are part of the primitive implementation of integers
([see u64](https://doc.rust-lang.org/std/primitive.u64.html) for
instance). The Rust compiler builds the Rust
[compiler-builtins](https://github.com/rust-lang/compiler-builtins)
crate as a step in the compilation processes, since it contains the math
builtins to be lowered in the target.
For BPF, however, when using those functions in Rust we hit the
following errors:
```
ERROR llvm: <unknown>:0:0: in function func i64 (i64, i64): A call to built-in function '__multi3' is not supported.
ERROR llvm: <unknown>:0:0: in function func i64 (i64, i64): only small returns supported
```
Those errors come from the following code:
```
pub fn func(a: u64, b: u64) -> u64 {
a.saturating_mul(b)
}
```
Those functions invoke underneath the llvm instrinc `{ i64, i1 }
@llvm.umul.with.overflow.i64(i64, i64)` or its variants.
It is very useful to use safe math operations when writing BPF code in
Rust, and I would like to add support for those in the target.
**Changes**
1. Create a target feature `allow-builtin-calls` to enable code
generation for builtin functions.
2. Implement `CanLowerReturn` to fix the error `only small returns
supported`.
3. Add code to correctly invoke lib functions.
4. Add a test case together with the corresponding C code.
To unsubscribe from these emails, change your notification settings at https://github.com/llvm/llvm-project/settings/notifications
More information about the All-commits
mailing list