aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/IR/Attributes.cpp
diff options
context:
space:
mode:
authorNikita Popov <npopov@redhat.com>2022-10-10 13:57:24 +0200
committerNikita Popov <npopov@redhat.com>2022-10-11 10:38:27 +0200
commit256976774f6d41a6f851e5e1dd2da2fddad1377e (patch)
treeb846e5440ba0153bc7f2becc88e7194e87fc054f /llvm/lib/IR/Attributes.cpp
parent24b1340ff96434c272a2a4abd3e70609be577e8a (diff)
downloadllvm-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.cpp22
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) {