r181662 - CodeGen: Refactor SetLLVMFunctionAttributesForDefinition to use an AttrBuilder.

Pete Cooper peter_cooper at apple.com
Sat May 11 10:25:18 PDT 2013


Hi Benjamin

This seems to have broken the buildbot.  Could you please take a look.

http://lab.llvm.org:8013/builders/clang-x86_64-darwin11-DA/builds/2084

Note that you aren’t listed on that build in the commit list, but you are the only commit on the trigger build:

http://lab.llvm.org:8013/builders/phase2%20-%20living/builds/2845

Thanks,
Pete
On May 11, 2013, at 5:45 AM, Benjamin Kramer <benny.kra at googlemail.com> wrote:

> Author: d0k
> Date: Sat May 11 07:45:37 2013
> New Revision: 181662
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=181662&view=rev
> Log:
> CodeGen: Refactor SetLLVMFunctionAttributesForDefinition to use an AttrBuilder.
> 
> Adding attributes to a uniqued set has become expensive, don't do it more often
> than necessary. No functionality change.
> 
> Modified:
>    cfe/trunk/lib/CodeGen/CodeGenModule.cpp
> 
> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=181662&r1=181661&r2=181662&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Sat May 11 07:45:37 2013
> @@ -598,61 +598,65 @@ static bool hasUnwindExceptions(const La
> 
> void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D,
>                                                            llvm::Function *F) {
> +  llvm::AttrBuilder B;
> +
>   if (CodeGenOpts.UnwindTables)
> -    F->setHasUWTable();
> +    B.addAttribute(llvm::Attribute::UWTable);
> 
>   if (!hasUnwindExceptions(LangOpts))
> -    F->addFnAttr(llvm::Attribute::NoUnwind);
> +    B.addAttribute(llvm::Attribute::NoUnwind);
> 
>   if (D->hasAttr<NakedAttr>()) {
>     // Naked implies noinline: we should not be inlining such functions.
> -    F->addFnAttr(llvm::Attribute::Naked);
> -    F->addFnAttr(llvm::Attribute::NoInline);
> +    B.addAttribute(llvm::Attribute::Naked);
> +    B.addAttribute(llvm::Attribute::NoInline);
> +  } else if (D->hasAttr<NoInlineAttr>()) {
> +    B.addAttribute(llvm::Attribute::NoInline);
> +  } else if ((D->hasAttr<AlwaysInlineAttr>() ||
> +              D->hasAttr<ForceInlineAttr>()) &&
> +             !F->getAttributes().hasAttribute(llvm::AttributeSet::FunctionIndex,
> +                                              llvm::Attribute::NoInline)) {
> +    // (noinline wins over always_inline, and we can't specify both in IR)
> +    B.addAttribute(llvm::Attribute::AlwaysInline);
>   }
> 
> -  if (D->hasAttr<NoInlineAttr>())
> -    F->addFnAttr(llvm::Attribute::NoInline);
> -
> -  // (noinline wins over always_inline, and we can't specify both in IR)
> -  if ((D->hasAttr<AlwaysInlineAttr>() || D->hasAttr<ForceInlineAttr>()) &&
> -      !F->getAttributes().hasAttribute(llvm::AttributeSet::FunctionIndex,
> -                                       llvm::Attribute::NoInline))
> -    F->addFnAttr(llvm::Attribute::AlwaysInline);
> -
>   // FIXME: Communicate hot and cold attributes to LLVM more directly.
>   if (D->hasAttr<ColdAttr>())
> -    F->addFnAttr(llvm::Attribute::OptimizeForSize);
> +    B.addAttribute(llvm::Attribute::OptimizeForSize);
> 
>   if (D->hasAttr<MinSizeAttr>())
> -    F->addFnAttr(llvm::Attribute::MinSize);
> -
> -  if (isa<CXXConstructorDecl>(D) || isa<CXXDestructorDecl>(D))
> -    F->setUnnamedAddr(true);
> -
> -  if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D))
> -    if (MD->isVirtual())
> -      F->setUnnamedAddr(true);
> +    B.addAttribute(llvm::Attribute::MinSize);
> 
>   if (LangOpts.getStackProtector() == LangOptions::SSPOn)
> -    F->addFnAttr(llvm::Attribute::StackProtect);
> +    B.addAttribute(llvm::Attribute::StackProtect);
>   else if (LangOpts.getStackProtector() == LangOptions::SSPReq)
> -    F->addFnAttr(llvm::Attribute::StackProtectReq);
> +    B.addAttribute(llvm::Attribute::StackProtectReq);
> 
>   // Add sanitizer attributes if function is not blacklisted.
>   if (!SanitizerBlacklist.isIn(*F)) {
>     // When AddressSanitizer is enabled, set SanitizeAddress attribute
>     // unless __attribute__((no_sanitize_address)) is used.
>     if (SanOpts.Address && !D->hasAttr<NoSanitizeAddressAttr>())
> -      F->addFnAttr(llvm::Attribute::SanitizeAddress);
> +      B.addAttribute(llvm::Attribute::SanitizeAddress);
>     // Same for ThreadSanitizer and __attribute__((no_sanitize_thread))
>     if (SanOpts.Thread && !D->hasAttr<NoSanitizeThreadAttr>()) {
> -      F->addFnAttr(llvm::Attribute::SanitizeThread);
> +      B.addAttribute(llvm::Attribute::SanitizeThread);
>     }
>     // Same for MemorySanitizer and __attribute__((no_sanitize_memory))
>     if (SanOpts.Memory && !D->hasAttr<NoSanitizeMemoryAttr>())
> -      F->addFnAttr(llvm::Attribute::SanitizeMemory);
> +      B.addAttribute(llvm::Attribute::SanitizeMemory);
>   }
> 
> +  F->addAttributes(llvm::AttributeSet::FunctionIndex,
> +                   llvm::AttributeSet::get(
> +                       F->getContext(), llvm::AttributeSet::FunctionIndex, B));
> +
> +  if (isa<CXXConstructorDecl>(D) || isa<CXXDestructorDecl>(D))
> +    F->setUnnamedAddr(true);
> +  else if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D))
> +    if (MD->isVirtual())
> +      F->setUnnamedAddr(true);
> +
>   unsigned alignment = D->getMaxAlignment() / Context.getCharWidth();
>   if (alignment)
>     F->setAlignment(alignment);
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130511/a9f82588/attachment.html>


More information about the cfe-commits mailing list