]> granicus.if.org Git - llvm/commitdiff
Fix off-by-one bug in AttributeList::addAttributes index handling
authorReid Kleckner <rnk@google.com>
Fri, 19 May 2017 22:23:47 +0000 (22:23 +0000)
committerReid Kleckner <rnk@google.com>
Fri, 19 May 2017 22:23:47 +0000 (22:23 +0000)
getParamAlignment expects an argument number, not an AttributeList
index.

Johan Englan, who works on LDC, found this bug and told me about it off
list.

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

lib/IR/Attributes.cpp
unittests/IR/AttributesTest.cpp

index ce60367a6c8bbdd80ddd204c8c1368b0f2879464..adb31d127a2ec3509e971a5e10ee92a3812dd4a9 100644 (file)
@@ -1058,7 +1058,7 @@ AttributeList AttributeList::addAttributes(LLVMContext &C, unsigned Index,
 #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 OldAlign = getAttributes(Index).getAlignment();
   unsigned NewAlign = B.getAlignment();
   assert((!OldAlign || !NewAlign || OldAlign == NewAlign) &&
          "Attempt to change alignment!");
index 0df7a847f8a5636dca01436e0b47e95cf2720cf6..7af4aebd540a516e0d66e18695eb0d5618f19386 100644 (file)
@@ -63,4 +63,23 @@ TEST(Attributes, AddAttributes) {
   EXPECT_TRUE(AL.hasFnAttribute(Attribute::NoReturn));
 }
 
+TEST(Attributes, AddMatchingAlignAttr) {
+  LLVMContext C;
+  AttributeList AL;
+  AL = AL.addAttribute(C, AttributeList::FirstArgIndex,
+                       Attribute::getWithAlignment(C, 8));
+  AL = AL.addAttribute(C, AttributeList::FirstArgIndex + 1,
+                       Attribute::getWithAlignment(C, 32));
+  EXPECT_EQ(8U, AL.getParamAlignment(0));
+  EXPECT_EQ(32U, AL.getParamAlignment(1));
+
+  AttrBuilder B;
+  B.addAttribute(Attribute::NonNull);
+  B.addAlignmentAttr(8);
+  AL = AL.addAttributes(C, AttributeList::FirstArgIndex, B);
+  EXPECT_EQ(8U, AL.getParamAlignment(0));
+  EXPECT_EQ(32U, AL.getParamAlignment(1));
+  EXPECT_TRUE(AL.hasParamAttribute(0, Attribute::NonNull));
+}
+
 } // end anonymous namespace