function.c (expand_function_end): Do not emit a jump to the "naked" return label for fall-through returns.
* function.c (expand_function_end): Do not emit a jump to the "naked" return label for fall-through returns. * except.c (sjlj_emit_function_exit): Always place the call to the unregister function at the location installed by expand_function_end. From-SVN: r146570
This commit is contained in:
parent
9925bce0b8
commit
4c33221ccd
@ -1,3 +1,10 @@
|
||||
2009-04-22 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
|
||||
|
||||
* function.c (expand_function_end): Do not emit a jump to the "naked"
|
||||
return label for fall-through returns.
|
||||
* except.c (sjlj_emit_function_exit): Always place the call to the
|
||||
unregister function at the location installed by expand_function_end.
|
||||
|
||||
2009-04-22 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/39845
|
||||
|
32
gcc/except.c
32
gcc/except.c
@ -1968,9 +1968,7 @@ sjlj_emit_function_exit_after (rtx after)
|
||||
static void
|
||||
sjlj_emit_function_exit (void)
|
||||
{
|
||||
rtx seq;
|
||||
edge e;
|
||||
edge_iterator ei;
|
||||
rtx seq, insn;
|
||||
|
||||
start_sequence ();
|
||||
|
||||
@ -1984,31 +1982,11 @@ sjlj_emit_function_exit (void)
|
||||
post-dominates all can_throw_internal instructions. This is
|
||||
the last possible moment. */
|
||||
|
||||
FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
|
||||
if (e->flags & EDGE_FALLTHRU)
|
||||
break;
|
||||
if (e)
|
||||
{
|
||||
rtx insn;
|
||||
insn = crtl->eh.sjlj_exit_after;
|
||||
if (LABEL_P (insn))
|
||||
insn = NEXT_INSN (insn);
|
||||
|
||||
/* Figure out whether the place we are supposed to insert libcall
|
||||
is inside the last basic block or after it. In the other case
|
||||
we need to emit to edge. */
|
||||
gcc_assert (e->src->next_bb == EXIT_BLOCK_PTR);
|
||||
for (insn = BB_HEAD (e->src); ; insn = NEXT_INSN (insn))
|
||||
{
|
||||
if (insn == crtl->eh.sjlj_exit_after)
|
||||
{
|
||||
if (LABEL_P (insn))
|
||||
insn = NEXT_INSN (insn);
|
||||
emit_insn_after (seq, insn);
|
||||
return;
|
||||
}
|
||||
if (insn == BB_END (e->src))
|
||||
break;
|
||||
}
|
||||
insert_insn_on_edge (seq, e);
|
||||
}
|
||||
emit_insn_after (seq, insn);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -4804,7 +4804,6 @@ expand_function_end (void)
|
||||
|
||||
start_sequence ();
|
||||
clobber_return_register ();
|
||||
expand_naked_return ();
|
||||
seq = get_insns ();
|
||||
end_sequence ();
|
||||
|
||||
@ -4812,7 +4811,8 @@ expand_function_end (void)
|
||||
}
|
||||
|
||||
/* Output the label for the naked return from the function. */
|
||||
emit_label (naked_return_label);
|
||||
if (naked_return_label)
|
||||
emit_label (naked_return_label);
|
||||
|
||||
/* @@@ This is a kludge. We want to ensure that instructions that
|
||||
may trap are not moved into the epilogue by scheduling, because
|
||||
|
Loading…
Reference in New Issue
Block a user