OSDN Git Service

PR middle-end/26983
authorsteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 10 Sep 2006 20:08:58 +0000 (20:08 +0000)
committersteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 10 Sep 2006 20:08:58 +0000 (20:08 +0000)
gcc/
* builtins.c (expand_builtin_setjmp): Force next_lab to be
preserved.

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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116826 138bc75d-0d04-0410-961f-82ee72b054a4

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

index a389b50..c4066f3 100644 (file)
@@ -1,3 +1,9 @@
+2006-09-10  Steven Bosscher  <steven@gcc.gnu.org>
+
+       PR middle-end/26983
+       * builtins.c (expand_builtin_setjmp): Force next_lab to be
+       preserved.
+
 2006-09-10  Richard Sandiford  <richard@codesourcery.com>
 
        PR target/29006
index 1f62dca..5bcba14 100644 (file)
@@ -760,6 +760,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 ce2c223..55eee6b 100644 (file)
@@ -1,3 +1,8 @@
+2006-09-10  Steven Bosscher  <steven@gcc.gnu.org>
+
+       PR middle-end/26983
+       * gcc.dg/pr26983.c: New test.
+
 2006-09-10  Richard Sandiford  <richard@codesourcery.com>
 
        PR target/29006
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;
+}
+