From: steven Date: Sun, 10 Sep 2006 20:08:58 +0000 (+0000) Subject: PR middle-end/26983 X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=32acc84a1f344f5ebfb5c81ed6665542c56c2880;ds=sidebyside PR middle-end/26983 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a389b503ffa..c4066f353b2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-09-10 Steven Bosscher + + PR middle-end/26983 + * builtins.c (expand_builtin_setjmp): Force next_lab to be + preserved. + 2006-09-10 Richard Sandiford PR target/29006 diff --git a/gcc/builtins.c b/gcc/builtins.c index 1f62dcaaf00..5bcba14d7c2 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ce2c223a640..55eee6b1505 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-09-10 Steven Bosscher + + PR middle-end/26983 + * gcc.dg/pr26983.c: New test. + 2006-09-10 Richard Sandiford PR target/29006 diff --git a/gcc/testsuite/gcc.dg/pr26983.c b/gcc/testsuite/gcc.dg/pr26983.c new file mode 100644 index 00000000000..5e2120a1ffe --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr26983.c @@ -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; +} +