]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/26983 (Missing label with builtin_setjmp/longjmp)
authorSteven Bosscher <steven@gcc.gnu.org>
Thu, 21 Sep 2006 23:38:21 +0000 (23:38 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Thu, 21 Sep 2006 23:38:21 +0000 (23:38 +0000)
2006-09-21  Steven Bosscher  <steven@gcc.gnu.org>

PR middle-end/26983
Backport from mainline
* builtins.c (expand_builtin_setjmp): Force next_lab to be
preserved.

* gcc.dg/pr26983.c: New test.

From-SVN: r117125

gcc/ChangeLog
gcc/builtins.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr26983.c [new file with mode: 0644]

index 4c1e0be4cb46136003c778fdeb2ee8f91d9dc145..74bae3348f6893ca427901a9bb2f326196aed5cf 100644 (file)
@@ -1,3 +1,10 @@
+2006-09-21  Steven Bosscher  <steven@gcc.gnu.org>
+
+       PR middle-end/26983
+       Backport from mainline
+       * builtins.c (expand_builtin_setjmp): Force next_lab to be
+       preserved.
+
 2006-09-19  Roger Sayle  <roger@eyesopen.com>
 
        PR middle-end/4520
index 963b19f2962a50646bf0e29b9b91001c730f98ac..7969174d51850ff6ee9599b7b2acd73c410fe426 100644 (file)
@@ -689,6 +689,12 @@ expand_builtin_setjmp (tree arglist, rtx target)
 
   emit_label (next_lab);
 
+  /* Because setjmp and longjmp are not represented in the CFG, a cfgcleanup
+     may find that the basic block starting with NEXT_LAB is unreachable.
+     The whole block, along with NEXT_LAB, would be removed (see PR26983).
+     Make sure that never happens.  */
+  LABEL_PRESERVE_P (next_lab) = 1;
+     
   expand_builtin_setjmp_receiver (next_lab);
 
   /* Set TARGET to one.  */
index c19ef26e86460bb689cdfb732254d5f7e1332acb..2ae67d4a4db7c8cc51baa3c303cb2e7713600089 100644 (file)
@@ -1,3 +1,8 @@
+2006-09-21  Steven Bosscher  <steven@gcc.gnu.org>
+
+       PR middle-end/26983
+       * gcc.dg/pr26983.c: New test.
+
 2006-09-18  Uros Bizjak  <uros@kss-loka.si>
 
        PR target/28946
diff --git a/gcc/testsuite/gcc.dg/pr26983.c b/gcc/testsuite/gcc.dg/pr26983.c
new file mode 100644 (file)
index 0000000..5e2120a
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do link } */
+
+/* This used to cause a linker failure because GCC would output
+   assembler code referencing labels that it had not output.  */
+
+void *jmpbuf[6];
+
+void
+foo (void)
+{
+  __builtin_setjmp (jmpbuf);
+}
+
+int
+main (void)
+{
+  return 0;
+}
+