3 个不稳定版本
使用旧的 Rust 2015
0.1.20170127+764557f0b669… | 2017年1月26日 |
---|---|
0.1.20170126+764557f0b669… |
|
0.0.20161008+c56faf22abb3… | 2016年10月8日 |
0.0.20161004+954e3b70959b… | 2016年10月3日 |
0.0.20161003+954e3b70959b… |
|
#478 在 编程语言
36 每月下载次数
3MB
65K SLoC
compiler-builtins
[WIP] 将
compiler-rt
内置函数移植到 Rust
请参阅 rust-lang/rust#35437.
何时以及如何使用此库?
如果你正在使用 rustup 无法通过二进制形式安装 std 的目标(这通常意味着你正在自己构建核心库)并且需要 compiler-rt 内置函数(即,当你构建可执行文件时可能遇到链接器错误:undefined reference to __aeabi_memcpy
),你可以使用此库来获取这些内置函数并解决链接器错误。为此,将此库添加到正在构建的库的依赖图中
# Cargo.toml
[dependencies]
compiler_builtins = { git = "https://github.com/rust-lang-nursery/compiler-builtins" }
extern crate compiler_builtins;
// ...
如果在更改之后仍然遇到 "undefined reference to $INTRINSIC" 错误,这意味着我们还没有将 $INTRINSIC
移植到 Rust!请就内置函数的名称和目标使用的 LLVM 三元组(例如 thumbv7m-none-eabi)打开 一个问题。这样我们就可以优先移植那个特定的内置函数。
如果你为目标提供了 C 编译器,那么在我们实现此内置函数的同时,你可以暂时启用回退到实际的 compiler-rt 实现以及未实现的内置函数
[dependencies.compiler_builtins]
git = "https://github.com/rust-lang-nursery/compiler-builtins"
features = ["c"]
贡献
- 从 [待办列表][#progress] 中选择一个或多个内置函数。
- 在此存储库上进行分支
- 将内置函数及其对应的 单元测试 从其 C 实现中 移植到 Rust。
- 发送拉取请求 (PR)
- 一旦 PR 通过我们广泛的 测试基础设施,我们就会合并它!
- 庆祝 🎉
移植注意事项
- 与Rust相比,C的运算符优先级略有不同。C在位运算(
& | ^
)之前评估比较运算(== !=
),而Rust则相反。 - C假设所有操作都是封包操作。在调试模式下,Rust在溢出时会产生恐慌。考虑使用Wrapping类型或显式的wrapping_*函数。
- 注意C隐式转换,特别是整数提升。Rust在类型转换方面更为明确,因此请确保任何影响输出的转换都被移植到Rust实现中。
- Rust标准库中有许多用于整数或浮点数操作的函数。考虑使用这些函数之一,而不是移植新的函数。
进度
- adddf3.c
- addsf3.c
- arm/adddf3vfp.S
- arm/addsf3vfp.S
- arm/aeabi_dcmp.S
- arm/aeabi_fcmp.S
- arm/aeabi_idivmod.S
- arm/aeabi_ldivmod.S
- arm/aeabi_memcpy.S
- arm/aeabi_memmove.S
- arm/aeabi_memset.S
- arm/aeabi_uidivmod.S
- arm/aeabi_uldivmod.S
- arm/divdf3vfp.S
- arm/divmodsi4.S (通用版本已完成)
- arm/divsf3vfp.S
- arm/divsi3.S (通用版本已完成)
- arm/eqdf2vfp.S
- arm/eqsf2vfp.S
- arm/extendsfdf2vfp.S
- arm/fixdfsivfp.S
- arm/fixsfsivfp.S
- arm/fixunsdfsivfp.S
- arm/fixunssfsivfp.S
- arm/floatsidfvfp.S
- arm/floatsisfvfp.S
- arm/floatunssidfvfp.S
- arm/floatunssisfvfp.S
- arm/gedf2vfp.S
- arm/gesf2vfp.S
- arm/gtdf2vfp.S
- arm/gtsf2vfp.S
- arm/ledf2vfp.S
- arm/lesf2vfp.S
- arm/ltdf2vfp.S
- arm/ltsf2vfp.S
- arm/modsi3.S (通用版本已完成)
- arm/muldf3vfp.S
- arm/mulsf3vfp.S
- arm/nedf2vfp.S
- arm/negdf2vfp.S
- arm/negsf2vfp.S
- arm/nesf2vfp.S
- arm/softfloat-alias.list
- arm/subdf3vfp.S
- arm/subsf3vfp.S
- arm/truncdfsf2vfp.S
- arm/udivmodsi4.S (通用版本已完成)
- arm/udivsi3.S (通用版本已完成)
- arm/umodsi3.S (通用版本已完成)
- arm/unorddf2vfp.S
- arm/unordsf2vfp.S
- ashldi3.c
- ashrdi3.c
- divdf3.c
- divdi3.c
- divmoddi4.c
- divmodsi4.c
- divsf3.c
- divsi3.c
- extendhfsf2.c
- extendsfdf2.c
- fixdfdi.c
- fixdfsi.c
- fixsfdi.c
- fixsfsi.c
- fixunsdfdi.c
- fixunsdfsi.c
- fixunssfdi.c
- fixunssfsi.c
- floatdidf.c
- floatdisf.c
- floatsidf.c
- floatsisf.c
- floatundidf.c
- floatundisf.c
- floatunsidf.c
- floatunsisf.c
- i386/ashldi3.S
- i386/ashrdi3.S
- i386/chkstk.S
- i386/chkstk2.S
- i386/divdi3.S
- i386/lshrdi3.S
- i386/moddi3.S
- i386/muldi3.S
- i386/udivdi3.S
- i386/umoddi3.S
- lshrdi3.c
- moddi3.c
- modsi3.c
- muldf3.c
- muldi3.c
- mulodi4.c
- mulosi4.c
- mulsf3.c
- powidf2.c
- powisf2.c
- subdf3.c
- subsf3.c
- truncdfhf2.c
- truncdfsf2.c
- truncsfhf2.c
- udivdi3.c
- udivmoddi4.c
- udivmodsi4.c
- udivsi3.c
- umoddi3.c
- umodsi3.c
- x86_64/chkstk.S
- x86_64/chkstk2.S
这些内置函数用于支持正在Rust中添加的128位整数。
- ashlti3.c
- ashrti3.c
- divti3.c
- fixdfti.c
- fixsfti.c
- fixunsdfti.c
- fixunssfti.c
- floattidf.c
- floattisf.c
- floatuntidf.c
- floatuntisf.c
- lshrti3.c
- modti3.c
- muloti4.c
- multi3.c
- udivmodti4.c
- udivti3.c
- umodti3.c
未实现的功能
这些内置函数涉及浮点类型("f128
", "f80
" 和复数)这些类型在 Rust 中不受支持。
addtf3.ccomparetf2.cdivdc3.cdivsc3.cdivtc3.cdivtf3.cdivxc3.cextenddftf2.cextendsftf2.cfixtfdi.cfixtfsi.cfixtfti.cfixunstfdi.cfixunstfsi.cfixunstfti.cfixunsxfdi.cfixunsxfsi.cfixunsxfti.cfixxfdi.cfixxfti.cfloatditf.cfloatdixf.cfloatsitf.cfloattixf.cfloatunditf.cfloatundixf.cfloatunsitf.cfloatuntixf.ci386/floatdixf.Si386/floatundixf.Smuldc3.cmulsc3.cmultc3.cmultf3.cmulxc3.cpowitf2.cpowixf2.cppc/divtc3.cppc/fixtfdi.cppc/fixunstfdi.cppc/floatditf.cppc/floatunditf.cppc/gcc_qadd.cppc/gcc_qdiv.cppc/gcc_qmul.cppc/gcc_qsub.cppc/multc3.csubtf3.ctrunctfdf2.ctrunctfsf2.cx86_64/floatdixf.cx86_64/floatundixf.S
这些内置函数从未被 LLVM 调用。
absvdi2.cabsvsi2.cabsvti2.caddvdi3.caddvsi3.caddvti3.carm/aeabi_cdcmp.Sarm/aeabi_cdcmpeq_check_nan.carm/aeabi_cfcmp.Sarm/aeabi_cfcmpeq_check_nan.carm/aeabi_div0.carm/aeabi_drsub.carm/aeabi_frsub.carm/aeabi_memcmp.Sarm/bswapdi2.Sarm/bswapsi2.Sarm/clzdi2.Sarm/clzsi2.Sarm/comparesf2.Sarm/restore_vfp_d8_d15_regs.Sarm/save_vfp_d8_d15_regs.Sarm/switch16.Sarm/switch32.Sarm/switch8.Sarm/switchu8.Sclzdi2.cclzsi2.cclzti2.ccmpdi2.ccmpti2.ccomparedf2.ccomparesf2.cctzdi2.cctzsi2.cctzti2.cffsdi2.cffsti2.cmulvdi3.cmulvsi3.cmulvti3.cnegdf2.cnegdi2.cnegsf2.cnegti2.cnegvdi2.cnegvsi2.cnegvti2.cparitydi2.cparitysi2.cparityti2.cpopcountdi2.cpopcountsi2.cpopcountti2.cppc/restFP.Sppc/saveFP.Ssubvdi3.csubvsi3.csubvti3.cucmpdi2.cucmpti2.cudivmodti4.c
Rust 只在支持它们的平台上公开原子类型,因此不需要回退到软件实现。
arm/sync_fetch_and_add_4.Sarm/sync_fetch_and_add_8.Sarm/sync_fetch_and_and_4.Sarm/sync_fetch_and_and_8.Sarm/sync_fetch_and_max_4.Sarm/sync_fetch_and_max_8.Sarm/sync_fetch_and_min_4.Sarm/sync_fetch_and_min_8.Sarm/sync_fetch_and_nand_4.Sarm/sync_fetch_and_nand_8.Sarm/sync_fetch_and_or_4.Sarm/sync_fetch_and_or_8.Sarm/sync_fetch_and_sub_4.Sarm/sync_fetch_and_sub_8.Sarm/sync_fetch_and_umax_4.Sarm/sync_fetch_and_umax_8.Sarm/sync_fetch_and_umin_4.Sarm/sync_fetch_and_umin_8.Sarm/sync_fetch_and_xor_4.Sarm/sync_fetch_and_xor_8.Sarm/sync_synchronize.Satomic.catomic_flag_clear.catomic_flag_clear_explicit.catomic_flag_test_and_set.catomic_flag_test_and_set_explicit.catomic_signal_fence.catomic_thread_fence.c
未使用 Rust 的杂项功能。
apple_versioning.cclear_cache.cemutls.cenable_execute_stack.ceprintf.cgcc_personality_v0.ctrampoline_setup.c
仅从软浮点代码调用的内置函数的浮点实现。在这种情况下,最好简单地使用通用的软浮点版本。
i386/floatdidf.Si386/floatdisf.Si386/floatundidf.Si386/floatundisf.Sx86_64/floatundidf.Sx86_64/floatundisf.Sx86_64/floatdidf.cx86_64/floatdisf.c
许可证
编译器内置功能crate同时受伊利诺伊大学“类似BSD”许可证和MIT许可证的双重许可。作为本代码的用户,您可以选择在任一许可证下使用它。作为贡献者,您同意允许您的代码在任一许可证下使用。
相关许可证的全文在LICENSE.TXT中。