diff options
Diffstat (limited to 'unittests/IR/AttributesTest.cpp')
-rw-r--r-- | unittests/IR/AttributesTest.cpp | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/unittests/IR/AttributesTest.cpp b/unittests/IR/AttributesTest.cpp index ab018d845382..dd88cc359343 100644 --- a/unittests/IR/AttributesTest.cpp +++ b/unittests/IR/AttributesTest.cpp @@ -63,6 +63,76 @@ TEST(Attributes, AddAttributes) { EXPECT_TRUE(AL.hasFnAttribute(Attribute::NoReturn)); } +TEST(Attributes, RemoveAlign) { + LLVMContext C; + + Attribute AlignAttr = Attribute::getWithAlignment(C, 8); + Attribute StackAlignAttr = Attribute::getWithStackAlignment(C, 32); + AttrBuilder B_align_readonly; + B_align_readonly.addAttribute(AlignAttr); + B_align_readonly.addAttribute(Attribute::ReadOnly); + AttrBuilder B_align; + B_align.addAttribute(AlignAttr); + AttrBuilder B_stackalign_optnone; + B_stackalign_optnone.addAttribute(StackAlignAttr); + B_stackalign_optnone.addAttribute(Attribute::OptimizeNone); + AttrBuilder B_stackalign; + B_stackalign.addAttribute(StackAlignAttr); + + AttributeSet AS = AttributeSet::get(C, B_align_readonly); + EXPECT_TRUE(AS.getAlignment() == 8); + EXPECT_TRUE(AS.hasAttribute(Attribute::ReadOnly)); + AS = AS.removeAttribute(C, Attribute::Alignment); + EXPECT_FALSE(AS.hasAttribute(Attribute::Alignment)); + EXPECT_TRUE(AS.hasAttribute(Attribute::ReadOnly)); + AS = AttributeSet::get(C, B_align_readonly); + AS = AS.removeAttributes(C, B_align); + EXPECT_TRUE(AS.getAlignment() == 0); + EXPECT_TRUE(AS.hasAttribute(Attribute::ReadOnly)); + + AttributeList AL; + AL = AL.addParamAttributes(C, 0, B_align_readonly); + AL = AL.addAttributes(C, 0, B_stackalign_optnone); + EXPECT_TRUE(AL.hasAttributes(0)); + EXPECT_TRUE(AL.hasAttribute(0, Attribute::StackAlignment)); + EXPECT_TRUE(AL.hasAttribute(0, Attribute::OptimizeNone)); + EXPECT_TRUE(AL.getStackAlignment(0) == 32); + EXPECT_TRUE(AL.hasParamAttrs(0)); + EXPECT_TRUE(AL.hasParamAttr(0, Attribute::Alignment)); + EXPECT_TRUE(AL.hasParamAttr(0, Attribute::ReadOnly)); + EXPECT_TRUE(AL.getParamAlignment(0) == 8); + + AL = AL.removeParamAttribute(C, 0, Attribute::Alignment); + EXPECT_FALSE(AL.hasParamAttr(0, Attribute::Alignment)); + EXPECT_TRUE(AL.hasParamAttr(0, Attribute::ReadOnly)); + EXPECT_TRUE(AL.hasAttribute(0, Attribute::StackAlignment)); + EXPECT_TRUE(AL.hasAttribute(0, Attribute::OptimizeNone)); + EXPECT_TRUE(AL.getStackAlignment(0) == 32); + + AL = AL.removeAttribute(C, 0, Attribute::StackAlignment); + EXPECT_FALSE(AL.hasParamAttr(0, Attribute::Alignment)); + EXPECT_TRUE(AL.hasParamAttr(0, Attribute::ReadOnly)); + EXPECT_FALSE(AL.hasAttribute(0, Attribute::StackAlignment)); + EXPECT_TRUE(AL.hasAttribute(0, Attribute::OptimizeNone)); + + AttributeList AL2; + AL2 = AL2.addParamAttributes(C, 0, B_align_readonly); + AL2 = AL2.addAttributes(C, 0, B_stackalign_optnone); + + AL2 = AL2.removeParamAttributes(C, 0, B_align); + EXPECT_FALSE(AL2.hasParamAttr(0, Attribute::Alignment)); + EXPECT_TRUE(AL2.hasParamAttr(0, Attribute::ReadOnly)); + EXPECT_TRUE(AL2.hasAttribute(0, Attribute::StackAlignment)); + EXPECT_TRUE(AL2.hasAttribute(0, Attribute::OptimizeNone)); + EXPECT_TRUE(AL2.getStackAlignment(0) == 32); + + AL2 = AL2.removeAttributes(C, 0, B_stackalign); + EXPECT_FALSE(AL2.hasParamAttr(0, Attribute::Alignment)); + EXPECT_TRUE(AL2.hasParamAttr(0, Attribute::ReadOnly)); + EXPECT_FALSE(AL2.hasAttribute(0, Attribute::StackAlignment)); + EXPECT_TRUE(AL2.hasAttribute(0, Attribute::OptimizeNone)); +} + TEST(Attributes, AddMatchingAlignAttr) { LLVMContext C; AttributeList AL; @@ -89,4 +159,12 @@ TEST(Attributes, EmptyGet) { EXPECT_TRUE(AL.isEmpty()); } +TEST(Attributes, OverflowGet) { + LLVMContext C; + std::pair<unsigned, Attribute> Attrs[] = { { AttributeList::ReturnIndex, Attribute::get(C, Attribute::SExt) }, + { AttributeList::FunctionIndex, Attribute::get(C, Attribute::ReadOnly) } }; + AttributeList AL = AttributeList::get(C, Attrs); + EXPECT_EQ(2U, AL.getNumAttrSets()); +} + } // end anonymous namespace |