From 79d45dbbf91df0b0d9c9b8c04a551bf652730bce Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Mon, 15 Oct 2012 06:53:28 +0000 Subject: [PATCH] Use a ::get method to create the attribute from Attributes::AttrVals instead of a constructor. llvm-svn: 165923 --- llvm/include/llvm/Attributes.h | 29 +++++++++++++++++------------ llvm/lib/VMCore/Attributes.cpp | 15 +++++++-------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/llvm/include/llvm/Attributes.h b/llvm/include/llvm/Attributes.h index afb2e56..d0833c3 100644 --- a/llvm/include/llvm/Attributes.h +++ b/llvm/include/llvm/Attributes.h @@ -89,17 +89,26 @@ public: }; private: AttributesImpl *Attrs; - - explicit Attributes(AttributesImpl *A); + Attributes(AttributesImpl *A); public: Attributes() : Attrs(0) {} - explicit Attributes(LLVMContext &C, ArrayRef Vals); Attributes(const Attributes &A); Attributes &operator=(const Attributes &A) { Attrs = A.Attrs; return *this; } + /// get - Return a uniquified Attributes object. This takes the uniquified + /// value from the Builder and wraps it in the Attributes class. + class Builder; + static Attributes get(LLVMContext &Context, ArrayRef Vals); + static Attributes get(LLVMContext &Context, Builder &B); + + //===--------------------------------------------------------------------===// + /// Attributes::Builder - This class is used in conjunction with the + /// Attributes::get method to create an Attributes object. The object itself + /// is uniquified. The Builder's value, however, is not. So this can be used + /// as a quick way to test for equality, presence of attributes, etc. class Builder { friend class Attributes; uint64_t Bits; @@ -122,6 +131,9 @@ public: Builder &addAttribute(Attributes::AttrVal Val); Builder &removeAttribute(Attributes::AttrVal Val); + Builder &addAttributes(const Attributes &A); + Builder &removeAttributes(const Attributes &A); + /// addRawValue - Add the raw value to the internal representation. This /// should be used ONLY for decoding bitcode! Builder &addRawValue(uint64_t Val); @@ -134,9 +146,6 @@ 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. void removeFunctionOnlyAttrs() { removeAttribute(Attributes::NoReturn) @@ -167,10 +176,6 @@ public: } }; - /// get - Return a uniquified Attributes object. This takes the uniquified - /// value from the Builder and wraps it in the Attributes class. - static Attributes get(LLVMContext &Context, Builder &B); - /// @brief Return true if the attribute is present. bool hasAttribute(AttrVal Val) const; @@ -224,10 +229,10 @@ public: hasAttribute(Attributes::AddressSafety); } - bool operator == (const Attributes &A) const { + bool operator==(const Attributes &A) const { return Attrs == A.Attrs; } - bool operator != (const Attributes &A) const { + bool operator!=(const Attributes &A) const { return Attrs != A.Attrs; } diff --git a/llvm/lib/VMCore/Attributes.cpp b/llvm/lib/VMCore/Attributes.cpp index fc5884b..e81bf3c 100644 --- a/llvm/lib/VMCore/Attributes.cpp +++ b/llvm/lib/VMCore/Attributes.cpp @@ -28,18 +28,18 @@ using namespace llvm; // Attributes Implementation //===----------------------------------------------------------------------===// -Attributes::Attributes(LLVMContext &C, ArrayRef Vals) { +Attributes::Attributes(AttributesImpl *A) : Attrs(A) {} + +Attributes::Attributes(const Attributes &A) : Attrs(A.Attrs) {} + +Attributes Attributes::get(LLVMContext &Context, ArrayRef Vals) { Attributes::Builder B; for (ArrayRef::iterator I = Vals.begin(), E = Vals.end(); I != E; ++I) B.addAttribute(*I); - Attrs = Attributes::get(C, B).Attrs; + return Attributes::get(Context, B); } -Attributes::Attributes(AttributesImpl *A) : Attrs(A) {} - -Attributes::Attributes(const Attributes &A) : Attrs(A.Attrs) {} - Attributes Attributes::get(LLVMContext &Context, Attributes::Builder &B) { // If there are no attributes, return an empty Attributes class. if (B.Bits == 0) @@ -186,8 +186,7 @@ std::string Attributes::getAsString() const { // Attributes::Builder Implementation //===----------------------------------------------------------------------===// -Attributes::Builder &Attributes::Builder:: -addAttribute(Attributes::AttrVal Val) { +Attributes::Builder &Attributes::Builder::addAttribute(Attributes::AttrVal Val){ Bits |= AttributesImpl::getAttrMask(Val); return *this; } -- 2.7.4