Commit e0d14c39 by Bernd Schmidt Committed by Bernd Schmidt

Allow a target to skip an unnecssary register return value for a struct return.

	* target.def (omit_struct_return_reg): New data hook.
	* doc/tm.texi.in: Add @hook TARGET_OMIT_STRUCT_RETURN_REG.
	* doc/tm.texi: Regenerate.
	* function.c (expand_function_end): Use it.

From-SVN: r217123
parent a50fa76a
2014-11-05 Bernd Schmidt <bernds@codesourcery.com> 2014-11-05 Bernd Schmidt <bernds@codesourcery.com>
* target.def (omit_struct_return_reg): New data hook.
* doc/tm.texi.in: Add @hook TARGET_OMIT_STRUCT_RETURN_REG.
* doc/tm.texi: Regenerate.
* function.c (expand_function_end): Use it.
* target.def (no_register_allocation): New data hook. * target.def (no_register_allocation): New data hook.
* doc/tm.texi.in: Add @hook TARGET_NO_REGISTER_ALLOCATION. * doc/tm.texi.in: Add @hook TARGET_NO_REGISTER_ALLOCATION.
* doc/tm.texi: Regenerate. * doc/tm.texi: Regenerate.
...@@ -4371,6 +4371,14 @@ need more space than is implied by @code{FUNCTION_VALUE_REGNO_P} for ...@@ -4371,6 +4371,14 @@ need more space than is implied by @code{FUNCTION_VALUE_REGNO_P} for
saving and restoring an arbitrary return value. saving and restoring an arbitrary return value.
@end defmac @end defmac
@deftypevr {Target Hook} bool TARGET_OMIT_STRUCT_RETURN_REG
Normally, when a function returns a structure by memory, the address
is passed as an invisible pointer argument, but the compiler also
arranges to return the address from the function like it would a normal
pointer return value. Define this to true if that behaviour is
undesirable on your target.
@end deftypevr
@deftypefn {Target Hook} bool TARGET_RETURN_IN_MSB (const_tree @var{type}) @deftypefn {Target Hook} bool TARGET_RETURN_IN_MSB (const_tree @var{type})
This hook should return true if values of type @var{type} are returned This hook should return true if values of type @var{type} are returned
at the most significant end of a register (in other words, if they are at the most significant end of a register (in other words, if they are
......
...@@ -3567,6 +3567,8 @@ need more space than is implied by @code{FUNCTION_VALUE_REGNO_P} for ...@@ -3567,6 +3567,8 @@ need more space than is implied by @code{FUNCTION_VALUE_REGNO_P} for
saving and restoring an arbitrary return value. saving and restoring an arbitrary return value.
@end defmac @end defmac
@hook TARGET_OMIT_STRUCT_RETURN_REG
@hook TARGET_RETURN_IN_MSB @hook TARGET_RETURN_IN_MSB
@node Aggregate Return @node Aggregate Return
......
...@@ -5177,8 +5177,8 @@ expand_function_end (void) ...@@ -5177,8 +5177,8 @@ expand_function_end (void)
If returning a structure PCC style, If returning a structure PCC style,
the caller also depends on this value. the caller also depends on this value.
And cfun->returns_pcc_struct is not necessarily set. */ And cfun->returns_pcc_struct is not necessarily set. */
if (cfun->returns_struct if ((cfun->returns_struct || cfun->returns_pcc_struct)
|| cfun->returns_pcc_struct) && !targetm.calls.omit_struct_return_reg)
{ {
rtx value_address = DECL_RTL (DECL_RESULT (current_function_decl)); rtx value_address = DECL_RTL (DECL_RESULT (current_function_decl));
tree type = TREE_TYPE (DECL_RESULT (current_function_decl)); tree type = TREE_TYPE (DECL_RESULT (current_function_decl));
......
...@@ -3731,6 +3731,16 @@ structure value address at the beginning of a function. If you need\n\ ...@@ -3731,6 +3731,16 @@ structure value address at the beginning of a function. If you need\n\
to emit adjusting code, you should do it at this point.", to emit adjusting code, you should do it at this point.",
rtx, (tree fndecl, int incoming), rtx, (tree fndecl, int incoming),
hook_rtx_tree_int_null) hook_rtx_tree_int_null)
DEFHOOKPOD
(omit_struct_return_reg,
"Normally, when a function returns a structure by memory, the address\n\
is passed as an invisible pointer argument, but the compiler also\n\
arranges to return the address from the function like it would a normal\n\
pointer return value. Define this to true if that behaviour is\n\
undesirable on your target.",
bool, false)
DEFHOOK DEFHOOK
(return_in_memory, (return_in_memory,
"This target hook should return a nonzero value to say to return the\n\ "This target hook should return a nonzero value to say to return the\n\
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment