Decode the LLVM attributes from bitcode using the attributes builder.
authorBill Wendling <isanbard@gmail.com>
Sun, 14 Oct 2012 04:10:01 +0000 (04:10 +0000)
committerBill Wendling <isanbard@gmail.com>
Sun, 14 Oct 2012 04:10:01 +0000 (04:10 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165891 91177308-0d34-0410-b5e6-96231b3b80d8

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

index eb1798fb5ed489913131eb541aa4484e1dd879fb..ce477c8aeb194130fed9d0c4325a0ab48a3fccc4 100644 (file)
@@ -103,6 +103,7 @@ public:
     uint64_t Bits;
   public:
     Builder() : Bits(0) {}
+    explicit Builder(uint64_t B) : Bits(B) {}
     Builder(const Attributes &A) : Bits(A.Raw()) {}
 
     void clear() { Bits = 0; }
@@ -118,6 +119,10 @@ public:
     Builder &addAttribute(Attributes::AttrVal Val);
     Builder &removeAttribute(Attributes::AttrVal Val);
 
+    /// addRawValue - Add the raw value to the internal representation. This
+    /// should be used ONLY for decoding bitcode!
+    Builder &addRawValue(uint64_t Val);
+
     /// addAlignmentAttr - This turns an int alignment (which must be a power of
     /// 2) into the form used internally in Attributes.
     Builder &addAlignmentAttr(unsigned Align);
@@ -266,14 +271,11 @@ public:
     assert((!Alignment || isPowerOf2_32(Alignment)) &&
            "Alignment must be a power of two.");
 
-    Attributes Attrs(EncodedAttrs & 0xffff);
-    if (Alignment) {
-      Attributes::Builder B;
+    Attributes::Builder B(EncodedAttrs & 0xffff);
+    if (Alignment)
       B.addAlignmentAttr(Alignment);
-      Attrs |= Attributes::get(B);
-    }
-    Attrs |= Attributes((EncodedAttrs & (0xfffULL << 32)) >> 11);
-    return Attrs;
+    B.addRawValue((EncodedAttrs & (0xfffULL << 32)) >> 11);
+    return Attributes::get(B);
   }
 
   /// getAsString - The set of Attributes set in Attributes is converted to a
index 5f4b51fc6b8d4c14e95cd42da03657048fbef7d9..4f3200b002f59c817ec12d024930f1cba7b70df5 100644 (file)
@@ -215,6 +215,11 @@ addAttribute(Attributes::AttrVal Val) {
   return *this;
 }
 
+Attributes::Builder &Attributes::Builder::addRawValue(uint64_t Val) {
+  Bits |= Val;
+  return *this;
+}
+
 Attributes::Builder &Attributes::Builder::addAlignmentAttr(unsigned Align) {
   if (Align == 0) return *this;
   assert(isPowerOf2_32(Align) && "Alignment must be a power of two.");