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