diff options
author | Bill Wendling <isanbard@gmail.com> | 2012-10-14 04:10:01 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2012-10-14 04:10:01 +0000 |
commit | a19a53065fcaa6fafce902efde38fcae7b0bdea4 (patch) | |
tree | f29295c60f996690e088112664d7474ee99596f2 | |
parent | da3f9d8edc5b3e0a3e0b94257c63e24215a85653 (diff) | |
download | external_llvm-a19a53065fcaa6fafce902efde38fcae7b0bdea4.zip external_llvm-a19a53065fcaa6fafce902efde38fcae7b0bdea4.tar.gz external_llvm-a19a53065fcaa6fafce902efde38fcae7b0bdea4.tar.bz2 |
Decode the LLVM attributes from bitcode using the attributes builder.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165891 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Attributes.h | 16 | ||||
-rw-r--r-- | lib/VMCore/Attributes.cpp | 5 |
2 files changed, 14 insertions, 7 deletions
diff --git a/include/llvm/Attributes.h b/include/llvm/Attributes.h index eb1798f..ce477c8 100644 --- a/include/llvm/Attributes.h +++ b/include/llvm/Attributes.h @@ -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 diff --git a/lib/VMCore/Attributes.cpp b/lib/VMCore/Attributes.cpp index 5f4b51f..4f3200b 100644 --- a/lib/VMCore/Attributes.cpp +++ b/lib/VMCore/Attributes.cpp @@ -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."); |