1
//===- TargetCallingConv.td - Target Calling Conventions ---*- tablegen -*-===//
3
// The LLVM Compiler Infrastructure
5
// This file is distributed under the University of Illinois Open Source
6
// License. See LICENSE.TXT for details.
8
//===----------------------------------------------------------------------===//
10
// This file defines the target-independent interfaces with which targets
11
// describe their calling conventions.
13
//===----------------------------------------------------------------------===//
18
/// CCCustom - Calls a custom arg handling function.
19
class CCCustom<string fn> : CCAction {
23
/// CCPredicateAction - Instances of this class check some predicate, then
24
/// delegate to another action if the predicate is true.
25
class CCPredicateAction<CCAction A> : CCAction {
26
CCAction SubAction = A;
29
/// CCIfType - If the current argument is one of the specified types, apply
31
class CCIfType<list<ValueType> vts, CCAction A> : CCPredicateAction<A> {
32
list<ValueType> VTs = vts;
35
/// CCIf - If the predicate matches, apply A.
36
class CCIf<string predicate, CCAction A> : CCPredicateAction<A> {
37
string Predicate = predicate;
40
/// CCIfByVal - If the current argument has ByVal parameter attribute, apply
42
class CCIfByVal<CCAction A> : CCIf<"ArgFlags.isByVal()", A> {
45
/// CCIfConsecutiveRegs - If the current argument has InConsecutiveRegs
46
/// parameter attribute, apply Action A.
47
class CCIfConsecutiveRegs<CCAction A> : CCIf<"ArgFlags.isInConsecutiveRegs()", A> {
50
/// CCIfCC - Match if the current calling convention is 'CC'.
51
class CCIfCC<string CC, CCAction A>
52
: CCIf<!strconcat("State.getCallingConv() == ", CC), A> {}
54
/// CCIfInReg - If this argument is marked with the 'inreg' attribute, apply
55
/// the specified action.
56
class CCIfInReg<CCAction A> : CCIf<"ArgFlags.isInReg()", A> {}
58
/// CCIfNest - If this argument is marked with the 'nest' attribute, apply
59
/// the specified action.
60
class CCIfNest<CCAction A> : CCIf<"ArgFlags.isNest()", A> {}
62
/// CCIfSplit - If this argument is marked with the 'split' attribute, apply
63
/// the specified action.
64
class CCIfSplit<CCAction A> : CCIf<"ArgFlags.isSplit()", A> {}
66
/// CCIfSRet - If this argument is marked with the 'sret' attribute, apply
67
/// the specified action.
68
class CCIfSRet<CCAction A> : CCIf<"ArgFlags.isSRet()", A> {}
70
/// CCIfVarArg - If the current function is vararg - apply the action
71
class CCIfVarArg<CCAction A> : CCIf<"State.isVarArg()", A> {}
73
/// CCIfNotVarArg - If the current function is not vararg - apply the action
74
class CCIfNotVarArg<CCAction A> : CCIf<"!State.isVarArg()", A> {}
76
/// CCAssignToReg - This action matches if there is a register in the specified
77
/// list that is still available. If so, it assigns the value to the first
78
/// available register and succeeds.
79
class CCAssignToReg<list<Register> regList> : CCAction {
80
list<Register> RegList = regList;
83
/// CCAssignToRegWithShadow - Same as CCAssignToReg, but with list of registers
84
/// which became shadowed, when some register is used.
85
class CCAssignToRegWithShadow<list<Register> regList,
86
list<Register> shadowList> : CCAction {
87
list<Register> RegList = regList;
88
list<Register> ShadowRegList = shadowList;
91
/// CCAssignToStack - This action always matches: it assigns the value to a
92
/// stack slot of the specified size and alignment on the stack. If size is
93
/// zero then the ABI size is used; if align is zero then the ABI alignment
94
/// is used - these may depend on the target or subtarget.
95
class CCAssignToStack<int size, int align> : CCAction {
100
/// CCAssignToStackWithShadow - Same as CCAssignToStack, but with a list of
101
/// registers to be shadowed. Note that, unlike CCAssignToRegWithShadow, this
102
/// shadows ALL of the registers in shadowList.
103
class CCAssignToStackWithShadow<int size,
105
list<Register> shadowList> : CCAction {
108
list<Register> ShadowRegList = shadowList;
111
/// CCPassByVal - This action always matches: it assigns the value to a stack
112
/// slot to implement ByVal aggregate parameter passing. Size and alignment
113
/// specify the minimum size and alignment for the stack slot.
114
class CCPassByVal<int size, int align> : CCAction {
119
/// CCPromoteToType - If applied, this promotes the specified current value to
120
/// the specified type.
121
class CCPromoteToType<ValueType destTy> : CCAction {
122
ValueType DestTy = destTy;
125
/// CCPromoteToUpperBitsInType - If applied, this promotes the specified current
126
/// value to the specified type and shifts the value into the upper bits.
127
class CCPromoteToUpperBitsInType<ValueType destTy> : CCAction {
128
ValueType DestTy = destTy;
131
/// CCBitConvertToType - If applied, this bitconverts the specified current
132
/// value to the specified type.
133
class CCBitConvertToType<ValueType destTy> : CCAction {
134
ValueType DestTy = destTy;
137
/// CCPassIndirect - If applied, this stores the value to stack and passes the pointer
138
/// as normal argument.
139
class CCPassIndirect<ValueType destTy> : CCAction {
140
ValueType DestTy = destTy;
143
/// CCDelegateTo - This action invokes the specified sub-calling-convention. It
144
/// is successful if the specified CC matches.
145
class CCDelegateTo<CallingConv cc> : CCAction {
149
/// CallingConv - An instance of this is used to define each calling convention
150
/// that the target supports.
151
class CallingConv<list<CCAction> actions> {
152
list<CCAction> Actions = actions;
156
/// CustomCallingConv - An instance of this is used to declare calling
157
/// conventions that are implemented using a custom function of the same name.
158
class CustomCallingConv : CallingConv<[]> {
162
/// CalleeSavedRegs - A list of callee saved registers for a given calling
163
/// convention. The order of registers is used by PrologEpilogInsertion when
164
/// allocation stack slots for saved registers.
166
/// For each CalleeSavedRegs def, TableGen will emit a FOO_SaveList array for
167
/// returning from getCalleeSavedRegs(), and a FOO_RegMask bit mask suitable for
168
/// returning from getCallPreservedMask().
169
class CalleeSavedRegs<dag saves> {
170
dag SaveList = saves;
172
// Registers that are also preserved across function calls, but should not be
173
// included in the generated FOO_SaveList array. These registers will be
174
// included in the FOO_RegMask bit mask. This can be used for registers that
175
// are saved automatically, like the SPARC register windows.