diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2023-12-05 09:44:52 +0000 |
---|---|---|
committer | Richard Sandiford <richard.sandiford@arm.com> | 2023-12-05 09:44:52 +0000 |
commit | 672fad57c1f99ff893019e2da4620e26b9b31dd2 (patch) | |
tree | 30d06172a99e58577072b0122069e80c052e38a9 /gcc/target.def | |
parent | 4f71c391ca020e5b080116826658b2c94ee32eb0 (diff) | |
download | gcc-672fad57c1f99ff893019e2da4620e26b9b31dd2.zip gcc-672fad57c1f99ff893019e2da4620e26b9b31dd2.tar.gz gcc-672fad57c1f99ff893019e2da4620e26b9b31dd2.tar.bz2 |
Add a new target hook: TARGET_START_CALL_ARGS
We have the following two hooks into the call expansion code:
- TARGET_CALL_ARGS is called for each argument before arguments
are moved into hard registers.
- TARGET_END_CALL_ARGS is called after the end of the call
sequence (specifically, after any return value has been
moved to a pseudo).
This patch adds a TARGET_START_CALL_ARGS hook that is called before
the TARGET_CALL_ARGS sequence. This means that TARGET_START_CALL_REGS
and TARGET_END_CALL_REGS bracket the region in which argument registers
might be live. They also bracket a region in which the only call
emiitted by target-independent code is the call to the target function
itself. (For example, TARGET_START_CALL_ARGS happens after any use of
memcpy to copy arguments, and TARGET_END_CALL_ARGS happens before any
use of memcpy to copy the result.)
Also, the patch adds the cumulative argument structure as an argument
to the hooks, so that the target can use it to record and retrieve
information about the call as a whole.
The TARGET_CALL_ARGS docs said:
While generating RTL for a function call, this target hook is invoked once
for each argument passed to the function, either a register returned by
``TARGET_FUNCTION_ARG`` or a memory location. It is called just
- before the point where argument registers are stored.
The last bit was true for normal calls, but for libcalls the hook was
invoked earlier, before stack arguments have been copied. I don't think
this caused a practical difference for nvptx (the only port to use the
hooks) since I wouldn't expect any libcalls to take stack parameters.
gcc/
* doc/tm.texi.in: Add TARGET_START_CALL_ARGS.
* doc/tm.texi: Regenerate.
* target.def (start_call_args): New hook.
(call_args, end_call_args): Add a parameter for the cumulative
argument information.
* hooks.h (hook_void_rtx_tree): Delete.
* hooks.cc (hook_void_rtx_tree): Likewise.
* targhooks.h (hook_void_CUMULATIVE_ARGS): Declare.
(hook_void_CUMULATIVE_ARGS_rtx_tree): Likewise.
* targhooks.cc (hook_void_CUMULATIVE_ARGS): New function.
(hook_void_CUMULATIVE_ARGS_rtx_tree): Likewise.
* calls.cc (expand_call): Call start_call_args before computing
and storing stack parameters. Pass the cumulative argument
information to call_args and end_call_args.
(emit_library_call_value_1): Likewise.
* config/nvptx/nvptx.cc (nvptx_call_args): Add a cumulative
argument parameter.
(nvptx_end_call_args): Likewise.
Diffstat (limited to 'gcc/target.def')
-rw-r--r-- | gcc/target.def | 59 |
1 files changed, 47 insertions, 12 deletions
diff --git a/gcc/target.def b/gcc/target.def index 427fe52..4addee1 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -4820,31 +4820,66 @@ not generate any instructions in this case.", default_setup_incoming_varargs) DEFHOOK +(start_call_args, + "This target hook is invoked while generating RTL for a function call,\n\ +after the argument values have been computed, and after stack arguments\n\ +have been initialized, but before register arguments have been moved into\n\ +their ABI-defined hard register locations. It precedes calls to the related\n\ +hooks @code{TARGET_CALL_ARGS} and @code{TARGET_END_CALL_ARGS}.\n\ +The significance of this position in the call expansion is that:\n\ +\n\ +@itemize @bullet\n\ +@item\n\ +No argument registers are live.\n\ +@item\n\ +Although a call sequence can in general involve subcalls (such as using\n\ +@code{memcpy} to copy large arguments), no such subcall will occur between\n\ +the call to this hook and the generation of the main call instruction.\n\ +@end itemize\n\ +\n\ +The single argument @var{complete_args} is the state of the target\n\ +function's cumulative argument information after the final call to\n\ +@code{TARGET_FUNCTION_ARG}.\n\ +\n\ +The hook can be used for things like switching processor mode, in cases\n\ +where different calls need different processor modes. Most ports do not\n\ +need to implement anything for this hook.", + void, (cumulative_args_t complete_args), + hook_void_CUMULATIVE_ARGS) + +DEFHOOK (call_args, "While generating RTL for a function call, this target hook is invoked once\n\ for each argument passed to the function, either a register returned by\n\ @code{TARGET_FUNCTION_ARG} or a memory location. It is called just\n\ -before the point where argument registers are stored. The type of the\n\ -function to be called is also passed as the second argument; it is\n\ -@code{NULL_TREE} for libcalls. The @code{TARGET_END_CALL_ARGS} hook is\n\ -invoked just after the code to copy the return reg has been emitted.\n\ -This functionality can be used to perform special setup of call argument\n\ -registers if a target needs it.\n\ +before the point where argument registers are stored.\n\ +\n\ +@var{complete_args} is the state of the target function's cumulative\n\ +argument information after the final call to @code{TARGET_FUNCTION_ARG}.\n\ +@var{loc} is the location of the argument. @var{type} is the type of\n\ +the function being called, or @code{NULL_TREE} for libcalls.\n\ +\n\ For functions without arguments, the hook is called once with @code{pc_rtx}\n\ passed instead of an argument register.\n\ -Most ports do not need to implement anything for this hook.", - void, (rtx, tree), - hook_void_rtx_tree) +\n\ +This functionality can be used to perform special setup of call argument\n\ +registers, if a target needs it. Most ports do not need to implement\n\ +anything for this hook.", + void, (cumulative_args_t complete_args, rtx loc, tree type), + hook_void_CUMULATIVE_ARGS_rtx_tree) DEFHOOK (end_call_args, "This target hook is invoked while generating RTL for a function call,\n\ just after the point where the return reg is copied into a pseudo. It\n\ signals that all the call argument and return registers for the just\n\ -emitted call are now no longer in use.\n\ +emitted call are now no longer in use. @var{complete_args} is the\n\ +state of the target function's cumulative argument information after\n\ +the final call to @code{TARGET_FUNCTION_ARG}.\n\ +\n\ Most ports do not need to implement anything for this hook.", - void, (void), - hook_void_void) + void, (cumulative_args_t complete_args), + hook_void_CUMULATIVE_ARGS) DEFHOOK (push_argument, |