Add must_pass_va_arg_in_stack
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 20 Aug 2019 08:51:09 +0000 (08:51 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 20 Aug 2019 08:51:09 +0000 (08:51 +0000)
This patch splits out another idiom from the va_arg gimplification
routines, so that there's only one place to update later.

2019-08-20  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* calls.h (must_pass_va_arg_in_stack): Declare.
* calls.c (must_pass_va_arg_in_stack): New function.
* config/alpha/alpha.c (alpha_gimplify_va_arg_1): Use it.
* config/sh/sh.c (sh_gimplify_va_arg_expr): Likewise.
* config/stormy16/stormy16.c (xstormy16_gimplify_va_arg_expr):
Likewise.
* config/xtensa/xtensa.c (xtensa_gimplify_va_arg_expr): Likewise.

From-SVN: r274696

gcc/ChangeLog
gcc/calls.c
gcc/calls.h
gcc/config/alpha/alpha.c
gcc/config/sh/sh.c
gcc/config/stormy16/stormy16.c
gcc/config/xtensa/xtensa.c

index 81d672f8970b901f506a160cb7ddd5bf83629115..86bd73af74aba487e9fefae0c215170ffb657681 100644 (file)
@@ -1,3 +1,13 @@
+2019-08-20  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * calls.h (must_pass_va_arg_in_stack): Declare.
+       * calls.c (must_pass_va_arg_in_stack): New function.
+       * config/alpha/alpha.c (alpha_gimplify_va_arg_1): Use it.
+       * config/sh/sh.c (sh_gimplify_va_arg_expr): Likewise.
+       * config/stormy16/stormy16.c (xstormy16_gimplify_va_arg_expr):
+       Likewise.
+       * config/xtensa/xtensa.c (xtensa_gimplify_va_arg_expr): Likewise.
+
 2019-08-20  Richard Sandiford  <richard.sandiford@arm.com>
 
        * calls.h (pass_va_arg_by_reference): Declare.
index f49f052bd4af8fb258acd67a31c13e6622bae30a..dd428b9bbb1951fc55fb7894ee94354665feb0a0 100644 (file)
@@ -5900,5 +5900,14 @@ must_pass_in_stack_var_size_or_pad (machine_mode mode, const_tree type)
   return false;
 }
 
+/* Return true if TYPE must be passed on the stack when passed to
+   the "..." arguments of a function.  */
+
+bool
+must_pass_va_arg_in_stack (tree type)
+{
+  return targetm.calls.must_pass_in_stack (TYPE_MODE (type), type);
+}
+
 /* Tell the garbage collector about GTY markers in this source file.  */
 #include "gt-calls.h"
index 2f41fa34abb21a58af943015950ee19f981b8b5f..b08427044b1bc7bc92c0e54aaca4165870b7e5ce 100644 (file)
@@ -28,6 +28,7 @@ extern bool gimple_alloca_call_p (const gimple *);
 extern bool alloca_call_p (const_tree);
 extern bool must_pass_in_stack_var_size (machine_mode, const_tree);
 extern bool must_pass_in_stack_var_size_or_pad (machine_mode, const_tree);
+extern bool must_pass_va_arg_in_stack (tree);
 extern rtx prepare_call_address (tree, rtx, rtx, rtx *, int, int);
 extern bool shift_return_value (machine_mode, bool, rtx);
 extern rtx expand_call (tree, rtx, int);
index 74ca95e12a8e7b7c5e75dbcfaf8e900be638b03a..479d1ad27225702102f8793451796eb19c8b0cce 100644 (file)
@@ -6243,7 +6243,7 @@ alpha_gimplify_va_arg_1 (tree type, tree base, tree offset,
 
   /* If the type could not be passed in registers, skip the block
      reserved for the registers.  */
-  if (targetm.calls.must_pass_in_stack (TYPE_MODE (type), type))
+  if (must_pass_va_arg_in_stack (type))
     {
       t = build_int_cst (TREE_TYPE (offset), 6*8);
       gimplify_assign (offset,
index e44e46d1fad25b84d0caa00326e0cfa0fc2d2145..ab01809ecc47cc009605bdc74490efc0ec20389a 100644 (file)
@@ -7656,9 +7656,8 @@ sh_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
   tree addr, lab_over = NULL, result = NULL;
   tree eff_type;
 
-  const bool pass_by_ref =
-    !VOID_TYPE_P (type)
-    && targetm.calls.must_pass_in_stack (TYPE_MODE (type), type);
+  const bool pass_by_ref
+    = !VOID_TYPE_P (type) && must_pass_va_arg_in_stack (type);
 
   if (pass_by_ref)
     type = build_pointer_type (type);
index aec9f2df2614a584d1111a30f73790c17eb5df3e..00085d13192deae68c2c0af1115ac0533226e329 100644 (file)
@@ -1342,7 +1342,7 @@ xstormy16_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
   count = build3 (COMPONENT_REF, TREE_TYPE (f_count), valist, f_count,
                  NULL_TREE);
 
-  must_stack = targetm.calls.must_pass_in_stack (TYPE_MODE (type), type);
+  must_stack = must_pass_va_arg_in_stack (type);
   size_tree = round_up (size_in_bytes (type), UNITS_PER_WORD);
   gimplify_expr (&size_tree, pre_p, NULL, is_gimple_val, fb_rvalue);
 
index 9c90c146896040119be1366d8f93a43dcae41b05..6a3104f76a0fe046e3b1e994cc8097efcc37631d 100644 (file)
@@ -3328,7 +3328,7 @@ xtensa_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
   array = create_tmp_var (ptr_type_node);
 
   lab_over = NULL;
-  if (!targetm.calls.must_pass_in_stack (TYPE_MODE (type), type))
+  if (!must_pass_va_arg_in_stack (type))
     {
       lab_false = create_artificial_label (UNKNOWN_LOCATION);
       lab_over = create_artificial_label (UNKNOWN_LOCATION);