Hi, during testing of the new in-review C-SKY port, we discovered some FAILs
due to
the default va_args gimplifying (targhooks.c:std_gimplify_va_arg_expr) not
properly
having the logic to handle the TARGET_SPLIT_COMPLEX_ARG hook.
It appears that all other targets that happen to use TARGET_SPLIT_COMPLEX_ARG
also
defines TARGET_GIMPLIFY_VA_ARG_EXPR, so this went undiscovered.
The C-SKY port happens to only have TARGET_SPLIT_COMPLEX_ARG defined.
This patch completes this handling in std_gimplify_va_arg_expr(), though at the
moment it's only really exercised by the C-SKY port, which we tested to fix
several
_Complex va_args related FAILs and without regressions.
(the patch fragment is actually adapted from the xtensa port, FWIW)
Is this okay for trunk?
Thanks,
Chung-Lin
2018-08-02 Chung-Lin Tang <[email protected]>
* targhooks.c (std_gimplify_va_arg_expr): Properly handle case of when
TARGET_SPLIT_COMPLEX_ARG is defined.
Index: targhooks.c
===================================================================
--- targhooks.c (revision 263244)
+++ targhooks.c (working copy)
@@ -2154,6 +2154,23 @@ std_gimplify_va_arg_expr (tree valist, tree type,
if (indirect)
type = build_pointer_type (type);
+ if (targetm.calls.split_complex_arg
+ && TREE_CODE (type) == COMPLEX_TYPE
+ && targetm.calls.split_complex_arg (type))
+ {
+ tree real_part, imag_part;
+
+ real_part = std_gimplify_va_arg_expr (valist,
+ TREE_TYPE (type), pre_p, NULL);
+ real_part = get_initialized_tmp_var (real_part, pre_p, NULL);
+
+ imag_part = std_gimplify_va_arg_expr (unshare_expr (valist),
+ TREE_TYPE (type), pre_p, NULL);
+ imag_part = get_initialized_tmp_var (imag_part, pre_p, NULL);
+
+ return build2 (COMPLEX_EXPR, type, real_part, imag_part);
+ }
+
align = PARM_BOUNDARY / BITS_PER_UNIT;
boundary = targetm.calls.function_arg_boundary (TYPE_MODE (type), type);