diff options
| author | James Munns <james.munns@gmail.com> | 2017-10-02 15:42:08 +0200 |
|---|---|---|
| committer | James Munns <james.munns@gmail.com> | 2017-10-02 16:53:43 +0200 |
| commit | 1e26094bdd18c704e1c060e2cf7d2b9bfec037ed (patch) | |
| tree | cb0df96596ca2760fc3ec4852326631dd275718c | |
| parent | 9ae6ed78acf9dc865e2300a7db556389eed9692d (diff) | |
| download | rust-1e26094bdd18c704e1c060e2cf7d2b9bfec037ed.tar.gz rust-1e26094bdd18c704e1c060e2cf7d2b9bfec037ed.zip | |
Allow atomic operations up to 32 bits
The ARMv5te platform does not have instruction-level support for atomics, however the kernel provides [user space helpers](https://www.kernel.org/doc/Documentation/arm/kernel_user_helpers.txt) which can be used to perform atomic operations. When linked with `libc`, the atomic symbols needed by Rust will be provided, rather than CPU level intrinsics. As this target is specifically `linux` and `gnueabi`, it is reasonable to assume the Linux Kernel and libc will be available for the target. There is a large performance penalty, as we are not using CPU level intrinsics, however this penalty is likely preferable to not having the target at all. I have used this change in a custom target (along with `xargo`) to build `std`, as well as a number of higher level crates.
| -rw-r--r-- | src/librustc_back/target/armv5te_unknown_linux_gnueabi.rs | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/librustc_back/target/armv5te_unknown_linux_gnueabi.rs b/src/librustc_back/target/armv5te_unknown_linux_gnueabi.rs index b9573721678..97397ca4962 100644 --- a/src/librustc_back/target/armv5te_unknown_linux_gnueabi.rs +++ b/src/librustc_back/target/armv5te_unknown_linux_gnueabi.rs @@ -27,8 +27,12 @@ pub fn target() -> TargetResult { options: TargetOptions { features: "+soft-float,+strict-align".to_string(), - // No atomic instructions on ARMv5 - max_atomic_width: Some(0), + + // Atomic operations provided when linked with libgcc. + // FIXME: If the following PR is merged, the atomic operations would be + // provided by compiler-builtins instead with no change of behavior: + // https://github.com/rust-lang-nursery/compiler-builtins/pull/115/files + max_atomic_width: Some(32), abi_blacklist: super::arm_base::abi_blacklist(), .. base } |
