From a19a53065fcaa6fafce902efde38fcae7b0bdea4 Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Sun, 14 Oct 2012 04:10:01 +0000 Subject: [PATCH] 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 --- include/llvm/Attributes.h | 16 +++++++++------- 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 eb1798fb5ed..ce477c8aeb1 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 5f4b51fc6b8..4f3200b002f 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."); -- 2.34.1