1e8d8bef9SDimitry Andric//===- Attributes.td - Defines all LLVM attributes ---------*- tablegen -*-===//
2e8d8bef9SDimitry Andric//
3e8d8bef9SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e8d8bef9SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
5e8d8bef9SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e8d8bef9SDimitry Andric//
7e8d8bef9SDimitry Andric//===----------------------------------------------------------------------===//
8e8d8bef9SDimitry Andric//
9e8d8bef9SDimitry Andric// This file defines all the LLVM attributes.
10e8d8bef9SDimitry Andric//
11e8d8bef9SDimitry Andric//===----------------------------------------------------------------------===//
12e8d8bef9SDimitry Andric
13fe6060f1SDimitry Andric/// Attribute property base class.
14fe6060f1SDimitry Andricclass AttrProperty;
15fe6060f1SDimitry Andric
16fe6060f1SDimitry Andric/// Can be used as function attribute.
17fe6060f1SDimitry Andricdef FnAttr : AttrProperty;
18fe6060f1SDimitry Andric
19fe6060f1SDimitry Andric/// Can be used as parameter attribute.
20fe6060f1SDimitry Andricdef ParamAttr : AttrProperty;
21fe6060f1SDimitry Andric
22fe6060f1SDimitry Andric/// Can be used as return attribute.
23fe6060f1SDimitry Andricdef RetAttr : AttrProperty;
24fe6060f1SDimitry Andric
250b57cec5SDimitry Andric/// Attribute base class.
26fe6060f1SDimitry Andricclass Attr<string S, list<AttrProperty> P> {
270b57cec5SDimitry Andric  // String representation of this attribute in the IR.
280b57cec5SDimitry Andric  string AttrString = S;
29fe6060f1SDimitry Andric  list<AttrProperty> Properties = P;
300b57cec5SDimitry Andric}
310b57cec5SDimitry Andric
320b57cec5SDimitry Andric/// Enum attribute.
33fe6060f1SDimitry Andricclass EnumAttr<string S, list<AttrProperty> P> : Attr<S, P>;
340b57cec5SDimitry Andric
355ffd83dbSDimitry Andric/// Int attribute.
36fe6060f1SDimitry Andricclass IntAttr<string S, list<AttrProperty> P> : Attr<S, P>;
370b57cec5SDimitry Andric
385ffd83dbSDimitry Andric/// Type attribute.
39fe6060f1SDimitry Andricclass TypeAttr<string S, list<AttrProperty> P> : Attr<S, P>;
40fe6060f1SDimitry Andric
41fe6060f1SDimitry Andric/// StringBool attribute.
42fe6060f1SDimitry Andricclass StrBoolAttr<string S> : Attr<S, []>;
435ffd83dbSDimitry Andric
4406c3fb27SDimitry Andric/// Arbitrary string attribute.
4506c3fb27SDimitry Andricclass ComplexStrAttr<string S, list<AttrProperty> P> : Attr<S, P>;
4606c3fb27SDimitry Andric
470b57cec5SDimitry Andric/// Target-independent enum attributes.
480b57cec5SDimitry Andric
490b57cec5SDimitry Andric/// Alignment of parameter (5 bits) stored as log2 of alignment with +1 bias.
500b57cec5SDimitry Andric/// 0 means unaligned (different from align(1)).
51fe6060f1SDimitry Andricdef Alignment : IntAttr<"align", [ParamAttr, RetAttr]>;
520b57cec5SDimitry Andric
5381ad6265SDimitry Andric/// Parameter of a function that tells us the alignment of an allocation, as in
5481ad6265SDimitry Andric/// aligned_alloc and aligned ::operator::new.
5581ad6265SDimitry Andricdef AllocAlign: EnumAttr<"allocalign", [ParamAttr]>;
5681ad6265SDimitry Andric
5781ad6265SDimitry Andric/// Describes behavior of an allocator function in terms of known properties.
5881ad6265SDimitry Andricdef AllocKind: IntAttr<"allockind", [FnAttr]>;
5981ad6265SDimitry Andric
6081ad6265SDimitry Andric/// Parameter is the pointer to be manipulated by the allocator function.
6181ad6265SDimitry Andricdef AllocatedPointer : EnumAttr<"allocptr", [ParamAttr]>;
6281ad6265SDimitry Andric
630b57cec5SDimitry Andric/// The result of the function is guaranteed to point to a number of bytes that
640b57cec5SDimitry Andric/// we can determine if we know the value of the function's arguments.
65fe6060f1SDimitry Andricdef AllocSize : IntAttr<"allocsize", [FnAttr]>;
660b57cec5SDimitry Andric
670b57cec5SDimitry Andric/// inline=always.
68fe6060f1SDimitry Andricdef AlwaysInline : EnumAttr<"alwaysinline", [FnAttr]>;
690b57cec5SDimitry Andric
700b57cec5SDimitry Andric/// Callee is recognized as a builtin, despite nobuiltin attribute on its
710b57cec5SDimitry Andric/// declaration.
72fe6060f1SDimitry Andricdef Builtin : EnumAttr<"builtin", [FnAttr]>;
730b57cec5SDimitry Andric
740b57cec5SDimitry Andric/// Pass structure by value.
75fe6060f1SDimitry Andricdef ByVal : TypeAttr<"byval", [ParamAttr]>;
765ffd83dbSDimitry Andric
77e8d8bef9SDimitry Andric/// Mark in-memory ABI type.
78fe6060f1SDimitry Andricdef ByRef : TypeAttr<"byref", [ParamAttr]>;
79e8d8bef9SDimitry Andric
805ffd83dbSDimitry Andric/// Parameter or return value may not contain uninitialized or poison bits.
81fe6060f1SDimitry Andricdef NoUndef : EnumAttr<"noundef", [ParamAttr, RetAttr]>;
820b57cec5SDimitry Andric
830b57cec5SDimitry Andric/// Marks function as being in a cold path.
84fe6060f1SDimitry Andricdef Cold : EnumAttr<"cold", [FnAttr]>;
850b57cec5SDimitry Andric
860b57cec5SDimitry Andric/// Can only be moved to control-equivalent blocks.
87fe6060f1SDimitry Andricdef Convergent : EnumAttr<"convergent", [FnAttr]>;
880b57cec5SDimitry Andric
89e8d8bef9SDimitry Andric/// Marks function as being in a hot path and frequently called.
90fe6060f1SDimitry Andricdef Hot: EnumAttr<"hot", [FnAttr]>;
91e8d8bef9SDimitry Andric
920b57cec5SDimitry Andric/// Pointer is known to be dereferenceable.
93fe6060f1SDimitry Andricdef Dereferenceable : IntAttr<"dereferenceable", [ParamAttr, RetAttr]>;
940b57cec5SDimitry Andric
950b57cec5SDimitry Andric/// Pointer is either null or dereferenceable.
96fe6060f1SDimitry Andricdef DereferenceableOrNull : IntAttr<"dereferenceable_or_null",
97fe6060f1SDimitry Andric                                    [ParamAttr, RetAttr]>;
98fe6060f1SDimitry Andric
99349cc55cSDimitry Andric/// Do not instrument function with sanitizers.
100349cc55cSDimitry Andricdef DisableSanitizerInstrumentation: EnumAttr<"disable_sanitizer_instrumentation", [FnAttr]>;
101349cc55cSDimitry Andric
102fe6060f1SDimitry Andric/// Provide pointer element type to intrinsic.
103fe6060f1SDimitry Andricdef ElementType : TypeAttr<"elementtype", [ParamAttr]>;
1040b57cec5SDimitry Andric
105753f127fSDimitry Andric/// Whether to keep return instructions, or replace with a jump to an external
106753f127fSDimitry Andric/// symbol.
107753f127fSDimitry Andricdef FnRetThunkExtern : EnumAttr<"fn_ret_thunk_extern", [FnAttr]>;
108753f127fSDimitry Andric
1090b57cec5SDimitry Andric/// Pass structure in an alloca.
110fe6060f1SDimitry Andricdef InAlloca : TypeAttr<"inalloca", [ParamAttr]>;
1110b57cec5SDimitry Andric
1120b57cec5SDimitry Andric/// Source said inlining was desirable.
113fe6060f1SDimitry Andricdef InlineHint : EnumAttr<"inlinehint", [FnAttr]>;
1140b57cec5SDimitry Andric
1150b57cec5SDimitry Andric/// Force argument to be passed in register.
116fe6060f1SDimitry Andricdef InReg : EnumAttr<"inreg", [ParamAttr, RetAttr]>;
1170b57cec5SDimitry Andric
1180b57cec5SDimitry Andric/// Build jump-instruction tables and replace refs.
119fe6060f1SDimitry Andricdef JumpTable : EnumAttr<"jumptable", [FnAttr]>;
1200b57cec5SDimitry Andric
121bdd1243dSDimitry Andric/// Memory effects of the function.
122bdd1243dSDimitry Andricdef Memory : IntAttr<"memory", [FnAttr]>;
123bdd1243dSDimitry Andric
12406c3fb27SDimitry Andric/// Forbidden floating-point classes.
12506c3fb27SDimitry Andricdef NoFPClass : IntAttr<"nofpclass", [ParamAttr, RetAttr]>;
12606c3fb27SDimitry Andric
1270b57cec5SDimitry Andric/// Function must be optimized for size first.
128fe6060f1SDimitry Andricdef MinSize : EnumAttr<"minsize", [FnAttr]>;
1290b57cec5SDimitry Andric
1300b57cec5SDimitry Andric/// Naked function.
131fe6060f1SDimitry Andricdef Naked : EnumAttr<"naked", [FnAttr]>;
1320b57cec5SDimitry Andric
1330b57cec5SDimitry Andric/// Nested function static chain.
134fe6060f1SDimitry Andricdef Nest : EnumAttr<"nest", [ParamAttr]>;
1350b57cec5SDimitry Andric
1360b57cec5SDimitry Andric/// Considered to not alias after call.
137fe6060f1SDimitry Andricdef NoAlias : EnumAttr<"noalias", [ParamAttr, RetAttr]>;
1380b57cec5SDimitry Andric
1390b57cec5SDimitry Andric/// Callee isn't recognized as a builtin.
140fe6060f1SDimitry Andricdef NoBuiltin : EnumAttr<"nobuiltin", [FnAttr]>;
1410b57cec5SDimitry Andric
142e8d8bef9SDimitry Andric/// Function cannot enter into caller's translation unit.
143fe6060f1SDimitry Andricdef NoCallback : EnumAttr<"nocallback", [FnAttr]>;
144e8d8bef9SDimitry Andric
1450b57cec5SDimitry Andric/// Function creates no aliases of pointer.
146fe6060f1SDimitry Andricdef NoCapture : EnumAttr<"nocapture", [ParamAttr]>;
1470b57cec5SDimitry Andric
1480b57cec5SDimitry Andric/// Call cannot be duplicated.
149fe6060f1SDimitry Andricdef NoDuplicate : EnumAttr<"noduplicate", [FnAttr]>;
1500b57cec5SDimitry Andric
1510b57cec5SDimitry Andric/// Function does not deallocate memory.
152fe6060f1SDimitry Andricdef NoFree : EnumAttr<"nofree", [FnAttr, ParamAttr]>;
1530b57cec5SDimitry Andric
1545f757f3fSDimitry Andric/// Argument is dead if the call unwinds.
1555f757f3fSDimitry Andricdef DeadOnUnwind : EnumAttr<"dead_on_unwind", [ParamAttr]>;
1565f757f3fSDimitry Andric
1570b57cec5SDimitry Andric/// Disable implicit floating point insts.
158fe6060f1SDimitry Andricdef NoImplicitFloat : EnumAttr<"noimplicitfloat", [FnAttr]>;
1590b57cec5SDimitry Andric
1600b57cec5SDimitry Andric/// inline=never.
161fe6060f1SDimitry Andricdef NoInline : EnumAttr<"noinline", [FnAttr]>;
1620b57cec5SDimitry Andric
1630b57cec5SDimitry Andric/// Function is called early and/or often, so lazy binding isn't worthwhile.
164fe6060f1SDimitry Andricdef NonLazyBind : EnumAttr<"nonlazybind", [FnAttr]>;
1650b57cec5SDimitry Andric
166e8d8bef9SDimitry Andric/// Disable merging for specified functions or call sites.
167fe6060f1SDimitry Andricdef NoMerge : EnumAttr<"nomerge", [FnAttr]>;
1685ffd83dbSDimitry Andric
1690b57cec5SDimitry Andric/// Pointer is known to be not null.
170fe6060f1SDimitry Andricdef NonNull : EnumAttr<"nonnull", [ParamAttr, RetAttr]>;
1710b57cec5SDimitry Andric
1720b57cec5SDimitry Andric/// The function does not recurse.
173fe6060f1SDimitry Andricdef NoRecurse : EnumAttr<"norecurse", [FnAttr]>;
1740b57cec5SDimitry Andric
1750b57cec5SDimitry Andric/// Disable redzone.
176fe6060f1SDimitry Andricdef NoRedZone : EnumAttr<"noredzone", [FnAttr]>;
1770b57cec5SDimitry Andric
1780b57cec5SDimitry Andric/// Mark the function as not returning.
179fe6060f1SDimitry Andricdef NoReturn : EnumAttr<"noreturn", [FnAttr]>;
1800b57cec5SDimitry Andric
1810b57cec5SDimitry Andric/// Function does not synchronize.
182fe6060f1SDimitry Andricdef NoSync : EnumAttr<"nosync", [FnAttr]>;
1830b57cec5SDimitry Andric
1840b57cec5SDimitry Andric/// Disable Indirect Branch Tracking.
185fe6060f1SDimitry Andricdef NoCfCheck : EnumAttr<"nocf_check", [FnAttr]>;
1860b57cec5SDimitry Andric
187fe6060f1SDimitry Andric/// Function should not be instrumented.
188fe6060f1SDimitry Andricdef NoProfile : EnumAttr<"noprofile", [FnAttr]>;
189e8d8bef9SDimitry Andric
190bdd1243dSDimitry Andric/// This function should not be instrumented but it is ok to inline profiled
191bdd1243dSDimitry Andric// functions into it.
192bdd1243dSDimitry Andricdef SkipProfile : EnumAttr<"skipprofile", [FnAttr]>;
193bdd1243dSDimitry Andric
1940b57cec5SDimitry Andric/// Function doesn't unwind stack.
195fe6060f1SDimitry Andricdef NoUnwind : EnumAttr<"nounwind", [FnAttr]>;
196fe6060f1SDimitry Andric
19781ad6265SDimitry Andric/// No SanitizeBounds instrumentation.
19881ad6265SDimitry Andricdef NoSanitizeBounds : EnumAttr<"nosanitize_bounds", [FnAttr]>;
19981ad6265SDimitry Andric
200fe6060f1SDimitry Andric/// No SanitizeCoverage instrumentation.
201fe6060f1SDimitry Andricdef NoSanitizeCoverage : EnumAttr<"nosanitize_coverage", [FnAttr]>;
2020b57cec5SDimitry Andric
2035ffd83dbSDimitry Andric/// Null pointer in address space zero is valid.
204fe6060f1SDimitry Andricdef NullPointerIsValid : EnumAttr<"null_pointer_is_valid", [FnAttr]>;
2055ffd83dbSDimitry Andric
2065f757f3fSDimitry Andric/// Select optimizations that give decent debug info.
2075f757f3fSDimitry Andricdef OptimizeForDebugging : EnumAttr<"optdebug", [FnAttr]>;
2085f757f3fSDimitry Andric
2090b57cec5SDimitry Andric/// Select optimizations for best fuzzing signal.
210fe6060f1SDimitry Andricdef OptForFuzzing : EnumAttr<"optforfuzzing", [FnAttr]>;
2110b57cec5SDimitry Andric
2120b57cec5SDimitry Andric/// opt_size.
213fe6060f1SDimitry Andricdef OptimizeForSize : EnumAttr<"optsize", [FnAttr]>;
2140b57cec5SDimitry Andric
2150b57cec5SDimitry Andric/// Function must not be optimized.
216fe6060f1SDimitry Andricdef OptimizeNone : EnumAttr<"optnone", [FnAttr]>;
2170b57cec5SDimitry Andric
2185ffd83dbSDimitry Andric/// Similar to byval but without a copy.
219fe6060f1SDimitry Andricdef Preallocated : TypeAttr<"preallocated", [FnAttr, ParamAttr]>;
2205ffd83dbSDimitry Andric
2210b57cec5SDimitry Andric/// Function does not access memory.
222bdd1243dSDimitry Andricdef ReadNone : EnumAttr<"readnone", [ParamAttr]>;
2230b57cec5SDimitry Andric
2240b57cec5SDimitry Andric/// Function only reads from memory.
225bdd1243dSDimitry Andricdef ReadOnly : EnumAttr<"readonly", [ParamAttr]>;
2260b57cec5SDimitry Andric
2270b57cec5SDimitry Andric/// Return value is always equal to this argument.
228fe6060f1SDimitry Andricdef Returned : EnumAttr<"returned", [ParamAttr]>;
2290b57cec5SDimitry Andric
2300b57cec5SDimitry Andric/// Parameter is required to be a trivial constant.
231fe6060f1SDimitry Andricdef ImmArg : EnumAttr<"immarg", [ParamAttr]>;
2320b57cec5SDimitry Andric
2330b57cec5SDimitry Andric/// Function can return twice.
234fe6060f1SDimitry Andricdef ReturnsTwice : EnumAttr<"returns_twice", [FnAttr]>;
2350b57cec5SDimitry Andric
2360b57cec5SDimitry Andric/// Safe Stack protection.
237fe6060f1SDimitry Andricdef SafeStack : EnumAttr<"safestack", [FnAttr]>;
2380b57cec5SDimitry Andric
2390b57cec5SDimitry Andric/// Shadow Call Stack protection.
240fe6060f1SDimitry Andricdef ShadowCallStack : EnumAttr<"shadowcallstack", [FnAttr]>;
2410b57cec5SDimitry Andric
2420b57cec5SDimitry Andric/// Sign extended before/after call.
243fe6060f1SDimitry Andricdef SExt : EnumAttr<"signext", [ParamAttr, RetAttr]>;
2440b57cec5SDimitry Andric
2450b57cec5SDimitry Andric/// Alignment of stack for function (3 bits)  stored as log2 of alignment with
2460b57cec5SDimitry Andric/// +1 bias 0 means unaligned (different from alignstack=(1)).
247fe6060f1SDimitry Andricdef StackAlignment : IntAttr<"alignstack", [FnAttr, ParamAttr]>;
2480b57cec5SDimitry Andric
2490b57cec5SDimitry Andric/// Function can be speculated.
250fe6060f1SDimitry Andricdef Speculatable : EnumAttr<"speculatable", [FnAttr]>;
2510b57cec5SDimitry Andric
2520b57cec5SDimitry Andric/// Stack protection.
253fe6060f1SDimitry Andricdef StackProtect : EnumAttr<"ssp", [FnAttr]>;
2540b57cec5SDimitry Andric
2550b57cec5SDimitry Andric/// Stack protection required.
256fe6060f1SDimitry Andricdef StackProtectReq : EnumAttr<"sspreq", [FnAttr]>;
2570b57cec5SDimitry Andric
2580b57cec5SDimitry Andric/// Strong Stack protection.
259fe6060f1SDimitry Andricdef StackProtectStrong : EnumAttr<"sspstrong", [FnAttr]>;
2600b57cec5SDimitry Andric
2610b57cec5SDimitry Andric/// Function was called in a scope requiring strict floating point semantics.
262fe6060f1SDimitry Andricdef StrictFP : EnumAttr<"strictfp", [FnAttr]>;
2630b57cec5SDimitry Andric
2640b57cec5SDimitry Andric/// Hidden pointer to structure to return.
265fe6060f1SDimitry Andricdef StructRet : TypeAttr<"sret", [ParamAttr]>;
2660b57cec5SDimitry Andric
2670b57cec5SDimitry Andric/// AddressSanitizer is on.
268fe6060f1SDimitry Andricdef SanitizeAddress : EnumAttr<"sanitize_address", [FnAttr]>;
2690b57cec5SDimitry Andric
2700b57cec5SDimitry Andric/// ThreadSanitizer is on.
271fe6060f1SDimitry Andricdef SanitizeThread : EnumAttr<"sanitize_thread", [FnAttr]>;
2720b57cec5SDimitry Andric
2730b57cec5SDimitry Andric/// MemorySanitizer is on.
274fe6060f1SDimitry Andricdef SanitizeMemory : EnumAttr<"sanitize_memory", [FnAttr]>;
2750b57cec5SDimitry Andric
2760b57cec5SDimitry Andric/// HWAddressSanitizer is on.
277fe6060f1SDimitry Andricdef SanitizeHWAddress : EnumAttr<"sanitize_hwaddress", [FnAttr]>;
2780b57cec5SDimitry Andric
2790b57cec5SDimitry Andric/// MemTagSanitizer is on.
280fe6060f1SDimitry Andricdef SanitizeMemTag : EnumAttr<"sanitize_memtag", [FnAttr]>;
2810b57cec5SDimitry Andric
2820b57cec5SDimitry Andric/// Speculative Load Hardening is enabled.
2830b57cec5SDimitry Andric///
2840b57cec5SDimitry Andric/// Note that this uses the default compatibility (always compatible during
2850b57cec5SDimitry Andric/// inlining) and a conservative merge strategy where inlining an attributed
2860b57cec5SDimitry Andric/// body will add the attribute to the caller. This ensures that code carrying
2870b57cec5SDimitry Andric/// this attribute will always be lowered with hardening enabled.
288fe6060f1SDimitry Andricdef SpeculativeLoadHardening : EnumAttr<"speculative_load_hardening",
289fe6060f1SDimitry Andric                                        [FnAttr]>;
2900b57cec5SDimitry Andric
2910b57cec5SDimitry Andric/// Argument is swift error.
292fe6060f1SDimitry Andricdef SwiftError : EnumAttr<"swifterror", [ParamAttr]>;
2930b57cec5SDimitry Andric
2940b57cec5SDimitry Andric/// Argument is swift self/context.
295fe6060f1SDimitry Andricdef SwiftSelf : EnumAttr<"swiftself", [ParamAttr]>;
296fe6060f1SDimitry Andric
297fe6060f1SDimitry Andric/// Argument is swift async context.
298fe6060f1SDimitry Andricdef SwiftAsync : EnumAttr<"swiftasync", [ParamAttr]>;
2990b57cec5SDimitry Andric
3000b57cec5SDimitry Andric/// Function must be in a unwind table.
30181ad6265SDimitry Andricdef UWTable : IntAttr<"uwtable", [FnAttr]>;
302fe6060f1SDimitry Andric
303fe6060f1SDimitry Andric/// Minimum/Maximum vscale value for function.
304fe6060f1SDimitry Andricdef VScaleRange : IntAttr<"vscale_range", [FnAttr]>;
3050b57cec5SDimitry Andric
3060b57cec5SDimitry Andric/// Function always comes back to callsite.
307fe6060f1SDimitry Andricdef WillReturn : EnumAttr<"willreturn", [FnAttr]>;
3080b57cec5SDimitry Andric
3095f757f3fSDimitry Andric/// Pointer argument is writable.
3105f757f3fSDimitry Andricdef Writable : EnumAttr<"writable", [ParamAttr]>;
3115f757f3fSDimitry Andric
3120b57cec5SDimitry Andric/// Function only writes to memory.
313bdd1243dSDimitry Andricdef WriteOnly : EnumAttr<"writeonly", [ParamAttr]>;
3140b57cec5SDimitry Andric
3150b57cec5SDimitry Andric/// Zero extended before/after call.
316fe6060f1SDimitry Andricdef ZExt : EnumAttr<"zeroext", [ParamAttr, RetAttr]>;
3170b57cec5SDimitry Andric
318e8d8bef9SDimitry Andric/// Function is required to make Forward Progress.
319fe6060f1SDimitry Andricdef MustProgress : EnumAttr<"mustprogress", [FnAttr]>;
320e8d8bef9SDimitry Andric
32181ad6265SDimitry Andric/// Function is a presplit coroutine.
32281ad6265SDimitry Andricdef PresplitCoroutine : EnumAttr<"presplitcoroutine", [FnAttr]>;
32381ad6265SDimitry Andric
3245f757f3fSDimitry Andric/// The coroutine would only be destroyed when it is complete.
3255f757f3fSDimitry Andricdef CoroDestroyOnlyWhenComplete : EnumAttr<"coro_only_destroy_when_complete", [FnAttr]>;
3265f757f3fSDimitry Andric
3270b57cec5SDimitry Andric/// Target-independent string attributes.
3280b57cec5SDimitry Andricdef LessPreciseFPMAD : StrBoolAttr<"less-precise-fpmad">;
3290b57cec5SDimitry Andricdef NoInfsFPMath : StrBoolAttr<"no-infs-fp-math">;
3300b57cec5SDimitry Andricdef NoNansFPMath : StrBoolAttr<"no-nans-fp-math">;
33181ad6265SDimitry Andricdef ApproxFuncFPMath : StrBoolAttr<"approx-func-fp-math">;
3325ffd83dbSDimitry Andricdef NoSignedZerosFPMath : StrBoolAttr<"no-signed-zeros-fp-math">;
3330b57cec5SDimitry Andricdef UnsafeFPMath : StrBoolAttr<"unsafe-fp-math">;
3340b57cec5SDimitry Andricdef NoJumpTables : StrBoolAttr<"no-jump-tables">;
335480093f4SDimitry Andricdef NoInlineLineTables : StrBoolAttr<"no-inline-line-tables">;
3360b57cec5SDimitry Andricdef ProfileSampleAccurate : StrBoolAttr<"profile-sample-accurate">;
3375ffd83dbSDimitry Andricdef UseSampleProfile : StrBoolAttr<"use-sample-profile">;
3380b57cec5SDimitry Andric
33906c3fb27SDimitry Andricdef DenormalFPMath : ComplexStrAttr<"denormal-fp-math", [FnAttr]>;
34006c3fb27SDimitry Andricdef DenormalFPMathF32 : ComplexStrAttr<"denormal-fp-math-f32", [FnAttr]>;
34106c3fb27SDimitry Andric
3424c2d3b02SDimitry Andric// Attribute compatiblity rules are generated to check the attribute of the
3434c2d3b02SDimitry Andric// caller and callee and decide whether inlining should be allowed. CompatRule
3444c2d3b02SDimitry Andric// and child classes are used for the rule generation. CompatRule takes only a
3454c2d3b02SDimitry Andric// compare function which could be templated with the attribute type.
3464c2d3b02SDimitry Andric// CompatRuleStrAttr takes the compare function and the string attribute for
3474c2d3b02SDimitry Andric// checking compatibility for inline substitution.
3480b57cec5SDimitry Andricclass CompatRule<string F> {
3494c2d3b02SDimitry Andric  // The function's signature must match "bool(const Function&, const
3504c2d3b02SDimitry Andric  // Function&)", where the first parameter is the reference to the caller and
3514c2d3b02SDimitry Andric  // the second parameter is the reference to the callee. It must return false
3524c2d3b02SDimitry Andric  // if the attributes of the caller and callee are incompatible, and true
3534c2d3b02SDimitry Andric  // otherwise.
3540b57cec5SDimitry Andric  string CompatFunc = F;
3554c2d3b02SDimitry Andric  string AttrName = "";
3564c2d3b02SDimitry Andric}
3574c2d3b02SDimitry Andric
3584c2d3b02SDimitry Andricclass CompatRuleStrAttr<string F, string Attr> : CompatRule<F> {
3594c2d3b02SDimitry Andric  // The checker function is extended with an third argument as the function
3604c2d3b02SDimitry Andric  // attribute string "bool(const Function&, const Function&, const StringRef&)".
3614c2d3b02SDimitry Andric  string AttrName = Attr;
3620b57cec5SDimitry Andric}
3630b57cec5SDimitry Andric
3640b57cec5SDimitry Andricdef : CompatRule<"isEqual<SanitizeAddressAttr>">;
3650b57cec5SDimitry Andricdef : CompatRule<"isEqual<SanitizeThreadAttr>">;
3660b57cec5SDimitry Andricdef : CompatRule<"isEqual<SanitizeMemoryAttr>">;
3670b57cec5SDimitry Andricdef : CompatRule<"isEqual<SanitizeHWAddressAttr>">;
3680b57cec5SDimitry Andricdef : CompatRule<"isEqual<SanitizeMemTagAttr>">;
3690b57cec5SDimitry Andricdef : CompatRule<"isEqual<SafeStackAttr>">;
3700b57cec5SDimitry Andricdef : CompatRule<"isEqual<ShadowCallStackAttr>">;
3715ffd83dbSDimitry Andricdef : CompatRule<"isEqual<UseSampleProfileAttr>">;
372fe6060f1SDimitry Andricdef : CompatRule<"isEqual<NoProfileAttr>">;
37306c3fb27SDimitry Andricdef : CompatRule<"checkDenormMode">;
3744c2d3b02SDimitry Andricdef : CompatRuleStrAttr<"isEqual", "sign-return-address">;
3754c2d3b02SDimitry Andricdef : CompatRuleStrAttr<"isEqual", "sign-return-address-key">;
3764c2d3b02SDimitry Andricdef : CompatRuleStrAttr<"isEqual", "branch-protection-pauth-lr">;
3770b57cec5SDimitry Andric
3780b57cec5SDimitry Andricclass MergeRule<string F> {
3790b57cec5SDimitry Andric  // The name of the function called to merge the attributes of the caller and
3800b57cec5SDimitry Andric  // callee. The function's signature must match
3810b57cec5SDimitry Andric  // "void(Function&, const Function &)", where the first parameter is the
3820b57cec5SDimitry Andric  // reference to the caller and the second parameter is the reference to the
3830b57cec5SDimitry Andric  // callee.
3840b57cec5SDimitry Andric  string MergeFunc = F;
3850b57cec5SDimitry Andric}
3860b57cec5SDimitry Andric
3870b57cec5SDimitry Andricdef : MergeRule<"setAND<LessPreciseFPMADAttr>">;
3880b57cec5SDimitry Andricdef : MergeRule<"setAND<NoInfsFPMathAttr>">;
3890b57cec5SDimitry Andricdef : MergeRule<"setAND<NoNansFPMathAttr>">;
39081ad6265SDimitry Andricdef : MergeRule<"setAND<ApproxFuncFPMathAttr>">;
3915ffd83dbSDimitry Andricdef : MergeRule<"setAND<NoSignedZerosFPMathAttr>">;
3920b57cec5SDimitry Andricdef : MergeRule<"setAND<UnsafeFPMathAttr>">;
3930b57cec5SDimitry Andricdef : MergeRule<"setOR<NoImplicitFloatAttr>">;
3940b57cec5SDimitry Andricdef : MergeRule<"setOR<NoJumpTablesAttr>">;
3950b57cec5SDimitry Andricdef : MergeRule<"setOR<ProfileSampleAccurateAttr>">;
3960b57cec5SDimitry Andricdef : MergeRule<"setOR<SpeculativeLoadHardeningAttr>">;
3970b57cec5SDimitry Andricdef : MergeRule<"adjustCallerSSPLevel">;
3980b57cec5SDimitry Andricdef : MergeRule<"adjustCallerStackProbes">;
3990b57cec5SDimitry Andricdef : MergeRule<"adjustCallerStackProbeSize">;
4000b57cec5SDimitry Andricdef : MergeRule<"adjustMinLegalVectorWidth">;
4010b57cec5SDimitry Andricdef : MergeRule<"adjustNullPointerValidAttr">;
402e8d8bef9SDimitry Andricdef : MergeRule<"setAND<MustProgressAttr>">;
403