aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2012-02-06 14:33:05 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2012-02-06 14:33:05 +0100
commit2c8b5d61bc629ae4468fc9a6cc717b2f0e5032f8 (patch)
treee8130221fccd6c95f373dd8407bd131492de17a5 /gcc
parent93286335bbc36ae4b752c102cb0e08e3dc1ca9c5 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/calls.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr52129.c28
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;
+}