15#ifndef LLVM_IR_ATTRIBUTES_H
16#define LLVM_IR_ATTRIBUTES_H
23#include "llvm/Config/llvm-config.h"
72 assert(DeadBytes.has_value() &&
73 "This attribute does not specify a byte count. Did you forget to "
74 "check if the attribute covers all reachable memory?");
75 return DeadBytes.value();
81 if (
Data == std::numeric_limits<uint64_t>::max())
87 if (DeadBytes.has_value())
88 return DeadBytes.value();
89 return std::numeric_limits<uint64_t>::max();
93 return DeadBytes.has_value() && DeadBytes.value() == 0;
97 std::optional<uint64_t> DeadBytes;
128 #define GET_ATTR_ENUM
129 #include "llvm/IR/Attributes.inc"
140 return Kind >= FirstEnumAttr && Kind <= LastEnumAttr;
143 return Kind >= FirstIntAttr && Kind <= LastIntAttr;
146 return Kind >= FirstTypeAttr && Kind <= LastTypeAttr;
149 return Kind >= FirstConstantRangeAttr && Kind <= LastConstantRangeAttr;
152 return Kind >= FirstConstantRangeListAttr &&
153 Kind <= LastConstantRangeListAttr;
200 const std::optional<unsigned> &NumElemsArg);
329 LLVM_ABI std::pair<unsigned, std::optional<unsigned>>
408 friend AttributeListImpl;
430 bool operator==(
const AttributeSet &O)
const {
return SetNode == O.SetNode; }
431 bool operator!=(
const AttributeSet &O)
const {
return !(*
this == O); }
451 const AttrBuilder &
B)
const;
471 [[nodiscard]]
LLVM_ABI std::optional<AttributeSet>
503 LLVM_ABI std::optional<std::pair<unsigned, std::optional<unsigned>>>
521#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
537namespace hashing::detail {
543static_assert(std::has_unique_object_representations_v<Attribute> &&
544 std::has_unique_object_representations_v<AttributeSet>,
545 "hashing the bytes requires unique object representations");
558 enum AttrIndex :
unsigned {
565 friend class AttrBuilder;
569 template <
typename Ty,
typename Enable>
friend struct DenseMapInfo;
591 static AttributeList getImpl(LLVMContext &
C, ArrayRef<AttributeSet> AttrSets);
594 AttributeList() =
default;
601 LLVM_ABI static AttributeList get(LLVMContext &
C,
602 ArrayRef<AttributeList> Attrs);
603 LLVM_ABI static AttributeList get(LLVMContext &
C,
unsigned Index,
604 ArrayRef<Attribute::AttrKind> Kinds);
605 LLVM_ABI static AttributeList get(LLVMContext &
C,
unsigned Index,
606 ArrayRef<Attribute::AttrKind> Kinds,
607 ArrayRef<uint64_t> Values);
608 LLVM_ABI static AttributeList get(LLVMContext &
C,
unsigned Index,
609 ArrayRef<StringRef> Kind);
610 LLVM_ABI static AttributeList get(LLVMContext &
C,
unsigned Index,
612 LLVM_ABI static AttributeList get(LLVMContext &
C,
unsigned Index,
613 const AttrBuilder &
B);
617 [[nodiscard]]
LLVM_ABI AttributeList setAttributesAtIndex(
618 LLVMContext &
C,
unsigned Index, AttributeSet Attrs)
const;
623 [[nodiscard]]
LLVM_ABI AttributeList addAttributeAtIndex(
624 LLVMContext &
C,
unsigned Index, Attribute::AttrKind Kind)
const;
628 [[nodiscard]]
LLVM_ABI AttributeList
629 addAttributeAtIndex(LLVMContext &
C,
unsigned Index, StringRef Kind,
630 StringRef Value = StringRef())
const;
634 [[nodiscard]]
LLVM_ABI AttributeList addAttributeAtIndex(LLVMContext &
C,
640 [[nodiscard]]
LLVM_ABI AttributeList addAttributesAtIndex(
641 LLVMContext &
C,
unsigned Index,
const AttrBuilder &
B)
const;
645 [[nodiscard]] AttributeList addFnAttribute(LLVMContext &
C,
646 Attribute::AttrKind Kind)
const {
647 return addAttributeAtIndex(
C, FunctionIndex, Kind);
652 [[nodiscard]] AttributeList addFnAttribute(LLVMContext &
C,
653 Attribute Attr)
const {
654 return addAttributeAtIndex(
C, FunctionIndex, Attr);
659 [[nodiscard]] AttributeList
660 addFnAttribute(LLVMContext &
C, StringRef Kind,
661 StringRef
Value = StringRef())
const {
662 return addAttributeAtIndex(
C, FunctionIndex, Kind,
Value);
667 [[nodiscard]] AttributeList addFnAttributes(LLVMContext &
C,
668 const AttrBuilder &
B)
const {
669 return addAttributesAtIndex(
C, FunctionIndex,
B);
674 [[nodiscard]] AttributeList addRetAttribute(LLVMContext &
C,
675 Attribute::AttrKind Kind)
const {
676 return addAttributeAtIndex(
C, ReturnIndex, Kind);
681 [[nodiscard]] AttributeList addRetAttribute(LLVMContext &
C,
682 Attribute Attr)
const {
683 return addAttributeAtIndex(
C, ReturnIndex, Attr);
688 [[nodiscard]] AttributeList addRetAttributes(LLVMContext &
C,
689 const AttrBuilder &
B)
const {
690 return addAttributesAtIndex(
C, ReturnIndex,
B);
695 [[nodiscard]] AttributeList
696 addParamAttribute(LLVMContext &
C,
unsigned ArgNo,
697 Attribute::AttrKind Kind)
const {
698 return addAttributeAtIndex(
C, ArgNo + FirstArgIndex, Kind);
703 [[nodiscard]] AttributeList
704 addParamAttribute(LLVMContext &
C,
unsigned ArgNo, StringRef Kind,
705 StringRef
Value = StringRef())
const {
706 return addAttributeAtIndex(
C, ArgNo + FirstArgIndex, Kind,
Value);
711 [[nodiscard]]
LLVM_ABI AttributeList addParamAttribute(
712 LLVMContext &
C, ArrayRef<unsigned> ArgNos, Attribute
A)
const;
716 [[nodiscard]] AttributeList addParamAttributes(LLVMContext &
C,
unsigned ArgNo,
717 const AttrBuilder &
B)
const {
718 return addAttributesAtIndex(
C, ArgNo + FirstArgIndex,
B);
723 [[nodiscard]]
LLVM_ABI AttributeList removeAttributeAtIndex(
724 LLVMContext &
C,
unsigned Index, Attribute::AttrKind Kind)
const;
728 [[nodiscard]]
LLVM_ABI AttributeList
729 removeAttributeAtIndex(LLVMContext &
C,
unsigned Index, StringRef Kind)
const;
730 [[nodiscard]] AttributeList removeAttribute(LLVMContext &
C,
unsigned Index,
731 StringRef Kind)
const {
732 return removeAttributeAtIndex(
C, Index, Kind);
737 [[nodiscard]]
LLVM_ABI AttributeList removeAttributesAtIndex(
738 LLVMContext &
C,
unsigned Index,
const AttributeMask &AttrsToRemove)
const;
742 [[nodiscard]]
LLVM_ABI AttributeList
743 removeAttributesAtIndex(LLVMContext &
C,
unsigned Index)
const;
747 [[nodiscard]] AttributeList
748 removeFnAttribute(LLVMContext &
C, Attribute::AttrKind Kind)
const {
749 return removeAttributeAtIndex(
C, FunctionIndex, Kind);
754 [[nodiscard]] AttributeList removeFnAttribute(LLVMContext &
C,
755 StringRef Kind)
const {
756 return removeAttributeAtIndex(
C, FunctionIndex, Kind);
761 [[nodiscard]] AttributeList
762 removeFnAttributes(LLVMContext &
C,
const AttributeMask &AttrsToRemove)
const {
763 return removeAttributesAtIndex(
C, FunctionIndex, AttrsToRemove);
768 [[nodiscard]] AttributeList removeFnAttributes(LLVMContext &
C)
const {
769 return removeAttributesAtIndex(
C, FunctionIndex);
774 [[nodiscard]] AttributeList
775 removeRetAttribute(LLVMContext &
C, Attribute::AttrKind Kind)
const {
776 return removeAttributeAtIndex(
C, ReturnIndex, Kind);
781 [[nodiscard]] AttributeList removeRetAttribute(LLVMContext &
C,
782 StringRef Kind)
const {
783 return removeAttributeAtIndex(
C, ReturnIndex, Kind);
788 [[nodiscard]] AttributeList
789 removeRetAttributes(LLVMContext &
C,
790 const AttributeMask &AttrsToRemove)
const {
791 return removeAttributesAtIndex(
C, ReturnIndex, AttrsToRemove);
796 [[nodiscard]] AttributeList
797 removeParamAttribute(LLVMContext &
C,
unsigned ArgNo,
798 Attribute::AttrKind Kind)
const {
799 return removeAttributeAtIndex(
C, ArgNo + FirstArgIndex, Kind);
804 [[nodiscard]] AttributeList
805 removeParamAttribute(LLVMContext &
C,
unsigned ArgNo, StringRef Kind)
const {
806 return removeAttributeAtIndex(
C, ArgNo + FirstArgIndex, Kind);
811 [[nodiscard]] AttributeList
812 removeParamAttributes(LLVMContext &
C,
unsigned ArgNo,
813 const AttributeMask &AttrsToRemove)
const {
814 return removeAttributesAtIndex(
C, ArgNo + FirstArgIndex, AttrsToRemove);
819 [[nodiscard]] AttributeList removeParamAttributes(LLVMContext &
C,
820 unsigned ArgNo)
const {
821 return removeAttributesAtIndex(
C, ArgNo + FirstArgIndex);
826 [[nodiscard]] AttributeList
827 replaceAttributeTypeAtIndex(LLVMContext &
C,
unsigned ArgNo,
828 Attribute::AttrKind Kind,
829 Type *ReplacementTy)
const {
830 Attribute Attr = getAttributeAtIndex(ArgNo, Kind);
831 auto Attrs = removeAttributeAtIndex(
C, ArgNo, Kind);
832 return Attrs.addAttributeAtIndex(
C, ArgNo,
833 Attr.getWithNewType(
C, ReplacementTy));
838 [[nodiscard]]
LLVM_ABI AttributeList
839 addDereferenceableRetAttr(LLVMContext &
C,
uint64_t Bytes)
const;
843 [[nodiscard]]
LLVM_ABI AttributeList addDereferenceableParamAttr(
844 LLVMContext &
C,
unsigned ArgNo,
uint64_t Bytes)
const;
849 [[nodiscard]]
LLVM_ABI AttributeList addDereferenceableOrNullParamAttr(
850 LLVMContext &
C,
unsigned ArgNo,
uint64_t Bytes)
const;
854 [[nodiscard]]
LLVM_ABI AttributeList
859 [[nodiscard]]
LLVM_ABI AttributeList
860 addAllocSizeParamAttr(LLVMContext &
C,
unsigned ArgNo,
unsigned ElemSizeArg,
861 const std::optional<unsigned> &NumElemsArg)
const;
866 [[nodiscard]]
LLVM_ABI std::optional<AttributeList>
867 intersectWith(LLVMContext &
C, AttributeList Other)
const;
878 LLVM_ABI AttributeSet getParamAttrs(
unsigned ArgNo)
const;
881 LLVM_ABI AttributeSet getRetAttrs()
const;
884 LLVM_ABI AttributeSet getFnAttrs()
const;
887 LLVM_ABI bool hasAttributeAtIndex(
unsigned Index,
888 Attribute::AttrKind Kind)
const;
891 LLVM_ABI bool hasAttributeAtIndex(
unsigned Index, StringRef Kind)
const;
894 LLVM_ABI bool hasAttributesAtIndex(
unsigned Index)
const;
897 bool hasParamAttr(
unsigned ArgNo, Attribute::AttrKind Kind)
const {
898 return hasAttributeAtIndex(ArgNo + FirstArgIndex, Kind);
902 bool hasParamAttr(
unsigned ArgNo, StringRef Kind)
const {
903 return hasAttributeAtIndex(ArgNo + FirstArgIndex, Kind);
907 bool hasParamAttrs(
unsigned ArgNo)
const {
908 return hasAttributesAtIndex(ArgNo + FirstArgIndex);
912 bool hasRetAttr(Attribute::AttrKind Kind)
const {
913 return hasAttributeAtIndex(ReturnIndex, Kind);
917 bool hasRetAttr(StringRef Kind)
const {
918 return hasAttributeAtIndex(ReturnIndex, Kind);
922 bool hasRetAttrs()
const {
return hasAttributesAtIndex(ReturnIndex); }
925 LLVM_ABI bool hasFnAttr(Attribute::AttrKind Kind)
const;
928 LLVM_ABI bool hasFnAttr(StringRef Kind)
const;
931 bool hasFnAttrs()
const {
return hasAttributesAtIndex(FunctionIndex); }
936 LLVM_ABI bool hasAttrSomewhere(Attribute::AttrKind Kind,
937 unsigned *Index =
nullptr)
const;
941 Attribute::AttrKind Kind)
const;
947 Attribute getParamAttr(
unsigned ArgNo, Attribute::AttrKind Kind)
const {
948 return getAttributeAtIndex(ArgNo + FirstArgIndex, Kind);
952 Attribute getParamAttr(
unsigned ArgNo, StringRef Kind)
const {
953 return getAttributeAtIndex(ArgNo + FirstArgIndex, Kind);
957 Attribute getFnAttr(Attribute::AttrKind Kind)
const {
958 return getAttributeAtIndex(FunctionIndex, Kind);
962 Attribute getFnAttr(StringRef Kind)
const {
963 return getAttributeAtIndex(FunctionIndex, Kind);
967 Attribute getRetAttr(Attribute::AttrKind Kind)
const {
968 return getAttributeAtIndex(ReturnIndex, Kind);
972 LLVM_ABI MaybeAlign getRetAlignment()
const;
975 LLVM_ABI MaybeAlign getParamAlignment(
unsigned ArgNo)
const;
978 LLVM_ABI MaybeAlign getParamStackAlignment(
unsigned ArgNo)
const;
984 LLVM_ABI Type *getParamStructRetType(
unsigned ArgNo)
const;
990 LLVM_ABI Type *getParamPreallocatedType(
unsigned ArgNo)
const;
993 LLVM_ABI Type *getParamInAllocaType(
unsigned ArgNo)
const;
996 LLVM_ABI Type *getParamElementType(
unsigned ArgNo)
const;
1002 LLVM_ABI MaybeAlign getRetStackAlignment()
const;
1016 LLVM_ABI DeadOnReturnInfo getDeadOnReturnInfo(
unsigned Index)
const;
1020 LLVM_ABI uint64_t getParamDereferenceableOrNullBytes(
unsigned ArgNo)
const;
1023 LLVM_ABI std::optional<ConstantRange> getParamRange(
unsigned ArgNo)
const;
1040 LLVM_ABI std::string getAsString(
unsigned Index,
1041 bool InAttrGrp =
false)
const;
1044 LLVM_ABI bool hasParentContext(LLVMContext &
C)
const;
1050 using iterator =
const AttributeSet *;
1055 LLVM_ABI unsigned getNumAttrSets()
const;
1060 struct index_iterator {
1061 unsigned NumAttrSets;
1062 index_iterator(
int NumAttrSets) : NumAttrSets(NumAttrSets) {}
1063 struct int_wrapper {
1064 int_wrapper(
unsigned i) : i(i) {}
1068 int_wrapper &operator++() {
1076 int_wrapper
begin() {
return int_wrapper(AttributeList::FunctionIndex); }
1078 int_wrapper
end() {
return int_wrapper(NumAttrSets - 1); }
1082 index_iterator indexes()
const {
return index_iterator(getNumAttrSets()); }
1085 bool operator==(
const AttributeList &
RHS)
const {
return pImpl ==
RHS.pImpl; }
1086 bool operator!=(
const AttributeList &
RHS)
const {
return pImpl !=
RHS.pImpl; }
1089 void *getRawPointer()
const {
1094 bool isEmpty()
const {
return pImpl ==
nullptr; }
1105 static unsigned getHashValue(AttributeList AS) {
1106 return DenseMapInfo<const void *>::getHashValue(AS.pImpl);
1122 SmallVector<Attribute, 8>
Attrs;
1125 AttrBuilder(LLVMContext &Ctx) : Ctx(Ctx) {}
1126 AttrBuilder(
const AttrBuilder &) =
delete;
1127 AttrBuilder(AttrBuilder &&) =
default;
1129 AttrBuilder(LLVMContext &Ctx,
const Attribute &
A) : Ctx(Ctx) {
1133 LLVM_ABI AttrBuilder(LLVMContext &Ctx, AttributeSet AS);
1138 LLVM_ABI AttrBuilder &addAttribute(Attribute::AttrKind Val);
1141 LLVM_ABI AttrBuilder &addAttribute(Attribute
A);
1144 LLVM_ABI AttrBuilder &addAttribute(StringRef
A, StringRef V = StringRef());
1147 LLVM_ABI AttrBuilder &removeAttribute(Attribute::AttrKind Val);
1150 LLVM_ABI AttrBuilder &removeAttribute(StringRef
A);
1153 AttrBuilder &removeAttribute(Attribute
A) {
1154 if (
A.isStringAttribute())
1155 return removeAttribute(
A.getKindAsString());
1157 return removeAttribute(
A.getKindAsEnum());
1169 LLVM_ABI bool overlaps(
const AttributeMask &AM)
const;
1179 bool hasAttributes()
const {
return !
Attrs.empty(); }
1196 getRawIntAttr(Attribute::AttrKind Kind)
const;
1200 return MaybeAlign(getRawIntAttr(Attribute::Alignment).value_or(0));
1204 MaybeAlign getStackAlignment()
const {
1205 return MaybeAlign(getRawIntAttr(Attribute::StackAlignment).value_or(0));
1210 uint64_t getDereferenceableBytes()
const {
1211 return getRawIntAttr(Attribute::Dereferenceable).value_or(0);
1216 uint64_t getDereferenceableOrNullBytes()
const {
1217 return getRawIntAttr(Attribute::DereferenceableOrNull).value_or(0);
1223 std::optional<uint64_t> Raw = getRawIntAttr(Attribute::NoFPClass);
1228 LLVM_ABI Type *getTypeAttr(Attribute::AttrKind Kind)
const;
1234 Type *getStructRetType()
const {
return getTypeAttr(Attribute::StructRet); }
1237 Type *getByRefType()
const {
return getTypeAttr(Attribute::ByRef); }
1240 Type *getPreallocatedType()
const {
1241 return getTypeAttr(Attribute::Preallocated);
1245 Type *getInAllocaType()
const {
return getTypeAttr(Attribute::InAlloca); }
1249 LLVM_ABI std::optional<std::pair<unsigned, std::optional<unsigned>>>
1250 getAllocSizeArgs()
const;
1257 LLVM_ABI AttrBuilder &addAlignmentAttr(MaybeAlign Align);
1263 inline AttrBuilder &addAlignmentAttr(
unsigned Align) {
1264 return addAlignmentAttr(MaybeAlign(Align));
1269 LLVM_ABI AttrBuilder &addStackAlignmentAttr(MaybeAlign Align);
1275 inline AttrBuilder &addStackAlignmentAttr(
unsigned Align) {
1276 return addStackAlignmentAttr(MaybeAlign(Align));
1285 LLVM_ABI AttrBuilder &addDeadOnReturnAttr(DeadOnReturnInfo Info);
1293 addAllocSizeAttr(
unsigned ElemSizeArg,
1294 const std::optional<unsigned> &NumElemsArg);
1297 LLVM_ABI AttrBuilder &addVScaleRangeAttr(
unsigned MinValue,
1298 std::optional<unsigned> MaxValue);
1301 LLVM_ABI AttrBuilder &addTypeAttr(Attribute::AttrKind Kind,
Type *Ty);
1320 LLVM_ABI AttrBuilder &addAllocSizeAttrFromRawRepr(
uint64_t RawAllocSizeRepr);
1325 addVScaleRangeAttrFromRawRepr(
uint64_t RawVScaleRangeRepr);
1329 LLVM_ABI AttrBuilder &addUWTableAttr(UWTableKind Kind);
1332 LLVM_ABI AttrBuilder &addAllocKindAttr(AllocFnKind Kind);
1335 LLVM_ABI AttrBuilder &addMemoryAttr(MemoryEffects ME);
1338 LLVM_ABI AttrBuilder &addCapturesAttr(CaptureInfo CI);
1341 LLVM_ABI AttrBuilder &addDenormalFPEnvAttr(DenormalFPEnv
Mode);
1344 LLVM_ABI AttrBuilder &addNoFPClassAttr(FPClassTest NoFPClassMask);
1347 LLVM_ABI AttrBuilder &addConstantRangeAttr(Attribute::AttrKind Kind,
1348 const ConstantRange &CR);
1351 LLVM_ABI AttrBuilder &addRangeAttr(
const ConstantRange &CR);
1354 LLVM_ABI AttrBuilder &addConstantRangeListAttr(Attribute::AttrKind Kind,
1355 ArrayRef<ConstantRange> Val);
1358 LLVM_ABI AttrBuilder &addInitializesAttr(
const ConstantRangeList &CRL);
1363 LLVM_ABI AttrBuilder &addFromEquivalentMetadata(
const Instruction &
I);
1365 ArrayRef<Attribute> attrs()
const {
return Attrs; }
1368 bool operator!=(
const AttrBuilder &
B)
const {
return !(*
this ==
B); }
1371namespace AttributeFuncs {
1373enum AttributeSafetyKind : uint8_t {
1374 ASK_SAFE_TO_DROP = 1,
1375 ASK_UNSAFE_TO_DROP = 2,
1376 ASK_ALL = ASK_SAFE_TO_DROP | ASK_UNSAFE_TO_DROP,
1393 AttributeSafetyKind ASK = ASK_ALL);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static std::optional< ConstantRange > getRange(Value *V, const InstrInfoQuery &IIQ)
Helper method to get range from metadata or attribute.
static LoopDeletionResult merge(LoopDeletionResult A, LoopDeletionResult B)
static Align getFnStackAlignment(const TargetSubtargetInfo &STI, const Function &F)
bool operator==(const MergedFunctionsInfo &LHS, const MergedFunctionsInfo &RHS)
II addRangeRetAttr(Range)
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
static DenormalFPEnv getDenormalFPEnv(const MachineFunction &MF)
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
static FPClassTest getNoFPClass(const Instruction &I)
static uint32_t getAlignment(const MCSectionCOFF &Sec)
Represent a constant reference to an array (0 or more elements consecutively in memory),...
This class represents a single, uniqued attribute.
This class represents a set of attributes that apply to the function, return type,...
This class stores enough information to efficiently remove some attributes from an existing AttrBuild...
This class represents a group of attributes that apply to one element: function, return type,...
This class holds the attributes for a particular argument, parameter, function, or return value.
LLVM_ABI AllocFnKind getAllocKind() const
bool hasAttributes() const
Return true if attributes exists in this set.
const Attribute * iterator
LLVM_ABI AttributeSet removeAttribute(LLVMContext &C, Attribute::AttrKind Kind) const
Remove the specified attribute from this set.
LLVM_ABI Type * getInAllocaType() const
LLVM_ABI Type * getByValType() const
LLVM_ABI DeadOnReturnInfo getDeadOnReturnInfo() const
bool operator!=(const AttributeSet &O) const
LLVM_ABI AttributeSet addAttributes(LLVMContext &C, AttributeSet AS) const
Add attributes to the attribute set.
LLVM_ABI MemoryEffects getMemoryEffects() const
LLVM_ABI bool hasAttribute(Attribute::AttrKind Kind) const
Return true if the attribute exists in this set.
bool operator==(const AttributeSet &O) const
LLVM_ABI std::optional< AttributeSet > intersectWith(LLVMContext &C, AttributeSet Other) const
Try to intersect this AttributeSet with Other.
LLVM_ABI Type * getStructRetType() const
LLVM_ABI std::string getAsString(bool InAttrGrp=false) const
LLVM_ABI unsigned getVScaleRangeMin() const
LLVM_ABI std::optional< std::pair< unsigned, std::optional< unsigned > > > getAllocSizeArgs() const
LLVM_ABI UWTableKind getUWTableKind() const
LLVM_ABI bool hasParentContext(LLVMContext &C) const
Return true if this attribute set belongs to the LLVMContext.
LLVM_ABI iterator begin() const
LLVM_ABI iterator end() const
LLVM_ABI AttributeSet removeAttributes(LLVMContext &C, const AttributeMask &AttrsToRemove) const
Remove the specified attributes from this set.
LLVM_ABI std::optional< unsigned > getVScaleRangeMax() const
LLVM_ABI MaybeAlign getStackAlignment() const
LLVM_ABI Attribute getAttribute(Attribute::AttrKind Kind) const
Return the attribute object.
LLVM_ABI Type * getPreallocatedType() const
LLVM_ABI uint64_t getDereferenceableBytes() const
LLVM_ABI MaybeAlign getAlignment() const
LLVM_ABI FPClassTest getNoFPClass() const
friend struct DenseMapInfo
AttributeSet(const AttributeSet &)=default
LLVM_ABI Type * getElementType() const
LLVM_ABI Type * getByRefType() const
LLVM_ABI CaptureInfo getCaptureInfo() const
AttributeSet()=default
AttributeSet is a trivially copyable value type.
static LLVM_ABI AttributeSet get(LLVMContext &C, const AttrBuilder &B)
LLVM_ABI uint64_t getDereferenceableOrNullBytes() const
LLVM_ABI unsigned getNumAttributes() const
Return the number of attributes in this set.
LLVM_ABI AttributeSet addAttribute(LLVMContext &C, Attribute::AttrKind Kind) const
Add an argument attribute.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
static const unsigned NumTypeAttrKinds
LLVM_ABI bool isStringAttribute() const
Return true if the attribute is a string (target-dependent) attribute.
static LLVM_ABI Attribute getWithStructRetType(LLVMContext &Context, Type *Ty)
bool operator==(Attribute A) const
Equality and non-equality operators.
static LLVM_ABI Attribute::AttrKind getAttrKindFromName(StringRef AttrName)
static const unsigned NumEnumAttrKinds
LLVM_ABI bool isEnumAttribute() const
Return true if the attribute is an Attribute::AttrKind type.
static LLVM_ABI Attribute getWithStackAlignment(LLVMContext &Context, Align Alignment)
LLVM_ABI const ConstantRange & getRange() const
Returns the value of the range attribute.
static LLVM_ABI bool intersectWithCustom(AttrKind Kind)
LLVM_ABI bool isIntAttribute() const
Return true if the attribute is an integer attribute.
static LLVM_ABI Attribute getWithByRefType(LLVMContext &Context, Type *Ty)
LLVM_ABI std::optional< unsigned > getVScaleRangeMax() const
Returns the maximum value for the vscale_range attribute or std::nullopt when unknown.
LLVM_ABI uint64_t getValueAsInt() const
Return the attribute's value as an integer.
LLVM_ABI unsigned getVScaleRangeMin() const
Returns the minimum value for the vscale_range attribute.
LLVM_ABI AllocFnKind getAllocKind() const
LLVM_ABI bool isConstantRangeAttribute() const
Return true if the attribute is a ConstantRange attribute.
static LLVM_ABI Attribute getWithAllocKind(LLVMContext &Context, AllocFnKind Kind)
LLVM_ABI StringRef getKindAsString() const
Return the attribute's kind as a string.
static LLVM_ABI Attribute getWithPreallocatedType(LLVMContext &Context, Type *Ty)
static LLVM_ABI bool intersectWithMin(AttrKind Kind)
static LLVM_ABI Attribute getWithDeadOnReturnInfo(LLVMContext &Context, DeadOnReturnInfo DI)
static LLVM_ABI Attribute get(LLVMContext &Context, AttrKind Kind, uint64_t Val=0)
Return a uniquified Attribute object.
static LLVM_ABI bool canUseAsRetAttr(AttrKind Kind)
static bool isTypeAttrKind(AttrKind Kind)
LLVM_ABI std::string getAsString(bool InAttrGrp=false) const
The Attribute is converted to a string of equivalent mnemonic.
LLVM_ABI uint64_t getDereferenceableOrNullBytes() const
Returns the number of dereferenceable_or_null bytes from the dereferenceable_or_null attribute.
static LLVM_ABI Attribute getWithDereferenceableBytes(LLVMContext &Context, uint64_t Bytes)
LLVM_ABI std::pair< unsigned, std::optional< unsigned > > getAllocSizeArgs() const
Returns the argument numbers for the allocsize attribute.
static LLVM_ABI Attribute getWithUWTableKind(LLVMContext &Context, UWTableKind Kind)
bool operator!=(Attribute A) const
LLVM_ABI FPClassTest getNoFPClass() const
Return the FPClassTest for nofpclass.
static LLVM_ABI Attribute getWithAllocSizeArgs(LLVMContext &Context, unsigned ElemSizeArg, const std::optional< unsigned > &NumElemsArg)
LLVM_ABI Attribute::AttrKind getKindAsEnum() const
Return the attribute's kind as an enum (Attribute::AttrKind).
LLVM_ABI bool getValueAsBool() const
Return the attribute's value as a boolean.
LLVM_ABI ArrayRef< ConstantRange > getInitializes() const
Returns the value of the initializes attribute.
LLVM_ABI const ConstantRange & getValueAsConstantRange() const
Return the attribute's value as a ConstantRange.
LLVM_ABI uint64_t getDereferenceableBytes() const
Returns the number of dereferenceable bytes from the dereferenceable attribute.
static LLVM_ABI Attribute getWithVScaleRangeArgs(LLVMContext &Context, unsigned MinValue, unsigned MaxValue)
LLVM_ABI MemoryEffects getMemoryEffects() const
Returns memory effects.
LLVM_ABI UWTableKind getUWTableKind() const
static LLVM_ABI Attribute getWithDereferenceableOrNullBytes(LLVMContext &Context, uint64_t Bytes)
LLVM_ABI ArrayRef< ConstantRange > getValueAsConstantRangeList() const
Return the attribute's value as a ConstantRange array.
LLVM_ABI StringRef getValueAsString() const
Return the attribute's value as a string.
static LLVM_ABI bool isExistingAttribute(StringRef Name)
Return true if the provided string matches the IR name of an attribute.
bool hasKindAsEnum() const
Returns true if the attribute's kind can be represented as an enum (Enum, Integer,...
static LLVM_ABI StringRef getNameFromAttrKind(Attribute::AttrKind AttrKind)
static LLVM_ABI bool canUseAsFnAttr(AttrKind Kind)
static LLVM_ABI bool intersectWithAnd(AttrKind Kind)
static LLVM_ABI Attribute getWithNoFPClass(LLVMContext &Context, FPClassTest Mask)
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
@ TombstoneKey
Use as Tombstone key for DenseMap of AttrKind.
@ None
No attributes have been set.
@ EmptyKey
Use as Empty key for DenseMap of AttrKind.
@ EndAttrKinds
Sentinel value useful for loops.
static bool isConstantRangeAttrKind(AttrKind Kind)
void * getRawPointer() const
Return a raw pointer that uniquely identifies this attribute.
LLVM_ABI bool hasParentContext(LLVMContext &C) const
Return true if this attribute belongs to the LLVMContext.
LLVM_ABI bool isTypeAttribute() const
Return true if the attribute is a type attribute.
static LLVM_ABI Attribute getWithCaptureInfo(LLVMContext &Context, CaptureInfo CI)
static LLVM_ABI Attribute getWithInAllocaType(LLVMContext &Context, Type *Ty)
static bool isIntAttrKind(AttrKind Kind)
static bool isConstantRangeListAttrKind(AttrKind Kind)
LLVM_ABI bool isConstantRangeListAttribute() const
Return true if the attribute is a ConstantRangeList attribute.
static LLVM_ABI Attribute getWithByValType(LLVMContext &Context, Type *Ty)
Attribute getWithNewType(LLVMContext &Context, Type *ReplacementTy)
For a typed attribute, return the equivalent attribute with the type changed to ReplacementTy.
LLVM_ABI bool hasAttribute(AttrKind Val) const
Return true if the attribute is present.
static bool isEnumAttrKind(AttrKind Kind)
static LLVM_ABI Attribute getWithMemoryEffects(LLVMContext &Context, MemoryEffects ME)
static LLVM_ABI bool canUseAsParamAttr(AttrKind Kind)
bool isValid() const
Return true if the attribute is any kind of attribute.
LLVM_ABI MaybeAlign getStackAlignment() const
Returns the stack alignment field of an attribute as a byte alignment value.
static Attribute fromRawPointer(void *RawPtr)
Get an attribute from a raw pointer created by getRawPointer.
static const unsigned NumIntAttrKinds
LLVM_ABI MaybeAlign getAlignment() const
Returns the alignment field of an attribute as a byte alignment value.
LLVM_ABI CaptureInfo getCaptureInfo() const
Returns information from captures attribute.
static LLVM_ABI bool intersectMustPreserve(AttrKind Kind)
LLVM_ABI int cmpKind(Attribute A) const
Used to sort attribute by kind.
LLVM_ABI bool operator<(Attribute A) const
Less-than operator. Useful for sorting the attributes list.
static LLVM_ABI Attribute getWithAlignment(LLVMContext &Context, Align Alignment)
Return a uniquified Attribute object that has the specific alignment set.
LLVM_ABI DeadOnReturnInfo getDeadOnReturnInfo() const
Returns the number of dead_on_return bytes from the dead_on_return attribute, or std::nullopt if all ...
LLVM_ABI Type * getValueAsType() const
Return the attribute's value as a Type.
Represents which components of the pointer may be captured in which location.
This class represents a list of constant ranges.
This class represents a range of values.
static DeadOnReturnInfo createFromIntValue(uint64_t Data)
bool coversAllReachableMemory() const
uint64_t toIntValue() const
DeadOnReturnInfo(uint64_t DeadOnReturnBytes)
uint64_t getNumberOfDeadBytes() const
This is an important class for using LLVM in a threaded context.
Represent a constant reference to a string, i.e.
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM Value Representation.
This class implements an extremely fast bulk output stream that can only output to a stream.
struct LLVMOpaqueAttributeRef * LLVMAttributeRef
Used to represent an attributes.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
LLVM_ABI AttributeList getAttributes(LLVMContext &C, ID id, FunctionType *FT)
Return the attributes for an intrinsic.
LLVM_ABI iterator begin() const
LLVM_ABI std::error_code remove(const Twine &path, bool IgnoreNonExisting=true)
Remove path.
This is an optimization pass for GlobalISel generic memory operations.
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
bool isEqual(const GCNRPTracker::LiveRegSet &S1, const GCNRPTracker::LiveRegSet &S2)
@ Unknown
Not known to have no common set bits.
@ LLVM_MARK_AS_BITMASK_ENUM
APInt operator*(APInt a, uint64_t RHS)
bool operator!=(uint64_t V1, const APInt &V2)
LLVM_ABI AttributeMask typeIncompatible(Type *Ty, AttributeSet AS, AttributeSafetyKind ASK=ASK_ALL)
This class holds the attributes for a function, its return value, and its parameters.
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
LLVM_ABI bool isStrictFPInlineCompatible(const Function &Caller, const Function &Callee)
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
Attribute unwrap(LLVMAttributeRef Attr)
LLVM_ABI void mergeAttributesForOutlining(Function &Base, const Function &ToMerge)
Merges the functions attributes from ToMerge into function Base.
LLVMAttributeRef wrap(Attribute Attr)
LLVM_ABI bool areInlineCompatible(const Function &Caller, const Function &Callee)
LLVM_ABI void updateMinLegalVectorWidthAttr(Function &Fn, uint64_t Width)
Update min-legal-vector-width if it is in Attribute and less than Width.
LLVM_ABI void mergeAttributesForInlining(Function &Caller, const Function &Callee)
Merge caller's and callee's attributes.
LLVM_ABI bool areOutlineCompatible(const Function &A, const Function &B)
Checks if there are any incompatible function attributes between A and B.
LLVM_ABI AttributeMask getUBImplyingAttributes()
Get param/return attributes which imply immediate undefined behavior if an invalid value is passed.
Implement std::hash so that hash_code can be used in STL containers.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Represents the full denormal controls for a function, including the default mode and the f32 specific...
Represent subnormal handling kind for floating point instruction inputs and outputs.
static bool isEqual(AttributeSet LHS, AttributeSet RHS)
static unsigned getHashValue(AttributeSet AS)
An information struct used to provide DenseMap with the various necessary components for a given valu...
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Trait to indicate whether a type's bits can be hashed directly.