diff options
author | Richard Henderson <rth@cygnus.com> | 2000-08-06 03:07:31 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2000-08-06 03:07:31 -0700 |
commit | 157229c314cbaa93f603a8d602a7d7301e36b59e (patch) | |
tree | 02cef3bb778936cb54cbe4ab870c9f3a115392b5 /gcc/stmt.c | |
parent | d2335c24035c080c8940984e9ca8dc39615216ea (diff) | |
download | gcc-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.c | 53 |
1 files changed, 22 insertions, 31 deletions
@@ -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 |