* 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
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.
* doc/tm.texi.in: Add @hook TARGET_NO_REGISTER_ALLOCATION.
* doc/tm.texi: Regenerate.
saving and restoring an arbitrary return value.
@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})
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
saving and restoring an arbitrary return value.
@end defmac
+@hook TARGET_OMIT_STRUCT_RETURN_REG
+
@hook TARGET_RETURN_IN_MSB
@node Aggregate Return
If returning a structure PCC style,
the caller also depends on this value.
And cfun->returns_pcc_struct is not necessarily set. */
- if (cfun->returns_struct
- || cfun->returns_pcc_struct)
+ if ((cfun->returns_struct || cfun->returns_pcc_struct)
+ && !targetm.calls.omit_struct_return_reg)
{
rtx value_address = DECL_RTL (DECL_RESULT (current_function_decl));
tree type = TREE_TYPE (DECL_RESULT (current_function_decl));
to emit adjusting code, you should do it at this point.",
rtx, (tree fndecl, int incoming),
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
(return_in_memory,
"This target hook should return a nonzero value to say to return the\n\