rust: add compiler_builtins
crate
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 our own crate. Reviewed-by: Kees Cook <keescook@chromium.org> Co-developed-by: Alex Gaynor <alex.gaynor@gmail.com> Signed-off-by: Alex Gaynor <alex.gaynor@gmail.com> Co-developed-by: Wedson Almeida Filho <wedsonaf@google.com> Signed-off-by: Wedson Almeida Filho <wedsonaf@google.com> Co-developed-by: Sven Van Asbroeck <thesven73@gmail.com> Signed-off-by: Sven Van Asbroeck <thesven73@gmail.com> Co-developed-by: Gary Guo <gary@garyguo.net> Signed-off-by: Gary Guo <gary@garyguo.net> Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
This commit is contained in:
parent
057b8d2571
commit
db958dcf88
63
rust/compiler_builtins.rs
Normal file
63
rust/compiler_builtins.rs
Normal file
@ -0,0 +1,63 @@
|
||||
// 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/
|
||||
|
||||
#![feature(compiler_builtins)]
|
||||
#![compiler_builtins]
|
||||
#![no_builtins]
|
||||
#![no_std]
|
||||
|
||||
macro_rules! define_panicking_intrinsics(
|
||||
($reason: tt, { $($ident: ident, )* }) => {
|
||||
$(
|
||||
#[doc(hidden)]
|
||||
#[no_mangle]
|
||||
pub extern "C" fn $ident() {
|
||||
panic!($reason);
|
||||
}
|
||||
)*
|
||||
}
|
||||
);
|
||||
|
||||
define_panicking_intrinsics!("`f32` should not be used", {
|
||||
__eqsf2,
|
||||
__gesf2,
|
||||
__lesf2,
|
||||
__nesf2,
|
||||
__unordsf2,
|
||||
});
|
||||
|
||||
define_panicking_intrinsics!("`f64` should not be used", {
|
||||
__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,
|
||||
});
|
Loading…
Reference in New Issue
Block a user