49 lines
2.0 KiB
Diff
49 lines
2.0 KiB
Diff
From 3ed698858f0ebb12a99ed1cc12c038b533f64b2c Mon Sep 17 00:00:00 2001
|
|
From: Xi Ruoyao <xry111@xry111.site>
|
|
Date: Fri, 25 Oct 2024 06:15:21 +0000
|
|
Subject: [PATCH 150/188] LoongArch: Fix C23 (...) functions returning large
|
|
aggregates [PR114175]
|
|
|
|
We were assuming TYPE_NO_NAMED_ARGS_STDARG_P don't have any named
|
|
arguments and there is nothing to advance, but that is not the case
|
|
for (...) functions returning by hidden reference which have one such
|
|
artificial argument. This is causing gcc.dg/c23-stdarg-6.c and
|
|
gcc.dg/c23-stdarg-8.c to fail.
|
|
|
|
Fix the issue by checking if arg.type is NULL, as r14-9503 explains.
|
|
|
|
gcc/ChangeLog:
|
|
|
|
PR target/114175
|
|
* config/loongarch/loongarch.cc
|
|
(loongarch_setup_incoming_varargs): Only skip
|
|
loongarch_function_arg_advance for TYPE_NO_NAMED_ARGS_STDARG_P
|
|
functions if arg.type is NULL.
|
|
---
|
|
gcc/config/loongarch/loongarch.cc | 9 ++++++++-
|
|
1 file changed, 8 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc
|
|
index c1dc30b61..1e3981e19 100644
|
|
--- a/gcc/config/loongarch/loongarch.cc
|
|
+++ b/gcc/config/loongarch/loongarch.cc
|
|
@@ -767,7 +767,14 @@ loongarch_setup_incoming_varargs (cumulative_args_t cum,
|
|
argument. Advance a local copy of CUM past the last "real" named
|
|
argument, to find out how many registers are left over. */
|
|
local_cum = *get_cumulative_args (cum);
|
|
- loongarch_function_arg_advance (pack_cumulative_args (&local_cum), arg);
|
|
+
|
|
+ /* For a C23 variadic function w/o any named argument, and w/o an
|
|
+ artifical argument for large return value, skip advancing args.
|
|
+ There is such an artifical argument iff. arg.type is non-NULL
|
|
+ (PR 114175). */
|
|
+ if (!TYPE_NO_NAMED_ARGS_STDARG_P (TREE_TYPE (current_function_decl))
|
|
+ || arg.type != NULL_TREE)
|
|
+ loongarch_function_arg_advance (pack_cumulative_args (&local_cum), arg);
|
|
|
|
/* Found out how many registers we need to save. */
|
|
gp_saved = MAX_ARGS_IN_REGISTERS - local_cum.num_gprs;
|
|
--
|
|
2.43.0
|
|
|