Skip to content

Commit

Permalink
Rollup merge of rust-lang#49428 - cuviper:llvm6-target_feature, r=ale…
Browse files Browse the repository at this point in the history
…xcrichton

Enable target_feature on any LLVM 6+

In `LLVMRustHasFeature()`, rather than using `MCInfo->getFeatureTable()`
that is specific to Rust's LLVM fork, we can use this in LLVM 6:

    /// Check whether the subtarget features are enabled/disabled as per
    /// the provided string, ignoring all other features.
    bool checkFeatures(StringRef FS) const;

Now rustc using external LLVM can also have `target_feature`.

r? @alexcrichton
  • Loading branch information
kennytm authored Mar 28, 2018
2 parents 6ca1466 + a93a4d2 commit 294f041
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 9 deletions.
12 changes: 4 additions & 8 deletions src/rustllvm/PassWrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -205,17 +205,13 @@ GEN_SUBTARGETS

extern "C" bool LLVMRustHasFeature(LLVMTargetMachineRef TM,
const char *Feature) {
#if LLVM_RUSTLLVM
#if LLVM_VERSION_GE(6, 0)
TargetMachine *Target = unwrap(TM);
const MCSubtargetInfo *MCInfo = Target->getMCSubtargetInfo();
const FeatureBitset &Bits = MCInfo->getFeatureBits();
const ArrayRef<SubtargetFeatureKV> FeatTable = MCInfo->getFeatureTable();

for (auto &FeatureEntry : FeatTable)
if (!strcmp(FeatureEntry.Key, Feature))
return (Bits & FeatureEntry.Value) == FeatureEntry.Value;
#endif
return MCInfo->checkFeatures(std::string("+") + Feature);
#else
return false;
#endif
}

enum class LLVMRustCodeModel {
Expand Down
6 changes: 5 additions & 1 deletion src/test/run-pass/sse2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// no-system-llvm -- needs MCSubtargetInfo::getFeatureTable()
// min-llvm-version 6.0
// ^ needs MCSubtargetInfo::checkFeatures()
// ignore-cloudabi no std::env

#![feature(cfg_target_feature)]
Expand All @@ -29,4 +30,7 @@ fn main() {
assert!(cfg!(target_feature = "sse2"),
"SSE2 was not detected as available on an x86 platform");
}
// check a negative case too -- whitelisted on x86, but not enabled by default
assert!(cfg!(not(target_feature = "avx2")),
"AVX2 shouldn't be detected as available by default on any platform");
}

0 comments on commit 294f041

Please sign in to comment.