From 4c33221ccd7955ab2e2e442b28fd4df277c1f728 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Wed, 22 Apr 2009 11:31:56 +0000 Subject: 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 --- gcc/ChangeLog | 7 +++++++ gcc/except.c | 32 +++++--------------------------- gcc/function.c | 4 ++-- 3 files changed, 14 insertions(+), 29 deletions(-) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 27182fb..cce04d5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-04-22 Ulrich Weigand + + * 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 PR tree-optimization/39845 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 diff --git a/gcc/function.c b/gcc/function.c index 2c97597e..60b7348 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -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 -- cgit v1.1