diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/IR/AttributeImpl.h | 20 | ||||
-rw-r--r-- | lib/IR/Attributes.cpp | 26 |
2 files changed, 33 insertions, 13 deletions
diff --git a/lib/IR/AttributeImpl.h b/lib/IR/AttributeImpl.h index f9a716c..8d5de77 100644 --- a/lib/IR/AttributeImpl.h +++ b/lib/IR/AttributeImpl.h @@ -117,7 +117,8 @@ class AttributeSetImpl : public FoldingSetNode { LLVMContext &Context; SmallVector<AttributeWithIndex, 4> AttrList; - SmallVector<std::pair<uint64_t, AttributeSetNode*>, 4> AttrNodes; + typedef std::pair<uint64_t, AttributeSetNode*> IndexAttrPair; + SmallVector<IndexAttrPair, 4> AttrNodes; // AttributesSet is uniqued, these should not be publicly available. void operator=(const AttributeSetImpl &) LLVM_DELETED_FUNCTION; @@ -137,7 +138,9 @@ public: /// is the index of the return, parameter, or function object that the /// attributes are applied to, not the index into the AttrNodes list where the /// attributes reside. - uint64_t getSlotIndex(unsigned Slot) const { return AttrNodes[Slot].first; } + uint64_t getSlotIndex(unsigned Slot) const { + return AttrNodes[Slot].first; + } /// \brief Retrieve the attributes for the given "slot" in the AttrNode list. /// \p Slot is an index into the AttrNodes list, not the index of the return / @@ -147,6 +150,19 @@ public: return AttributeSet::get(Context, AttrList[Slot]); } + typedef AttributeSetNode::iterator iterator; + typedef AttributeSetNode::const_iterator const_iterator; + + iterator begin(unsigned Idx) + { return AttrNodes[Idx].second->begin(); } + iterator end(unsigned Idx) + { return AttrNodes[Idx].second->end(); } + + const_iterator begin(unsigned Idx) const + { return AttrNodes[Idx].second->begin(); } + const_iterator end(unsigned Idx) const + { return AttrNodes[Idx].second->end(); } + void Profile(FoldingSetNodeID &ID) const { Profile(ID, AttrList); } diff --git a/lib/IR/Attributes.cpp b/lib/IR/Attributes.cpp index 361f3d6..59d3ef0 100644 --- a/lib/IR/Attributes.cpp +++ b/lib/IR/Attributes.cpp @@ -197,17 +197,21 @@ AttrBuilder::AttrBuilder(AttributeSet AS, unsigned Idx) AttributeSetImpl *pImpl = AS.pImpl; if (!pImpl) return; - ArrayRef<AttributeWithIndex> AttrList = pImpl->getAttributes(); - const AttributeWithIndex *AWI = 0; - for (unsigned I = 0, E = AttrList.size(); I != E; ++I) - if (AttrList[I].Index == Idx) { - AWI = &AttrList[I]; - break; - } + AttrBuilder B; + + for (unsigned I = 0, E = pImpl->getNumAttributes(); I != E; ++I) { + if (pImpl->getSlotIndex(I) != Idx) continue; + + for (AttributeSetNode::const_iterator II = pImpl->begin(I), + IE = pImpl->end(I); II != IE; ++II) + B.addAttributes(*II); + + break; + } - if (!AWI) return; + if (!B.hasAttributes()) return; - uint64_t Mask = AWI->Attrs.Raw(); + uint64_t Mask = B.Raw(); for (Attribute::AttrKind I = Attribute::None; I != Attribute::EndAttrKinds; I = Attribute::AttrKind(I + 1)) { @@ -861,8 +865,8 @@ AttributeSet AttributeSet::removeAttr(LLVMContext &C, unsigned Idx, } void AttributeSet::dump() const { - dbgs() << "PAL[ "; - for (unsigned i = 0; i < getNumSlots(); ++i) { + dbgs() << "PAL[\n"; + for (unsigned i = 0, e = getNumSlots(); i < e; ++i) { uint64_t Index = getSlotIndex(i); dbgs() << " { "; if (Index == ~0U) |