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