Author: dblaikie Date: Wed Nov 11 19:09:58 2015 New Revision: 252840 URL: http://llvm.org/viewvc/llvm-project?rev=252840&view=rev Log: Refactor out some common code from r252834
Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=252840&r1=252839&r2=252840&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original) +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Wed Nov 11 19:09:58 2015 @@ -1843,6 +1843,30 @@ template void CGBuilderInserter<Preserve 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::checkTargetFeature 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::checkTargetFeature 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(); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits