diff options
-rw-r--r-- | lib/CodeGen/CGCall.cpp | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index f2c2d0a85d..fe0088dc0b 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -1021,21 +1021,25 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI, if (CodeGenOpts.NoImplicitFloat) FuncAttrs.addAttribute(llvm::Attribute::NoImplicitFloat); - if (!TargetOpts.CPU.empty()) - FuncAttrs.addAttribute("target-cpu", TargetOpts.CPU); - - if (TargetOpts.Features.size()) { - llvm::SubtargetFeatures Features; - for (std::vector<std::string>::const_iterator - it = TargetOpts.Features.begin(), - ie = TargetOpts.Features.end(); it != ie; ++it) - Features.AddFeature(*it); - FuncAttrs.addAttribute("target-features", Features.getString()); + if (AttrOnCallSite) { + // Attributes that should go on the call site only. + if (!CodeGenOpts.SimplifyLibCalls) + FuncAttrs.addAttribute(llvm::Attribute::NoBuiltin); + } else { + // Attributes that should go on the function, but not the call site. + if (!TargetOpts.CPU.empty()) + FuncAttrs.addAttribute("target-cpu", TargetOpts.CPU); + + if (TargetOpts.Features.size()) { + llvm::SubtargetFeatures Features; + for (std::vector<std::string>::const_iterator + it = TargetOpts.Features.begin(), + ie = TargetOpts.Features.end(); it != ie; ++it) + Features.AddFeature(*it); + FuncAttrs.addAttribute("target-features", Features.getString()); + } } - if (AttrOnCallSite && !CodeGenOpts.SimplifyLibCalls) - FuncAttrs.addAttribute(llvm::Attribute::NoBuiltin); - QualType RetTy = FI.getReturnType(); unsigned Index = 1; const ABIArgInfo &RetAI = FI.getReturnInfo(); |