/// 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<uint64_t> 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.
void Profile(FoldingSetNodeID &ID) const {
if (isEnumAttribute())
- Profile(ID, getKindAsEnum(), static_cast<uint64_t>(0));
+ Profile(ID, getKindAsEnum());
else if (isIntAttribute())
Profile(ID, getKindAsEnum(), getValueAsInt());
else if (isStringAttribute())
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) {
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);
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);
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,
}
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) {