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