]> granicus.if.org Git - clang/commitdiff
Merge the two feature map setting functions into a single function
authorEric Christopher <echristo@gmail.com>
Fri, 28 Aug 2015 02:13:58 +0000 (02:13 +0000)
committerEric Christopher <echristo@gmail.com>
Fri, 28 Aug 2015 02:13:58 +0000 (02:13 +0000)
and replace all callers.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@246259 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/TargetInfo.h
lib/Basic/Targets.cpp
lib/CodeGen/CGCall.cpp

index b05d8669139f5734259e5bce6013e464137918f7..9db319ac2f01c2c883d2563c71b96ad04326799e 100644 (file)
@@ -742,8 +742,13 @@ public:
 
   /// \brief Initialize the map with the default set of target features for the
   /// CPU this should include all legal feature strings on the target.
-  virtual void initDefaultFeatures(llvm::StringMap<bool> &Features,
-                                   StringRef CPU) const {}
+  ///
+  /// \return False on error (invalid features).
+  virtual bool initFeatureMap(llvm::StringMap<bool> &Features,
+                              DiagnosticsEngine &Diags, StringRef CPU,
+                              std::vector<std::string> &FAW) const {
+    return handleUserFeatures(Features, FAW, Diags);
+  }
 
   /// \brief Get the ABI currently in use.
   virtual StringRef getABI() const { return StringRef(); }
index eee181e7214c2f36664528ad27790eb713626915..76da995665fbd5deb30cffa4b852c337feb3ac3c 100644 (file)
@@ -863,8 +863,9 @@ public:
   void getTargetDefines(const LangOptions &Opts,
                         MacroBuilder &Builder) const override;
 
-  void initDefaultFeatures(llvm::StringMap<bool> &Features,
-                           StringRef CPU) const override;
+  bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
+                      StringRef CPU,
+                      std::vector<std::string> &FAW) const override;
 
   bool handleTargetFeatures(std::vector<std::string> &Features,
                             DiagnosticsEngine &Diags) override;
@@ -1050,37 +1051,32 @@ bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
 }
 
 bool PPCTargetInfo::handleUserFeatures(llvm::StringMap<bool> &Features,
-                                       std::vector<std::string> &UserFeatures,
+                                       std::vector<std::string> &FAW,
                                        DiagnosticsEngine &Diags) const {
-
   // Handle explicit options being passed to the compiler here: if we've
   // explicitly turned off vsx and turned on power8-vector or direct-move then
   // go ahead and error since the customer has expressed a somewhat incompatible
   // set of options.
-  if (std::find(UserFeatures.begin(), UserFeatures.end(), "-vsx") !=
-      UserFeatures.end()) {
-    if (std::find(UserFeatures.begin(), UserFeatures.end(), "+power8-vector") !=
-        UserFeatures.end()) {
+  if (std::find(FAW.begin(), FAW.end(), "-vsx") != FAW.end()) {
+    if (std::find(FAW.begin(), FAW.end(), "+power8-vector") != FAW.end()) {
       Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
                                                      << "-mno-vsx";
       return false;
     }
 
-    if (std::find(UserFeatures.begin(), UserFeatures.end(), "+direct-move") !=
-        UserFeatures.end()) {
+    if (std::find(FAW.begin(), FAW.end(), "+direct-move") != FAW.end()) {
       Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
                                                      << "-mno-vsx";
       return false;
     }
   }
 
-  for (const auto &F : UserFeatures) {
+  for (const auto &F : FAW) {
     const char *Name = F.c_str();
     // Apply the feature via the target.
     bool Enabled = Name[0] == '+';
     setFeatureEnabled(Features, Name + 1, Enabled);
   }
-
   return true;
 }
 
@@ -1263,8 +1259,9 @@ void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
   //   __NO_FPRS__
 }
 
-void PPCTargetInfo::initDefaultFeatures(llvm::StringMap<bool> &Features,
-                                        StringRef CPU) const {
+bool PPCTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
+                                   DiagnosticsEngine &Diags, StringRef CPU,
+                                   std::vector<std::string> &FAW) const {
   Features["altivec"] = llvm::StringSwitch<bool>(CPU)
     .Case("7400", true)
     .Case("g4", true)
@@ -1307,6 +1304,8 @@ void PPCTargetInfo::initDefaultFeatures(llvm::StringMap<bool> &Features,
     .Case("pwr8", true)
     .Case("pwr7", true)
     .Default(false);
+
+  return handleUserFeatures(Features, FAW, Diags);
 }
 
 bool PPCTargetInfo::hasFeature(StringRef Feature) const {
@@ -2371,11 +2370,12 @@ public:
     setFeatureEnabledImpl(Features, Name, Enabled);
   }
   // This exists purely to cut down on the number of virtual calls in
-  // initDefaultFeatures which calls this repeatedly.
+  // initFeatureMap which calls this repeatedly.
   static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
                                     StringRef Name, bool Enabled);
-  void initDefaultFeatures(llvm::StringMap<bool> &Features,
-                           StringRef CPU) const override;
+  bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
+                      StringRef CPU,
+                      std::vector<std::string> &FAW) const override;
   bool hasFeature(StringRef Feature) const override;
   bool handleTargetFeatures(std::vector<std::string> &Features,
                             DiagnosticsEngine &Diags) override;
@@ -2501,8 +2501,9 @@ bool X86TargetInfo::setFPMath(StringRef Name) {
   return false;
 }
 
-void X86TargetInfo::initDefaultFeatures(llvm::StringMap<bool> &Features,
-                                        StringRef CPU) const {
+bool X86TargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
+                                   DiagnosticsEngine &Diags, StringRef CPU,
+                                   std::vector<std::string> &FAW) const {
   // FIXME: This *really* should not be here.
 
   // X86_64 always has SSE2.
@@ -2678,6 +2679,7 @@ void X86TargetInfo::initDefaultFeatures(llvm::StringMap<bool> &Features,
     setFeatureEnabledImpl(Features, "cx16", true);
     break;
   }
+  return handleUserFeatures(Features, FAW, Diags);
 }
 
 void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
@@ -4397,8 +4399,9 @@ public:
   }
 
   // FIXME: This should be based on Arch attributes, not CPU names.
-  void initDefaultFeatures(llvm::StringMap<bool> &Features,
-                           StringRef CPU) const override {
+  bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
+                      StringRef CPU,
+                      std::vector<std::string> &FAW) const override {
     if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
       Features["vfp2"] = true;
     else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
@@ -4430,6 +4433,7 @@ public:
                CPU == "sc300" || CPU == "cortex-r4" || CPU == "cortex-r4f") {
       Features["hwdiv"] = true;
     }
+    return handleUserFeatures(Features, FAW, Diags);
   }
 
   bool handleTargetFeatures(std::vector<std::string> &Features,
@@ -5841,14 +5845,16 @@ public:
 
     return CPUKnown;
   }
-  void initDefaultFeatures(llvm::StringMap<bool> &Features,
-                           StringRef CPU) const override {
+  bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
+                    StringRef CPU,
+                    std::vector<std::string> &FAW) const override {
     if (CPU == "zEC12")
       Features["transactional-execution"] = true;
     if (CPU == "z13") {
       Features["transactional-execution"] = true;
       Features["vector"] = true;
     }
+    return handleUserFeatures(Features, FAW, Diags);
   }
 
   bool handleTargetFeatures(std::vector<std::string> &Features,
@@ -6209,12 +6215,14 @@ public:
         .Default(false);
   }
   const std::string& getCPU() const { return CPU; }
-  void initDefaultFeatures(llvm::StringMap<bool> &Features,
-                           StringRef CPU) const override {
+  bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
+                    StringRef CPU,
+                    std::vector<std::string> &FAW) const override {
     if (CPU == "octeon")
       Features["mips64r2"] = Features["cnmips"] = true;
     else
       Features[CPU] = true;
+    return handleUserFeatures(Features, FAW, Diags);
   }
 
   void getTargetDefines(const LangOptions &Opts,
@@ -7500,10 +7508,7 @@ TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
   // Compute the default target features, we need the target to handle this
   // because features may have dependencies on one another.
   llvm::StringMap<bool> Features;
-  Target->initDefaultFeatures(Features, Opts->CPU);
-
-  // Apply the user specified deltas.
-  if (!Target->handleUserFeatures(Features, Opts->FeaturesAsWritten, Diags))
+  if (!Target->initFeatureMap(Features, Diags, Opts->CPU, Opts->FeaturesAsWritten))
       return nullptr;
 
   // Add the features to the compile options.
index d5997e51180bebdbaef8ec36cc9ad0be6b1111c4..fac251686315fff31853bc2156423511cf71dc14 100644 (file)
@@ -1538,8 +1538,7 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
       // the default or a new one from the target attribute string. Then we'll
       // use the passed in features (FeaturesAsWritten) along with the new ones
       // from the attribute.
-      getTarget().initDefaultFeatures(FeatureMap, TargetCPU);
-      getTarget().handleUserFeatures(FeatureMap, FnFeatures, Diags);
+      getTarget().initFeatureMap(FeatureMap, Diags, TargetCPU, FnFeatures);
 
       // Produce the canonical string for this set of features.
       std::vector<std::string> Features;