about summary refs log tree commit diff
path: root/src/rustllvm/PassWrapper.cpp
diff options
context:
space:
mode:
authorLuca Barbato <lu_zero@gentoo.org>2017-07-28 02:03:23 +0000
committerLuca Barbato <lu_zero@gentoo.org>2017-07-28 14:30:06 +0000
commitc4710203c098b68b5f80b1507e889ad894855729 (patch)
tree71052bd4843b612179d9dde9c167e7c1c59a01c9 /src/rustllvm/PassWrapper.cpp
parentcbce0aa341c8be3f4b9253c93ed641ed454fc0a0 (diff)
downloadrust-c4710203c098b68b5f80b1507e889ad894855729.tar.gz
rust-c4710203c098b68b5f80b1507e889ad894855729.zip
Make LLVMRustHasFeature more robust
The function should accept feature strings that old LLVM might not
support.

Simplify the code using the same approach used by
LLVMRustPrintTargetFeatures.

Dummify the function for non 4.0 LLVM and update the tests accordingly.
Diffstat (limited to 'src/rustllvm/PassWrapper.cpp')
-rw-r--r--src/rustllvm/PassWrapper.cpp20
1 files changed, 7 insertions, 13 deletions
diff --git a/src/rustllvm/PassWrapper.cpp b/src/rustllvm/PassWrapper.cpp
index 7fb1eafb30d..57e90be2774 100644
--- a/src/rustllvm/PassWrapper.cpp
+++ b/src/rustllvm/PassWrapper.cpp
@@ -181,20 +181,14 @@ extern "C" bool LLVMRustHasFeature(LLVMTargetMachineRef TM,
   TargetMachine *Target = unwrap(TM);
   const MCSubtargetInfo *MCInfo = Target->getMCSubtargetInfo();
   const FeatureBitset &Bits = MCInfo->getFeatureBits();
-  const llvm::SubtargetFeatureKV *FeatureEntry;
-
-#define SUBTARGET(x)                                                           \
-  if (MCInfo->isCPUStringValid(x##SubTypeKV[0].Key)) {                         \
-    FeatureEntry = x##FeatureKV;                                               \
-  } else
-
-  GEN_SUBTARGETS { return false; }
-#undef SUBTARGET
-
-  while (strcmp(Feature, FeatureEntry->Key) != 0)
-    FeatureEntry++;
+#if LLVM_VERSION_GE(4, 0)
+  const ArrayRef<SubtargetFeatureKV> FeatTable = MCInfo->getFeatureTable();
 
-  return (Bits & FeatureEntry->Value) == FeatureEntry->Value;
+  for (auto &FeatureEntry : FeatTable)
+    if (!strcmp(FeatureEntry.Key, Feature))
+      return (Bits & FeatureEntry.Value) == FeatureEntry.Value;
+#endif
+  return false;
 }
 
 enum class LLVMRustCodeModel {