Re: [PATCH] rust: cfi: disable function merging if CFI is enabled
From: Gary Guo
Date: Thu Aug 20 2026 - 12:05:50 EST
On Thu Aug 20, 2026 at 2:57 PM BST, Gary Guo wrote:
> From: Gary Guo <gary@xxxxxxxxxxx>
>
> In Rust doc tests, there is a dummy `__module_firmware_test_init` function
> generated by the example in `module_firmware!`'s documentation, which just
> returns zero. Many other documentation generates function that produces
> zero. LKP test robot reports a `Flags::zeroed` instance; my local
> reproduction has a `Bounded::new::<0>`.
>
> LLVM's MergeFunctionsPass incorrectly merge functions with the same KCFI
This should read "with different KCFI type" (obviously).
Best,
Gary
> type, causing `__module_firmware_test_init` being merged into one of the
> zero-returning function. As module init is invoked via indirect function
> call, KCFI is checked and this produces a KCFI failure.
>
> I've reported this bug to upstream LLVM [1]; in the mean time, disable
> function merging if CFI is enabled. No separate treatment is needed for
> CONFIG_RUST_INLINE_HELPERS, as Clang does not enable function merging by
> default.
>
> Reported-by: kernel test robot <yi1.lai@xxxxxxxxx>
> Closes: https://lore.kernel.org/oe-lkp/202608201017.100a4511-lkp@xxxxxxxxx
> Link: https://github.com/llvm/llvm-project/issues/217629 [1]
> Signed-off-by: Gary Guo <gary@xxxxxxxxxxx>
> ---
> Makefile | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/Makefile b/Makefile
> index 4fee5ee9e9f4..0dd9a6eda739 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1118,7 +1118,8 @@ endif
> ifdef CONFIG_RUST
> # Always pass -Zsanitizer-cfi-normalize-integers as CONFIG_RUST selects
> # CONFIG_CFI_ICALL_NORMALIZE_INTEGERS.
> - RUSTC_FLAGS_CFI := -Zsanitizer=kcfi -Zsanitizer-cfi-normalize-integers
> + # Disable function merging as LLVM incorrectly merge functions with the same KCFI type.
> + RUSTC_FLAGS_CFI := -Zsanitizer=kcfi -Zsanitizer-cfi-normalize-integers -Zmerge-functions=disabled
> KBUILD_RUSTFLAGS += $(RUSTC_FLAGS_CFI)
> export RUSTC_FLAGS_CFI
> endif
>
> base-commit: e6664f2b33db9b6811eb4cec109f06cb2b4f458d