Attributes.td revision 294024
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
192294024Sdimdef : MergeRule<"setAND<LessPreciseFPMADAttr>">;
193294024Sdimdef : MergeRule<"setAND<NoInfsFPMathAttr>">;
194294024Sdimdef : MergeRule<"setAND<NoNansFPMathAttr>">;
195294024Sdimdef : MergeRule<"setAND<UnsafeFPMathAttr>">;
196294024Sdimdef : MergeRule<"setOR<NoImplicitFloatAttr>">;
197292915Sdimdef : MergeRule<"adjustCallerSSPLevel">;
198