Allow a target to skip an unnecssary register return value for a struct return.
authorBernd Schmidt <bernds@codesourcery.com>
Wed, 5 Nov 2014 12:14:36 +0000 (12:14 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Wed, 5 Nov 2014 12:14:36 +0000 (12:14 +0000)
* 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

gcc/ChangeLog
gcc/doc/tm.texi
gcc/doc/tm.texi.in
gcc/function.c
gcc/target.def

index ff9ead618a42111a9cddfd6bf1071b08b0d76f9b..74e0b0fd43615912a0653e014b14c2f899aeb11e 100644 (file)
@@ -1,5 +1,10 @@
 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.
index dbca62dd8eda9f33110812db3e279474211cd594..88631a1acefb4fdd01f032f73ce4cc210485de70 100644 (file)
@@ -4371,6 +4371,14 @@ need more space than is implied by @code{FUNCTION_VALUE_REGNO_P} for
 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
index b732f1f671cd1e488ce5a38fbccf64cec164cf23..856e4dc5e39eb975ea8bf300d17435115b7d9a67 100644 (file)
@@ -3567,6 +3567,8 @@ need more space than is implied by @code{FUNCTION_VALUE_REGNO_P} for
 saving and restoring an arbitrary return value.
 @end defmac
 
+@hook TARGET_OMIT_STRUCT_RETURN_REG
+
 @hook TARGET_RETURN_IN_MSB
 
 @node Aggregate Return
index 6d0998228d1437524761f27b471fb2f7c46a3e2a..91e3b2c14fbe6935cc2ef6a21ae2853e46f9a354 100644 (file)
@@ -5177,8 +5177,8 @@ expand_function_end (void)
      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));
index de203c3146b54d064df60de051b359acc80786e9..112f78eef56799236398be56027a6fc9d89ae493 100644 (file)
@@ -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.",
  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\