Attributes.td revision 292915
1292915Sdim/// Attribute base class. 2292915Sdimclass Attr<string S> { 3292915Sdim // String representation of this attribute in the IR. 4292915Sdim string AttrString = S; 5292915Sdim} 6292915Sdim 7292915Sdim/// Enum attribute. 8292915Sdimclass EnumAttr<string S> : Attr<S>; 9292915Sdim 10292915Sdim/// StringBool attribute. 11292915Sdimclass StrBoolAttr<string S> : Attr<S>; 12292915Sdim 13292915Sdim/// Target-independent enum attributes. 14292915Sdim 15292915Sdim/// Alignment of parameter (5 bits) stored as log2 of alignment with +1 bias. 16292915Sdim/// 0 means unaligned (different from align(1)). 17292915Sdimdef Alignment : EnumAttr<"align">; 18292915Sdim 19292915Sdim/// inline=always. 20292915Sdimdef AlwaysInline : EnumAttr<"alwaysinline">; 21292915Sdim 22292915Sdim/// Function can access memory only using pointers based on its arguments. 23292915Sdimdef ArgMemOnly : EnumAttr<"argmemonly">; 24292915Sdim 25292915Sdim/// Callee is recognized as a builtin, despite nobuiltin attribute on its 26292915Sdim/// declaration. 27292915Sdimdef Builtin : EnumAttr<"builtin">; 28292915Sdim 29292915Sdim/// Pass structure by value. 30292915Sdimdef ByVal : EnumAttr<"byval">; 31292915Sdim 32292915Sdim/// Marks function as being in a cold path. 33292915Sdimdef Cold : EnumAttr<"cold">; 34292915Sdim 35292915Sdim/// Can only be moved to control-equivalent blocks. 36292915Sdimdef Convergent : EnumAttr<"convergent">; 37292915Sdim 38292915Sdim/// Pointer is known to be dereferenceable. 39292915Sdimdef Dereferenceable : EnumAttr<"dereferenceable">; 40292915Sdim 41292915Sdim/// Pointer is either null or dereferenceable. 42292915Sdimdef DereferenceableOrNull : EnumAttr<"dereferenceable_or_null">; 43292915Sdim 44292915Sdim/// Function may only access memory that is inaccessible from IR. 45292915Sdimdef InaccessibleMemOnly : EnumAttr<"inaccessiblememonly">; 46292915Sdim 47292915Sdim/// Function may only access memory that is either inaccessible from the IR, 48292915Sdim/// or pointed to by its pointer arguments. 49292915Sdimdef InaccessibleMemOrArgMemOnly : EnumAttr<"inaccessiblemem_or_argmemonly">; 50292915Sdim 51292915Sdim/// Pass structure in an alloca. 52292915Sdimdef InAlloca : EnumAttr<"inalloca">; 53292915Sdim 54292915Sdim/// Source said inlining was desirable. 55292915Sdimdef InlineHint : EnumAttr<"inlinehint">; 56292915Sdim 57292915Sdim/// Force argument to be passed in register. 58292915Sdimdef InReg : EnumAttr<"inreg">; 59292915Sdim 60292915Sdim/// Build jump-instruction tables and replace refs. 61292915Sdimdef JumpTable : EnumAttr<"jumptable">; 62292915Sdim 63292915Sdim/// Function must be optimized for size first. 64292915Sdimdef MinSize : EnumAttr<"minsize">; 65292915Sdim 66292915Sdim/// Naked function. 67292915Sdimdef Naked : EnumAttr<"naked">; 68292915Sdim 69292915Sdim/// Nested function static chain. 70292915Sdimdef Nest : EnumAttr<"nest">; 71292915Sdim 72292915Sdim/// Considered to not alias after call. 73292915Sdimdef NoAlias : EnumAttr<"noalias">; 74292915Sdim 75292915Sdim/// Callee isn't recognized as a builtin. 76292915Sdimdef NoBuiltin : EnumAttr<"nobuiltin">; 77292915Sdim 78292915Sdim/// Function creates no aliases of pointer. 79292915Sdimdef NoCapture : EnumAttr<"nocapture">; 80292915Sdim 81292915Sdim/// Call cannot be duplicated. 82292915Sdimdef NoDuplicate : EnumAttr<"noduplicate">; 83292915Sdim 84292915Sdim/// Disable implicit floating point insts. 85292915Sdimdef NoImplicitFloat : EnumAttr<"noimplicitfloat">; 86292915Sdim 87292915Sdim/// inline=never. 88292915Sdimdef NoInline : EnumAttr<"noinline">; 89292915Sdim 90292915Sdim/// Function is called early and/or often, so lazy binding isn't worthwhile. 91292915Sdimdef NonLazyBind : EnumAttr<"nonlazybind">; 92292915Sdim 93292915Sdim/// Pointer is known to be not null. 94292915Sdimdef NonNull : EnumAttr<"nonnull">; 95292915Sdim 96292915Sdim/// The function does not recurse. 97292915Sdimdef NoRecurse : EnumAttr<"norecurse">; 98292915Sdim 99292915Sdim/// Disable redzone. 100292915Sdimdef NoRedZone : EnumAttr<"noredzone">; 101292915Sdim 102292915Sdim/// Mark the function as not returning. 103292915Sdimdef NoReturn : EnumAttr<"noreturn">; 104292915Sdim 105292915Sdim/// Function doesn't unwind stack. 106292915Sdimdef NoUnwind : EnumAttr<"nounwind">; 107292915Sdim 108292915Sdim/// opt_size. 109292915Sdimdef OptimizeForSize : EnumAttr<"optsize">; 110292915Sdim 111292915Sdim/// Function must not be optimized. 112292915Sdimdef OptimizeNone : EnumAttr<"optnone">; 113292915Sdim 114292915Sdim/// Function does not access memory. 115292915Sdimdef ReadNone : EnumAttr<"readnone">; 116292915Sdim 117292915Sdim/// Function only reads from memory. 118292915Sdimdef ReadOnly : EnumAttr<"readonly">; 119292915Sdim 120292915Sdim/// Return value is always equal to this argument. 121292915Sdimdef Returned : EnumAttr<"returned">; 122292915Sdim 123292915Sdim/// Function can return twice. 124292915Sdimdef ReturnsTwice : EnumAttr<"returns_twice">; 125292915Sdim 126292915Sdim/// Safe Stack protection. 127292915Sdimdef SafeStack : EnumAttr<"safestack">; 128292915Sdim 129292915Sdim/// Sign extended before/after call. 130292915Sdimdef SExt : EnumAttr<"signext">; 131292915Sdim 132292915Sdim/// Alignment of stack for function (3 bits) stored as log2 of alignment with 133292915Sdim/// +1 bias 0 means unaligned (different from alignstack=(1)). 134292915Sdimdef StackAlignment : EnumAttr<"alignstack">; 135292915Sdim 136292915Sdim/// Stack protection. 137292915Sdimdef StackProtect : EnumAttr<"ssp">; 138292915Sdim 139292915Sdim/// Stack protection required. 140292915Sdimdef StackProtectReq : EnumAttr<"sspreq">; 141292915Sdim 142292915Sdim/// Strong Stack protection. 143292915Sdimdef StackProtectStrong : EnumAttr<"sspstrong">; 144292915Sdim 145292915Sdim/// Hidden pointer to structure to return. 146292915Sdimdef StructRet : EnumAttr<"sret">; 147292915Sdim 148292915Sdim/// AddressSanitizer is on. 149292915Sdimdef SanitizeAddress : EnumAttr<"sanitize_address">; 150292915Sdim 151292915Sdim/// ThreadSanitizer is on. 152292915Sdimdef SanitizeThread : EnumAttr<"sanitize_thread">; 153292915Sdim 154292915Sdim/// MemorySanitizer is on. 155292915Sdimdef SanitizeMemory : EnumAttr<"sanitize_memory">; 156292915Sdim 157292915Sdim/// Function must be in a unwind table. 158292915Sdimdef UWTable : EnumAttr<"uwtable">; 159292915Sdim 160292915Sdim/// Zero extended before/after call. 161292915Sdimdef ZExt : EnumAttr<"zeroext">; 162292915Sdim 163292915Sdim/// Target-independent string attributes. 164292915Sdimdef LessPreciseFPMAD : StrBoolAttr<"less-precise-fpmad">; 165292915Sdimdef NoInfsFPMath : StrBoolAttr<"no-infs-fp-math">; 166292915Sdimdef NoNansFPMath : StrBoolAttr<"no-nans-fp-math">; 167292915Sdimdef UnsafeFPMath : StrBoolAttr<"unsafe-fp-math">; 168292915Sdim 169292915Sdimclass CompatRule<string F> { 170292915Sdim // The name of the function called to check the attribute of the caller and 171292915Sdim // callee and decide whether inlining should be allowed. The function's 172292915Sdim // signature must match "bool(const Function&, const Function &)", where the 173292915Sdim // first parameter is the reference to the caller and the second parameter is 174292915Sdim // the reference to the callee. It must return false if the attributes of the 175292915Sdim // caller and callee are incompatible, and true otherwise. 176292915Sdim string CompatFunc = F; 177292915Sdim} 178292915Sdim 179292915Sdimdef : CompatRule<"isEqual<SanitizeAddressAttr>">; 180292915Sdimdef : CompatRule<"isEqual<SanitizeThreadAttr>">; 181292915Sdimdef : CompatRule<"isEqual<SanitizeMemoryAttr>">; 182292915Sdim 183292915Sdimclass MergeRule<string F> { 184292915Sdim // The name of the function called to merge the attributes of the caller and 185292915Sdim // callee. The function's signature must match 186292915Sdim // "void(Function&, const Function &)", where the first parameter is the 187292915Sdim // reference to the caller and the second parameter is the reference to the 188292915Sdim // callee. 189292915Sdim string MergeFunc = F; 190292915Sdim} 191292915Sdim 192292915Sdimdef : MergeRule<"adjustCallerSSPLevel">; 193