Эх сурвалжийг харах

[Targets] Move soft-float-abi filtering to `initFeatureMap`

ARM has a special target feature called soft-float-abi. This feature is
special, since we get it passed to us explicitly in the frontend, but
filter it out before it can land in any target feature strings in LLVM
IR.

__attribute__((target(""))) doesn't quite filter these features out
properly, so today, we get warnings about soft-float-abi being an
unknown feature from the backend.

This CL has us filter soft-float-abi out at a slightly different point,
so we don't end up passing these invalid features to the backend.

Differential Revision: https://reviews.llvm.org/D61750

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@363346 91177308-0d34-0410-b5e6-96231b3b80d8
George Burgess IV 6 жил өмнө
parent
commit
a577b1192b

+ 19 - 14
lib/Basic/Targets/ARM.cpp

@@ -323,6 +323,8 @@ ARMTargetInfo::ARMTargetInfo(const llvm::Triple &Triple,
     this->MCountName = Opts.EABIVersion == llvm::EABI::GNU
     this->MCountName = Opts.EABIVersion == llvm::EABI::GNU
                            ? "\01__gnu_mcount_nc"
                            ? "\01__gnu_mcount_nc"
                            : "\01mcount";
                            : "\01mcount";
+
+  SoftFloatABI = llvm::is_contained(Opts.FeaturesAsWritten, "+soft-float-abi");
 }
 }
 
 
 StringRef ARMTargetInfo::getABI() const { return ABI; }
 StringRef ARMTargetInfo::getABI() const { return ABI; }
@@ -385,12 +387,21 @@ bool ARMTargetInfo::initFeatureMap(
 
 
   // Convert user-provided arm and thumb GNU target attributes to
   // Convert user-provided arm and thumb GNU target attributes to
   // [-|+]thumb-mode target features respectively.
   // [-|+]thumb-mode target features respectively.
-  std::vector<std::string> UpdatedFeaturesVec(FeaturesVec);
-  for (auto &Feature : UpdatedFeaturesVec) {
-    if (Feature.compare("+arm") == 0)
-      Feature = "-thumb-mode";
-    else if (Feature.compare("+thumb") == 0)
-      Feature = "+thumb-mode";
+  std::vector<std::string> UpdatedFeaturesVec;
+  for (const auto &Feature : FeaturesVec) {
+    // Skip soft-float-abi; it's something we only use to initialize a bit of
+    // class state, and is otherwise unrecognized.
+    if (Feature == "+soft-float-abi")
+      continue;
+
+    StringRef FixedFeature;
+    if (Feature == "+arm")
+      FixedFeature = "-thumb-mode";
+    else if (Feature == "+thumb")
+      FixedFeature = "+thumb-mode";
+    else
+      FixedFeature = Feature;
+    UpdatedFeaturesVec.push_back(FixedFeature.str());
   }
   }
 
 
   return TargetInfo::initFeatureMap(Features, Diags, CPU, UpdatedFeaturesVec);
   return TargetInfo::initFeatureMap(Features, Diags, CPU, UpdatedFeaturesVec);
@@ -405,7 +416,8 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
   Crypto = 0;
   Crypto = 0;
   DSP = 0;
   DSP = 0;
   Unaligned = 1;
   Unaligned = 1;
-  SoftFloat = SoftFloatABI = false;
+  SoftFloat = false;
+  // Note that SoftFloatABI is initialized in our constructor.
   HWDiv = 0;
   HWDiv = 0;
   DotProd = 0;
   DotProd = 0;
   HasFloat16 = true;
   HasFloat16 = true;
@@ -415,8 +427,6 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
   for (const auto &Feature : Features) {
   for (const auto &Feature : Features) {
     if (Feature == "+soft-float") {
     if (Feature == "+soft-float") {
       SoftFloat = true;
       SoftFloat = true;
-    } else if (Feature == "+soft-float-abi") {
-      SoftFloatABI = true;
     } else if (Feature == "+vfp2sp" || Feature == "+vfp2d16sp" ||
     } else if (Feature == "+vfp2sp" || Feature == "+vfp2d16sp" ||
                Feature == "+vfp2" || Feature == "+vfp2d16") {
                Feature == "+vfp2" || Feature == "+vfp2d16") {
       FPU |= VFP2FPU;
       FPU |= VFP2FPU;
@@ -510,11 +520,6 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
   else if (FPMath == FP_VFP)
   else if (FPMath == FP_VFP)
     Features.push_back("-neonfp");
     Features.push_back("-neonfp");
 
 
-  // Remove front-end specific options which the backend handles differently.
-  auto Feature = llvm::find(Features, "+soft-float-abi");
-  if (Feature != Features.end())
-    Features.erase(Feature);
-
   return true;
   return true;
 }
 }
 
 

+ 6 - 0
lib/Basic/Targets/ARM.h

@@ -124,6 +124,12 @@ public:
                  StringRef CPU,
                  StringRef CPU,
                  const std::vector<std::string> &FeaturesVec) const override;
                  const std::vector<std::string> &FeaturesVec) const override;
 
 
+  bool isValidFeatureName(StringRef Feature) const override {
+    // We pass soft-float-abi in as a -target-feature, but the backend figures
+    // this out through other means.
+    return Feature != "soft-float-abi";
+  }
+
   bool handleTargetFeatures(std::vector<std::string> &Features,
   bool handleTargetFeatures(std::vector<std::string> &Features,
                             DiagnosticsEngine &Diags) override;
                             DiagnosticsEngine &Diags) override;
 
 

+ 9 - 0
test/CodeGen/arm-soft-float-abi-filtering.c

@@ -0,0 +1,9 @@
+// REQUIRES: arm-registered-target
+// RUN: %clang_cc1 -emit-llvm -o - -triple arm-none-linux-gnueabi -target-feature "+soft-float-abi" %s | FileCheck %s
+// RUN: %clang_cc1 -verify -triple arm-none-linux-gnueabi -target-feature "+soft-float-abi" %s
+
+// CHECK-NOT: +soft-float-abi
+
+void foo() {}
+__attribute__((target("crc"))) void bar() {}
+__attribute__((target("soft-float-abi"))) void baz() {} // expected-warning{{unsupported 'soft-float-abi' in the 'target' attribute string}}