2021-07-03 17:54:11 +03:00
// 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) ]
2022-12-06 00:50:00 +03:00
#[ export_name = concat!( " __rust " , stringify!($ident)) ]
2021-07-03 17:54:11 +03:00
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 ,
} ) ;
2022-12-06 00:50:00 +03:00
// NOTE: if you are adding a new intrinsic here, you should also add it to
// `redirect-intrinsics` in `rust/Makefile`.