diff options
author | Richard Henderson <rth@redhat.com> | 2004-09-12 10:22:03 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2004-09-12 10:22:03 -0700 |
commit | f6a41d17646f19146749442cced240b927f88b8b (patch) | |
tree | 7fbe3e0f7976ee06071314aa3a4f0e6be24c17c5 /gcc | |
parent | bdd1aed4e1daf301088d973c35312338ee48fffd (diff) | |
download | gcc-f6a41d17646f19146749442cced240b927f88b8b.zip gcc-f6a41d17646f19146749442cced240b927f88b8b.tar.gz gcc-f6a41d17646f19146749442cced240b927f88b8b.tar.bz2 |
PR 17186, part deux
PR 17186, part deux
* except.c (sjlj_emit_function_exit): Fix logic locating
sjlj_exit_after in final block.
From-SVN: r87394
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/except.c | 21 |
2 files changed, 17 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f9b548a..81f42f3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-09-12 Richard Henderson <rth@redhat.com + + PR 17186, part deux + * except.c (sjlj_emit_function_exit): Fix logic locating + sjlj_exit_after in final block. + 2004-09-12 Toon Moene <toon@moene.indiv.nluug.nl> * common.opt: Remove flags -fmove-all-movables and diff --git a/gcc/except.c b/gcc/except.c index 9e3c06d..50eda2a 100644 --- a/gcc/except.c +++ b/gcc/except.c @@ -2042,18 +2042,19 @@ sjlj_emit_function_exit (void) 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 = NEXT_INSN (BB_END (e->src)); insn; insn = NEXT_INSN (insn)) - if (insn == cfun->eh->sjlj_exit_after) - break; - if (insn) - insert_insn_on_edge (seq, e); - else + for (insn = BB_HEAD (e->src); ; insn = NEXT_INSN (insn)) { - insn = cfun->eh->sjlj_exit_after; - if (LABEL_P (insn)) - insn = NEXT_INSN (insn); - emit_insn_after (seq, insn); + if (insn == cfun->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); } } |