Use a ::get method to create the attribute from Attributes::AttrVals instead of a...
authorBill Wendling <isanbard@gmail.com>
Mon, 15 Oct 2012 06:53:28 +0000 (06:53 +0000)
committerBill Wendling <isanbard@gmail.com>
Mon, 15 Oct 2012 06:53:28 +0000 (06:53 +0000)
llvm-svn: 165923

llvm/include/llvm/Attributes.h
llvm/lib/VMCore/Attributes.cpp

index afb2e56..d0833c3 100644 (file)
@@ -89,17 +89,26 @@ public:
   };
 private:
   AttributesImpl *Attrs;
-
-  explicit Attributes(AttributesImpl *A);
+  Attributes(AttributesImpl *A);
 public:
   Attributes() : Attrs(0) {}
-  explicit Attributes(LLVMContext &C, ArrayRef<AttrVal> 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<AttrVal> 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;
   }
 
index fc5884b..e81bf3c 100644 (file)
@@ -28,18 +28,18 @@ using namespace llvm;
 // Attributes Implementation
 //===----------------------------------------------------------------------===//
 
-Attributes::Attributes(LLVMContext &C, ArrayRef<AttrVal> Vals) {
+Attributes::Attributes(AttributesImpl *A) : Attrs(A) {}
+
+Attributes::Attributes(const Attributes &A) : Attrs(A.Attrs) {}
+
+Attributes Attributes::get(LLVMContext &Context, ArrayRef<AttrVal> Vals) {
   Attributes::Builder B;
   for (ArrayRef<AttrVal>::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;
 }