 

rustc-builtins
[WIP] Porting compiler-rt intrinsics to Rust
See rust-lang/rust#35437.
When and how to use this crate?
If you are working with a target that doesn't have binary releases of std available via rustup (this
probably means you are building the core crate yourself) and need compiler-rt intrinsics (i.e. you
are probably getting linker errors when building an executable: undefined reference to
__aeabi_memcpy), you can use this crate to get those intrinsics and solve the linker errors. To do
that, simply add this crate as a Cargo dependency (it doesn't matter where in the dependency graph
this crate ends up, as long as it's there):
[dependencies]
rustc-builtins = { git = "https://github.com/japaric/rustc-builtins" }
If you still get an "undefined reference to $INTRINSIC" error after that change, that means that we
haven't ported $INTRINSIC to Rust yet! Please open an issue with the name of the intrinsic and
the LLVM triple (e.g. thumbv7m-none-eabi) of the target you are using. That way we can prioritize
porting that particular intrinsic.
Contributing
- Pick one or more intrinsics from the [pending list][#progress].
- Fork this repository
- Port the intrinsic(s) and their corresponding unit tests from their C implementation to
Rust.
- Send a Pull Request (PR)
- Once the PR passes our extensive testing infrastructure, we'll merge it!
- Celebrate :tada:
Porting Reminders
- Rust and C have slightly different operator precedence. C evaluates comparisons (== !=) before bitwise operations (& | ^), while Rust evaluates the other way.
- C assumes wrapping operations everywhere. Rust panics on overflow when in debug mode. Consider using the Wrapping type or the explicit wrapping_* functions where applicable.
- Note C implicit casts, especially integer promotion. Rust is much more explicit about casting, so be sure that any cast which affects the output is ported to the Rust implementation.
- Rust has many functions for integer or floating point manipulation in the standard library. Consider using one of these functions rather than porting a new one.
Progress
These builtins are needed to support 128-bit integers, which are in the process of being added to Rust.
Unimplemented functions
These builtins involve floating-point types ("f128", "f80" and complex numbers) that are not supported by Rust.
- addtf3.c
- comparetf2.c
- divdc3.c
- divsc3.c
- divtc3.c
- divtf3.c
- divxc3.c
- extenddftf2.c
- extendsftf2.c
- fixtfdi.c
- fixtfsi.c
- fixtfti.c
- fixunstfdi.c
- fixunstfsi.c
- fixunstfti.c
- fixunsxfdi.c
- fixunsxfsi.c
- fixunsxfti.c
- fixxfdi.c
- fixxfti.c
- floatditf.c
- floatdixf.c
- floatsitf.c
- floattixf.c
- floatunditf.c
- floatundixf.c
- floatunsitf.c
- floatuntixf.c
- i386/floatdixf.S
- i386/floatundixf.S
- muldc3.c
- mulsc3.c
- multc3.c
- multf3.c
- mulxc3.c
- powitf2.c
- powixf2.c
- ppc/divtc3.c
- ppc/fixtfdi.c
- ppc/fixunstfdi.c
- ppc/floatditf.c
- ppc/floatunditf.c
- ppc/gcc_qadd.c
- ppc/gcc_qdiv.c
- ppc/gcc_qmul.c
- ppc/gcc_qsub.c
- ppc/multc3.c
- subtf3.c
- trunctfdf2.c
- trunctfsf2.c
- x86_64/floatdixf.c
- x86_64/floatundixf.S
These builtins are never called by LLVM.
- absvdi2.c
- absvsi2.c
- absvti2.c
- addvdi3.c
- addvsi3.c
- addvti3.c
- arm/aeabi_cdcmp.S
- arm/aeabi_cdcmpeq_check_nan.c
- arm/aeabi_cfcmp.S
- arm/aeabi_cfcmpeq_check_nan.c
- arm/aeabi_div0.c
- arm/aeabi_drsub.c
- arm/aeabi_frsub.c
- arm/aeabi_memcmp.S
- arm/bswapdi2.S
- arm/bswapsi2.S
- arm/clzdi2.S
- arm/clzsi2.S
- arm/comparesf2.S
- arm/restore_vfp_d8_d15_regs.S
- arm/save_vfp_d8_d15_regs.S
- arm/switch16.S
- arm/switch32.S
- arm/switch8.S
- arm/switchu8.S
- clzdi2.c
- clzsi2.c
- clzti2.c
- cmpdi2.c
- cmpti2.c
- comparedf2.c
- comparesf2.c
- ctzdi2.c
- ctzsi2.c
- ctzti2.c
- ffsdi2.c
- ffsti2.c
- mulvdi3.c
- mulvsi3.c
- mulvti3.c
- negdf2.c
- negdi2.c
- negsf2.c
- negti2.c
- negvdi2.c
- negvsi2.c
- negvti2.c
- paritydi2.c
- paritysi2.c
- parityti2.c
- popcountdi2.c
- popcountsi2.c
- popcountti2.c
- ppc/restFP.S
- ppc/saveFP.S
- subvdi3.c
- subvsi3.c
- subvti3.c
- ucmpdi2.c
- ucmpti2.c
- udivmodti4.c
Rust only exposes atomic types on platforms that support them, and therefore does not need to fall back to software implementations.
- arm/sync_fetch_and_add_4.S
- arm/sync_fetch_and_add_8.S
- arm/sync_fetch_and_and_4.S
- arm/sync_fetch_and_and_8.S
- arm/sync_fetch_and_max_4.S
- arm/sync_fetch_and_max_8.S
- arm/sync_fetch_and_min_4.S
- arm/sync_fetch_and_min_8.S
- arm/sync_fetch_and_nand_4.S
- arm/sync_fetch_and_nand_8.S
- arm/sync_fetch_and_or_4.S
- arm/sync_fetch_and_or_8.S
- arm/sync_fetch_and_sub_4.S
- arm/sync_fetch_and_sub_8.S
- arm/sync_fetch_and_umax_4.S
- arm/sync_fetch_and_umax_8.S
- arm/sync_fetch_and_umin_4.S
- arm/sync_fetch_and_umin_8.S
- arm/sync_fetch_and_xor_4.S
- arm/sync_fetch_and_xor_8.S
- arm/sync_synchronize.S
- atomic.c
- atomic_flag_clear.c
- atomic_flag_clear_explicit.c
- atomic_flag_test_and_set.c
- atomic_flag_test_and_set_explicit.c
- atomic_signal_fence.c
- atomic_thread_fence.c
Miscellaneous functionality that is not used by Rust.
- apple_versioning.c
- clear_cache.c
- emutls.c
- enable_execute_stack.c
- eprintf.c
- gcc_personality_v0.c
- trampoline_setup.c
Floating-point implementations of builtins that are only called from soft-float code. It would be better to simply use the generic soft-float versions in this case.
- i386/floatdidf.S
- i386/floatdisf.S
- i386/floatundidf.S
- i386/floatundisf.S
- x86_64/floatundidf.S
- x86_64/floatundisf.S
- x86_64/floatdidf.c
- x86_64/floatdisf.c
License
Licensed under either of
at your option.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the
work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any
additional terms or conditions.