diff options
| author | Simonas Kazlauskas <git@kazlauskas.me> | 2021-07-23 14:42:36 +0300 |
|---|---|---|
| committer | Simonas Kazlauskas <git@kazlauskas.me> | 2022-02-27 21:21:38 +0200 |
| commit | dfcfaa4ec1dd8a5bda33874dc180509b74bb625f (patch) | |
| tree | 4ed06fdf5a430f9eda3c0ce522ab12349b86f01c | |
| parent | 3b1fe7e7c95e14dd8a420edf2f8a160c70211e04 (diff) | |
| download | rust-dfcfaa4ec1dd8a5bda33874dc180509b74bb625f.tar.gz rust-dfcfaa4ec1dd8a5bda33874dc180509b74bb625f.zip | |
Do not pass through features without +/- prefix
LLVM really dislikes this and will assert, saying something along the lines of: ``` rustc: llvm/lib/MC/MCSubtargetInfo.cpp:60: void ApplyFeatureFlag( llvm::FeatureBitset&, llvm::StringRef, llvm::ArrayRef<llvm::SubtargetFeatureKV> ): Assertion `SubtargetFeatures::hasFlag(Feature) && "Feature flags should start with '+' or '-'"` failed. ```
| -rw-r--r-- | compiler/rustc_codegen_llvm/src/llvm_util.rs | 33 | ||||
| -rw-r--r-- | src/test/ui/target-feature/missing-plusminus-2.rs | 6 | ||||
| -rw-r--r-- | src/test/ui/target-feature/missing-plusminus-2.stderr | 6 |
3 files changed, 28 insertions, 17 deletions
diff --git a/compiler/rustc_codegen_llvm/src/llvm_util.rs b/compiler/rustc_codegen_llvm/src/llvm_util.rs index b1c14c7e44b..69eacafb1b5 100644 --- a/compiler/rustc_codegen_llvm/src/llvm_util.rs +++ b/compiler/rustc_codegen_llvm/src/llvm_util.rs @@ -221,7 +221,11 @@ pub fn target_features(sess: &Session) -> Vec<Symbol> { supported_target_features(sess) .iter() .filter_map(|&(feature, gate)| { - if sess.is_nightly_build() || gate.is_none() { Some(feature) } else { None } + if sess.is_nightly_build() || gate.is_none() { + Some(feature) + } else { + None + } }) .filter(|feature| { for llvm_feature in to_llvm_feature(sess, feature) { @@ -428,20 +432,15 @@ pub fn llvm_global_features(sess: &Session) -> Vec<String> { } let filter = |s: &str| { - if s.is_empty() { - return vec![]; - } - let feature = strip(s); - if feature == s { - return vec![s.to_string()]; - } - - // Rustc-specific feature requests like `+crt-static` or `-crt-static` - // are not passed down to LLVM. - if RUSTC_SPECIFIC_FEATURES.contains(&feature) { - return vec![]; - } - // ... otherwise though we run through `to_llvm_feature` feature when + // features must start with a `+` or `-`. + let feature = match s.strip_prefix(&['+', '-'][..]) { + None => return vec![], + // Rustc-specific feature requests like `+crt-static` or `-crt-static` + // are not passed down to LLVM. + Some(feature) if RUSTC_SPECIFIC_FEATURES.contains(&feature) => return vec![], + Some(feature) => feature, + }; + // ... otherwise though we run through `to_llvm_feature` when // passing requests down to LLVM. This means that all in-language // features also work on the command line instead of having two // different names when the LLVM name and the Rust name differ. @@ -458,11 +457,11 @@ pub fn llvm_global_features(sess: &Session) -> Vec<String> { check_tied_features(sess, &feats.iter().map(|f| (strip(f), !f.starts_with("-"))).collect()) { sess.err(&format!( - "Target features {} must all be enabled or disabled together", + "target features {} must all be enabled or disabled together", f.join(", ") )); } - features.extend(feats.iter().flat_map(|&f| filter(f))); + features.extend(feats.iter().flat_map(&filter)); features } diff --git a/src/test/ui/target-feature/missing-plusminus-2.rs b/src/test/ui/target-feature/missing-plusminus-2.rs new file mode 100644 index 00000000000..13168728902 --- /dev/null +++ b/src/test/ui/target-feature/missing-plusminus-2.rs @@ -0,0 +1,6 @@ +// compile-flags: -Ctarget-feature=rdrand --crate-type=rlib --target=x86_64-unknown-linux-gnu +// build-pass +// needs-llvm-components: x86 + +#![feature(no_core)] +#![no_core] diff --git a/src/test/ui/target-feature/missing-plusminus-2.stderr b/src/test/ui/target-feature/missing-plusminus-2.stderr new file mode 100644 index 00000000000..5ed2652a06d --- /dev/null +++ b/src/test/ui/target-feature/missing-plusminus-2.stderr @@ -0,0 +1,6 @@ +warning: unknown feature specified for `-Ctarget-feature`: `rdrand` + | + = note: features must begin with a `+` to enable or `-` to disable it + +warning: 1 warning emitted + |
