aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/except.c32
-rw-r--r--gcc/function.c4
3 files changed, 14 insertions, 29 deletions
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 <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
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 2c97597..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