This section describes the macros which let you control how various types of arguments are passed in registers or how they are arranged in the stack.
| FUNCTION_ARG (cum, mode, type, named) | Macro |
|
A C expression that controls whether a function argument is passed
in a register, and which register.
The arguments are cum, which summarizes all the previous
arguments; mode, the machine mode of the argument; type,
the data type of the argument as a tree node or 0 if that is not known
(which happens for C support library functions); and named,
which is 1 for an ordinary argument and 0 for nameless arguments that
correspond to The value of the expression is usually either a For machines like the VAX and 68000, where normally all arguments are pushed, zero suffices as a definition. The value of the expression can also be a The last time this macro is called, it is called with The usual way to make the ISO library You may use the macro |
| MUST_PASS_IN_STACK (mode, type) | Macro |
Define as a C expression that evaluates to nonzero if we do not know how
to pass TYPE solely in registers. The file expr.h defines a
definition that is usually appropriate, refer to expr.h for additional
documentation.
|
| FUNCTION_INCOMING_ARG (cum, mode, type, named) | Macro |
|
Define this macro if the target machine has "register windows", so
that the register in which a function sees an arguments is not
necessarily the same as the one in which the caller passed the
argument.
For such machines, If |
| FUNCTION_ARG_PARTIAL_NREGS (cum, mode, type, named) | Macro |
|
A C expression for the number of words, at the beginning of an
argument, that must be put in registers. The value must be zero for
arguments that are passed entirely in registers or that are entirely
pushed on the stack.
On some machines, certain arguments must be passed partially in
registers and partially in memory. On these machines, typically the
first n words of arguments are passed in registers, and the rest
on the stack. If a multi-word argument (a
|
| FUNCTION_ARG_PASS_BY_REFERENCE (cum, mode, type, named) | Macro |
|
A C expression that indicates when an argument must be passed by reference.
If nonzero for an argument, a copy of that argument is made in memory and a
pointer to the argument is passed instead of the argument itself.
The pointer is passed in whatever way is appropriate for passing a pointer
to that type.
On machines where #define FUNCTION_ARG_PASS_BY_REFERENCE\
(CUM, MODE, TYPE, NAMED) \
MUST_PASS_IN_STACK (MODE, TYPE)
|
| FUNCTION_ARG_CALLEE_COPIES (cum, mode, type, named) | Macro |
If defined, a C expression that indicates when it is the called function's
responsibility to make a copy of arguments passed by invisible reference.
Normally, the caller makes a copy and passes the address of the copy to the
routine being called. When FUNCTION_ARG_CALLEE_COPIES is defined and is
nonzero, the caller does not make a copy. Instead, it passes a pointer to the
"live" value. The called function must not modify this value. If it can be
determined that the value won't be modified, it need not make a copy;
otherwise a copy must be made.
|
| CUMULATIVE_ARGS | Macro |
A C type for declaring a variable that is used as the first argument of
FUNCTION_ARG and other related values. For some target machines,
the type int suffices and can hold the number of bytes of
argument so far.
There is no need to record in |
| INIT_CUMULATIVE_ARGS (cum, fntype, libname, fndecl, n_named_args) | Macro |
A C statement (sans semicolon) for initializing the variable
cum for the state at the beginning of the argument list. The
variable has type CUMULATIVE_ARGS. The value of fntype
is the tree node for the data type of the function which will receive
the args, or 0 if the args are to a compiler support library function.
For direct calls that are not libcalls, fndecl contain the
declaration node of the function. fndecl is also set when
INIT_CUMULATIVE_ARGS is used to find arguments for the function
being compiled. n_named_args is set to the number of named
arguments, including a structure return address if it is passed as a
parameter, when making a call. When processing incoming arguments,
n_named_args is set to -1.
When processing a call to a compiler support library function,
libname identifies which one. It is a |
| INIT_CUMULATIVE_LIBCALL_ARGS (cum, mode, libname) | Macro |
Like INIT_CUMULATIVE_ARGS but only used for outgoing libcalls,
it gets a MODE argument instead of fntype, that would be
NULL. indirect would always be zero, too. If this macro
is not defined, INIT_CUMULATIVE_ARGS (cum, NULL_RTX, libname,
0) is used instead.
|
| INIT_CUMULATIVE_INCOMING_ARGS (cum, fntype, libname) | Macro |
Like INIT_CUMULATIVE_ARGS but overrides it for the purposes of
finding the arguments for the function being compiled. If this macro is
undefined, INIT_CUMULATIVE_ARGS is used instead.
The value passed for libname is always 0, since library routines
with special calling conventions are never compiled with GCC. The
argument libname exists for symmetry with
|
| FUNCTION_ARG_ADVANCE (cum, mode, type, named) | Macro |
A C statement (sans semicolon) to update the summarizer variable
cum to advance past an argument in the argument list. The
values mode, type and named describe that argument.
Once this is done, the variable cum is suitable for analyzing
the following argument with FUNCTION_ARG, etc.
This macro need not do anything if the argument in question was passed on the stack. The compiler knows how to track the amount of stack space used for arguments without any special help. |
| FUNCTION_ARG_PADDING (mode, type) | Macro |
If defined, a C expression which determines whether, and in which direction,
to pad out an argument with extra space. The value should be of type
enum direction: either upward to pad above the argument,
downward to pad below, or none to inhibit padding.
The amount of padding is always just enough to reach the next
multiple of This macro has a default definition which is right for most systems.
For little-endian machines, the default is to pad upward. For
big-endian machines, the default is to pad downward for an argument of
constant size shorter than an |
| PAD_VARARGS_DOWN | Macro |
If defined, a C expression which determines whether the default
implementation of va_arg will attempt to pad down before reading the
next argument, if that argument is smaller than its aligned space as
controlled by PARM_BOUNDARY. If this macro is not defined, all such
arguments are padded down if BYTES_BIG_ENDIAN is true.
|
| BLOCK_REG_PADDING (mode, type, first) | Macro |
Specify padding for the last element of a block move between registers and
memory. first is nonzero if this is the only element. Defining this
macro allows better control of register function parameters on big-endian
machines, without using PARALLEL rtl. In particular,
MUST_PASS_IN_STACK need not test padding and mode of types in
registers, as there is no longer a "wrong" part of a register; For example,
a three byte aggregate may be passed in the high part of a register if so
required.
|
| FUNCTION_ARG_BOUNDARY (mode, type) | Macro |
If defined, a C expression that gives the alignment boundary, in bits,
of an argument with the specified mode and type. If it is not defined,
PARM_BOUNDARY is used for all arguments.
|
| FUNCTION_ARG_REGNO_P (regno) | Macro |
| A C expression that is nonzero if regno is the number of a hard register in which function arguments are sometimes passed. This does not include implicit arguments such as the static chain and the structure-value address. On many machines, no registers can be used for this purpose since all function arguments are pushed on the stack. |
| bool TARGET_SPLIT_COMPLEX_ARG (tree type) | Target Hook |
|
This hook should return true if parameter of type type are passed
as two scalar parameters. By default, GCC will attempt to pack complex
arguments into the target's word size. Some ABIs require complex arguments
to be split and treated as their individual components. For example, on
AIX64, complex floats should be passed in a pair of floating point
registers, even though a complex float would fit in one 64-bit floating
point register.
The default value of this hook is |