Commit 316d0b19 by Eric Botcazou Committed by Eric Botcazou

re PR middle-end/8028 (__builtin_apply() passes wrong arguments)

	PR middle-end/8028
	PR middle-end/9890
	PR middle-end/11151
	PR middle-end/12210
	PR middle-end/12503
	PR middle-end/12692
	* builtins.c (expand_builtin_apply): Use virtual_outgoing_args_rtx
	as the base address to copy the memory arguments to.

From-SVN: r73976
parent 27f0f552
2003-11-27 Eric Botcazou <ebotcazou@libertysurf.fr>
PR middle-end/8028
PR middle-end/9890
PR middle-end/11151
PR middle-end/12210
PR middle-end/12503
PR middle-end/12692
* builtins.c (expand_builtin_apply): Use virtual_outgoing_args_rtx
as the base address to copy the memory arguments to.
2003-11-26 Danny Smith <dannysmith@users.sourceforge.net> 2003-11-26 Danny Smith <dannysmith@users.sourceforge.net>
* config/i386/cygming.h (ASM_OUTPUT_DEF_FROM_DECLS): Declare * config/i386/cygming.h (ASM_OUTPUT_DEF_FROM_DECLS): Declare
......
...@@ -1219,12 +1219,16 @@ expand_builtin_apply (rtx function, rtx arguments, rtx argsize) ...@@ -1219,12 +1219,16 @@ expand_builtin_apply (rtx function, rtx arguments, rtx argsize)
#endif #endif
emit_stack_save (SAVE_BLOCK, &old_stack_level, NULL_RTX); emit_stack_save (SAVE_BLOCK, &old_stack_level, NULL_RTX);
/* Push a block of memory onto the stack to store the memory arguments. /* Allocate a block of memory onto the stack and copy the memory
Save the address in a register, and copy the memory arguments. ??? I arguments to the outgoing arguments address. */
haven't figured out how the calling convention macros effect this, allocate_dynamic_stack_space (argsize, 0, BITS_PER_UNIT);
but it's likely that the source and/or destination addresses in dest = virtual_outgoing_args_rtx;
the block copy will need updating in machine specific ways. */ #ifndef STACK_GROWS_DOWNWARD
dest = allocate_dynamic_stack_space (argsize, 0, BITS_PER_UNIT); if (GET_CODE (argsize) == CONST_INT)
dest = plus_constant (dest, -INTVAL (argsize));
else
dest = gen_rtx_PLUS (Pmode, dest, negate_rtx (Pmode, argsize));
#endif
dest = gen_rtx_MEM (BLKmode, dest); dest = gen_rtx_MEM (BLKmode, dest);
set_mem_align (dest, PARM_BOUNDARY); set_mem_align (dest, PARM_BOUNDARY);
src = gen_rtx_MEM (BLKmode, incoming_args); src = gen_rtx_MEM (BLKmode, incoming_args);
......
2003-11-27 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.dg/builtin-apply2.c: New test.
2003-11-26 Eric Botcazou <ebotcazou@libertysurf.fr> 2003-11-26 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.c-torture/compile/20031023-4.c: Don't XFAIL on SPARC64. * gcc.c-torture/compile/20031023-4.c: Don't XFAIL on SPARC64.
......
/* PR target/12503 */
/* Origin: <pierre.nguyen-tuong@asim.lip6.fr> */
/* Verify that __builtin_apply behaves correctly on targets
with pre-pushed arguments (e.g. SPARC). */
/* { dg-do run } */
#define INTEGER_ARG 5
typedef __SIZE_TYPE__ size_t;
extern void abort(void);
void foo(char *name, double d, double e, double f, int g)
{
if (g != INTEGER_ARG)
abort();
}
void bar(char *name, ...)
{
size_t size;
void *arguments;
size = sizeof(char *) + 3 * sizeof(double) + sizeof(int);
arguments = __builtin_apply_args();
__builtin_apply(foo, arguments, size);
}
int main(void)
{
bar("eeee", 5.444567, 8.90765, 4.567789, INTEGER_ARG);
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment