Use iterators instead of relying upon a bitmask of attributes to remove attributes...
authorBill Wendling <isanbard@gmail.com>
Fri, 1 Feb 2013 00:13:50 +0000 (00:13 +0000)
committerBill Wendling <isanbard@gmail.com>
Fri, 1 Feb 2013 00:13:50 +0000 (00:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174123 91177308-0d34-0410-b5e6-96231b3b80d8

lib/IR/Attributes.cpp

index 9d5f53bfdcd69b2c15f9ee16dc607b239719b280..01e0235b5765b203852d61ffab32d808b58b79e8 100644 (file)
@@ -749,7 +749,7 @@ AttributeSet::iterator AttributeSet::begin(unsigned Idx) {
 AttributeSet::iterator AttributeSet::end(unsigned Idx) {
   if (!pImpl)
     return ArrayRef<Attribute>().end();
-  return pImpl->begin(Idx);
+  return pImpl->end(Idx);
 }
 
 //===----------------------------------------------------------------------===//
@@ -852,18 +852,24 @@ AttrBuilder &AttrBuilder::removeAttribute(Attribute::AttrKind Val) {
 }
 
 AttrBuilder &AttrBuilder::removeAttributes(AttributeSet A, uint64_t Index) {
-  uint64_t Mask = A.Raw(Index);
+  unsigned Idx = ~0U;
+  for (unsigned I = 0, E = A.getNumSlots(); I != E; ++I)
+    if (A.getSlotIndex(I) == Index) {
+      Idx = I;
+      break;
+    }
 
-  for (Attribute::AttrKind I = Attribute::None; I != Attribute::EndAttrKinds;
-       I = Attribute::AttrKind(I + 1)) {
-    if (Mask & AttributeImpl::getAttrMask(I)) {
-      Attrs.erase(I);
+  assert(Idx != ~0U && "Couldn't find index in AttributeSet!");
 
-      if (I == Attribute::Alignment)
-        Alignment = 0;
-      else if (I == Attribute::StackAlignment)
-        StackAlignment = 0;
-    }
+  for (AttributeSet::iterator I = A.begin(Idx), E = A.end(Idx); I != E; ++I) {
+    ConstantInt *CI = cast<ConstantInt>(I->getAttributeKind());
+    Attribute::AttrKind Kind = Attribute::AttrKind(CI->getZExtValue());
+    Attrs.erase(Kind);
+
+    if (Kind == Attribute::Alignment)
+      Alignment = 0;
+    else if (Kind == Attribute::StackAlignment)
+      StackAlignment = 0;
   }
 
   return *this;