diff options
author | Jakub Jelinek <jakub@redhat.com> | 2012-02-06 14:33:05 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-02-06 14:33:05 +0100 |
commit | 2c8b5d61bc629ae4468fc9a6cc717b2f0e5032f8 (patch) | |
tree | e8130221fccd6c95f373dd8407bd131492de17a5 /gcc | |
parent | 93286335bbc36ae4b752c102cb0e08e3dc1ca9c5 (diff) | |
download | gcc-2c8b5d61bc629ae4468fc9a6cc717b2f0e5032f8.zip gcc-2c8b5d61bc629ae4468fc9a6cc717b2f0e5032f8.tar.gz gcc-2c8b5d61bc629ae4468fc9a6cc717b2f0e5032f8.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/calls.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr52129.c | 28 |
4 files changed, 44 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 072fc3c..7effee6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-02-06 Jakub Jelinek <jakub@redhat.com> + + 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 <jwakely.gcc@gmail.com> PR c++/48680 diff --git a/gcc/calls.c b/gcc/calls.c index 943ab09..53c0335 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 2f66445..6361ab0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-02-06 Jakub Jelinek <jakub@redhat.com> + + PR target/52129 + * gcc.c-torture/execute/pr52129.c: New test. + 2012-02-06 Andrey Belevantsev <abel@ispras.ru> * 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 0000000..a60bfa8 --- /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; +} |