LLVM: include/llvm/IR/Attributes.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#ifndef LLVM_IR_ATTRIBUTES_H
16#define LLVM_IR_ATTRIBUTES_H
17
22#include "llvm/Config/llvm-config.h"
28#include
29#include
30#include
31#include
32#include
33
34namespace llvm {
35
36class AttrBuilder;
50
62
63
64
65
66
67
68
69class Attribute {
70public:
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
97
98 static const unsigned NumIntAttrKinds = LastIntAttr - FirstIntAttr + 1;
99 static const unsigned NumTypeAttrKinds = LastTypeAttr - FirstTypeAttr + 1;
100
102 return Kind >= FirstEnumAttr && Kind <= LastEnumAttr;
103 }
105 return Kind >= FirstIntAttr && Kind <= LastIntAttr;
106 }
108 return Kind >= FirstTypeAttr && Kind <= LastTypeAttr;
109 }
111 return Kind >= FirstConstantRangeAttr && Kind <= LastConstantRangeAttr;
112 }
114 return Kind >= FirstConstantRangeListAttr &&
115 Kind <= LastConstantRangeListAttr;
116 }
117
121
126
127private:
129
131
132public:
134
135
136
137
138
139
149
150
151
153 Align Alignment);
155 Align Alignment);
162 const std::optional &NumElemsArg);
166 unsigned MinValue,
167 unsigned MaxValue);
183
184
185
190
192
194
195
196
198
199
200
201
202
203
205
206
208
209
210
212
213
215
216
218
219
221
222
223 bool isValid() const { return pImpl; }
224
225
227
228
230
231
232
234
235
236
238
239
240
242
243
244
246
247
248
250
251
252
254
255
256
258
259
260
262
263
264
266
267
268
270
271
272
274
275
276
278
279
280
282
283
284 LLVM_ABI std::pair<unsigned, std::optional>
286
287
289
290
291
293
294
296
297
299
300
302
303
305
306
308
309
311
312
314
315
316
318
319
321
322
323 bool operator==(Attribute A) const { return pImpl == A.pImpl; }
324 bool operator!=(Attribute A) const { return pImpl != A.pImpl; }
325
326
328
329
331
333
334
338
339
343};
344
345
349
350
354
355
356
357
358
359
360
361class AttributeSet {
362 friend AttributeListImpl;
363 template <typename Ty, typename Enable> friend struct DenseMapInfo;
364
365
366
367
368
369
371
372private:
374
375public:
376
380
383
384 bool operator==(const AttributeSet &O) const { return SetNode == O.SetNode; }
385 bool operator!=(const AttributeSet &O) const { return !(*this == O); }
386
387
388
391
392
393
396
397
398
401
402
403
405
406
407
410
411
412
415
416
417
420
421
422
423
424 [[nodiscard]] LLVM_ABI std::optional
426
427
429
430
432
433
435
436
438
439
441
442
444
455 LLVM_ABI std::optional<std::pair<unsigned, std::optional>>
465
466
468
470
473#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
474 void dump() const;
475#endif
476};
477
478
479
480
483 auto Val = static_cast<uintptr_t>(-1);
484 Val <<= PointerLikeTypeTraits<void *>::NumLowBitsAvailable;
486 }
487
489 auto Val = static_cast<uintptr_t>(-2);
490 Val <<= PointerLikeTypeTraits<void *>::NumLowBitsAvailable;
492 }
493
495 return (unsigned((uintptr_t)AS.SetNode) >> 4) ^
496 (unsigned((uintptr_t)AS.SetNode) >> 9);
497 }
498
500};
501
502
503
504
505
506
507
508
509
510class AttributeList {
511public:
512 enum AttrIndex : unsigned {
513 ReturnIndex = 0U,
514 FunctionIndex = ~0U,
515 FirstArgIndex = 1,
516 };
517
518private:
519 friend class AttrBuilder;
520 friend class AttributeListImpl;
521 friend class AttributeSet;
522 friend class AttributeSetNode;
523 template <typename Ty, typename Enable> friend struct DenseMapInfo;
524
525
526
527 AttributeListImpl *pImpl = nullptr;
528
529public:
530
531 LLVM_ABI static AttributeList
532 get(LLVMContext &C, ArrayRef<std::pair<unsigned, Attribute>> Attrs);
533 LLVM_ABI static AttributeList
534 get(LLVMContext &C, ArrayRef<std::pair<unsigned, AttributeSet>> Attrs);
535
536
537
538 LLVM_ABI static AttributeList get(LLVMContext &C, AttributeSet FnAttrs,
539 AttributeSet RetAttrs,
540 ArrayRef ArgAttrs);
541
542private:
543 explicit AttributeList(AttributeListImpl *LI) : pImpl(LI) {}
544
545 static AttributeList getImpl(LLVMContext &C, ArrayRef AttrSets);
546
547 AttributeList setAttributesAtIndex(LLVMContext &C, unsigned Index,
548 AttributeSet Attrs) const;
549
550public:
551 AttributeList() = default;
552
553
554
555
556
557
558 LLVM_ABI static AttributeList get(LLVMContext &C,
559 ArrayRef Attrs);
560 LLVM_ABI static AttributeList get(LLVMContext &C, unsigned Index,
561 ArrayRefAttribute::AttrKind Kinds);
562 LLVM_ABI static AttributeList get(LLVMContext &C, unsigned Index,
563 ArrayRefAttribute::AttrKind Kinds,
564 ArrayRef<uint64_t> Values);
565 LLVM_ABI static AttributeList get(LLVMContext &C, unsigned Index,
566 ArrayRef Kind);
567 LLVM_ABI static AttributeList get(LLVMContext &C, unsigned Index,
568 AttributeSet Attrs);
569 LLVM_ABI static AttributeList get(LLVMContext &C, unsigned Index,
570 const AttrBuilder &B);
571
572
573
574
575 [[nodiscard]] LLVM_ABI AttributeList addAttributeAtIndex(
576 LLVMContext &C, unsigned Index, Attribute::AttrKind Kind) const;
577
578
579
580 [[nodiscard]] LLVM_ABI AttributeList
581 addAttributeAtIndex(LLVMContext &C, unsigned Index, StringRef Kind,
582 StringRef Value = StringRef()) const;
583
584
585
586 [[nodiscard]] LLVM_ABI AttributeList addAttributeAtIndex(LLVMContext &C,
587 unsigned Index,
588 Attribute A) const;
589
590
591
592 [[nodiscard]] LLVM_ABI AttributeList addAttributesAtIndex(
593 LLVMContext &C, unsigned Index, const AttrBuilder &B) const;
594
595
596
597 [[nodiscard]] AttributeList addFnAttribute(LLVMContext &C,
598 Attribute::AttrKind Kind) const {
599 return addAttributeAtIndex(C, FunctionIndex, Kind);
600 }
601
602
603
604 [[nodiscard]] AttributeList addFnAttribute(LLVMContext &C,
605 Attribute Attr) const {
606 return addAttributeAtIndex(C, FunctionIndex, Attr);
607 }
608
609
610
611 [[nodiscard]] AttributeList
612 addFnAttribute(LLVMContext &C, StringRef Kind,
613 StringRef Value = StringRef()) const {
614 return addAttributeAtIndex(C, FunctionIndex, Kind, Value);
615 }
616
617
618
619 [[nodiscard]] AttributeList addFnAttributes(LLVMContext &C,
620 const AttrBuilder &B) const {
621 return addAttributesAtIndex(C, FunctionIndex, B);
622 }
623
624
625
626 [[nodiscard]] AttributeList addRetAttribute(LLVMContext &C,
627 Attribute::AttrKind Kind) const {
628 return addAttributeAtIndex(C, ReturnIndex, Kind);
629 }
630
631
632
633 [[nodiscard]] AttributeList addRetAttribute(LLVMContext &C,
634 Attribute Attr) const {
635 return addAttributeAtIndex(C, ReturnIndex, Attr);
636 }
637
638
639
640 [[nodiscard]] AttributeList addRetAttributes(LLVMContext &C,
641 const AttrBuilder &B) const {
642 return addAttributesAtIndex(C, ReturnIndex, B);
643 }
644
645
646
647 [[nodiscard]] AttributeList
648 addParamAttribute(LLVMContext &C, unsigned ArgNo,
649 Attribute::AttrKind Kind) const {
650 return addAttributeAtIndex(C, ArgNo + FirstArgIndex, Kind);
651 }
652
653
654
655 [[nodiscard]] AttributeList
656 addParamAttribute(LLVMContext &C, unsigned ArgNo, StringRef Kind,
657 StringRef Value = StringRef()) const {
658 return addAttributeAtIndex(C, ArgNo + FirstArgIndex, Kind, Value);
659 }
660
661
662
663 [[nodiscard]] LLVM_ABI AttributeList addParamAttribute(
664 LLVMContext &C, ArrayRef ArgNos, Attribute A) const;
665
666
667
668 [[nodiscard]] AttributeList addParamAttributes(LLVMContext &C, unsigned ArgNo,
669 const AttrBuilder &B) const {
670 return addAttributesAtIndex(C, ArgNo + FirstArgIndex, B);
671 }
672
673
674
675 [[nodiscard]] LLVM_ABI AttributeList removeAttributeAtIndex(
676 LLVMContext &C, unsigned Index, Attribute::AttrKind Kind) const;
677
678
679
680 [[nodiscard]] LLVM_ABI AttributeList
681 removeAttributeAtIndex(LLVMContext &C, unsigned Index, StringRef Kind) const;
682 [[nodiscard]] AttributeList removeAttribute(LLVMContext &C, unsigned Index,
683 StringRef Kind) const {
684 return removeAttributeAtIndex(C, Index, Kind);
685 }
686
687
688
689 [[nodiscard]] LLVM_ABI AttributeList removeAttributesAtIndex(
690 LLVMContext &C, unsigned Index, const AttributeMask &AttrsToRemove) const;
691
692
693
694 [[nodiscard]] LLVM_ABI AttributeList
695 removeAttributesAtIndex(LLVMContext &C, unsigned Index) const;
696
697
698
699 [[nodiscard]] AttributeList
700 removeFnAttribute(LLVMContext &C, Attribute::AttrKind Kind) const {
701 return removeAttributeAtIndex(C, FunctionIndex, Kind);
702 }
703
704
705
706 [[nodiscard]] AttributeList removeFnAttribute(LLVMContext &C,
707 StringRef Kind) const {
708 return removeAttributeAtIndex(C, FunctionIndex, Kind);
709 }
710
711
712
713 [[nodiscard]] AttributeList
714 removeFnAttributes(LLVMContext &C, const AttributeMask &AttrsToRemove) const {
715 return removeAttributesAtIndex(C, FunctionIndex, AttrsToRemove);
716 }
717
718
719
720 [[nodiscard]] AttributeList removeFnAttributes(LLVMContext &C) const {
721 return removeAttributesAtIndex(C, FunctionIndex);
722 }
723
724
725
726 [[nodiscard]] AttributeList
727 removeRetAttribute(LLVMContext &C, Attribute::AttrKind Kind) const {
728 return removeAttributeAtIndex(C, ReturnIndex, Kind);
729 }
730
731
732
733 [[nodiscard]] AttributeList removeRetAttribute(LLVMContext &C,
734 StringRef Kind) const {
735 return removeAttributeAtIndex(C, ReturnIndex, Kind);
736 }
737
738
739
740 [[nodiscard]] AttributeList
741 removeRetAttributes(LLVMContext &C,
742 const AttributeMask &AttrsToRemove) const {
743 return removeAttributesAtIndex(C, ReturnIndex, AttrsToRemove);
744 }
745
746
747
748 [[nodiscard]] AttributeList
749 removeParamAttribute(LLVMContext &C, unsigned ArgNo,
750 Attribute::AttrKind Kind) const {
751 return removeAttributeAtIndex(C, ArgNo + FirstArgIndex, Kind);
752 }
753
754
755
756 [[nodiscard]] AttributeList
757 removeParamAttribute(LLVMContext &C, unsigned ArgNo, StringRef Kind) const {
758 return removeAttributeAtIndex(C, ArgNo + FirstArgIndex, Kind);
759 }
760
761
762
763 [[nodiscard]] AttributeList
764 removeParamAttributes(LLVMContext &C, unsigned ArgNo,
765 const AttributeMask &AttrsToRemove) const {
766 return removeAttributesAtIndex(C, ArgNo + FirstArgIndex, AttrsToRemove);
767 }
768
769
770
771 [[nodiscard]] AttributeList removeParamAttributes(LLVMContext &C,
772 unsigned ArgNo) const {
773 return removeAttributesAtIndex(C, ArgNo + FirstArgIndex);
774 }
775
776
777
778 [[nodiscard]] AttributeList
779 replaceAttributeTypeAtIndex(LLVMContext &C, unsigned ArgNo,
780 Attribute::AttrKind Kind,
781 Type *ReplacementTy) const {
782 Attribute Attr = getAttributeAtIndex(ArgNo, Kind);
783 auto Attrs = removeAttributeAtIndex(C, ArgNo, Kind);
784 return Attrs.addAttributeAtIndex(C, ArgNo,
785 Attr.getWithNewType(C, ReplacementTy));
786 }
787
788
789
790 [[nodiscard]] LLVM_ABI AttributeList
791 addDereferenceableRetAttr(LLVMContext &C, uint64_t Bytes) const;
792
793
794
795 [[nodiscard]] LLVM_ABI AttributeList addDereferenceableParamAttr(
796 LLVMContext &C, unsigned ArgNo, uint64_t Bytes) const;
797
798
799
800
801 [[nodiscard]] LLVM_ABI AttributeList addDereferenceableOrNullParamAttr(
802 LLVMContext &C, unsigned ArgNo, uint64_t Bytes) const;
803
804
805
806 [[nodiscard]] LLVM_ABI AttributeList
807 addRangeRetAttr(LLVMContext &C, const ConstantRange &CR) const;
808
809
810
811 [[nodiscard]] LLVM_ABI AttributeList
812 addAllocSizeParamAttr(LLVMContext &C, unsigned ArgNo, unsigned ElemSizeArg,
813 const std::optional &NumElemsArg) const;
814
815
816
817
818 [[nodiscard]] LLVM_ABI std::optional
819 intersectWith(LLVMContext &C, AttributeList Other) const;
820
821
822
823
824
825
827
828
829
830 LLVM_ABI AttributeSet getParamAttrs(unsigned ArgNo) const;
831
832
833 LLVM_ABI AttributeSet getRetAttrs() const;
834
835
836 LLVM_ABI AttributeSet getFnAttrs() const;
837
838
839 LLVM_ABI bool hasAttributeAtIndex(unsigned Index,
840 Attribute::AttrKind Kind) const;
841
842
843 LLVM_ABI bool hasAttributeAtIndex(unsigned Index, StringRef Kind) const;
844
845
846 LLVM_ABI bool hasAttributesAtIndex(unsigned Index) const;
847
848
849 bool hasParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const {
850 return hasAttributeAtIndex(ArgNo + FirstArgIndex, Kind);
851 }
852
853
854 bool hasParamAttr(unsigned ArgNo, StringRef Kind) const {
855 return hasAttributeAtIndex(ArgNo + FirstArgIndex, Kind);
856 }
857
858
859 bool hasParamAttrs(unsigned ArgNo) const {
860 return hasAttributesAtIndex(ArgNo + FirstArgIndex);
861 }
862
863
864 bool hasRetAttr(Attribute::AttrKind Kind) const {
865 return hasAttributeAtIndex(ReturnIndex, Kind);
866 }
867
868
869 bool hasRetAttr(StringRef Kind) const {
870 return hasAttributeAtIndex(ReturnIndex, Kind);
871 }
872
873
874 bool hasRetAttrs() const { return hasAttributesAtIndex(ReturnIndex); }
875
876
877 LLVM_ABI bool hasFnAttr(Attribute::AttrKind Kind) const;
878
879
880 LLVM_ABI bool hasFnAttr(StringRef Kind) const;
881
882
883 bool hasFnAttrs() const { return hasAttributesAtIndex(FunctionIndex); }
884
885
886
887
888 LLVM_ABI bool hasAttrSomewhere(Attribute::AttrKind Kind,
889 unsigned *Index = nullptr) const;
890
891
893 Attribute::AttrKind Kind) const;
894
895
896 LLVM_ABI Attribute getAttributeAtIndex(unsigned Index, StringRef Kind) const;
897
898
899 Attribute getParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const {
900 return getAttributeAtIndex(ArgNo + FirstArgIndex, Kind);
901 }
902
903
904 Attribute getParamAttr(unsigned ArgNo, StringRef Kind) const {
905 return getAttributeAtIndex(ArgNo + FirstArgIndex, Kind);
906 }
907
908
909 Attribute getFnAttr(Attribute::AttrKind Kind) const {
910 return getAttributeAtIndex(FunctionIndex, Kind);
911 }
912
913
914 Attribute getFnAttr(StringRef Kind) const {
915 return getAttributeAtIndex(FunctionIndex, Kind);
916 }
917
918
919 Attribute getRetAttr(Attribute::AttrKind Kind) const {
920 return getAttributeAtIndex(ReturnIndex, Kind);
921 }
922
923
924 LLVM_ABI MaybeAlign getRetAlignment() const;
925
926
927 LLVM_ABI MaybeAlign getParamAlignment(unsigned ArgNo) const;
928
929
930 LLVM_ABI MaybeAlign getParamStackAlignment(unsigned ArgNo) const;
931
932
933 LLVM_ABI Type *getParamByValType(unsigned ArgNo) const;
934
935
936 LLVM_ABI Type *getParamStructRetType(unsigned ArgNo) const;
937
938
939 LLVM_ABI Type *getParamByRefType(unsigned ArgNo) const;
940
941
942 LLVM_ABI Type *getParamPreallocatedType(unsigned ArgNo) const;
943
944
945 LLVM_ABI Type *getParamInAllocaType(unsigned ArgNo) const;
946
947
948 LLVM_ABI Type *getParamElementType(unsigned ArgNo) const;
949
950
952
953
954 LLVM_ABI MaybeAlign getRetStackAlignment() const;
955
956
957
958 LLVM_ABI uint64_t getRetDereferenceableBytes() const;
959
960
961 LLVM_ABI uint64_t getParamDereferenceableBytes(unsigned Index) const;
962
963
964
965 LLVM_ABI uint64_t getRetDereferenceableOrNullBytes() const;
966
967
968
969 LLVM_ABI uint64_t getParamDereferenceableOrNullBytes(unsigned ArgNo) const;
970
971
972 LLVM_ABI std::optional getParamRange(unsigned ArgNo) const;
973
974
976
977
979
980
982
984
985
987
988
989 LLVM_ABI std::string getAsString(unsigned Index,
990 bool InAttrGrp = false) const;
991
992
993 LLVM_ABI bool hasParentContext(LLVMContext &C) const;
994
995
996
997
998
999 using iterator = const AttributeSet *;
1000
1003
1004 LLVM_ABI unsigned getNumAttrSets() const;
1005
1006
1007
1008
1009 struct index_iterator {
1010 unsigned NumAttrSets;
1011 index_iterator(int NumAttrSets) : NumAttrSets(NumAttrSets) {}
1012 struct int_wrapper {
1013 int_wrapper(unsigned i) : i(i) {}
1014 unsigned i;
1015 unsigned operator*() { return i; }
1016 bool operator!=(const int_wrapper &Other) { return i != Other.i; }
1017 int_wrapper &operator++() {
1018
1019
1020 ++i;
1021 return *this;
1022 }
1023 };
1024
1025 int_wrapper begin() { return int_wrapper(AttributeList::FunctionIndex); }
1026
1027 int_wrapper end() { return int_wrapper(NumAttrSets - 1); }
1028 };
1029
1030
1031 index_iterator indexes() const { return index_iterator(getNumAttrSets()); }
1032
1033
1034 bool operator==(const AttributeList &RHS) const { return pImpl == RHS.pImpl; }
1035 bool operator!=(const AttributeList &RHS) const { return pImpl != RHS.pImpl; }
1036
1037
1038 void *getRawPointer() const {
1039 return pImpl;
1040 }
1041
1042
1043 bool isEmpty() const { return pImpl == nullptr; }
1044
1046
1048};
1049
1050
1051
1052
1053template <> struct DenseMapInfo<AttributeList, void> {
1054 static AttributeList getEmptyKey() {
1055 auto Val = static_cast<uintptr_t>(-1);
1056 Val <<= PointerLikeTypeTraits<void*>::NumLowBitsAvailable;
1057 return AttributeList(reinterpret_cast<AttributeListImpl *>(Val));
1058 }
1059
1060 static AttributeList getTombstoneKey() {
1061 auto Val = static_cast<uintptr_t>(-2);
1062 Val <<= PointerLikeTypeTraits<void*>::NumLowBitsAvailable;
1063 return AttributeList(reinterpret_cast<AttributeListImpl *>(Val));
1064 }
1065
1066 static unsigned getHashValue(AttributeList AS) {
1067 return (unsigned((uintptr_t)AS.pImpl) >> 4) ^
1068 (unsigned((uintptr_t)AS.pImpl) >> 9);
1069 }
1070
1071 static bool isEqual(AttributeList LHS, AttributeList RHS) {
1073 }
1074};
1075
1076
1077
1078
1079
1080
1081
1082class AttrBuilder {
1083 LLVMContext &Ctx;
1084 SmallVector<Attribute, 8> Attrs;
1085
1086public:
1087 AttrBuilder(LLVMContext &Ctx) : Ctx(Ctx) {}
1088 AttrBuilder(const AttrBuilder &) = delete;
1089 AttrBuilder(AttrBuilder &&) = default;
1090
1091 AttrBuilder(LLVMContext &Ctx, const Attribute &A) : Ctx(Ctx) {
1092 addAttribute(A);
1093 }
1094
1095 LLVM_ABI AttrBuilder(LLVMContext &Ctx, AttributeSet AS);
1096
1098
1099
1100 LLVM_ABI AttrBuilder &addAttribute(Attribute::AttrKind Val);
1101
1102
1103 LLVM_ABI AttrBuilder &addAttribute(Attribute A);
1104
1105
1106 LLVM_ABI AttrBuilder &addAttribute(StringRef A, StringRef V = StringRef());
1107
1108
1109 LLVM_ABI AttrBuilder &removeAttribute(Attribute::AttrKind Val);
1110
1111
1112 LLVM_ABI AttrBuilder &removeAttribute(StringRef A);
1113
1114
1115 AttrBuilder &removeAttribute(Attribute A) {
1116 if (A.isStringAttribute())
1117 return removeAttribute(A.getKindAsString());
1118 else
1119 return removeAttribute(A.getKindAsEnum());
1120 }
1121
1122
1123
1125
1126
1127 LLVM_ABI AttrBuilder &remove(const AttributeMask &AM);
1128
1129
1130
1131 LLVM_ABI bool overlaps(const AttributeMask &AM) const;
1132
1133
1135
1136
1137
1139
1140
1141 bool hasAttributes() const { return .empty(); }
1142
1143
1144
1145 LLVM_ABI Attribute getAttribute(Attribute::AttrKind Kind) const;
1146
1147
1148
1150
1151
1152
1154
1155
1156
1157 LLVM_ABI std::optional<uint64_t>
1158 getRawIntAttr(Attribute::AttrKind Kind) const;
1159
1160
1162 return MaybeAlign(getRawIntAttr(Attribute::Alignment).value_or(0));
1163 }
1164
1165
1166 MaybeAlign getStackAlignment() const {
1167 return MaybeAlign(getRawIntAttr(Attribute::StackAlignment).value_or(0));
1168 }
1169
1170
1171
1172 uint64_t getDereferenceableBytes() const {
1173 return getRawIntAttr(Attribute::Dereferenceable).value_or(0);
1174 }
1175
1176
1177
1178 uint64_t getDereferenceableOrNullBytes() const {
1179 return getRawIntAttr(Attribute::DereferenceableOrNull).value_or(0);
1180 }
1181
1182
1183
1185 std::optional<uint64_t> Raw = getRawIntAttr(Attribute::NoFPClass);
1186 return static_cast<FPClassTest>(Raw.value_or(0));
1187 }
1188
1189
1190 LLVM_ABI Type *getTypeAttr(Attribute::AttrKind Kind) const;
1191
1192
1193 Type *getByValType() const { return getTypeAttr(Attribute::ByVal); }
1194
1195
1196 Type *getStructRetType() const { return getTypeAttr(Attribute::StructRet); }
1197
1198
1199 Type *getByRefType() const { return getTypeAttr(Attribute::ByRef); }
1200
1201
1202 Type *getPreallocatedType() const {
1203 return getTypeAttr(Attribute::Preallocated);
1204 }
1205
1206
1207 Type *getInAllocaType() const { return getTypeAttr(Attribute::InAlloca); }
1208
1209
1210
1211 LLVM_ABI std::optional<std::pair<unsigned, std::optional>>
1212 getAllocSizeArgs() const;
1213
1214
1215 LLVM_ABI AttrBuilder &addRawIntAttr(Attribute::AttrKind Kind, uint64_t Value);
1216
1217
1218
1219 LLVM_ABI AttrBuilder &addAlignmentAttr(MaybeAlign Align);
1220
1221
1222
1223
1224
1225 inline AttrBuilder &addAlignmentAttr(unsigned Align) {
1226 return addAlignmentAttr(MaybeAlign(Align));
1227 }
1228
1229
1230
1231 LLVM_ABI AttrBuilder &addStackAlignmentAttr(MaybeAlign Align);
1232
1233
1234
1235
1236
1237 inline AttrBuilder &addStackAlignmentAttr(unsigned Align) {
1238 return addStackAlignmentAttr(MaybeAlign(Align));
1239 }
1240
1241
1242
1243 LLVM_ABI AttrBuilder &addDereferenceableAttr(uint64_t Bytes);
1244
1245
1246
1247 LLVM_ABI AttrBuilder &addDereferenceableOrNullAttr(uint64_t Bytes);
1248
1249
1251 addAllocSizeAttr(unsigned ElemSizeArg,
1252 const std::optional &NumElemsArg);
1253
1254
1255 LLVM_ABI AttrBuilder &addVScaleRangeAttr(unsigned MinValue,
1256 std::optional MaxValue);
1257
1258
1259 LLVM_ABI AttrBuilder &addTypeAttr(Attribute::AttrKind Kind, Type *Ty);
1260
1261
1262 LLVM_ABI AttrBuilder &addByValAttr(Type *Ty);
1263
1264
1265 LLVM_ABI AttrBuilder &addStructRetAttr(Type *Ty);
1266
1267
1268 LLVM_ABI AttrBuilder &addByRefAttr(Type *Ty);
1269
1270
1271 LLVM_ABI AttrBuilder &addPreallocatedAttr(Type *Ty);
1272
1273
1274 LLVM_ABI AttrBuilder &addInAllocaAttr(Type *Ty);
1275
1276
1277
1278 LLVM_ABI AttrBuilder &addAllocSizeAttrFromRawRepr(uint64_t RawAllocSizeRepr);
1279
1280
1281
1283 addVScaleRangeAttrFromRawRepr(uint64_t RawVScaleRangeRepr);
1284
1285
1286
1287 LLVM_ABI AttrBuilder &addUWTableAttr(UWTableKind Kind);
1288
1289
1290 LLVM_ABI AttrBuilder &addAllocKindAttr(AllocFnKind Kind);
1291
1292
1293 LLVM_ABI AttrBuilder &addMemoryAttr(MemoryEffects ME);
1294
1295
1296 LLVM_ABI AttrBuilder &addCapturesAttr(CaptureInfo CI);
1297
1298
1299 LLVM_ABI AttrBuilder &addNoFPClassAttr(FPClassTest NoFPClassMask);
1300
1301
1302 LLVM_ABI AttrBuilder &addConstantRangeAttr(Attribute::AttrKind Kind,
1303 const ConstantRange &CR);
1304
1305
1306 LLVM_ABI AttrBuilder &addRangeAttr(const ConstantRange &CR);
1307
1308
1309 LLVM_ABI AttrBuilder &addConstantRangeListAttr(Attribute::AttrKind Kind,
1310 ArrayRef Val);
1311
1312
1313 LLVM_ABI AttrBuilder &addInitializesAttr(const ConstantRangeList &CRL);
1314
1315
1316
1317
1318 LLVM_ABI AttrBuilder &addFromEquivalentMetadata(const Instruction &I);
1319
1320 ArrayRef attrs() const { return Attrs; }
1321
1323 bool operator!=(const AttrBuilder &B) const { return !(*this == B); }
1324};
1325
1326namespace AttributeFuncs {
1327
1328enum AttributeSafetyKind : uint8_t {
1329 ASK_SAFE_TO_DROP = 1,
1330 ASK_UNSAFE_TO_DROP = 2,
1331 ASK_ALL = ASK_SAFE_TO_DROP | ASK_UNSAFE_TO_DROP,
1332};
1333
1334
1335
1336LLVM_ABI bool isNoFPClassCompatibleType(Type *Ty);
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1348 AttributeSafetyKind ASK = ASK_ALL);
1349
1350
1351
1352
1353
1354
1356
1357
1358
1361
1362
1363
1364
1365
1366
1367
1369
1370
1373
1374
1375
1376
1377
1380
1381
1383
1384}
1385
1386}
1387
1388#endif
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 bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
static FPClassTest getNoFPClass(const Instruction &I)
static uint32_t getAlignment(const MCSectionCOFF &Sec)
ArrayRef - 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.
Definition Attributes.h:361
LLVM_ABI AllocFnKind getAllocKind() const
bool hasAttributes() const
Return true if attributes exists in this set.
Definition Attributes.h:431
const Attribute * iterator
Definition Attributes.h:469
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
bool operator!=(const AttributeSet &O) const
Definition Attributes.h:385
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
Definition Attributes.h:384
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
Definition Attributes.h:363
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...
Definition Attributes.h:69
static const unsigned NumTypeAttrKinds
Definition Attributes.h:99
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.
Definition Attributes.h:323
static LLVM_ABI Attribute::AttrKind getAttrKindFromName(StringRef AttrName)
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 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)
Definition Attributes.h:107
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
Definition Attributes.h:324
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,...
Definition Attributes.h:233
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,...
Definition Attributes.h:88
@ TombstoneKey
Use as Tombstone key for DenseMap of AttrKind.
Definition Attributes.h:95
@ None
No attributes have been set.
Definition Attributes.h:90
@ EmptyKey
Use as Empty key for DenseMap of AttrKind.
Definition Attributes.h:94
@ EndAttrKinds
Sentinel value useful for loops.
Definition Attributes.h:93
static bool isConstantRangeAttrKind(AttrKind Kind)
Definition Attributes.h:110
void * getRawPointer() const
Return a raw pointer that uniquely identifies this attribute.
Definition Attributes.h:335
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)
Definition Attributes.h:104
static bool isConstantRangeListAttrKind(AttrKind Kind)
Definition Attributes.h:113
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.
Definition Attributes.h:186
LLVM_ABI bool hasAttribute(AttrKind Val) const
Return true if the attribute is present.
static bool isEnumAttrKind(AttrKind Kind)
Definition Attributes.h:101
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.
Definition Attributes.h:223
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.
Definition Attributes.h:340
static const unsigned NumIntAttrKinds
Definition Attributes.h:98
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 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.
FoldingSetNodeID - This class is used to gather all the unique data bits of a node.
This is an important class for using LLVM in a threaded context.
StringRef - 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.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
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)
APInt operator*(APInt a, uint64_t RHS)
AllocFnKind
Definition Attributes.h:51
@ Aligned
Definition Attributes.h:58
@ Free
Definition Attributes.h:55
@ Zeroed
Definition Attributes.h:57
@ Alloc
Definition Attributes.h:53
@ Realloc
Definition Attributes.h:54
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.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
@ LLVM_MARK_AS_BITMASK_ENUM
Attribute unwrap(LLVMAttributeRef Attr)
Definition Attributes.h:351
LLVM_ABI void mergeAttributesForOutlining(Function &Base, const Function &ToMerge)
Merges the functions attributes from ToMerge into function Base.
LLVMAttributeRef wrap(Attribute Attr)
Definition Attributes.h:346
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.
This struct is a compact representation of a valid (non-zero power of two) alignment.
static AttributeSet getTombstoneKey()
Definition Attributes.h:488
static bool isEqual(AttributeSet LHS, AttributeSet RHS)
Definition Attributes.h:499
static AttributeSet getEmptyKey()
Definition Attributes.h:482
static unsigned getHashValue(AttributeSet AS)
Definition Attributes.h:494
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.