162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci//! Our own `compiler_builtins`.
462306a36Sopenharmony_ci//!
562306a36Sopenharmony_ci//! Rust provides [`compiler_builtins`] as a port of LLVM's [`compiler-rt`].
662306a36Sopenharmony_ci//! Since we do not need the vast majority of them, we avoid the dependency
762306a36Sopenharmony_ci//! by providing this file.
862306a36Sopenharmony_ci//!
962306a36Sopenharmony_ci//! At the moment, some builtins are required that should not be. For instance,
1062306a36Sopenharmony_ci//! [`core`] has 128-bit integers functionality which we should not be compiling
1162306a36Sopenharmony_ci//! in. We will work with upstream [`core`] to provide feature flags to disable
1262306a36Sopenharmony_ci//! the parts we do not need. For the moment, we define them to [`panic!`] at
1362306a36Sopenharmony_ci//! runtime for simplicity to catch mistakes, instead of performing surgery
1462306a36Sopenharmony_ci//! on `core.o`.
1562306a36Sopenharmony_ci//!
1662306a36Sopenharmony_ci//! In any case, all these symbols are weakened to ensure we do not override
1762306a36Sopenharmony_ci//! those that may be provided by the rest of the kernel.
1862306a36Sopenharmony_ci//!
1962306a36Sopenharmony_ci//! [`compiler_builtins`]: https://github.com/rust-lang/compiler-builtins
2062306a36Sopenharmony_ci//! [`compiler-rt`]: https://compiler-rt.llvm.org/
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#![allow(internal_features)]
2362306a36Sopenharmony_ci#![feature(compiler_builtins)]
2462306a36Sopenharmony_ci#![compiler_builtins]
2562306a36Sopenharmony_ci#![no_builtins]
2662306a36Sopenharmony_ci#![no_std]
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cimacro_rules! define_panicking_intrinsics(
2962306a36Sopenharmony_ci    ($reason: tt, { $($ident: ident, )* }) => {
3062306a36Sopenharmony_ci        $(
3162306a36Sopenharmony_ci            #[doc(hidden)]
3262306a36Sopenharmony_ci            #[export_name = concat!("__rust", stringify!($ident))]
3362306a36Sopenharmony_ci            pub extern "C" fn $ident() {
3462306a36Sopenharmony_ci                panic!($reason);
3562306a36Sopenharmony_ci            }
3662306a36Sopenharmony_ci        )*
3762306a36Sopenharmony_ci    }
3862306a36Sopenharmony_ci);
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cidefine_panicking_intrinsics!("`f32` should not be used", {
4162306a36Sopenharmony_ci    __addsf3,
4262306a36Sopenharmony_ci    __eqsf2,
4362306a36Sopenharmony_ci    __gesf2,
4462306a36Sopenharmony_ci    __lesf2,
4562306a36Sopenharmony_ci    __ltsf2,
4662306a36Sopenharmony_ci    __mulsf3,
4762306a36Sopenharmony_ci    __nesf2,
4862306a36Sopenharmony_ci    __unordsf2,
4962306a36Sopenharmony_ci});
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cidefine_panicking_intrinsics!("`f64` should not be used", {
5262306a36Sopenharmony_ci    __adddf3,
5362306a36Sopenharmony_ci    __ledf2,
5462306a36Sopenharmony_ci    __ltdf2,
5562306a36Sopenharmony_ci    __muldf3,
5662306a36Sopenharmony_ci    __unorddf2,
5762306a36Sopenharmony_ci});
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cidefine_panicking_intrinsics!("`i128` should not be used", {
6062306a36Sopenharmony_ci    __ashrti3,
6162306a36Sopenharmony_ci    __muloti4,
6262306a36Sopenharmony_ci    __multi3,
6362306a36Sopenharmony_ci});
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cidefine_panicking_intrinsics!("`u128` should not be used", {
6662306a36Sopenharmony_ci    __ashlti3,
6762306a36Sopenharmony_ci    __lshrti3,
6862306a36Sopenharmony_ci    __udivmodti4,
6962306a36Sopenharmony_ci    __udivti3,
7062306a36Sopenharmony_ci    __umodti3,
7162306a36Sopenharmony_ci});
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci// NOTE: if you are adding a new intrinsic here, you should also add it to
7462306a36Sopenharmony_ci// `redirect-intrinsics` in `rust/Makefile`.
75