From: Bill Wendling Date: Wed, 6 Feb 2013 01:33:42 +0000 (+0000) Subject: Add a 'StringRef' version of hasAttribute. X-Git-Tag: android-x86-6.0-r1~167^2~718 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=c342d9d345acdbd95577c7c6e9ce7d3a1bdb57bf;p=android-x86%2Fexternal-llvm.git Add a 'StringRef' version of hasAttribute. Fix the 'operator==' and 'hasAttributes' queries to take into account target-dependent attributes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174481 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/IR/Attributes.h b/include/llvm/IR/Attributes.h index d0fe2e15bc7..e73be5db22f 100644 --- a/include/llvm/IR/Attributes.h +++ b/include/llvm/IR/Attributes.h @@ -404,6 +404,10 @@ public: /// \brief Return true if the builder has the specified attribute. bool contains(Attribute::AttrKind A) const; + /// \brief Return true if the builder has the specified target-dependent + /// attribute. + bool contains(StringRef A) const; + /// \brief Return true if the builder has IR-level attributes. bool hasAttributes() const; diff --git a/lib/IR/Attributes.cpp b/lib/IR/Attributes.cpp index 67ab4eaa699..99fafae88e8 100644 --- a/lib/IR/Attributes.cpp +++ b/lib/IR/Attributes.cpp @@ -977,8 +977,12 @@ bool AttrBuilder::contains(Attribute::AttrKind A) const { return Attrs.count(A); } +bool AttrBuilder::contains(StringRef A) const { + return TargetDepAttrs.find(A) != TargetDepAttrs.end(); +} + bool AttrBuilder::hasAttributes() const { - return !Attrs.empty(); + return !Attrs.empty() || !TargetDepAttrs.empty(); } bool AttrBuilder::hasAttributes(AttributeSet A, uint64_t Index) const { @@ -1005,9 +1009,17 @@ bool AttrBuilder::hasAlignmentAttr() const { } bool AttrBuilder::operator==(const AttrBuilder &B) { - SmallVector This(Attrs.begin(), Attrs.end()); - SmallVector That(B.Attrs.begin(), B.Attrs.end()); - return This == That; + for (DenseSet::iterator I = Attrs.begin(), + E = Attrs.end(); I != E; ++I) + if (!B.Attrs.count(*I)) + return false; + + for (td_const_iterator I = TargetDepAttrs.begin(), + E = TargetDepAttrs.end(); I != E; ++I) + if (B.TargetDepAttrs.find(I->first) == B.TargetDepAttrs.end()) + return false; + + return Alignment == B.Alignment && StackAlignment == B.StackAlignment; } AttrBuilder &AttrBuilder::addRawValue(uint64_t Val) {