add ABI target features *before* -Ctarget-features
This commit is contained in:
parent
eb527424a5
commit
912b7291d0
4 changed files with 19 additions and 16 deletions
|
@ -154,12 +154,12 @@ pub(crate) fn global_gcc_features(sess: &Session, diagnostics: bool) -> Vec<Stri
|
|||
// we will silently correct them rather than silently producing wrong code.
|
||||
// (The target sanity check tries to catch this, but we can't know which features are
|
||||
// enabled in GCC by default so we can't be fully sure about that check.)
|
||||
for feature in abi_enable {
|
||||
all_rust_features.push((true, feature));
|
||||
}
|
||||
for feature in abi_disable {
|
||||
all_rust_features.push((false, feature));
|
||||
}
|
||||
// We add these at the beginning of the list so that `-Ctarget-features` can
|
||||
// still override it... that's unsound, but more compatible with past behavior.
|
||||
all_rust_features.splice(
|
||||
0..0,
|
||||
abi_enable.iter().map(|&f| (true, f)).chain(abi_disable.iter().map(|&f| (false, f))),
|
||||
);
|
||||
|
||||
// Translate this into GCC features.
|
||||
let feats = all_rust_features
|
||||
|
|
|
@ -779,12 +779,12 @@ pub(crate) fn global_llvm_features(
|
|||
// we will silently correct them rather than silently producing wrong code.
|
||||
// (The target sanity check tries to catch this, but we can't know which features are
|
||||
// enabled in LLVM by default so we can't be fully sure about that check.)
|
||||
for feature in abi_enable {
|
||||
all_rust_features.push((true, feature));
|
||||
}
|
||||
for feature in abi_disable {
|
||||
all_rust_features.push((false, feature));
|
||||
}
|
||||
// We add these at the beginning of the list so that `-Ctarget-features` can
|
||||
// still override it... that's unsound, but more compatible with past behavior.
|
||||
all_rust_features.splice(
|
||||
0..0,
|
||||
abi_enable.iter().map(|&f| (true, f)).chain(abi_disable.iter().map(|&f| (false, f))),
|
||||
);
|
||||
|
||||
// Translate this into LLVM features.
|
||||
let feats = all_rust_features
|
||||
|
|
|
@ -743,6 +743,9 @@ impl Target {
|
|||
/// the first list contains target features that must be enabled for ABI reasons,
|
||||
/// and the second list contains target feature that must be disabled for ABI reasons.
|
||||
///
|
||||
/// These features are automatically appended to whatever the target spec sats as default
|
||||
/// features for the target.
|
||||
///
|
||||
/// All features enabled/disabled via `-Ctarget-features` and `#[target_features]` are checked
|
||||
/// against this. We also check any implied features, based on the information above. If LLVM
|
||||
/// implicitly enables more implied features than we do, that could bypass this check!
|
||||
|
|
|
@ -39,8 +39,8 @@ pub unsafe fn banana() -> u32 {
|
|||
}
|
||||
|
||||
// CHECK: attributes [[APPLEATTRS]]
|
||||
// COMPAT-SAME: "target-features"="+avx,+avx2,{{.*}}"
|
||||
// INCOMPAT-SAME: "target-features"="-avx2,-avx,+x87,+sse2,+avx,{{.*}}"
|
||||
// COMPAT-SAME: "target-features"="+x87,+sse2,+avx,+avx2,{{.*}}"
|
||||
// INCOMPAT-SAME: "target-features"="+x87,+sse2,-avx2,-avx,+avx,{{.*}}"
|
||||
// CHECK: attributes [[BANANAATTRS]]
|
||||
// COMPAT-SAME: "target-features"="+avx,+avx2,{{.*}}"
|
||||
// INCOMPAT-SAME: "target-features"="-avx2,-avx,+x87,+sse2"
|
||||
// COMPAT-SAME: "target-features"="+x87,+sse2,+avx,+avx2,{{.*}}"
|
||||
// INCOMPAT-SAME: "target-features"="+x87,+sse2,-avx2,-avx"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue