From: NAKAMURA Takumi Date: Thu, 31 Jan 2013 03:47:28 +0000 (+0000) Subject: Revert r174026, "Remove Attribute::hasAttributes() and make Attribute::hasAttribute... X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=eddab1550ee10cce3bb26a26e88529cb19451aa3;p=oota-llvm.git Revert r174026, "Remove Attribute::hasAttributes() and make Attribute::hasAttribute() private." It broke many hosts to crash. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174035 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/IR/Attributes.h b/include/llvm/IR/Attributes.h index 83588fdf13d..e854da7313e 100644 --- a/include/llvm/IR/Attributes.h +++ b/include/llvm/IR/Attributes.h @@ -107,9 +107,6 @@ private: Attribute(AttributeImpl *A) : pImpl(A) {} static Attribute get(LLVMContext &Context, AttrBuilder &B); - - /// \brief Return true if the attribute is present. - bool hasAttribute(AttrKind Val) const; public: Attribute() : pImpl(0) {} @@ -129,6 +126,12 @@ public: // Attribute Accessors //===--------------------------------------------------------------------===// + /// \brief Return true if the attribute is present. + bool hasAttribute(AttrKind Val) const; + + /// \brief Return true if attributes exist + bool hasAttributes() const; + /// \brief Return the kind of this attribute. Constant *getAttributeKind() const; diff --git a/lib/IR/AttributeImpl.h b/lib/IR/AttributeImpl.h index af9d4fa285c..7be5a162f12 100644 --- a/lib/IR/AttributeImpl.h +++ b/lib/IR/AttributeImpl.h @@ -46,6 +46,7 @@ public: AttributeImpl(LLVMContext &C, StringRef data); bool hasAttribute(Attribute::AttrKind A) const; + bool hasAttributes() const; Constant *getAttributeKind() const { return Kind; } ArrayRef getAttributeValues() const { return Vals; } diff --git a/lib/IR/Attributes.cpp b/lib/IR/Attributes.cpp index 2c84a3d13fe..98c12b5d855 100644 --- a/lib/IR/Attributes.cpp +++ b/lib/IR/Attributes.cpp @@ -82,6 +82,10 @@ bool Attribute::hasAttribute(AttrKind Val) const { return pImpl && pImpl->hasAttribute(Val); } +bool Attribute::hasAttributes() const { + return pImpl && pImpl->hasAttributes(); +} + Constant *Attribute::getAttributeKind() const { return pImpl ? pImpl->getAttributeKind() : 0; } @@ -181,7 +185,7 @@ std::string Attribute::getAsString() const { } bool Attribute::operator==(AttrKind K) const { - return (pImpl && *pImpl == K) || (!pImpl && K == None); + return pImpl && *pImpl == K; } bool Attribute::operator!=(AttrKind K) const { return !(*this == K); @@ -222,6 +226,10 @@ bool AttributeImpl::hasAttribute(Attribute::AttrKind A) const { return (Raw() & getAttrMask(A)) != 0; } +bool AttributeImpl::hasAttributes() const { + return Raw() != 0; +} + uint64_t AttributeImpl::getAlignment() const { uint64_t Mask = Raw() & getAttrMask(Attribute::Alignment); return 1ULL << ((Mask >> 16) - 1); @@ -361,7 +369,7 @@ AttributeSetNode *AttributeSetNode::get(LLVMContext &C, bool AttributeSetNode::hasAttribute(Attribute::AttrKind Kind) const { for (SmallVectorImpl::const_iterator I = AttrList.begin(), E = AttrList.end(); I != E; ++I) - if (*I == Kind) + if (I->hasAttribute(Kind)) return true; return false; } @@ -369,7 +377,7 @@ bool AttributeSetNode::hasAttribute(Attribute::AttrKind Kind) const { unsigned AttributeSetNode::getAlignment() const { for (SmallVectorImpl::const_iterator I = AttrList.begin(), E = AttrList.end(); I != E; ++I) - if (*I == Attribute::Alignment) + if (I->hasAttribute(Attribute::Alignment)) return I->getAlignment(); return 0; } @@ -377,7 +385,7 @@ unsigned AttributeSetNode::getAlignment() const { unsigned AttributeSetNode::getStackAlignment() const { for (SmallVectorImpl::const_iterator I = AttrList.begin(), E = AttrList.end(); I != E; ++I) - if (*I == Attribute::StackAlignment) + if (I->hasAttribute(Attribute::StackAlignment)) return I->getStackAlignment(); return 0; } @@ -446,7 +454,7 @@ AttributeSet AttributeSet::get(LLVMContext &C, for (unsigned i = 0, e = Attrs.size(); i != e; ++i) { assert((!i || Attrs[i-1].first <= Attrs[i].first) && "Misordered Attributes list!"); - assert(Attrs[i].second != Attribute::None && + assert(Attrs[i].second.hasAttributes() && "Pointless attribute!"); } #endif @@ -674,7 +682,7 @@ bool AttributeSet::hasAttrSomewhere(Attribute::AttrKind Attr) const { for (unsigned I = 0, E = pImpl->getNumAttributes(); I != E; ++I) for (AttributeSetImpl::const_iterator II = pImpl->begin(I), IE = pImpl->end(I); II != IE; ++II) - if (*II == Attr) + if (II->hasAttribute(Attr)) return true; return false;