[PATCH] rust: cfi: disable function merging if CFI is enabled

Gary Guo <[email protected]>
Newsgroups org.kernel.vger.linux-kbuild,dev.linux.lists.llvm,org.kernel.vger.linux-kernel,org.kernel.vger.rust-for-linux
Message-ID <[email protected]>
From: Gary Guo <[email protected]>

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
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 <[email protected]>
Closes: https://lore.kernel.org/oe-lkp/[email protected]
Link: https://github.com/llvm/llvm-project/issues/217629 [1]
Signed-off-by: Gary Guo <[email protected]>
---
 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
-- 
2.54.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.