78 lines · rust
1// SPDX-License-Identifier: GPL-2.02 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 dependency7//! 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 compiling11//! in. We will work with upstream [`core`] to provide feature flags to disable12//! the parts we do not need. For the moment, we define them to [`panic!`] at13//! runtime for simplicity to catch mistakes, instead of performing surgery14//! on `core.o`.15//!16//! In any case, all these symbols are weakened to ensure we do not override17//! those that may be provided by the rest of the kernel.18//!19//! [`compiler_builtins`]: https://github.com/rust-lang/compiler-builtins20//! [`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 28macro_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 40define_panicking_intrinsics!("`f32` should not be used", {41 __addsf3,42 __eqsf2,43 __extendsfdf2,44 __gesf2,45 __lesf2,46 __ltsf2,47 __mulsf3,48 __nesf2,49 __truncdfsf2,50 __unordsf2,51});52 53define_panicking_intrinsics!("`f64` should not be used", {54 __adddf3,55 __eqdf2,56 __ledf2,57 __ltdf2,58 __muldf3,59 __unorddf2,60});61 62define_panicking_intrinsics!("`i128` should not be used", {63 __ashrti3,64 __muloti4,65 __multi3,66});67 68define_panicking_intrinsics!("`u128` should not be used", {69 __ashlti3,70 __lshrti3,71 __udivmodti4,72 __udivti3,73 __umodti3,74});75 76// NOTE: if you are adding a new intrinsic here, you should also add it to77// `redirect-intrinsics` in `rust/Makefile`.78