From bf6b3b1564f1846c5c729b582b4bc3f97d946770 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Fri, 19 May 2017 22:23:47 +0000 Subject: [PATCH] Fix off-by-one bug in AttributeList::addAttributes index handling 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. llvm-svn: 303458 --- llvm/lib/IR/Attributes.cpp | 2 +- llvm/unittests/IR/AttributesTest.cpp | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/llvm/lib/IR/Attributes.cpp b/llvm/lib/IR/Attributes.cpp index ce60367..adb31d1 100644 --- a/llvm/lib/IR/Attributes.cpp +++ b/llvm/lib/IR/Attributes.cpp @@ -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!"); diff --git a/llvm/unittests/IR/AttributesTest.cpp b/llvm/unittests/IR/AttributesTest.cpp index 0df7a84..7af4aeb 100644 --- a/llvm/unittests/IR/AttributesTest.cpp +++ b/llvm/unittests/IR/AttributesTest.cpp @@ -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 -- 2.7.4