xref: /linux/rust/compiler_builtins.rs (revision 0da908c291070d89482f6211dbe81d4d43c3f7cb)
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             #[no_mangle]
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