Commit ba716ac9 by Bernd Schmidt Committed by Jeff Law

function.c (nonlocal_goto_handler_slots): Renamed from…

function.c (nonlocal_goto_handler_slots): Renamed from nonlocal_goto_handler_slot; now an EXPR_LIST chain.

        * function.c (nonlocal_goto_handler_slots): Renamed from
        nonlocal_goto_handler_slot; now an EXPR_LIST chain.
        (push_function_context_to): Adjust for this change.
        (pop_function_context_from): Likewise.
        (init_function_start): Likewise.
        (expand_function_end): Likewise.
        * function.h (struct function): Likewise.
        * calls.c (expand_call): Likewise.
        * explow.c (allocate_dynamic_stack_space): Likewise.
        * expr.h (nonlocal_goto_handler_slots): Rename its declaration.
        * stmt.c (declare_nonlocal_label): Make a new handler slot for each
        label.
        (expand_goto): When doing a nonlocal goto, find corresponding handler
        slot for it.  Don't put the label address in the static chain register.
        (expand_end_bindings): Break out nonlocal goto handling code into
        three new functions.
        (expand_nl_handler_label, expand_nl_goto_receiver,
        expand_nl_goto_receivers): New static functions, broken out of
        expand_end_bindings and adapted to create one handler per nonlocal
        label.
        * function.c (delete_handlers): Delete insn if it references any of
        the nonlocal goto handler slots.
        * i960.md (nonlocal_goto): Comment out code that modifies
        static_chain_rtx.
        * sparc.md (nonlocal_goto): Likewise.
        (goto_handler_and_restore_v9): Comment out.
        (goto_handler_and_restore_v9_sp64): Comment out.

From-SVN: r23732
parent 294377f8
Thu Nov 19 23:44:38 1998 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de> Fri Nov 20 08:34:00 1998 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>
* function.c (nonlocal_goto_handler_slots): Renamed from
nonlocal_goto_handler_slot; now an EXPR_LIST chain.
(push_function_context_to): Adjust for this change.
(pop_function_context_from): Likewise.
(init_function_start): Likewise.
(expand_function_end): Likewise.
* function.h (struct function): Likewise.
* calls.c (expand_call): Likewise.
* explow.c (allocate_dynamic_stack_space): Likewise.
* expr.h (nonlocal_goto_handler_slots): Rename its declaration.
* stmt.c (declare_nonlocal_label): Make a new handler slot for each
label.
(expand_goto): When doing a nonlocal goto, find corresponding handler
slot for it. Don't put the label address in the static chain register.
(expand_end_bindings): Break out nonlocal goto handling code into
three new functions.
(expand_nl_handler_label, expand_nl_goto_receiver,
expand_nl_goto_receivers): New static functions, broken out of
expand_end_bindings and adapted to create one handler per nonlocal
label.
* function.c (delete_handlers): Delete insn if it references any of
the nonlocal goto handler slots.
* i960.md (nonlocal_goto): Comment out code that modifies
static_chain_rtx.
* sparc.md (nonlocal_goto): Likewise.
(goto_handler_and_restore_v9): Comment out.
(goto_handler_and_restore_v9_sp64): Comment out.
Thu Nov 19 23:44:38 1998
* expr.c (STACK_BYTES): Delete unused macro. * expr.c (STACK_BYTES): Delete unused macro.
* calls.c: Provide default for PREFERRED_STACK_BOUNDARY. * calls.c: Provide default for PREFERRED_STACK_BOUNDARY.
......
...@@ -2204,7 +2204,7 @@ expand_call (exp, target, ignore) ...@@ -2204,7 +2204,7 @@ expand_call (exp, target, ignore)
Check for the handler slots since we might not have a save area Check for the handler slots since we might not have a save area
for non-local gotos. */ for non-local gotos. */
if (may_be_alloca && nonlocal_goto_handler_slot != 0) if (may_be_alloca && nonlocal_goto_handler_slots != 0)
emit_stack_save (SAVE_NONLOCAL, &nonlocal_goto_stack_level, NULL_RTX); emit_stack_save (SAVE_NONLOCAL, &nonlocal_goto_stack_level, NULL_RTX);
pop_temp_slots (); pop_temp_slots ();
......
...@@ -2343,6 +2343,7 @@ ...@@ -2343,6 +2343,7 @@
plus_constant (fp, 8)), plus_constant (fp, 8)),
new_pc); new_pc);
#if 0
/* Next, we put the value into the static chain register's save /* Next, we put the value into the static chain register's save
area on the stack. After the ret below, this will be loaded into area on the stack. After the ret below, this will be loaded into
r3 (the static chain). */ r3 (the static chain). */
...@@ -2350,6 +2351,7 @@ ...@@ -2350,6 +2351,7 @@
emit_move_insn (gen_rtx (MEM, SImode, emit_move_insn (gen_rtx (MEM, SImode,
plus_constant (fp, 12)), plus_constant (fp, 12)),
val); val);
#endif
/* We now load pfp (the previous frame pointer) with the value that /* We now load pfp (the previous frame pointer) with the value that
we want fp to be. */ we want fp to be. */
......
...@@ -7686,6 +7686,8 @@ ...@@ -7686,6 +7686,8 @@
really needed. */ really needed. */
/*emit_insn (gen_rtx_USE (VOIDmode, frame_pointer_rtx));*/ /*emit_insn (gen_rtx_USE (VOIDmode, frame_pointer_rtx));*/
emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx)); emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
#if 0
/* Return, restoring reg window and jumping to goto handler. */ /* Return, restoring reg window and jumping to goto handler. */
if (TARGET_V9 && GET_CODE (chain) == CONST_INT if (TARGET_V9 && GET_CODE (chain) == CONST_INT
&& ! (INTVAL (chain) & ~(HOST_WIDE_INT)0xffffffff)) && ! (INTVAL (chain) & ~(HOST_WIDE_INT)0xffffffff))
...@@ -7697,6 +7699,8 @@ ...@@ -7697,6 +7699,8 @@
} }
/* Put in the static chain register the nonlocal label address. */ /* Put in the static chain register the nonlocal label address. */
emit_move_insn (static_chain_rtx, chain); emit_move_insn (static_chain_rtx, chain);
#endif
emit_insn (gen_rtx_USE (VOIDmode, static_chain_rtx)); emit_insn (gen_rtx_USE (VOIDmode, static_chain_rtx));
emit_insn (gen_goto_handler_and_restore (labreg)); emit_insn (gen_goto_handler_and_restore (labreg));
emit_barrier (); emit_barrier ();
...@@ -7718,27 +7722,27 @@ ...@@ -7718,27 +7722,27 @@
[(set_attr "type" "misc") [(set_attr "type" "misc")
(set_attr "length" "2")]) (set_attr "length" "2")])
(define_insn "goto_handler_and_restore_v9" ;;(define_insn "goto_handler_and_restore_v9"
[(unspec_volatile [(match_operand:SI 0 "register_operand" "=r,r") ;; [(unspec_volatile [(match_operand:SI 0 "register_operand" "=r,r")
(match_operand:SI 1 "register_operand" "=r,r") ;; (match_operand:SI 1 "register_operand" "=r,r")
(match_operand:SI 2 "const_int_operand" "I,n")] 3)] ;; (match_operand:SI 2 "const_int_operand" "I,n")] 3)]
"TARGET_V9 && ! TARGET_ARCH64" ;; "TARGET_V9 && ! TARGET_ARCH64"
"@ ;; "@
return\\t%0+0\\n\\tmov\\t%2, %Y1 ;; return\\t%0+0\\n\\tmov\\t%2, %Y1
sethi\\t%%hi(%2), %1\\n\\treturn\\t%0+0\\n\\tor\\t%Y1, %%lo(%2), %Y1" ;; sethi\\t%%hi(%2), %1\\n\\treturn\\t%0+0\\n\\tor\\t%Y1, %%lo(%2), %Y1"
[(set_attr "type" "misc") ;; [(set_attr "type" "misc")
(set_attr "length" "2,3")]) ;; (set_attr "length" "2,3")])
;;
(define_insn "*goto_handler_and_restore_v9_sp64" ;;(define_insn "*goto_handler_and_restore_v9_sp64"
[(unspec_volatile [(match_operand:DI 0 "register_operand" "=r,r") ;; [(unspec_volatile [(match_operand:DI 0 "register_operand" "=r,r")
(match_operand:DI 1 "register_operand" "=r,r") ;; (match_operand:DI 1 "register_operand" "=r,r")
(match_operand:SI 2 "const_int_operand" "I,n")] 3)] ;; (match_operand:SI 2 "const_int_operand" "I,n")] 3)]
"TARGET_V9 && TARGET_ARCH64" ;; "TARGET_V9 && TARGET_ARCH64"
"@ ;; "@
return\\t%0+0\\n\\tmov\\t%2, %Y1 ;; return\\t%0+0\\n\\tmov\\t%2, %Y1
sethi\\t%%hi(%2), %1\\n\\treturn\\t%0+0\\n\\tor\\t%Y1, %%lo(%2), %Y1" ;; sethi\\t%%hi(%2), %1\\n\\treturn\\t%0+0\\n\\tor\\t%Y1, %%lo(%2), %Y1"
[(set_attr "type" "misc") ;; [(set_attr "type" "misc")
(set_attr "length" "2,3")]) ;; (set_attr "length" "2,3")])
;; Pattern for use after a setjmp to store FP and the return register ;; Pattern for use after a setjmp to store FP and the return register
;; into the stack area. ;; into the stack area.
......
...@@ -1303,7 +1303,7 @@ allocate_dynamic_stack_space (size, target, known_align) ...@@ -1303,7 +1303,7 @@ allocate_dynamic_stack_space (size, target, known_align)
#endif #endif
/* Record the new stack level for nonlocal gotos. */ /* Record the new stack level for nonlocal gotos. */
if (nonlocal_goto_handler_slot != 0) if (nonlocal_goto_handler_slots != 0)
emit_stack_save (SAVE_NONLOCAL, &nonlocal_goto_stack_level, NULL_RTX); emit_stack_save (SAVE_NONLOCAL, &nonlocal_goto_stack_level, NULL_RTX);
return target; return target;
......
...@@ -105,10 +105,12 @@ extern int inhibit_defer_pop; ...@@ -105,10 +105,12 @@ extern int inhibit_defer_pop;
extern int function_call_count; extern int function_call_count;
/* RTX for stack slot that holds the current handler for nonlocal gotos. /* List (chain of EXPR_LIST) of stack slots that hold the current handlers
for nonlocal gotos. There is one for every nonlocal label in the function;
this list matches the one in nonlocal_labels.
Zero when function does not have nonlocal labels. */ Zero when function does not have nonlocal labels. */
extern rtx nonlocal_goto_handler_slot; extern rtx nonlocal_goto_handler_slots;
/* RTX for stack slot that holds the stack pointer value to restore /* RTX for stack slot that holds the stack pointer value to restore
for a nonlocal goto. for a nonlocal goto.
......
...@@ -247,10 +247,12 @@ int function_call_count; ...@@ -247,10 +247,12 @@ int function_call_count;
tree nonlocal_labels; tree nonlocal_labels;
/* RTX for stack slot that holds the current handler for nonlocal gotos. /* List (chain of EXPR_LIST) of stack slots that hold the current handlers
for nonlocal gotos. There is one for every nonlocal label in the function;
this list matches the one in nonlocal_labels.
Zero when function does not have nonlocal labels. */ Zero when function does not have nonlocal labels. */
rtx nonlocal_goto_handler_slot; rtx nonlocal_goto_handler_slots;
/* RTX for stack slot that holds the stack pointer value to restore /* RTX for stack slot that holds the stack pointer value to restore
for a nonlocal goto. for a nonlocal goto.
...@@ -532,7 +534,7 @@ push_function_context_to (context) ...@@ -532,7 +534,7 @@ push_function_context_to (context)
p->parm_reg_stack_loc = parm_reg_stack_loc; p->parm_reg_stack_loc = parm_reg_stack_loc;
p->outgoing_args_size = current_function_outgoing_args_size; p->outgoing_args_size = current_function_outgoing_args_size;
p->return_rtx = current_function_return_rtx; p->return_rtx = current_function_return_rtx;
p->nonlocal_goto_handler_slot = nonlocal_goto_handler_slot; p->nonlocal_goto_handler_slots = nonlocal_goto_handler_slots;
p->nonlocal_goto_stack_level = nonlocal_goto_stack_level; p->nonlocal_goto_stack_level = nonlocal_goto_stack_level;
p->nonlocal_labels = nonlocal_labels; p->nonlocal_labels = nonlocal_labels;
p->cleanup_label = cleanup_label; p->cleanup_label = cleanup_label;
...@@ -616,7 +618,7 @@ pop_function_context_from (context) ...@@ -616,7 +618,7 @@ pop_function_context_from (context)
parm_reg_stack_loc = p->parm_reg_stack_loc; parm_reg_stack_loc = p->parm_reg_stack_loc;
current_function_outgoing_args_size = p->outgoing_args_size; current_function_outgoing_args_size = p->outgoing_args_size;
current_function_return_rtx = p->return_rtx; current_function_return_rtx = p->return_rtx;
nonlocal_goto_handler_slot = p->nonlocal_goto_handler_slot; nonlocal_goto_handler_slots = p->nonlocal_goto_handler_slots;
nonlocal_goto_stack_level = p->nonlocal_goto_stack_level; nonlocal_goto_stack_level = p->nonlocal_goto_stack_level;
nonlocal_labels = p->nonlocal_labels; nonlocal_labels = p->nonlocal_labels;
cleanup_label = p->cleanup_label; cleanup_label = p->cleanup_label;
...@@ -3664,14 +3666,23 @@ delete_handlers () ...@@ -3664,14 +3666,23 @@ delete_handlers ()
TREE_CHAIN (last_t) = TREE_CHAIN (t); TREE_CHAIN (last_t) = TREE_CHAIN (t);
} }
} }
if (GET_CODE (insn) == INSN if (GET_CODE (insn) == INSN)
&& ((nonlocal_goto_handler_slot != 0 {
&& reg_mentioned_p (nonlocal_goto_handler_slot, PATTERN (insn))) int can_delete = 0;
rtx t;
for (t = nonlocal_goto_handler_slots; t != 0; t = XEXP (t, 1))
if (reg_mentioned_p (t, PATTERN (insn)))
{
can_delete = 1;
break;
}
if (can_delete
|| (nonlocal_goto_stack_level != 0 || (nonlocal_goto_stack_level != 0
&& reg_mentioned_p (nonlocal_goto_stack_level, && reg_mentioned_p (nonlocal_goto_stack_level,
PATTERN (insn))))) PATTERN (insn))))
delete_insn (insn); delete_insn (insn);
} }
}
} }
/* Return a list (chain of EXPR_LIST nodes) for the nonlocal labels /* Return a list (chain of EXPR_LIST nodes) for the nonlocal labels
...@@ -5452,7 +5463,7 @@ init_function_start (subr, filename, line) ...@@ -5452,7 +5463,7 @@ init_function_start (subr, filename, line)
stack_slot_list = 0; stack_slot_list = 0;
/* There is no stack slot for handling nonlocal gotos. */ /* There is no stack slot for handling nonlocal gotos. */
nonlocal_goto_handler_slot = 0; nonlocal_goto_handler_slots = 0;
nonlocal_goto_stack_level = 0; nonlocal_goto_stack_level = 0;
/* No labels have been declared for nonlocal use. */ /* No labels have been declared for nonlocal use. */
...@@ -5972,7 +5983,8 @@ expand_function_end (filename, line, end_bindings) ...@@ -5972,7 +5983,8 @@ expand_function_end (filename, line, end_bindings)
} }
/* Delete handlers for nonlocal gotos if nothing uses them. */ /* Delete handlers for nonlocal gotos if nothing uses them. */
if (nonlocal_goto_handler_slot != 0 && !current_function_has_nonlocal_label) if (nonlocal_goto_handler_slots != 0
&& ! current_function_has_nonlocal_label)
delete_handlers (); delete_handlers ();
/* End any sequences that failed to be closed due to syntax errors. */ /* End any sequences that failed to be closed due to syntax errors. */
......
...@@ -81,7 +81,7 @@ struct function ...@@ -81,7 +81,7 @@ struct function
int has_nonlocal_goto; int has_nonlocal_goto;
int contains_functions; int contains_functions;
int is_thunk; int is_thunk;
rtx nonlocal_goto_handler_slot; rtx nonlocal_goto_handler_slots;
rtx nonlocal_goto_stack_level; rtx nonlocal_goto_stack_level;
tree nonlocal_labels; tree nonlocal_labels;
int args_size; int args_size;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment