diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2013-02-18 12:09:51 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2013-02-18 12:09:51 +0000 |
commit | 3f213e7b3a6829a154d4e8ceb7d8689b389bd5dc (patch) | |
tree | ba9c46607076d86d28e413ff7b40378bc254ae28 | |
parent | 32d0b2a9e8fd29c12ceea164db953767dd199b1f (diff) | |
download | external_llvm-3f213e7b3a6829a154d4e8ceb7d8689b389bd5dc.zip external_llvm-3f213e7b3a6829a154d4e8ceb7d8689b389bd5dc.tar.gz external_llvm-3f213e7b3a6829a154d4e8ceb7d8689b389bd5dc.tar.bz2 |
Futureproof AttrBuild if we ever have more than 64 attr enum values.
Currently we're at 34. Bitset should compile into virtually the same code as
uint64_t here.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175437 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/IR/Attributes.h | 10 | ||||
-rw-r--r-- | lib/IR/Attributes.cpp | 26 |
2 files changed, 17 insertions, 19 deletions
diff --git a/include/llvm/IR/Attributes.h b/include/llvm/IR/Attributes.h index c0a34a0..380bc6a 100644 --- a/include/llvm/IR/Attributes.h +++ b/include/llvm/IR/Attributes.h @@ -19,6 +19,7 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/FoldingSet.h" #include "llvm/Support/PointerLikeTypeTraits.h" +#include <bitset> #include <cassert> #include <map> #include <string> @@ -378,7 +379,7 @@ template<> struct DenseMapInfo<AttributeSet> { /// value, however, is not. So this can be used as a quick way to test for /// equality, presence of attributes, etc. class AttrBuilder { - uint64_t Attrs; + std::bitset<Attribute::EndAttrKinds> Attrs; std::map<std::string, std::string> TargetDepAttrs; uint64_t Alignment; uint64_t StackAlignment; @@ -422,9 +423,8 @@ public: /// \brief Return true if the builder has the specified attribute. bool contains(Attribute::AttrKind A) const { - assert((unsigned)A < 64 && A < Attribute::EndAttrKinds && - "Attribute out of range!"); - return Attrs & (1ULL << A); + assert((unsigned)A < Attribute::EndAttrKinds && "Attribute out of range!"); + return Attrs[A]; } /// \brief Return true if the builder has the specified target-dependent @@ -457,7 +457,7 @@ public: /// \brief Return true if the builder contains no target-independent /// attributes. - bool empty() const { return Attrs == 0; } + bool empty() const { return Attrs.none(); } // Iterators for target-dependent attributes. typedef std::pair<std::string, std::string> td_type; diff --git a/lib/IR/Attributes.cpp b/lib/IR/Attributes.cpp index 77a1c82..d89ebc5 100644 --- a/lib/IR/Attributes.cpp +++ b/lib/IR/Attributes.cpp @@ -924,16 +924,15 @@ AttrBuilder::AttrBuilder(AttributeSet AS, unsigned Idx) } void AttrBuilder::clear() { - Attrs = 0; + Attrs.reset(); Alignment = StackAlignment = 0; } AttrBuilder &AttrBuilder::addAttribute(Attribute::AttrKind Val) { - assert((unsigned)Val < 64 && Val < Attribute::EndAttrKinds && - "Attribute out of range!"); + assert((unsigned)Val < Attribute::EndAttrKinds && "Attribute out of range!"); assert(Val != Attribute::Alignment && Val != Attribute::StackAlignment && "Adding alignment attribute without adding alignment value!"); - Attrs |= 1ULL << Val; + Attrs[Val] = true; return *this; } @@ -944,7 +943,7 @@ AttrBuilder &AttrBuilder::addAttribute(Attribute Attr) { } Attribute::AttrKind Kind = Attr.getKindAsEnum(); - Attrs |= 1ULL << Kind; + Attrs[Kind] = true; if (Kind == Attribute::Alignment) Alignment = Attr.getAlignment(); @@ -959,9 +958,8 @@ AttrBuilder &AttrBuilder::addAttribute(StringRef A, StringRef V) { } AttrBuilder &AttrBuilder::removeAttribute(Attribute::AttrKind Val) { - assert((unsigned)Val < 64 && Val < Attribute::EndAttrKinds && - "Attribute out of range!"); - Attrs &= ~(1ULL << Val); + assert((unsigned)Val < Attribute::EndAttrKinds && "Attribute out of range!"); + Attrs[Val] = false; if (Val == Attribute::Alignment) Alignment = 0; @@ -985,7 +983,7 @@ AttrBuilder &AttrBuilder::removeAttributes(AttributeSet A, uint64_t Index) { Attribute Attr = *I; if (Attr.isEnumAttribute() || Attr.isAlignAttribute()) { Attribute::AttrKind Kind = I->getKindAsEnum(); - Attrs &= ~(1ULL << Kind); + Attrs[Kind] = false; if (Kind == Attribute::Alignment) Alignment = 0; @@ -1016,7 +1014,7 @@ AttrBuilder &AttrBuilder::addAlignmentAttr(unsigned Align) { assert(isPowerOf2_32(Align) && "Alignment must be a power of two."); assert(Align <= 0x40000000 && "Alignment too large."); - Attrs |= 1ULL << Attribute::Alignment; + Attrs[Attribute::Alignment] = true; Alignment = Align; return *this; } @@ -1028,7 +1026,7 @@ AttrBuilder &AttrBuilder::addStackAlignmentAttr(unsigned Align) { assert(isPowerOf2_32(Align) && "Alignment must be a power of two."); assert(Align <= 0x100 && "Alignment too large."); - Attrs |= 1ULL << Attribute::StackAlignment; + Attrs[Attribute::StackAlignment] = true; StackAlignment = Align; return *this; } @@ -1055,7 +1053,7 @@ bool AttrBuilder::contains(StringRef A) const { } bool AttrBuilder::hasAttributes() const { - return Attrs != 0 || !TargetDepAttrs.empty(); + return !Attrs.none() || !TargetDepAttrs.empty(); } bool AttrBuilder::hasAttributes(AttributeSet A, uint64_t Index) const { @@ -1072,7 +1070,7 @@ bool AttrBuilder::hasAttributes(AttributeSet A, uint64_t Index) const { I != E; ++I) { Attribute Attr = *I; if (Attr.isEnumAttribute() || Attr.isAlignAttribute()) { - if (Attrs & (1ULL << I->getKindAsEnum())) + if (Attrs[I->getKindAsEnum()]) return true; } else { assert(Attr.isStringAttribute() && "Invalid attribute kind!"); @@ -1106,7 +1104,7 @@ AttrBuilder &AttrBuilder::addRawValue(uint64_t Val) { for (Attribute::AttrKind I = Attribute::None; I != Attribute::EndAttrKinds; I = Attribute::AttrKind(I + 1)) { if (uint64_t A = (Val & AttributeImpl::getAttrMask(I))) { - Attrs |= 1ULL << I; + Attrs[I] = true; if (I == Attribute::Alignment) Alignment = 1ULL << ((A >> 16) - 1); |