aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2010-10-29 09:56:18 -0700
committerRichard Henderson <rth@gcc.gnu.org>2010-10-29 09:56:18 -0700
commitf802f27b85e93c508d78f3ccf07488e837a1989d (patch)
treeb95a38887ae8c25b78b1a385d92460f1cf6ecc59 /gcc
parenta9c64fcc1ec3485dae75ee8a4bc871298df7ea44 (diff)
downloadgcc-f802f27b85e93c508d78f3ccf07488e837a1989d.zip
gcc-f802f27b85e93c508d78f3ccf07488e837a1989d.tar.gz
gcc-f802f27b85e93c508d78f3ccf07488e837a1989d.tar.bz2
re PR rtl-optimization/46226 (asm goto may leave stack pointer invalid)
PR rtl-opt/46226 * stmt.c (expand_asm_operands): Call do_pending_stack_adjust for asm goto. From-SVN: r166067
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/stmt.c4
-rw-r--r--gcc/testsuite/gcc.dg/pr46226.c36
3 files changed, 46 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d207ffd..dc6d231 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-10-29 Richard Henderson <rth@redhat.com>
+
+ PR rtl-opt/46226
+ * stmt.c (expand_asm_operands): Call do_pending_stack_adjust
+ for asm goto.
+
2010-10-29 Paul Koning <ni1d@arrl.net>
* config/pdp11/pdp11.c (output_move_quad): Fix ICE for CPU
diff --git a/gcc/stmt.c b/gcc/stmt.c
index 9096d83..c8f56f5 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -776,6 +776,10 @@ expand_asm_operands (tree string, tree outputs, tree inputs,
/* Second pass evaluates arguments. */
+ /* Make sure stack is consistent for asm goto. */
+ if (nlabels > 0)
+ do_pending_stack_adjust ();
+
ninout = 0;
for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
{
diff --git a/gcc/testsuite/gcc.dg/pr46226.c b/gcc/testsuite/gcc.dg/pr46226.c
new file mode 100644
index 0000000..9934a4f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr46226.c
@@ -0,0 +1,36 @@
+/* { dg-do run } */
+/* { dg-options "-Os -fomit-frame-pointer" } */
+/* { dg-options "-Os -fomit-frame-pointer -mno-accumulate-outgoing-args -fno-asynchronous-unwind-tables" { target { i?86-*-* x86_64-*-* } } } */
+
+extern void abort(void);
+
+static void *p[2];
+
+void __attribute__((noinline))
+g(int x, ...)
+{
+ asm volatile ("" : : "g"(x));
+}
+
+void __attribute__((noinline))
+f(int x)
+{
+ p[0] = __builtin_return_address (0);
+ if (x == 0)
+ g(0);
+ g(1, 2, 3, 4, 5, 6, 7);
+
+ asm goto ("jmp %l0" : : : : label);
+ abort ();
+
+ label:
+ p[1] = __builtin_return_address (0);
+}
+
+int main()
+{
+ f(1);
+ if (p[0] != p[1])
+ abort ();
+ return 0;
+}