02dfd63afe
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`.
|