xref: /linux/rust/compiler_builtins.rs (revision 954ea91fb68b771dba6d87cfa61b68e09cc2497f)
1  // SPDX-License-Identifier: GPL-2.0
2  
3  //! Our own `compiler_builtins`.
4  //!
5  //! Rust provides [`compiler_builtins`] as a port of LLVM's [`compiler-rt`].
6  //! Since we do not need the vast majority of them, we avoid the dependency
7  //! by providing this file.
8  //!
9  //! At the moment, some builtins are required that should not be. For instance,
10  //! [`core`] has 128-bit integers functionality which we should not be compiling
11  //! in. We will work with upstream [`core`] to provide feature flags to disable
12  //! the parts we do not need. For the moment, we define them to [`panic!`] at
13  //! runtime for simplicity to catch mistakes, instead of performing surgery
14  //! on `core.o`.
15  //!
16  //! In any case, all these symbols are weakened to ensure we do not override
17  //! those that may be provided by the rest of the kernel.
18  //!
19  //! [`compiler_builtins`]: https://github.com/rust-lang/compiler-builtins
20  //! [`compiler-rt`]: https://compiler-rt.llvm.org/
21  
22  #![feature(compiler_builtins)]
23  #![compiler_builtins]
24  #![no_builtins]
25  #![no_std]
26  
27  macro_rules! define_panicking_intrinsics(
28      ($reason: tt, { $($ident: ident, )* }) => {
29          $(
30              #[doc(hidden)]
31              #[export_name = concat!("__rust", stringify!($ident))]
32              pub extern "C" fn $ident() {
33                  panic!($reason);
34              }
35          )*
36      }
37  );
38  
39  define_panicking_intrinsics!("`f32` should not be used", {
40      __eqsf2,
41      __gesf2,
42      __lesf2,
43      __nesf2,
44      __unordsf2,
45  });
46  
47  define_panicking_intrinsics!("`f64` should not be used", {
48      __unorddf2,
49  });
50  
51  define_panicking_intrinsics!("`i128` should not be used", {
52      __ashrti3,
53      __muloti4,
54      __multi3,
55  });
56  
57  define_panicking_intrinsics!("`u128` should not be used", {
58      __ashlti3,
59      __lshrti3,
60      __udivmodti4,
61      __udivti3,
62      __umodti3,
63  });
64  
65  // NOTE: if you are adding a new intrinsic here, you should also add it to
66  // `redirect-intrinsics` in `rust/Makefile`.
67