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 /compiler/rustc_codegen_llvm/src | |
| parent | f5b62577f79396979585ee98ed3a52594207bce7 (diff) | |
| download | rust-2c7f3badcf631d2b11459bb23590b776c0076a61.tar.gz rust-2c7f3badcf631d2b11459bb23590b776c0076a61.zip | |
target_features: explain what exacty 'implied' means here
Diffstat (limited to 'compiler/rustc_codegen_llvm/src')
| -rw-r--r-- | compiler/rustc_codegen_llvm/src/llvm_util.rs | 14 |
1 files changed, 11 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 + } }); } } |
