reject aarch64 target feature toggling that would change the float ABI
This commit is contained in:
parent
eb2e928250
commit
1f8236d4c7
5 changed files with 59 additions and 1 deletions
|
@ -2615,6 +2615,18 @@ impl TargetOptions {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn has_neg_feature(&self, search_feature: &str) -> bool {
|
||||||
|
self.features.split(',').any(|f| {
|
||||||
|
if let Some(f) = f.strip_prefix('-')
|
||||||
|
&& f == search_feature
|
||||||
|
{
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for TargetOptions {
|
impl Default for TargetOptions {
|
||||||
|
|
|
@ -290,6 +290,7 @@ const AARCH64_FEATURES: &[(&str, StabilityUncomputed, ImpliedFeatures)] = &[
|
||||||
("flagm", STABLE, &[]),
|
("flagm", STABLE, &[]),
|
||||||
// FEAT_FLAGM2
|
// FEAT_FLAGM2
|
||||||
("flagm2", unstable(sym::aarch64_unstable_target_feature), &[]),
|
("flagm2", unstable(sym::aarch64_unstable_target_feature), &[]),
|
||||||
|
("fp-armv8", Stability::Forbidden { reason: "Rust ties `fp-armv8` to `neon`" }, &[]),
|
||||||
// FEAT_FP16
|
// FEAT_FP16
|
||||||
// Rust ties FP and Neon: https://github.com/rust-lang/rust/pull/91608
|
// Rust ties FP and Neon: https://github.com/rust-lang/rust/pull/91608
|
||||||
("fp16", STABLE, &["neon"]),
|
("fp16", STABLE, &["neon"]),
|
||||||
|
@ -325,7 +326,28 @@ const AARCH64_FEATURES: &[(&str, StabilityUncomputed, ImpliedFeatures)] = &[
|
||||||
// FEAT_MTE & FEAT_MTE2
|
// FEAT_MTE & FEAT_MTE2
|
||||||
("mte", STABLE, &[]),
|
("mte", STABLE, &[]),
|
||||||
// FEAT_AdvSimd & FEAT_FP
|
// FEAT_AdvSimd & FEAT_FP
|
||||||
("neon", STABLE, &[]),
|
(
|
||||||
|
"neon",
|
||||||
|
Stability::Stable {
|
||||||
|
allow_toggle: |target, enable| {
|
||||||
|
if target.abi == "softfloat" {
|
||||||
|
// `neon` has no ABI implications for softfloat targets, we can allow this.
|
||||||
|
Ok(())
|
||||||
|
} else if enable
|
||||||
|
&& !target.has_neg_feature("fp-armv8")
|
||||||
|
&& !target.has_neg_feature("neon")
|
||||||
|
{
|
||||||
|
// neon is enabled by default, and has not been disabled, so enabling it again
|
||||||
|
// is redundant and we can permit it. Forbidding this would be a breaking change
|
||||||
|
// since this feature is stable.
|
||||||
|
Ok(())
|
||||||
|
} else {
|
||||||
|
Err("unsound on hard-float targets because it changes float ABI")
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
&[],
|
||||||
|
),
|
||||||
// FEAT_PAUTH (address authentication)
|
// FEAT_PAUTH (address authentication)
|
||||||
("paca", STABLE, &[]),
|
("paca", STABLE, &[]),
|
||||||
// FEAT_PAUTH (generic authentication)
|
// FEAT_PAUTH (generic authentication)
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
warning: target feature `neon` cannot be toggled with `-Ctarget-feature`: unsound on hard-float targets because it changes float ABI
|
||||||
|
|
|
||||||
|
= note: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||||
|
= note: for more information, see issue #116344 <https://github.com/rust-lang/rust/issues/116344>
|
||||||
|
|
||||||
|
warning: 1 warning emitted
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
//@ compile-flags: --target=aarch64-unknown-linux-gnu --crate-type=lib
|
||||||
|
//@ needs-llvm-components: aarch64
|
||||||
|
//@ compile-flags: -Ctarget-feature=-neon
|
||||||
|
// For now this is just a warning.
|
||||||
|
//@ build-pass
|
||||||
|
#![feature(no_core, lang_items)]
|
||||||
|
#![no_core]
|
||||||
|
|
||||||
|
#[lang = "sized"]
|
||||||
|
pub trait Sized {}
|
|
@ -0,0 +1,7 @@
|
||||||
|
warning: target feature `neon` cannot be toggled with `-Ctarget-feature`: unsound on hard-float targets because it changes float ABI
|
||||||
|
|
|
||||||
|
= note: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||||
|
= note: for more information, see issue #116344 <https://github.com/rust-lang/rust/issues/116344>
|
||||||
|
|
||||||
|
warning: 1 warning emitted
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue