BUGREPORT Ossadchy Yury A., waspcoder@mail.ru GCC 3.3.1 fails on test --- CODE --- #include <stdio.h> __attribute__ ((regparm (0))) int fn1 (int arg1, int arg2) { printf ("fn1 (%i, %i)\n", arg1, arg2); return -20; } __attribute__ ((regparm (0))) int caller (int arg1, int arg2) { void * args = __builtin_apply_args (); printf ("caller (%i, %i)\n", arg1, arg2); __builtin_return (__builtin_apply ((void (*)())&fn1, args, sizeof (int)*2)); // ^^^^^^^^^^^^^^ // it's bad, but it must work! // regparm (0)! } int main () { printf ("result == %i\n", caller (10, 34)); } --- /CODE --- gcc-2.96: >caller (10, 34) >fn1 (10, 34) >result == -20 gcc-3.3.1: >caller (10, 34) >fn1 (1074217344, 1075033152) >result == -20 gcc -v: >Reading specs from /usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.3.1/specs >Configured with: ../gcc-3.3.1/configure --enable-languages=c objc++ >Thread model: posix >gcc version 3.3.1 NOTE: include somewhat like my test into `testsuite'! Problem is in `builtins.c::expand_builtin_apply', when pushing parameters. Simplest `bugfix': /* WASP: dest = allocate_dynamic_stack_space (argsize, 0, BITS_PER_UNIT); does NOT works, use this: */ dest = push_block (argsize, 0, 1);
I want to say this is the same bug as PR 9890 but I do not know.
__builtin_apply is indeed broken.
I'm already in this business :-)
I don't think the fix is right, since push_block statically allocates memory on the stack while we really want to dynamically allocate in this case.
See http://gcc.gnu.org/ml/gcc-patches/2003-10/msg00897.html
*** Bug 13531 has been marked as a duplicate of this bug. ***