mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	Alice reported [1] that an arm64 build failed with:
    ld.lld: error: undefined symbol: __extendsfdf2
    >>> referenced by core.a6f5fc5794e7b7b3-cgu.0
    >>>               rust/core.o:(<f32>::midpoint) in archive vmlinux.a
    >>> referenced by core.a6f5fc5794e7b7b3-cgu.0
    >>>               rust/core.o:(<f32>::midpoint) in archive vmlinux.a
    ld.lld: error: undefined symbol: __truncdfsf2
    >>> referenced by core.a6f5fc5794e7b7b3-cgu.0
    >>>               rust/core.o:(<f32>::midpoint) in archive vmlinux.a
Rust 1.80.0 or later together with `CONFIG_CC_OPTIMIZE_FOR_SIZE=y`
is what triggers it.
In addition, x86_64 builds also fail the same way.
Similarly, compiling with Rust 1.82.0 (currently in nightly) makes
another one appear, possibly due to the LLVM 19 upgrade there:
    ld.lld: error: undefined symbol: __eqdf2
    >>> referenced by core.20495ea57a9f069d-cgu.0
    >>>               rust/core.o:(<f64>::next_up) in archive vmlinux.a
    >>> referenced by core.20495ea57a9f069d-cgu.0
    >>>               rust/core.o:(<f64>::next_down) in archive vmlinux.a
Gary adds [1]:
> Usually the fix on rustc side is to mark those functions as `#[inline]`
>
> All of {midpoint,next_up,next_down} are indeed unstable functions not
> marked as inline...
Fix all those by adding those intrinsics to our usual workaround.
[ Trevor quickly submitted a fix to upstream Rust [2] that has already
  been merged, to be released in Rust 1.82.0 (2024-10-17). - Miguel ]
Cc: Gary Guo <gary@garyguo.net>
Reported-by: Alice Ryhl <aliceryhl@google.com>
Closes: https://rust-for-linux.zulipchat.com/#narrow/stream/x/topic/x/near/455637364 [1]
Reviewed-by: Trevor Gross <tmgross@umich.edu>
Tested-by: Alice Ryhl <aliceryhl@google.com>
Tested-by: Boqun Feng <boqun.feng@gmail.com>
Reviewed-by: Gary Guo <gary@garyguo.net>
Link: https://github.com/rust-lang/rust/pull/128749 [2]
Link: https://lore.kernel.org/r/20240806150619.192882-1-ojeda@kernel.org
[ Shortened Zulip link. - Miguel ]
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
		
	
			
		
			
				
	
	
		
			77 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0
 | 
						|
 | 
						|
//! Our own `compiler_builtins`.
 | 
						|
//!
 | 
						|
//! Rust provides [`compiler_builtins`] as a port of LLVM's [`compiler-rt`].
 | 
						|
//! Since we do not need the vast majority of them, we avoid the dependency
 | 
						|
//! by providing this file.
 | 
						|
//!
 | 
						|
//! At the moment, some builtins are required that should not be. For instance,
 | 
						|
//! [`core`] has 128-bit integers functionality which we should not be compiling
 | 
						|
//! in. We will work with upstream [`core`] to provide feature flags to disable
 | 
						|
//! the parts we do not need. For the moment, we define them to [`panic!`] at
 | 
						|
//! runtime for simplicity to catch mistakes, instead of performing surgery
 | 
						|
//! on `core.o`.
 | 
						|
//!
 | 
						|
//! In any case, all these symbols are weakened to ensure we do not override
 | 
						|
//! those that may be provided by the rest of the kernel.
 | 
						|
//!
 | 
						|
//! [`compiler_builtins`]: https://github.com/rust-lang/compiler-builtins
 | 
						|
//! [`compiler-rt`]: https://compiler-rt.llvm.org/
 | 
						|
 | 
						|
#![allow(internal_features)]
 | 
						|
#![feature(compiler_builtins)]
 | 
						|
#![compiler_builtins]
 | 
						|
#![no_builtins]
 | 
						|
#![no_std]
 | 
						|
 | 
						|
macro_rules! define_panicking_intrinsics(
 | 
						|
    ($reason: tt, { $($ident: ident, )* }) => {
 | 
						|
        $(
 | 
						|
            #[doc(hidden)]
 | 
						|
            #[export_name = concat!("__rust", stringify!($ident))]
 | 
						|
            pub extern "C" fn $ident() {
 | 
						|
                panic!($reason);
 | 
						|
            }
 | 
						|
        )*
 | 
						|
    }
 | 
						|
);
 | 
						|
 | 
						|
define_panicking_intrinsics!("`f32` should not be used", {
 | 
						|
    __addsf3,
 | 
						|
    __eqsf2,
 | 
						|
    __extendsfdf2,
 | 
						|
    __gesf2,
 | 
						|
    __lesf2,
 | 
						|
    __ltsf2,
 | 
						|
    __mulsf3,
 | 
						|
    __nesf2,
 | 
						|
    __truncdfsf2,
 | 
						|
    __unordsf2,
 | 
						|
});
 | 
						|
 | 
						|
define_panicking_intrinsics!("`f64` should not be used", {
 | 
						|
    __adddf3,
 | 
						|
    __eqdf2,
 | 
						|
    __ledf2,
 | 
						|
    __ltdf2,
 | 
						|
    __muldf3,
 | 
						|
    __unorddf2,
 | 
						|
});
 | 
						|
 | 
						|
define_panicking_intrinsics!("`i128` should not be used", {
 | 
						|
    __ashrti3,
 | 
						|
    __muloti4,
 | 
						|
    __multi3,
 | 
						|
});
 | 
						|
 | 
						|
define_panicking_intrinsics!("`u128` should not be used", {
 | 
						|
    __ashlti3,
 | 
						|
    __lshrti3,
 | 
						|
    __udivmodti4,
 | 
						|
    __udivti3,
 | 
						|
    __umodti3,
 | 
						|
});
 | 
						|
 | 
						|
// NOTE: if you are adding a new intrinsic here, you should also add it to
 | 
						|
// `redirect-intrinsics` in `rust/Makefile`.
 |