diff --git a/include/llvm/Attributes.h b/include/llvm/Attributes.h index c8f723a7dcf..268fc5a8e1c 100644 --- a/include/llvm/Attributes.h +++ b/include/llvm/Attributes.h @@ -131,6 +131,7 @@ public: /// a power of 2) into the form used internally in Attributes. Builder &addStackAlignmentAttr(unsigned Align); + Builder &addAttributes(const Attributes &A); Builder &removeAttributes(const Attributes &A); /// @brief Remove attributes that are used on functions only. @@ -234,7 +235,6 @@ public: return Attrs.Bits != A.Attrs.Bits; } - Attributes operator | (const Attributes &A) const; Attributes operator & (const Attributes &A) const; Attributes &operator |= (const Attributes &A); Attributes &operator &= (const Attributes &A); diff --git a/lib/VMCore/Attributes.cpp b/lib/VMCore/Attributes.cpp index e70efc54fa7..0f24f97f836 100644 --- a/lib/VMCore/Attributes.cpp +++ b/lib/VMCore/Attributes.cpp @@ -93,9 +93,6 @@ bool Attributes::isEmptyOrSingleton() const { return Attrs.isEmptyOrSingleton(); } -Attributes Attributes::operator | (const Attributes &A) const { - return Attributes(Raw() | A.Raw()); -} Attributes Attributes::operator & (const Attributes &A) const { return Attributes(Raw() & A.Raw()); } @@ -236,8 +233,12 @@ removeAttribute(Attributes::AttrVal Val) { return *this; } -Attributes::Builder &Attributes::Builder:: -removeAttributes(const Attributes &A) { +Attributes::Builder &Attributes::Builder::addAttributes(const Attributes &A) { + Bits |= A.Raw(); + return *this; +} + +Attributes::Builder &Attributes::Builder::removeAttributes(const Attributes &A){ Bits &= ~A.Raw(); return *this; } @@ -514,8 +515,9 @@ AttrListPtr AttrListPtr::addAttr(unsigned Idx, Attributes Attrs) const { "Attempt to change alignment!"); #endif - Attributes NewAttrs = OldAttrs | Attrs; - if (NewAttrs == OldAttrs) + Attributes::Builder NewAttrs = + Attributes::Builder(OldAttrs).addAttributes(Attrs); + if (NewAttrs == Attributes::Builder(OldAttrs)) return *this; SmallVector NewAttrList;