aboutsummaryrefslogtreecommitdiff
path: root/gcc/except.c
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2009-04-22 11:31:56 +0000
committerUlrich Weigand <uweigand@gcc.gnu.org>2009-04-22 11:31:56 +0000
commit4c33221ccd7955ab2e2e442b28fd4df277c1f728 (patch)
tree869fe1a9b21d0e0d0899b90686c82c84b6ee0c49 /gcc/except.c
parent9925bce0b85fd64eb1aa4afac20552781ecfa5e2 (diff)
downloadgcc-4c33221ccd7955ab2e2e442b28fd4df277c1f728.zip
gcc-4c33221ccd7955ab2e2e442b28fd4df277c1f728.tar.gz
gcc-4c33221ccd7955ab2e2e442b28fd4df277c1f728.tar.bz2
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
Diffstat (limited to 'gcc/except.c')
-rw-r--r--gcc/except.c32
1 files changed, 5 insertions, 27 deletions
diff --git a/gcc/except.c b/gcc/except.c
index 5a04fa6..bec7383 100644
--- a/gcc/except.c
+++ b/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