aboutsummaryrefslogtreecommitdiff
path: root/gcc/builtins.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2000-12-20 17:11:31 -0800
committerRichard Henderson <rth@gcc.gnu.org>2000-12-20 17:11:31 -0800
commit4b01bd1658cc87a0d9a674606b4ae78a3b4594fe (patch)
treeffba52aed7e19dec753b233566b9ab484e11d29e /gcc/builtins.c
parent1e248ee3875e64165a8a5c928e175603be975ffa (diff)
downloadgcc-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/builtins.c')
-rw-r--r--gcc/builtins.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c
index cbf9acd..3d74681 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -649,7 +649,7 @@ void
expand_builtin_longjmp (buf_addr, value)
rtx buf_addr, value;
{
- rtx fp, lab, stack;
+ rtx fp, lab, stack, insn;
enum machine_mode sa_mode = STACK_SAVEAREA_MODE (SAVE_NONLOCAL);
if (setjmp_alias_set == -1)
@@ -706,6 +706,18 @@ expand_builtin_longjmp (buf_addr, value)
emit_indirect_jump (lab);
}
}
+
+ /* Search backwards and mark the jump insn as a non-local goto.
+ Note that this precludes the use of __builtin_longjmp to a
+ __builtin_setjmp target in the same function. However, we've
+ already cautioned the user that these functions are for
+ internal exception handling use only. */
+ 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));
}
/* Get a MEM rtx for expression EXP which is the address of an operand