From 12828d9ff8ca306bd81e45efc9c36021e0380bb0 Mon Sep 17 00:00:00 2001 From: Steven Bosscher Date: Thu, 21 Sep 2006 23:38:21 +0000 Subject: [PATCH] re PR middle-end/26983 (Missing label with builtin_setjmp/longjmp) 2006-09-21 Steven Bosscher 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 | 7 +++++++ gcc/builtins.c | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr26983.c | 19 +++++++++++++++++++ 4 files changed, 37 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/pr26983.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4c1e0be4cb46..74bae3348f68 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2006-09-21 Steven Bosscher + + PR middle-end/26983 + Backport from mainline + * builtins.c (expand_builtin_setjmp): Force next_lab to be + preserved. + 2006-09-19 Roger Sayle PR middle-end/4520 diff --git a/gcc/builtins.c b/gcc/builtins.c index 963b19f2962a..7969174d5185 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c19ef26e8646..2ae67d4a4db7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-09-21 Steven Bosscher + + PR middle-end/26983 + * gcc.dg/pr26983.c: New test. + 2006-09-18 Uros Bizjak PR target/28946 diff --git a/gcc/testsuite/gcc.dg/pr26983.c b/gcc/testsuite/gcc.dg/pr26983.c new file mode 100644 index 000000000000..5e2120a1ffe3 --- /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; +} + -- 2.47.2