diff options
author | Richard Henderson <rth@redhat.com> | 2000-12-20 17:11:31 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2000-12-20 17:11:31 -0800 |
commit | 4b01bd1658cc87a0d9a674606b4ae78a3b4594fe (patch) | |
tree | ffba52aed7e19dec753b233566b9ab484e11d29e /gcc/stmt.c | |
parent | 1e248ee3875e64165a8a5c928e175603be975ffa (diff) | |
download | gcc-4b01bd1658cc87a0d9a674606b4ae78a3b4594fe.zip gcc-4b01bd1658cc87a0d9a674606b4ae78a3b4594fe.tar.gz gcc-4b01bd1658cc87a0d9a674606b4ae78a3b4594fe.tar.bz2 |
rtl.h (REG_NON_LOCAL_GOTO): New.
* rtl.h (REG_NON_LOCAL_GOTO): New.
* rtl.c (reg_note_name): Update.
* stmt.c (expand_goto): Emit a REG_NON_LOCAL_GOTO note.
* builtins.c (expand_builtin_longjmp): Likewise.
* flow.c (make_edges): Check for REG_NON_LOCAL_GOTO and do
not emit an edge.
From-SVN: r38408
Diffstat (limited to 'gcc/stmt.c')
-rw-r--r-- | gcc/stmt.c | 11 |
1 files changed, 10 insertions, 1 deletions
@@ -783,7 +783,7 @@ expand_goto (label) { struct function *p = find_function_data (context); rtx label_ref = gen_rtx_LABEL_REF (Pmode, label_rtx (label)); - rtx handler_slot, static_chain, save_area; + rtx handler_slot, static_chain, save_area, insn; tree link; /* Find the corresponding handler slot for this label. */ @@ -836,6 +836,15 @@ expand_goto (label) emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx)); emit_indirect_jump (handler_slot); } + + /* Search backwards to the jump insn and mark it as a + non-local goto. */ + for (insn = get_last_insn (); + GET_CODE (insn) != JUMP_INSN; + insn = PREV_INSN (insn)) + continue; + REG_NOTES (insn) = alloc_EXPR_LIST (REG_NON_LOCAL_GOTO, const0_rtx, + REG_NOTES (insn)); } else expand_goto_internal (label, label_rtx (label), NULL_RTX); |