diff options
author | Nikita Popov <npopov@redhat.com> | 2022-10-10 13:57:24 +0200 |
---|---|---|
committer | Nikita Popov <npopov@redhat.com> | 2022-10-11 10:38:27 +0200 |
commit | 256976774f6d41a6f851e5e1dd2da2fddad1377e (patch) | |
tree | b846e5440ba0153bc7f2becc88e7194e87fc054f /llvm/lib/IR/Attributes.cpp | |
parent | 24b1340ff96434c272a2a4abd3e70609be577e8a (diff) | |
download | llvm-256976774f6d41a6f851e5e1dd2da2fddad1377e.zip llvm-256976774f6d41a6f851e5e1dd2da2fddad1377e.tar.gz llvm-256976774f6d41a6f851e5e1dd2da2fddad1377e.tar.bz2 |
[Attributes] Support int attributes with zero value
This regularly comes up as a stumbling stone when adding int
attributes: They currently need to be encoded in a way to avoids
the zero value.
This adds support for zero-value int attributes by a) making the
ctor determine int/enum attribute based on attribute kind, not
whether the value is non-zero and b) switching getRawIntAttr()
to return an Optional, so that it's possible to distinguish a zero
value from non-existence.
Differential Revision: https://reviews.llvm.org/D135572
Diffstat (limited to 'llvm/lib/IR/Attributes.cpp')
-rw-r--r-- | llvm/lib/IR/Attributes.cpp | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/llvm/lib/IR/Attributes.cpp b/llvm/lib/IR/Attributes.cpp index cbd299c..256d81f 100644 --- a/llvm/lib/IR/Attributes.cpp +++ b/llvm/lib/IR/Attributes.cpp @@ -89,15 +89,17 @@ unpackVScaleRangeArgs(uint64_t Value) { 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 @@ Attribute Attribute::get(LLVMContext &Context, Attribute::AttrKind Kind, 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 @@ AttrBuilder &AttrBuilder::removeAttribute(StringRef A) { return *this; } -uint64_t AttrBuilder::getRawIntAttr(Attribute::AttrKind Kind) const { +Optional<uint64_t> 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 @@ AttrBuilder &AttrBuilder::addRawIntAttr(Attribute::AttrKind Kind, } std::pair<unsigned, Optional<unsigned>> AttrBuilder::getAllocSizeArgs() const { - return unpackAllocSizeArgs(getRawIntAttr(Attribute::AllocSize)); + return unpackAllocSizeArgs(getRawIntAttr(Attribute::AllocSize).value_or(0)); } AttrBuilder &AttrBuilder::addAlignmentAttr(MaybeAlign Align) { |