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 | #![allow(internal_features)] |
23 | #![feature(compiler_builtins)] |
24 | #![compiler_builtins] |
25 | #![no_builtins] |
26 | #![no_std] |
27 | |
28 | macro_rules! define_panicking_intrinsics( |
29 | ($reason: tt, { $($ident: ident, )* }) => { |
30 | $( |
31 | #[doc(hidden)] |
32 | #[export_name = concat!("__rust", stringify!($ident))] |
33 | pub extern "C" fn $ident() { |
34 | panic!($reason); |
35 | } |
36 | )* |
37 | } |
38 | ); |
39 | |
40 | define_panicking_intrinsics!("`f32` should not be used" , { |
41 | __addsf3, |
42 | __eqsf2, |
43 | __gesf2, |
44 | __lesf2, |
45 | __ltsf2, |
46 | __mulsf3, |
47 | __nesf2, |
48 | __unordsf2, |
49 | }); |
50 | |
51 | define_panicking_intrinsics!("`f64` should not be used" , { |
52 | __adddf3, |
53 | __ledf2, |
54 | __ltdf2, |
55 | __muldf3, |
56 | __unorddf2, |
57 | }); |
58 | |
59 | define_panicking_intrinsics!("`i128` should not be used" , { |
60 | __ashrti3, |
61 | __muloti4, |
62 | __multi3, |
63 | }); |
64 | |
65 | define_panicking_intrinsics!("`u128` should not be used" , { |
66 | __ashlti3, |
67 | __lshrti3, |
68 | __udivmodti4, |
69 | __udivti3, |
70 | __umodti3, |
71 | }); |
72 | |
73 | // NOTE: if you are adding a new intrinsic here, you should also add it to |
74 | // `redirect-intrinsics` in `rust/Makefile`. |
75 | |