https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64979
Bug ID: 64979 Summary: S/390: va_list overflow area pointer is not setup due to stdarg optimization Product: gcc Version: 4.0.0 Status: UNCONFIRMED Severity: critical Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: krebbel at gcc dot gnu.org Created attachment 34699 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=34699&action=edit Experimental fix The following testcase aborts when compiled with at least -O1: #include <stdarg.h> extern void abort (void); void __attribute__((noinline)) bar(int msgno, va_list *args) { int i; for (i = 0; i < 10; i++) if (i != va_arg(*args, int)) abort (); } void __attribute__((noinline)) foo(int msgno, ...) { va_list args; int nargs; va_start(args, msgno); nargs = va_arg(args, int); bar(msgno, (va_list *)((nargs == 0) ? ((void *)0) : &args)); } int main(void) { foo(100 /* msgno */, 1 /* nargs - part of vararg list */, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9); return 0; } It is present since we enabled stdarg optimization in the S/390 backend: https://gcc.gnu.org/ml/gcc-patches/2005-05/msg02429.html The field __overfloat_arg_area in the va_list struct is not set up if the va_arg expansions in the current function are found not to exceed the number of argument registers. This fails with the testcase since the va_list pointer is passed to another function - still needing that field. The final patch will include the testcase.