Geen omschrijving

Hugues de Valon 5d683bafc3 Remove thumbv6m configuration of intrinsic example 6 jaren geleden
ci 2da5d40e84 Use `nm` on OSX 6 jaren geleden
compiler-rt @ 84c0bd0158 fe74674f6e Update for next LLVM 8 version 6 jaren geleden
crates 8bfd4374b6 `panic_handler` is now stable 6 jaren geleden
examples 5d683bafc3 Remove thumbv6m configuration of intrinsic example 6 jaren geleden
libm @ 3559e70379 f7fbdc33df Update libm submodule 6 jaren geleden
src c924aed0b9 Fix Armv8-M Baseline compilation 6 jaren geleden
testcrate 2e8b85439f Move the test to be a standard test. 6 jaren geleden
.gitignore 1faf15fc64 initial commit 8 jaren geleden
.gitmodules f7fbdc33df Update libm submodule 6 jaren geleden
.travis.yml fa36133caf Apple-darwin: set DEBUG_LTO_BUILD_DOESNT_WORK 6 jaren geleden
Cargo.toml fafaacecd1 Bump to 0.1.7 6 jaren geleden
LICENSE.TXT c064549c4b Correct the license to that of upstream compiler-rt 8 jaren geleden
README.md 939cbca6e9 Revert "Conversion from a wider to a narrower IEEE-754 floating-point type" 6 jaren geleden
appveyor.yml f06f7c7bd6 Update MinGW download location 7 jaren geleden
build.rs 85101f2a47 Fix compilation for thumbv8m.main-none-eabihf 6 jaren geleden
thumbv6m-linux-eabi.json fe8d893a6b Update target specs 7 jaren geleden
thumbv7em-linux-eabi.json fe8d893a6b Update target specs 7 jaren geleden
thumbv7em-linux-eabihf.json fe8d893a6b Update target specs 7 jaren geleden
thumbv7m-linux-eabi.json fe8d893a6b Update target specs 7 jaren geleden

README.md

compiler-builtins

Build status Build Status

[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, add this crate somewhere in the dependency graph of the crate you are building:

# Cargo.toml
[dependencies]
compiler_builtins = { git = "https://github.com/rust-lang-nursery/compiler-builtins" }
extern crate compiler_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.

If you've got a C compiler available for your target then while we implement this intrinsic you can temporarily enable a fallback to the actual compiler-rt implementation as well for unimplemented intrinsics:

[dependencies.compiler_builtins]
git = "https://github.com/rust-lang-nursery/compiler-builtins"
features = ["c"]

Contributing

  1. Pick one or more intrinsics from the pending list.
  2. Fork this repository.
  3. Port the intrinsic(s) and their corresponding unit tests from their C implementation to Rust.
  4. Implement a test generator to compare the behavior of the ported intrinsic(s) with their implementation on the testing host. Note that randomized compiler-builtin tests should be run using cargo test --features gen-tests.
  5. Send a Pull Request (PR).
  6. Once the PR passes our extensive testing infrastructure, we'll merge it!
  7. Celebrate :tada:

Porting Reminders

  1. Rust and C have slightly different operator precedence. C evaluates comparisons (== !=) before bitwise operations (& | ^), while Rust evaluates the other way.
  2. 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.
  3. 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.
  4. 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

  • 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 (generic version is done)
  • arm/divsf3vfp.S
  • arm/divsi3.S (generic version is done)
  • 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 (generic version is done)
  • 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 (generic version is done)
  • arm/udivsi3.S (generic version is done)
  • arm/umodsi3.S (generic version is done)
  • arm/unorddf2vfp.S
  • arm/unordsf2vfp.S
  • ashldi3.c
  • ashrdi3.c
  • comparedf2.c
  • comparesf2.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

These builtins are needed to support 128-bit integers, which are in the process of being added to Rust.

  • 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

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
  • ctzdi2.c
  • ctzsi2.c
  • ctzti2.c
  • ffsdi2.c - this is called by gcc though!
  • 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

The compiler-builtins crate is dual licensed under both the University of Illinois "BSD-Like" license and the MIT license. As a user of this code you may choose to use it under either license. As a contributor, you agree to allow your code to be used under both.

Full text of the relevant licenses is in LICENSE.TXT.