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