Skip to content

Commit

Permalink
Do not pass through features without +/- prefix
Browse files Browse the repository at this point in the history
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.
```
  • Loading branch information
nagisa committed Feb 27, 2022
1 parent 3b1fe7e commit dfcfaa4
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 17 deletions.
33 changes: 16 additions & 17 deletions compiler/rustc_codegen_llvm/src/llvm_util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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.
Expand All @@ -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
}

Expand Down
6 changes: 6 additions & 0 deletions src/test/ui/target-feature/missing-plusminus-2.rs
Original file line number Diff line number Diff line change
@@ -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]
6 changes: 6 additions & 0 deletions src/test/ui/target-feature/missing-plusminus-2.stderr
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit dfcfaa4

Please sign in to comment.