aboutsummaryrefslogtreecommitdiff
path: root/gcc/stmt.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>2000-08-06 03:07:31 -0700
committerRichard Henderson <rth@gcc.gnu.org>2000-08-06 03:07:31 -0700
commit157229c314cbaa93f603a8d602a7d7301e36b59e (patch)
tree02cef3bb778936cb54cbe4ab870c9f3a115392b5 /gcc/stmt.c
parentd2335c24035c080c8940984e9ca8dc39615216ea (diff)
downloadgcc-157229c314cbaa93f603a8d602a7d7301e36b59e.zip
gcc-157229c314cbaa93f603a8d602a7d7301e36b59e.tar.gz
gcc-157229c314cbaa93f603a8d602a7d7301e36b59e.tar.bz2
stmt.c (expand_goto): Do virtual_stack_vars_rtx replacement for HAVE_nonlocal_goto as well.
* stmt.c (expand_goto): Do virtual_stack_vars_rtx replacement for HAVE_nonlocal_goto as well. * config/i960/i960.md (nonlocal_goto): Don't do it here. * config/pj/pj.md (nonlocal_goto): Likewise. From-SVN: r35521
Diffstat (limited to 'gcc/stmt.c')
-rw-r--r--gcc/stmt.c53
1 files changed, 22 insertions, 31 deletions
diff --git a/gcc/stmt.c b/gcc/stmt.c
index 3f102cf..47431f6 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -798,7 +798,7 @@ expand_goto (label)
{
struct function *p = find_function_data (context);
rtx label_ref = gen_rtx_LABEL_REF (Pmode, label_rtx (label));
- rtx temp, handler_slot;
+ rtx handler_slot, static_chain, save_area;
tree link;
/* Find the corresponding handler slot for this label. */
@@ -816,49 +816,40 @@ expand_goto (label)
case the virtual stack vars register gets instantiated differently
in the parent than in the child. */
+ static_chain = copy_to_reg (lookup_static_chain (label));
+
+ /* Get addr of containing function's current nonlocal goto handler,
+ which will do any cleanups and then jump to the label. */
+ handler_slot = copy_to_reg (replace_rtx (copy_rtx (handler_slot),
+ virtual_stack_vars_rtx,
+ static_chain));
+
+ /* Get addr of containing function's nonlocal save area. */
+ save_area = p->x_nonlocal_goto_stack_level;
+ if (save_area)
+ save_area = replace_rtx (copy_rtx (save_area),
+ virtual_stack_vars_rtx, static_chain);
+
#if HAVE_nonlocal_goto
if (HAVE_nonlocal_goto)
- emit_insn (gen_nonlocal_goto (lookup_static_chain (label),
- copy_rtx (handler_slot),
- copy_rtx (p->x_nonlocal_goto_stack_level),
- label_ref));
+ emit_insn (gen_nonlocal_goto (static_chain, handler_slot,
+ save_area, label_ref));
else
#endif
{
- rtx addr;
-
/* Restore frame pointer for containing function.
This sets the actual hard register used for the frame pointer
to the location of the function's incoming static chain info.
The non-local goto handler will then adjust it to contain the
proper value and reload the argument pointer, if needed. */
- emit_move_insn (hard_frame_pointer_rtx, lookup_static_chain (label));
-
- /* We have now loaded the frame pointer hardware register with
- the address of that corresponds to the start of the virtual
- stack vars. So replace virtual_stack_vars_rtx in all
- addresses we use with stack_pointer_rtx. */
-
- /* Get addr of containing function's current nonlocal goto handler,
- which will do any cleanups and then jump to the label. */
- addr = copy_rtx (handler_slot);
- temp = copy_to_reg (replace_rtx (addr, virtual_stack_vars_rtx,
- hard_frame_pointer_rtx));
-
- /* Restore the stack pointer. Note this uses fp just restored. */
- addr = p->x_nonlocal_goto_stack_level;
- if (addr)
- addr = replace_rtx (copy_rtx (addr),
- virtual_stack_vars_rtx,
- hard_frame_pointer_rtx);
-
- emit_stack_restore (SAVE_NONLOCAL, addr, NULL_RTX);
+ emit_move_insn (hard_frame_pointer_rtx, static_chain);
+ emit_stack_restore (SAVE_NONLOCAL, save_area, NULL_RTX);
- /* USE of hard_frame_pointer_rtx added for consistency; not clear if
- really needed. */
+ /* USE of hard_frame_pointer_rtx added for consistency;
+ not clear if really needed. */
emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
- emit_indirect_jump (temp);
+ emit_indirect_jump (handler_slot);
}
}
else