Description
This is a P-high embedded-WG issue that needs to be fixed to make embedded Rust work on stable.
Background:
The compiler-builtins
crate contains compiler intrinsics that LLVM may call when lowering operations like i64
multiplication to machine code. This crate currently is its own crate due to these requirements: its object file needs to appear at the end of the linker argument list and it needs be marked with the #![compiler_builtins]
attribute (symbol visibility, etc.).
On #![no_std]
compiler-builtins
needs to appear in the dependency graph to avoid linker errors but that requires the #[feature(compiler_builtins_lib)]
feature gate because the crate is unstable -- it's a compiler implementation detail.
The fix is to put the compiler intrinsics into core
and eliminate the compiler-builtins
crate from the std
facade. This has become possible thanks to recent progress in multiple codegen units.
What roughly needs to be done
-
Include
compiler-builtins
as source code intocore
using something like#[path = "../compiler-builtins/src/lib.rs"] mod intrinsics
. -
Create some attribute to mark the whole
intrinsics
module as#![compiler_builtins]
and to force the whole module to be into its own codegen unit so it gets its own object file.