]> granicus.if.org Git - clang/commitdiff
Refactor out some common code from r252834
authorDavid Blaikie <dblaikie@gmail.com>
Thu, 12 Nov 2015 01:09:58 +0000 (01:09 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Thu, 12 Nov 2015 01:09:58 +0000 (01:09 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@252840 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CodeGenFunction.cpp

index 8596f97a3b187b8cfde9449e2203aeb30b6d0edf..1d3ad9bc4adc1f05a76cc68874dbc4533033cb6a 100644 (file)
@@ -1843,6 +1843,30 @@ template void CGBuilderInserter<PreserveNames>::InsertHelper(
     llvm::BasicBlock::iterator InsertPt) const;
 #undef PreserveNames
 
+static bool hasRequiredFeatures(const SmallVectorImpl<StringRef> &ReqFeatures,
+                                CodeGenModule &CGM, const FunctionDecl *FD) {
+  // If there aren't any required features listed then go ahead and return.
+  if (ReqFeatures.empty())
+    return false;
+
+  // Now build up the set of caller features and verify that all the required
+  // features are there.
+  llvm::StringMap<bool> CallerFeatureMap;
+  CGM.getFunctionFeatureMap(CallerFeatureMap, FD);
+
+  // If we have at least one of the features in the feature list return
+  // true, otherwise return false.
+  return std::all_of(
+      ReqFeatures.begin(), ReqFeatures.end(), [&](StringRef Feature) {
+        SmallVector<StringRef, 1> OrFeatures;
+        Feature.split(OrFeatures, "|");
+        return std::any_of(OrFeatures.begin(), OrFeatures.end(),
+                           [&](StringRef Feature) {
+                             return CallerFeatureMap.lookup(Feature);
+                           });
+      });
+}
+
 // Emits an error if we don't have a valid set of target features for the
 // called function.
 void CodeGenFunction::checkTargetFeatures(const CallExpr *E,
@@ -1870,26 +1894,7 @@ void CodeGenFunction::checkTargetFeatures(const CallExpr *E,
       return;
     StringRef(FeatureList).split(ReqFeatures, ",");
 
-    // If there aren't any required features listed then go ahead and return.
-    if (ReqFeatures.empty())
-      return;
-
-    // Now build up the set of caller features and verify that all the required
-    // features are there.
-    llvm::StringMap<bool> CallerFeatureMap;
-    CGM.getFunctionFeatureMap(CallerFeatureMap, FD);
-
-    // If we have at least one of the features in the feature list return
-    // true, otherwise return false.
-    if (!std::all_of(
-            ReqFeatures.begin(), ReqFeatures.end(), [&](StringRef &Feature) {
-              SmallVector<StringRef, 1> OrFeatures;
-              Feature.split(OrFeatures, "|");
-              return std::any_of(OrFeatures.begin(), OrFeatures.end(),
-                                 [&](StringRef &Feature) {
-                                   return CallerFeatureMap.lookup(Feature);
-                                 });
-            }))
+    if (!hasRequiredFeatures(ReqFeatures, CGM, FD))
       CGM.getDiags().Report(E->getLocStart(), diag::err_builtin_needs_feature)
           << TargetDecl->getDeclName()
           << CGM.getContext().BuiltinInfo.getRequiredFeatures(BuiltinID);
@@ -1901,25 +1906,7 @@ void CodeGenFunction::checkTargetFeatures(const CallExpr *E,
     CGM.getFunctionFeatureMap(CalleeFeatureMap, TargetDecl);
     for (const auto &F : CalleeFeatureMap)
       ReqFeatures.push_back(F.getKey());
-    // If there aren't any required features listed then go ahead and return.
-    if (ReqFeatures.empty())
-      return;
-
-    // Now get the features that the caller provides.
-    llvm::StringMap<bool> CallerFeatureMap;
-    CGM.getFunctionFeatureMap(CallerFeatureMap, FD);
-
-    // If we have at least one of the features in the feature list return
-    // true, otherwise return false.
-    if (!std::all_of(
-            ReqFeatures.begin(), ReqFeatures.end(), [&](StringRef &Feature) {
-              SmallVector<StringRef, 1> OrFeatures;
-              Feature.split(OrFeatures, "|");
-              return std::any_of(OrFeatures.begin(), OrFeatures.end(),
-                                 [&](StringRef &Feature) {
-                                   return CallerFeatureMap.lookup(Feature);
-                                 });
-            }))
+    if (!hasRequiredFeatures(ReqFeatures, CGM, FD))
       CGM.getDiags().Report(E->getLocStart(), diag::err_function_needs_feature)
           << FD->getDeclName() << TargetDecl->getDeclName();
   }