|  | // 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, | 
|  | __gesf2, | 
|  | __lesf2, | 
|  | __ltsf2, | 
|  | __mulsf3, | 
|  | __nesf2, | 
|  | __unordsf2, | 
|  | }); | 
|  |  | 
|  | define_panicking_intrinsics!("`f64` should not be used", { | 
|  | __adddf3, | 
|  | __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`. |