r181662 - CodeGen: Refactor SetLLVMFunctionAttributesForDefinition to use an AttrBuilder.

Pete Cooper peter_cooper at apple.com
Sat May 11 17:16:53 PDT 2013


Turns out you were right that it was spurious.  Sorry for the noise, and thanks for rerunning the build.

Pete
On May 11, 2013, at 11:23 AM, Benjamin Kramer <benny.kra at gmail.com> wrote:

> 
> On 11.05.2013, at 19:25, Pete Cooper <peter_cooper at apple.com> wrote:
> 
>> 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
> 
> I saw the failure and it looks extremely unlikely that it was caused by my commit. The test that failed doesn't even use LLVM codegen and died by being killed with signal 9 (probably run out of time/memory).
> 
> There haven't been any commits today that triggered a rebuild, I expect it to go back to green in the next cycle. I'll keep an eye on it.
> 
> - Ben
> 
>> 
>> 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
>> 
> 





More information about the cfe-commits mailing list