diff --git a/llvm/include/llvm/IR/Attributes.h b/llvm/include/llvm/IR/Attributes.h --- a/llvm/include/llvm/IR/Attributes.h +++ b/llvm/include/llvm/IR/Attributes.h @@ -1096,30 +1096,30 @@ /// invalid if the Kind is not present in the builder. Attribute getAttribute(StringRef Kind) const; - /// Return raw (possibly packed/encoded) value of integer attribute or 0 if + /// Return raw (possibly packed/encoded) value of integer attribute or None if /// not set. - uint64_t getRawIntAttr(Attribute::AttrKind Kind) const; + Optional getRawIntAttr(Attribute::AttrKind Kind) const; /// Retrieve the alignment attribute, if it exists. MaybeAlign getAlignment() const { - return MaybeAlign(getRawIntAttr(Attribute::Alignment)); + return MaybeAlign(getRawIntAttr(Attribute::Alignment).value_or(0)); } /// Retrieve the stack alignment attribute, if it exists. MaybeAlign getStackAlignment() const { - return MaybeAlign(getRawIntAttr(Attribute::StackAlignment)); + return MaybeAlign(getRawIntAttr(Attribute::StackAlignment).value_or(0)); } /// Retrieve the number of dereferenceable bytes, if the /// dereferenceable attribute exists (zero is returned otherwise). uint64_t getDereferenceableBytes() const { - return getRawIntAttr(Attribute::Dereferenceable); + return getRawIntAttr(Attribute::Dereferenceable).value_or(0); } /// Retrieve the number of dereferenceable_or_null bytes, if the /// dereferenceable_or_null attribute exists (zero is returned otherwise). uint64_t getDereferenceableOrNullBytes() const { - return getRawIntAttr(Attribute::DereferenceableOrNull); + return getRawIntAttr(Attribute::DereferenceableOrNull).value_or(0); } /// Retrieve type for the given type attribute. diff --git a/llvm/lib/IR/AttributeImpl.h b/llvm/lib/IR/AttributeImpl.h --- a/llvm/lib/IR/AttributeImpl.h +++ b/llvm/lib/IR/AttributeImpl.h @@ -76,7 +76,7 @@ void Profile(FoldingSetNodeID &ID) const { if (isEnumAttribute()) - Profile(ID, getKindAsEnum(), static_cast(0)); + Profile(ID, getKindAsEnum()); else if (isIntAttribute()) Profile(ID, getKindAsEnum(), getValueAsInt()); else if (isStringAttribute()) @@ -85,10 +85,16 @@ Profile(ID, getKindAsEnum(), getValueAsType()); } + static void Profile(FoldingSetNodeID &ID, Attribute::AttrKind Kind) { + assert(Attribute::isEnumAttrKind(Kind) && "Expected enum attribute"); + ID.AddInteger(Kind); + } + static void Profile(FoldingSetNodeID &ID, Attribute::AttrKind Kind, uint64_t Val) { + assert(Attribute::isIntAttrKind(Kind) && "Expected int attribute"); ID.AddInteger(Kind); - if (Val) ID.AddInteger(Val); + ID.AddInteger(Val); } static void Profile(FoldingSetNodeID &ID, StringRef Kind, StringRef Values) { diff --git a/llvm/lib/IR/Attributes.cpp b/llvm/lib/IR/Attributes.cpp --- a/llvm/lib/IR/Attributes.cpp +++ b/llvm/lib/IR/Attributes.cpp @@ -89,15 +89,17 @@ Attribute Attribute::get(LLVMContext &Context, Attribute::AttrKind Kind, uint64_t Val) { - if (Val) - assert(Attribute::isIntAttrKind(Kind) && "Not an int attribute"); - else - assert(Attribute::isEnumAttrKind(Kind) && "Not an enum attribute"); + bool IsIntAttr = Attribute::isIntAttrKind(Kind); + assert((IsIntAttr || Attribute::isEnumAttrKind(Kind)) && + "Not an enum or int attribute"); LLVMContextImpl *pImpl = Context.pImpl; FoldingSetNodeID ID; ID.AddInteger(Kind); - if (Val) ID.AddInteger(Val); + if (IsIntAttr) + ID.AddInteger(Val); + else + assert(Val == 0 && "Value must be zero for enum attributes"); void *InsertPoint; AttributeImpl *PA = pImpl->AttrsSet.FindNodeOrInsertPos(ID, InsertPoint); @@ -105,7 +107,7 @@ if (!PA) { // If we didn't find any existing attributes of the same shape then create a // new one and insert it. - if (!Val) + if (!IsIntAttr) PA = new (pImpl->Alloc) EnumAttributeImpl(Kind); else PA = new (pImpl->Alloc) IntAttributeImpl(Kind, Val); @@ -1638,10 +1640,12 @@ return *this; } -uint64_t AttrBuilder::getRawIntAttr(Attribute::AttrKind Kind) const { +Optional AttrBuilder::getRawIntAttr(Attribute::AttrKind Kind) const { assert(Attribute::isIntAttrKind(Kind) && "Not an int attribute"); Attribute A = getAttribute(Kind); - return A.isValid() ? A.getValueAsInt() : 0; + if (A.isValid()) + return A.getValueAsInt(); + return None; } AttrBuilder &AttrBuilder::addRawIntAttr(Attribute::AttrKind Kind, @@ -1650,7 +1654,7 @@ } std::pair> AttrBuilder::getAllocSizeArgs() const { - return unpackAllocSizeArgs(getRawIntAttr(Attribute::AllocSize)); + return unpackAllocSizeArgs(getRawIntAttr(Attribute::AllocSize).value_or(0)); } AttrBuilder &AttrBuilder::addAlignmentAttr(MaybeAlign Align) {