From: Reid Kleckner Date: Wed, 19 Apr 2017 01:51:13 +0000 (+0000) Subject: Remove buggy 'addAttributes(unsigned, AttrBuilder)' overload X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4bc9eb623db35f12b50ebff2f79734cde3dc16a6;p=llvm Remove buggy 'addAttributes(unsigned, AttrBuilder)' overload The 'addAttributes(unsigned, AttrBuilder)' overload delegated to 'get' instead of 'addAttributes'. Since we can implicitly construct an AttrBuilder from an AttributeSet, just standardize on AttrBuilder. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@300651 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/IR/Attributes.h b/include/llvm/IR/Attributes.h index 121f57a433a..b13f197d25f 100644 --- a/include/llvm/IR/Attributes.h +++ b/include/llvm/IR/Attributes.h @@ -356,9 +356,6 @@ public: AttributeList addAttributes(LLVMContext &C, unsigned Index, AttributeList Attrs) const; - AttributeList addAttributes(LLVMContext &C, unsigned Index, - AttributeSet AS) const; - AttributeList addAttributes(LLVMContext &C, unsigned Index, const AttrBuilder &B) const; diff --git a/lib/IR/Attributes.cpp b/lib/IR/Attributes.cpp index 3da00ad6fd4..47ca5e40623 100644 --- a/lib/IR/Attributes.cpp +++ b/lib/IR/Attributes.cpp @@ -984,23 +984,23 @@ AttributeList AttributeList::addAttributes(LLVMContext &C, unsigned Index, } AttributeList AttributeList::addAttributes(LLVMContext &C, unsigned Index, - AttributeSet AS) const { - if (!AS.hasAttributes()) + const AttrBuilder &B) const { + if (!B.hasAttributes()) return *this; if (!pImpl) - return AttributeList::get(C, {{Index, AS}}); + return AttributeList::get(C, {{Index, AttributeSet::get(C, B)}}); #ifndef NDEBUG // FIXME it is not obvious how this should work for alignment. For now, say // we can't change a known alignment. unsigned OldAlign = getParamAlignment(Index); - unsigned NewAlign = AS.getAlignment(); + unsigned NewAlign = B.getAlignment(); assert((!OldAlign || !NewAlign || OldAlign == NewAlign) && "Attempt to change alignment!"); #endif - SmallVector, 4> AttrSet; + SmallVector AttrVec; uint64_t NumAttrs = pImpl->getNumSlots(); unsigned I; @@ -1008,31 +1008,25 @@ AttributeList AttributeList::addAttributes(LLVMContext &C, unsigned Index, for (I = 0; I < NumAttrs; ++I) { if (getSlotIndex(I) >= Index) break; - AttrSet.emplace_back(getSlotIndex(I), pImpl->getSlotNode(I)); + AttrVec.emplace_back(getSlotIndex(I), pImpl->getSlotNode(I)); } + AttrBuilder NewAttrs; if (I < NumAttrs && getSlotIndex(I) == Index) { - // We need to merge two AttributeSets. - AttributeSet Merged = AttributeSet::get( - C, AttrBuilder(pImpl->getSlotNode(I)).merge(AttrBuilder(AS))); - AttrSet.emplace_back(Index, Merged); + // We need to merge the attribute sets. + NewAttrs.merge(pImpl->getSlotNode(I)); ++I; - } else { - // Otherwise, there were no attributes at this position in the original - // list. Add the set as is. - AttrSet.emplace_back(Index, AS); } + NewAttrs.merge(B); + + // Add the new or merged attribute set at this index. + AttrVec.emplace_back(Index, AttributeSet::get(C, NewAttrs)); // Add the remaining entries. for (; I < NumAttrs; ++I) - AttrSet.emplace_back(getSlotIndex(I), pImpl->getSlotNode(I)); - - return get(C, AttrSet); -} + AttrVec.emplace_back(getSlotIndex(I), pImpl->getSlotNode(I)); -AttributeList AttributeList::addAttributes(LLVMContext &C, unsigned Index, - const AttrBuilder &B) const { - return get(C, Index, AttributeSet::get(C, B)); + return get(C, AttrVec); } AttributeList AttributeList::removeAttribute(LLVMContext &C, unsigned Index, diff --git a/unittests/IR/AttributesTest.cpp b/unittests/IR/AttributesTest.cpp index c9c8cb75ebf..7c3df2e19e8 100644 --- a/unittests/IR/AttributesTest.cpp +++ b/unittests/IR/AttributesTest.cpp @@ -56,6 +56,11 @@ TEST(Attributes, AddAttributes) { B.addAttribute(Attribute::NoReturn); AL = AL.addAttributes(C, AttributeList::FunctionIndex, AttributeSet::get(C, B)); EXPECT_TRUE(AL.hasFnAttribute(Attribute::NoReturn)); + B.clear(); + B.addAttribute(Attribute::SExt); + AL = AL.addAttributes(C, AttributeList::ReturnIndex, B); + EXPECT_TRUE(AL.hasAttribute(AttributeList::ReturnIndex, Attribute::SExt)); + EXPECT_TRUE(AL.hasFnAttribute(Attribute::NoReturn)); } } // end anonymous namespace