Author: echristo Date: Wed Nov 11 17:05:08 2015 New Revision: 252819 URL: http://llvm.org/viewvc/llvm-project?rev=252819&view=rev Log: Extract out a function onto CodeGenModule for getting the map of features for a particular function, then use it to clean up some code.
Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp cfe/trunk/lib/CodeGen/CGCall.cpp cfe/trunk/lib/CodeGen/CodeGenFunction.h cfe/trunk/lib/CodeGen/CodeGenModule.cpp cfe/trunk/lib/CodeGen/CodeGenModule.h Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=252819&r1=252818&r2=252819&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original) +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Wed Nov 11 17:05:08 2015 @@ -353,7 +353,8 @@ bool CodeGenFunction::checkBuiltinTarget // Get the current enclosing function if it exists. If it doesn't // we can't check the target features anyhow. const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(CurFuncDecl); - if (!FD) return true; + if (!FD) + return true; unsigned BuiltinID = TargetDecl->getBuiltinID(); const char *FeatureList = @@ -362,32 +363,8 @@ bool CodeGenFunction::checkBuiltinTarget if (!FeatureList || StringRef(FeatureList) == "") return true; - StringRef TargetCPU = Target.getTargetOpts().CPU; llvm::StringMap<bool> FeatureMap; - - if (const auto *TD = FD->getAttr<TargetAttr>()) { - // If we have a TargetAttr build up the feature map based on that. - TargetAttr::ParsedTargetAttr ParsedAttr = TD->parse(); - - // Make a copy of the features as passed on the command line into the - // beginning of the additional features from the function to override. - ParsedAttr.first.insert(ParsedAttr.first.begin(), - Target.getTargetOpts().FeaturesAsWritten.begin(), - Target.getTargetOpts().FeaturesAsWritten.end()); - - if (ParsedAttr.second != "") - TargetCPU = ParsedAttr.second; - - // Now populate the feature map, first with the TargetCPU which is either - // 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. - Target.initFeatureMap(FeatureMap, CGM.getDiags(), TargetCPU, - ParsedAttr.first); - } else { - Target.initFeatureMap(FeatureMap, CGM.getDiags(), TargetCPU, - Target.getTargetOpts().Features); - } + CGM.getFunctionFeatureMap(FeatureMap, FD); // If we have at least one of the features in the feature list return // true, otherwise return false. Modified: cfe/trunk/lib/CodeGen/CGCall.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=252819&r1=252818&r2=252819&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGCall.cpp (original) +++ cfe/trunk/lib/CodeGen/CGCall.cpp Wed Nov 11 17:05:08 2015 @@ -1506,24 +1506,7 @@ void CodeGenModule::ConstructAttributeLi const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl); if (FD && FD->hasAttr<TargetAttr>()) { llvm::StringMap<bool> FeatureMap; - const auto *TD = FD->getAttr<TargetAttr>(); - TargetAttr::ParsedTargetAttr ParsedAttr = TD->parse(); - - // Make a copy of the features as passed on the command line into the - // beginning of the additional features from the function to override. - ParsedAttr.first.insert( - ParsedAttr.first.begin(), - getTarget().getTargetOpts().FeaturesAsWritten.begin(), - getTarget().getTargetOpts().FeaturesAsWritten.end()); - - if (ParsedAttr.second != "") - TargetCPU = ParsedAttr.second; - - // Now populate the feature map, first with the TargetCPU which is either - // 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().initFeatureMap(FeatureMap, Diags, TargetCPU, ParsedAttr.first); + getFunctionFeatureMap(FeatureMap, FD); // Produce the canonical string for this set of features. std::vector<std::string> Features; @@ -1533,6 +1516,13 @@ void CodeGenModule::ConstructAttributeLi Features.push_back((it->second ? "+" : "-") + it->first().str()); // Now add the target-cpu and target-features to the function. + // While we populated the feature map above, we still need to + // get and parse the target attribute so we can get the cpu for + // the function. + const auto *TD = FD->getAttr<TargetAttr>(); + TargetAttr::ParsedTargetAttr ParsedAttr = TD->parse(); + if (ParsedAttr.second != "") + TargetCPU = ParsedAttr.second; if (TargetCPU != "") FuncAttrs.addAttribute("target-cpu", TargetCPU); if (!Features.empty()) { Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=252819&r1=252818&r2=252819&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original) +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Wed Nov 11 17:05:08 2015 @@ -2638,6 +2638,8 @@ public: RValue EmitCallExpr(const CallExpr *E, ReturnValueSlot ReturnValue = ReturnValueSlot()); + void getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap, + const FunctionDecl *FD); bool checkBuiltinTargetFeatures(const FunctionDecl *TargetDecl); llvm::CallInst *EmitRuntimeCall(llvm::Value *callee, Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=252819&r1=252818&r2=252819&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original) +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Wed Nov 11 17:05:08 2015 @@ -3875,3 +3875,32 @@ llvm::MDTuple *CodeGenModule::CreateVTab llvm::ConstantInt::get(Int64Ty, Offset.getQuantity()))}; return llvm::MDTuple::get(getLLVMContext(), BitsetOps); } + +// Fills in the supplied string map with the set of target features for the +// passed in function. +void CodeGenModule::getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap, + const FunctionDecl *FD) { + StringRef TargetCPU = Target.getTargetOpts().CPU; + if (const auto *TD = FD->getAttr<TargetAttr>()) { + // If we have a TargetAttr build up the feature map based on that. + TargetAttr::ParsedTargetAttr ParsedAttr = TD->parse(); + + // Make a copy of the features as passed on the command line into the + // beginning of the additional features from the function to override. + ParsedAttr.first.insert(ParsedAttr.first.begin(), + Target.getTargetOpts().FeaturesAsWritten.begin(), + Target.getTargetOpts().FeaturesAsWritten.end()); + + if (ParsedAttr.second != "") + TargetCPU = ParsedAttr.second; + + // Now populate the feature map, first with the TargetCPU which is either + // 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. + Target.initFeatureMap(FeatureMap, getDiags(), TargetCPU, ParsedAttr.first); + } else { + Target.initFeatureMap(FeatureMap, getDiags(), TargetCPU, + Target.getTargetOpts().Features); + } +} Modified: cfe/trunk/lib/CodeGen/CodeGenModule.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=252819&r1=252818&r2=252819&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CodeGenModule.h (original) +++ cfe/trunk/lib/CodeGen/CodeGenModule.h Wed Nov 11 17:05:08 2015 @@ -979,6 +979,11 @@ public: unsigned &CallingConv, bool AttrOnCallSite); + // Fills in the supplied string map with the set of target features for the + // passed in function. + void getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap, + const FunctionDecl *FD); + StringRef getMangledName(GlobalDecl GD); StringRef getBlockMangledName(GlobalDecl GD, const BlockDecl *BD); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits