This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix -fmudflap ICE with setjmp (PR middle-end/35314)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sat, 8 Nov 2008 21:34:35 +0100
- Subject: [PATCH] Fix -fmudflap ICE with setjmp (PR middle-end/35314)
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
is_ctrl_altering_stmt has:
/* A non-pure/const call alters flow control if the current
function has nonlocal labels. */
if (!(flags & (ECF_CONST | ECF_PURE))
&& cfun->has_nonlocal_label)
return true;
When mudflap2 adds __mf_check () call in a function which
has_nonlocal_label and adds some further statements after it, verification
fails because of this. This patch splits the bb after __mf_check () call
in that case to make verification happy (eventhough __mf_check won't longjmp to
any of the nonlocal labels, is_ctrl_altering_stmt doesn't know that).
Ok for trunk?
2008-11-08 Jakub Jelinek <jakub@redhat.com>
PR middle-end/35314
* tree-mudflap.c (mf_build_check_statement_for): Split then_block
after __mf_check call if the call must end a bb.
* testsuite/libmudflap.c/pass67-frag.c: New test.
--- gcc/tree-mudflap.c.jj 2008-10-23 13:21:41.000000000 +0200
+++ gcc/tree-mudflap.c 2008-11-08 20:41:27.000000000 +0100
@@ -669,6 +669,15 @@ mf_build_check_statement_for (tree base,
if (! flag_mudflap_threads)
{
+ if (stmt_ends_bb_p (g))
+ {
+ gsi = gsi_start_bb (then_bb);
+ gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING);
+ e = split_block (then_bb, g);
+ then_bb = e->dest;
+ seq = gimple_seq_alloc ();
+ }
+
g = gimple_build_assign (mf_cache_shift_decl_l, mf_cache_shift_decl);
gimple_seq_add_stmt (&seq, g);
--- libmudflap/testsuite/libmudflap.c/pass67-frag.c.jj 2008-11-08 20:48:49.000000000 +0100
+++ libmudflap/testsuite/libmudflap.c/pass67-frag.c 2008-11-08 20:48:14.000000000 +0100
@@ -0,0 +1,14 @@
+/* PR middle-end/35314 */
+/* { dg-do compile } */
+/* { dg-options "-fmudflap" } */
+
+#include <setjmp.h>
+
+jmp_buf buf;
+
+void
+foo (volatile char *p)
+{
+ if (__builtin_setjmp (buf))
+ *p;
+}
Jakub