diff options
| author | Ralf Jung <post@ralfj.de> | 2024-11-10 22:51:38 +0100 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2024-11-11 07:33:39 +0100 |
| commit | 2c7f3badcf631d2b11459bb23590b776c0076a61 (patch) | |
| tree | e200b30f92725ef10fe18014c217fbdc75479c55 | |
| parent | f5b62577f79396979585ee98ed3a52594207bce7 (diff) | |
| download | rust-2c7f3badcf631d2b11459bb23590b776c0076a61.tar.gz rust-2c7f3badcf631d2b11459bb23590b776c0076a61.zip | |
target_features: explain what exacty 'implied' means here
| -rw-r--r-- | compiler/rustc_codegen_llvm/src/llvm_util.rs | 14 | ||||
| -rw-r--r-- | compiler/rustc_target/src/target_features.rs | 5 |
2 files changed, 16 insertions, 3 deletions
diff --git a/compiler/rustc_codegen_llvm/src/llvm_util.rs b/compiler/rustc_codegen_llvm/src/llvm_util.rs index c382242d8d0..db2b03d9aed 100644 --- a/compiler/rustc_codegen_llvm/src/llvm_util.rs +++ b/compiler/rustc_codegen_llvm/src/llvm_util.rs @@ -344,15 +344,23 @@ pub fn target_features(sess: &Session, allow_unstable: bool) -> Vec<Symbol> { }) { if enabled { + // Also add all transitively implied features. features.extend(sess.target.implied_target_features(std::iter::once(feature))); } else { + // Remove transitively reverse-implied features. + // We don't care about the order in `features` since the only thing we use it for is the // `features.contains` below. #[allow(rustc::potential_query_instability)] features.retain(|f| { - // Keep a feature if it does not imply `feature`. Or, equivalently, - // remove the reverse-dependencies of `feature`. - !sess.target.implied_target_features(std::iter::once(*f)).contains(&feature) + if sess.target.implied_target_features(std::iter::once(*f)).contains(&feature) { + // If `f` if implies `feature`, then `!feature` implies `!f`, so we have to + // remove `f`. (This is the standard logical contraposition principle.) + false + } else { + // We can keep `f`. + true + } }); } } diff --git a/compiler/rustc_target/src/target_features.rs b/compiler/rustc_target/src/target_features.rs index c4f9c742650..e8a6de98b7e 100644 --- a/compiler/rustc_target/src/target_features.rs +++ b/compiler/rustc_target/src/target_features.rs @@ -92,6 +92,11 @@ impl Stability { // // Stabilizing a target feature requires t-lang approval. +// If feature A "implies" feature B, then: +// - when A gets enabled (via `-Ctarget-feature` or `#[target_feature]`), we also enable B +// - when B gets disabled (via `-Ctarget-feature`), we also disable A +// +// Both of these are also applied transitively. type ImpliedFeatures = &'static [&'static str]; const ARM_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[ |
