• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#ifdef GET_ATTR_NAMES
2#undef GET_ATTR_NAMES
3#ifndef ATTRIBUTE_ALL
4#define ATTRIBUTE_ALL(FIRST, SECOND)
5#endif
6
7#ifndef ATTRIBUTE_ENUM
8#define ATTRIBUTE_ENUM(FIRST, SECOND) ATTRIBUTE_ALL(FIRST, SECOND)
9#endif
10
11ATTRIBUTE_ENUM(AllocAlign,allocalign)
12ATTRIBUTE_ENUM(AllocatedPointer,allocptr)
13ATTRIBUTE_ENUM(AlwaysInline,alwaysinline)
14ATTRIBUTE_ENUM(Builtin,builtin)
15ATTRIBUTE_ENUM(Cold,cold)
16ATTRIBUTE_ENUM(Convergent,convergent)
17ATTRIBUTE_ENUM(DisableSanitizerInstrumentation,disable_sanitizer_instrumentation)
18ATTRIBUTE_ENUM(FnRetThunkExtern,fn_ret_thunk_extern)
19ATTRIBUTE_ENUM(Hot,hot)
20ATTRIBUTE_ENUM(ImmArg,immarg)
21ATTRIBUTE_ENUM(InReg,inreg)
22ATTRIBUTE_ENUM(InlineHint,inlinehint)
23ATTRIBUTE_ENUM(JumpTable,jumptable)
24ATTRIBUTE_ENUM(MinSize,minsize)
25ATTRIBUTE_ENUM(MustProgress,mustprogress)
26ATTRIBUTE_ENUM(Naked,naked)
27ATTRIBUTE_ENUM(Nest,nest)
28ATTRIBUTE_ENUM(NoAlias,noalias)
29ATTRIBUTE_ENUM(NoBuiltin,nobuiltin)
30ATTRIBUTE_ENUM(NoCallback,nocallback)
31ATTRIBUTE_ENUM(NoCapture,nocapture)
32ATTRIBUTE_ENUM(NoCfCheck,nocf_check)
33ATTRIBUTE_ENUM(NoDuplicate,noduplicate)
34ATTRIBUTE_ENUM(NoFree,nofree)
35ATTRIBUTE_ENUM(NoImplicitFloat,noimplicitfloat)
36ATTRIBUTE_ENUM(NoInline,noinline)
37ATTRIBUTE_ENUM(NoMerge,nomerge)
38ATTRIBUTE_ENUM(NoProfile,noprofile)
39ATTRIBUTE_ENUM(NoRecurse,norecurse)
40ATTRIBUTE_ENUM(NoRedZone,noredzone)
41ATTRIBUTE_ENUM(NoReturn,noreturn)
42ATTRIBUTE_ENUM(NoSanitizeBounds,nosanitize_bounds)
43ATTRIBUTE_ENUM(NoSanitizeCoverage,nosanitize_coverage)
44ATTRIBUTE_ENUM(NoSync,nosync)
45ATTRIBUTE_ENUM(NoUndef,noundef)
46ATTRIBUTE_ENUM(NoUnwind,nounwind)
47ATTRIBUTE_ENUM(NonLazyBind,nonlazybind)
48ATTRIBUTE_ENUM(NonNull,nonnull)
49ATTRIBUTE_ENUM(NullPointerIsValid,null_pointer_is_valid)
50ATTRIBUTE_ENUM(OptForFuzzing,optforfuzzing)
51ATTRIBUTE_ENUM(OptimizeForSize,optsize)
52ATTRIBUTE_ENUM(OptimizeNone,optnone)
53ATTRIBUTE_ENUM(PresplitCoroutine,presplitcoroutine)
54ATTRIBUTE_ENUM(ReadNone,readnone)
55ATTRIBUTE_ENUM(ReadOnly,readonly)
56ATTRIBUTE_ENUM(Returned,returned)
57ATTRIBUTE_ENUM(ReturnsTwice,returns_twice)
58ATTRIBUTE_ENUM(SExt,signext)
59ATTRIBUTE_ENUM(SafeStack,safestack)
60ATTRIBUTE_ENUM(SanitizeAddress,sanitize_address)
61ATTRIBUTE_ENUM(SanitizeHWAddress,sanitize_hwaddress)
62ATTRIBUTE_ENUM(SanitizeMemTag,sanitize_memtag)
63ATTRIBUTE_ENUM(SanitizeMemory,sanitize_memory)
64ATTRIBUTE_ENUM(SanitizeThread,sanitize_thread)
65ATTRIBUTE_ENUM(ShadowCallStack,shadowcallstack)
66ATTRIBUTE_ENUM(SkipProfile,skipprofile)
67ATTRIBUTE_ENUM(Speculatable,speculatable)
68ATTRIBUTE_ENUM(SpeculativeLoadHardening,speculative_load_hardening)
69ATTRIBUTE_ENUM(StackProtect,ssp)
70ATTRIBUTE_ENUM(StackProtectReq,sspreq)
71ATTRIBUTE_ENUM(StackProtectStrong,sspstrong)
72ATTRIBUTE_ENUM(StrictFP,strictfp)
73ATTRIBUTE_ENUM(SwiftAsync,swiftasync)
74ATTRIBUTE_ENUM(SwiftError,swifterror)
75ATTRIBUTE_ENUM(SwiftSelf,swiftself)
76ATTRIBUTE_ENUM(WillReturn,willreturn)
77ATTRIBUTE_ENUM(WriteOnly,writeonly)
78ATTRIBUTE_ENUM(ZExt,zeroext)
79ATTRIBUTE_ENUM(ByRef,byref)
80ATTRIBUTE_ENUM(ByVal,byval)
81ATTRIBUTE_ENUM(ElementType,elementtype)
82ATTRIBUTE_ENUM(InAlloca,inalloca)
83ATTRIBUTE_ENUM(Preallocated,preallocated)
84ATTRIBUTE_ENUM(StructRet,sret)
85ATTRIBUTE_ENUM(Alignment,align)
86ATTRIBUTE_ENUM(AllocKind,allockind)
87ATTRIBUTE_ENUM(AllocSize,allocsize)
88ATTRIBUTE_ENUM(Dereferenceable,dereferenceable)
89ATTRIBUTE_ENUM(DereferenceableOrNull,dereferenceable_or_null)
90ATTRIBUTE_ENUM(Memory,memory)
91ATTRIBUTE_ENUM(StackAlignment,alignstack)
92ATTRIBUTE_ENUM(UWTable,uwtable)
93ATTRIBUTE_ENUM(VScaleRange,vscale_range)
94#undef ATTRIBUTE_ENUM
95
96#ifndef ATTRIBUTE_STRBOOL
97#define ATTRIBUTE_STRBOOL(FIRST, SECOND) ATTRIBUTE_ALL(FIRST, SECOND)
98#endif
99
100ATTRIBUTE_STRBOOL(ApproxFuncFPMath,approx-func-fp-math)
101ATTRIBUTE_STRBOOL(LessPreciseFPMAD,less-precise-fpmad)
102ATTRIBUTE_STRBOOL(NoInfsFPMath,no-infs-fp-math)
103ATTRIBUTE_STRBOOL(NoInlineLineTables,no-inline-line-tables)
104ATTRIBUTE_STRBOOL(NoJumpTables,no-jump-tables)
105ATTRIBUTE_STRBOOL(NoNansFPMath,no-nans-fp-math)
106ATTRIBUTE_STRBOOL(NoSignedZerosFPMath,no-signed-zeros-fp-math)
107ATTRIBUTE_STRBOOL(ProfileSampleAccurate,profile-sample-accurate)
108ATTRIBUTE_STRBOOL(UnsafeFPMath,unsafe-fp-math)
109ATTRIBUTE_STRBOOL(UseSampleProfile,use-sample-profile)
110#undef ATTRIBUTE_STRBOOL
111
112#undef ATTRIBUTE_ALL
113#endif
114
115#ifdef GET_ATTR_ENUM
116#undef GET_ATTR_ENUM
117FirstEnumAttr = 1,
118AllocAlign = 1,
119AllocatedPointer = 2,
120AlwaysInline = 3,
121Builtin = 4,
122Cold = 5,
123Convergent = 6,
124DisableSanitizerInstrumentation = 7,
125FnRetThunkExtern = 8,
126Hot = 9,
127ImmArg = 10,
128InReg = 11,
129InlineHint = 12,
130JumpTable = 13,
131MinSize = 14,
132MustProgress = 15,
133Naked = 16,
134Nest = 17,
135NoAlias = 18,
136NoBuiltin = 19,
137NoCallback = 20,
138NoCapture = 21,
139NoCfCheck = 22,
140NoDuplicate = 23,
141NoFree = 24,
142NoImplicitFloat = 25,
143NoInline = 26,
144NoMerge = 27,
145NoProfile = 28,
146NoRecurse = 29,
147NoRedZone = 30,
148NoReturn = 31,
149NoSanitizeBounds = 32,
150NoSanitizeCoverage = 33,
151NoSync = 34,
152NoUndef = 35,
153NoUnwind = 36,
154NonLazyBind = 37,
155NonNull = 38,
156NullPointerIsValid = 39,
157OptForFuzzing = 40,
158OptimizeForSize = 41,
159OptimizeNone = 42,
160PresplitCoroutine = 43,
161ReadNone = 44,
162ReadOnly = 45,
163Returned = 46,
164ReturnsTwice = 47,
165SExt = 48,
166SafeStack = 49,
167SanitizeAddress = 50,
168SanitizeHWAddress = 51,
169SanitizeMemTag = 52,
170SanitizeMemory = 53,
171SanitizeThread = 54,
172ShadowCallStack = 55,
173SkipProfile = 56,
174Speculatable = 57,
175SpeculativeLoadHardening = 58,
176StackProtect = 59,
177StackProtectReq = 60,
178StackProtectStrong = 61,
179StrictFP = 62,
180SwiftAsync = 63,
181SwiftError = 64,
182SwiftSelf = 65,
183WillReturn = 66,
184WriteOnly = 67,
185ZExt = 68,
186LastEnumAttr = 68,
187FirstTypeAttr = 69,
188ByRef = 69,
189ByVal = 70,
190ElementType = 71,
191InAlloca = 72,
192Preallocated = 73,
193StructRet = 74,
194LastTypeAttr = 74,
195FirstIntAttr = 75,
196Alignment = 75,
197AllocKind = 76,
198AllocSize = 77,
199Dereferenceable = 78,
200DereferenceableOrNull = 79,
201Memory = 80,
202StackAlignment = 81,
203UWTable = 82,
204VScaleRange = 83,
205LastIntAttr = 83,
206#endif
207
208#ifdef GET_ATTR_COMPAT_FUNC
209#undef GET_ATTR_COMPAT_FUNC
210static inline bool hasCompatibleFnAttrs(const Function &Caller,
211                                        const Function &Callee) {
212  bool Ret = true;
213
214  Ret &= isEqual<SanitizeAddressAttr>(Caller, Callee);
215  Ret &= isEqual<SanitizeThreadAttr>(Caller, Callee);
216  Ret &= isEqual<SanitizeMemoryAttr>(Caller, Callee);
217  Ret &= isEqual<SanitizeHWAddressAttr>(Caller, Callee);
218  Ret &= isEqual<SanitizeMemTagAttr>(Caller, Callee);
219  Ret &= isEqual<SafeStackAttr>(Caller, Callee);
220  Ret &= isEqual<ShadowCallStackAttr>(Caller, Callee);
221  Ret &= isEqual<UseSampleProfileAttr>(Caller, Callee);
222  Ret &= isEqual<NoProfileAttr>(Caller, Callee);
223
224  return Ret;
225}
226
227static inline void mergeFnAttrs(Function &Caller,
228                                const Function &Callee) {
229  setAND<NoInfsFPMathAttr>(Caller, Callee);
230  setAND<NoNansFPMathAttr>(Caller, Callee);
231  setAND<ApproxFuncFPMathAttr>(Caller, Callee);
232  setAND<NoSignedZerosFPMathAttr>(Caller, Callee);
233  setAND<UnsafeFPMathAttr>(Caller, Callee);
234  setOR<NoImplicitFloatAttr>(Caller, Callee);
235  setOR<NoJumpTablesAttr>(Caller, Callee);
236  setOR<ProfileSampleAccurateAttr>(Caller, Callee);
237  setOR<SpeculativeLoadHardeningAttr>(Caller, Callee);
238  adjustCallerSSPLevel(Caller, Callee);
239  adjustCallerStackProbes(Caller, Callee);
240  adjustCallerStackProbeSize(Caller, Callee);
241  adjustMinLegalVectorWidth(Caller, Callee);
242  adjustNullPointerValidAttr(Caller, Callee);
243  setAND<MustProgressAttr>(Caller, Callee);
244  setAND<LessPreciseFPMADAttr>(Caller, Callee);
245}
246
247#endif
248#ifdef GET_ATTR_PROP_TABLE
249#undef GET_ATTR_PROP_TABLE
250static const uint8_t AttrPropTable[] = {
2510 | AttributeProperty::ParamAttr,
2520 | AttributeProperty::ParamAttr,
2530 | AttributeProperty::FnAttr,
2540 | AttributeProperty::FnAttr,
2550 | AttributeProperty::FnAttr,
2560 | AttributeProperty::FnAttr,
2570 | AttributeProperty::FnAttr,
2580 | AttributeProperty::FnAttr,
2590 | AttributeProperty::FnAttr,
2600 | AttributeProperty::ParamAttr,
2610 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr,
2620 | AttributeProperty::FnAttr,
2630 | AttributeProperty::FnAttr,
2640 | AttributeProperty::FnAttr,
2650 | AttributeProperty::FnAttr,
2660 | AttributeProperty::FnAttr,
2670 | AttributeProperty::ParamAttr,
2680 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr,
2690 | AttributeProperty::FnAttr,
2700 | AttributeProperty::FnAttr,
2710 | AttributeProperty::ParamAttr,
2720 | AttributeProperty::FnAttr,
2730 | AttributeProperty::FnAttr,
2740 | AttributeProperty::FnAttr | AttributeProperty::ParamAttr,
2750 | AttributeProperty::FnAttr,
2760 | AttributeProperty::FnAttr,
2770 | AttributeProperty::FnAttr,
2780 | AttributeProperty::FnAttr,
2790 | AttributeProperty::FnAttr,
2800 | AttributeProperty::FnAttr,
2810 | AttributeProperty::FnAttr,
2820 | AttributeProperty::FnAttr,
2830 | AttributeProperty::FnAttr,
2840 | AttributeProperty::FnAttr,
2850 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr,
2860 | AttributeProperty::FnAttr,
2870 | AttributeProperty::FnAttr,
2880 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr,
2890 | AttributeProperty::FnAttr,
2900 | AttributeProperty::FnAttr,
2910 | AttributeProperty::FnAttr,
2920 | AttributeProperty::FnAttr,
2930 | AttributeProperty::FnAttr,
2940 | AttributeProperty::ParamAttr,
2950 | AttributeProperty::ParamAttr,
2960 | AttributeProperty::ParamAttr,
2970 | AttributeProperty::FnAttr,
2980 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr,
2990 | AttributeProperty::FnAttr,
3000 | AttributeProperty::FnAttr,
3010 | AttributeProperty::FnAttr,
3020 | AttributeProperty::FnAttr,
3030 | AttributeProperty::FnAttr,
3040 | AttributeProperty::FnAttr,
3050 | AttributeProperty::FnAttr,
3060 | AttributeProperty::FnAttr,
3070 | AttributeProperty::FnAttr,
3080 | AttributeProperty::FnAttr,
3090 | AttributeProperty::FnAttr,
3100 | AttributeProperty::FnAttr,
3110 | AttributeProperty::FnAttr,
3120 | AttributeProperty::FnAttr,
3130 | AttributeProperty::ParamAttr,
3140 | AttributeProperty::ParamAttr,
3150 | AttributeProperty::ParamAttr,
3160 | AttributeProperty::FnAttr,
3170 | AttributeProperty::ParamAttr,
3180 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr,
3190 | AttributeProperty::ParamAttr,
3200 | AttributeProperty::ParamAttr,
3210 | AttributeProperty::ParamAttr,
3220 | AttributeProperty::ParamAttr,
3230 | AttributeProperty::FnAttr | AttributeProperty::ParamAttr,
3240 | AttributeProperty::ParamAttr,
3250 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr,
3260 | AttributeProperty::FnAttr,
3270 | AttributeProperty::FnAttr,
3280 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr,
3290 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr,
3300 | AttributeProperty::FnAttr,
3310 | AttributeProperty::FnAttr | AttributeProperty::ParamAttr,
3320 | AttributeProperty::FnAttr,
3330 | AttributeProperty::FnAttr,
334};
335#endif
336