From 2c8b5d61bc629ae4468fc9a6cc717b2f0e5032f8 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 6 Feb 2012 14:33:05 +0100 Subject: [PATCH] re PR target/52129 (wrong code to pass parameters to tail call function) PR target/52129 * calls.c (mem_overlaps_already_clobbered_arg_p): If val is CONST_INT_P, subtract resp. add crtl->args.pretend_args_size to it. * gcc.c-torture/execute/pr52129.c: New test. From-SVN: r183933 --- gcc/ChangeLog | 6 ++++ gcc/calls.c | 5 ++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.c-torture/execute/pr52129.c | 28 +++++++++++++++++++ 4 files changed, 44 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr52129.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 072fc3c3766..7effee6db59 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-02-06 Jakub Jelinek + + PR target/52129 + * calls.c (mem_overlaps_already_clobbered_arg_p): If val is + CONST_INT_P, subtract resp. add crtl->args.pretend_args_size to it. + 2012-02-06 Jonathan Wakely PR c++/48680 diff --git a/gcc/calls.c b/gcc/calls.c index 943ab093c0f..53c03354726 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -1808,6 +1808,11 @@ mem_overlaps_already_clobbered_arg_p (rtx addr, unsigned HOST_WIDE_INT size) return true; else i = INTVAL (val); +#ifdef STACK_GROWS_DOWNWARD + i -= crtl->args.pretend_args_size; +#else + i += crtl->args.pretend_args_size; +#endif #ifdef ARGS_GROW_DOWNWARD i = -i - size; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2f66445da64..6361ab0e0e5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-02-06 Jakub Jelinek + + PR target/52129 + * gcc.c-torture/execute/pr52129.c: New test. + 2012-02-06 Andrey Belevantsev * gcc.dg/pr48374.c: Actually add the test I forgot diff --git a/gcc/testsuite/gcc.c-torture/execute/pr52129.c b/gcc/testsuite/gcc.c-torture/execute/pr52129.c new file mode 100644 index 00000000000..a60bfa8bb6a --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr52129.c @@ -0,0 +1,28 @@ +/* PR target/52129 */ + +extern void abort (void); +struct S { void *p; unsigned int q; }; +struct T { char a[64]; char b[64]; } t; + +__attribute__((noinline, noclone)) int +foo (void *x, struct S s, void *y, void *z) +{ + if (x != &t.a[2] || s.p != &t.b[5] || s.q != 27 || y != &t.a[17] || z != &t.b[17]) + abort (); + return 29; +} + +__attribute__((noinline, noclone)) int +bar (void *x, void *y, void *z, struct S s, int t, struct T *u) +{ + return foo (x, s, &u->a[t], &u->b[t]); +} + +int +main () +{ + struct S s = { &t.b[5], 27 }; + if (bar (&t.a[2], (void *) 0, (void *) 0, s, 17, &t) != 29) + abort (); + return 0; +} -- 2.30.2