Xi Ruoyao <xry...@xry111.site> 于2024年3月20日周三 15:12写道: > > 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,8,9}.c to > fail. > > Fix the issue by checking if arg.type is NULL, as r14-9503 explains. > > gcc/ChangeLog: > > PR target/114175 > * config/mips/mips.cc (mips_setup_incoming_varargs): Only skip > mips_function_arg_advance for TYPE_NO_NAMED_ARGS_STDARG_P > functions if arg.type is NULL. > --- > > Bootstrapped and regtested on mips64el-linux-gnuabi64. Ok for trunk? >
Thanks. LGTM. > gcc/config/mips/mips.cc | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/gcc/config/mips/mips.cc b/gcc/config/mips/mips.cc > index 68e2ae8d8fa..ce764a5cb35 100644 > --- a/gcc/config/mips/mips.cc > +++ b/gcc/config/mips/mips.cc > @@ -6834,7 +6834,13 @@ mips_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); > - if (!TYPE_NO_NAMED_ARGS_STDARG_P (TREE_TYPE (current_function_decl))) > + > + /* 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) > mips_function_arg_advance (pack_cumulative_args (&local_cum), arg); > > /* Found out how many registers we need to save. */ > -- > 2.44.0 >