-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 03/23/11 08:25, Jeff Law wrote: > On 03/21/11 11:50, Jakub Jelinek wrote: >> On Mon, Mar 21, 2011 at 11:37:16AM -0600, Jeff Law wrote: >>> Similarly for redirect_edge_succ_nodup in this fragment: >>> >>> ret = redirect_edge_succ_nodup (e, dest); >>> if (dump_file) >>> fprintf (dump_file, "Fallthru edge %i->%i redirected to %i\n", >>> e->src->index, e->dest->index, dest->index); >>> } >>> Luckily in this case the use-after-free only occurs when dumping, so it >>> won't typically affect end users. > >> Well, the message is wrong anyway, becase e->dest->index will be >> dest->index (with the exception that e has been remove_edge, but then it is >> the use after free). Guess the message should be printed before the >> redirect_edge_succ_nodup call, or remember e->dest->index in some local >> variable and print that variable after the call. > Yea, I'll just move the message before the call to > redirecT_edge_succ_nodup. Attached is the actual patch that was checked in after another bootstrap and regression test.
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/ iQEcBAEBAgAGBQJNii+4AAoJEBRtltQi2kC7aLsIAJQ8JrBCCCSNC0HH+1NgAdyp aUFEpQJUV9KgYpKzcqtKY5+kJI4WXRnRXsMmXuC4rWKV5rsnGmCzOSoHolHecLXB F7J3KaCwg51tcJ/wxXUCPUy+MhZ/ZWHBVbLzw+aQ+O4mXqwnHoRRxnUwGmas6rDk +pFXjmTArphMQdQ/xnOtXqUylecf4iu06Axn+0UXVy2J3CHT3jPvjuNZUHVUcVq+ qNrUTwYhDMHPXQtZWGz4RNqoACmpY/ku53xXwJq4PrcD1g/rl8Vy6aVnTPE9lONv rXmxr/FgNFZixKxNhaYz6A+maXbM4uRGZvSoGuO0do/YulZXXN+Ym5HHlocM/pQ= =/fA+ -----END PGP SIGNATURE-----
Index: cfg.c =================================================================== *** cfg.c (revision 171351) --- cfg.c (working copy) *************** redirect_edge_succ_nodup (edge e, basic_ *** 402,409 **** if (s->probability > REG_BR_PROB_BASE) s->probability = REG_BR_PROB_BASE; s->count += e->count; - remove_edge (e); redirect_edge_var_map_dup (s, e); e = s; } else --- 402,409 ---- if (s->probability > REG_BR_PROB_BASE) s->probability = REG_BR_PROB_BASE; s->count += e->count; redirect_edge_var_map_dup (s, e); + remove_edge (e); e = s; } else Index: cfgrtl.c =================================================================== *** cfgrtl.c (revision 171351) --- cfgrtl.c (working copy) *************** cfg_layout_redirect_edge_and_branch (edg *** 2537,2545 **** e->flags &= ~EDGE_FALLTHRU; redirected = redirect_branch_edge (e, dest); gcc_assert (redirected); ! e->flags |= EDGE_FALLTHRU; ! df_set_bb_dirty (e->src); ! return e; } /* In case we are redirecting fallthru edge to the branch edge of conditional jump, remove it. */ --- 2537,2545 ---- e->flags &= ~EDGE_FALLTHRU; redirected = redirect_branch_edge (e, dest); gcc_assert (redirected); ! redirected->flags |= EDGE_FALLTHRU; ! df_set_bb_dirty (redirected->src); ! return redirected; } /* In case we are redirecting fallthru edge to the branch edge of conditional jump, remove it. */ *************** cfg_layout_redirect_edge_and_branch (edg *** 2553,2562 **** && onlyjump_p (BB_END (src))) delete_insn (BB_END (src)); } - ret = redirect_edge_succ_nodup (e, dest); if (dump_file) fprintf (dump_file, "Fallthru edge %i->%i redirected to %i\n", e->src->index, e->dest->index, dest->index); } else ret = redirect_branch_edge (e, dest); --- 2553,2562 ---- && onlyjump_p (BB_END (src))) delete_insn (BB_END (src)); } if (dump_file) fprintf (dump_file, "Fallthru edge %i->%i redirected to %i\n", e->src->index, e->dest->index, dest->index); + ret = redirect_edge_succ_nodup (e, dest); } else ret = redirect_branch_edge (e, dest);