Remove a use of AttributeWithIndex.
authorBill Wendling <isanbard@gmail.com>
Mon, 28 Jan 2013 00:21:34 +0000 (00:21 +0000)
committerBill Wendling <isanbard@gmail.com>
Mon, 28 Jan 2013 00:21:34 +0000 (00:21 +0000)
We want to remove AttributeWithIndex because it provides a non-encapsulated view
of the AttributeSetImpl object. Instead, use accessor methods and iterators.

Eventually, this code can be simplified because the Attribute object will hold
only one attribute instead of multiple attributes.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173641 91177308-0d34-0410-b5e6-96231b3b80d8

lib/IR/AttributeImpl.h
lib/IR/Attributes.cpp

index f9a716cb3c0b79de973d4808dcfddab9c85a87e5..8d5de77eed1f581788d0bc37f768ff4817c2993a 100644 (file)
@@ -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);
   }
index 361f3d6c8cc4849036b35d13237200960415de1b..59d3ef03dd83d2da5d2752edd684f601cfaf9c50 100644 (file)
@@ -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)