Commit 0e668396 by Nick Clifton Committed by Nick Clifton

Fix bug restoring stack from interrupt handler.

From-SVN: r31287
parent 69d4f56d
Sat Jan 8 12:12:46 2000 Nick Clifton <nickc@cygnus.com>
* config/v850/v850.c (expand_epilogue): Interrupt functions no
longer allocate extra stack for function calls.
2000-01-08 Michael Hayes <m.hayes@elec.canterbury.ac.nz> 2000-01-08 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
* config/c4x/c4x.md (*subqf3_set): Fix typo. * config/c4x/c4x.md (*subqf3_set): Fix typo.
......
...@@ -1495,7 +1495,7 @@ expand_prologue () ...@@ -1495,7 +1495,7 @@ expand_prologue ()
actual_fsize = compute_frame_size (size, &reg_saved); actual_fsize = compute_frame_size (size, &reg_saved);
/* Save/setup global registers for interrupt functions right now */ /* Save/setup global registers for interrupt functions right now. */
if (interrupt_handler) if (interrupt_handler)
{ {
emit_insn (gen_save_interrupt ()); emit_insn (gen_save_interrupt ());
...@@ -1527,7 +1527,7 @@ expand_prologue () ...@@ -1527,7 +1527,7 @@ expand_prologue ()
} }
} }
/* Identify all of the saved registers */ /* Identify all of the saved registers. */
num_save = 0; num_save = 0;
default_stack = 0; default_stack = 0;
for (i = 1; i < 31; i++) for (i = 1; i < 31; i++)
...@@ -1716,7 +1716,7 @@ expand_epilogue () ...@@ -1716,7 +1716,7 @@ expand_epilogue ()
if (frame_pointer_needed) if (frame_pointer_needed)
emit_move_insn (stack_pointer_rtx, hard_frame_pointer_rtx); emit_move_insn (stack_pointer_rtx, hard_frame_pointer_rtx);
/* Identify all of the saved registers */ /* Identify all of the saved registers. */
num_restore = 0; num_restore = 0;
default_stack = 0; default_stack = 0;
for (i = 1; i < 31; i++) for (i = 1; i < 31; i++)
...@@ -1736,7 +1736,9 @@ expand_epilogue () ...@@ -1736,7 +1736,9 @@ expand_epilogue ()
/* See if we have an insn that restores the particular registers we /* See if we have an insn that restores the particular registers we
want to. */ want to. */
restore_all = NULL_RTX; restore_all = NULL_RTX;
if (TARGET_PROLOG_FUNCTION && num_restore > 0
if (TARGET_PROLOG_FUNCTION
&& num_restore > 0
&& actual_fsize >= default_stack && actual_fsize >= default_stack
&& !interrupt_handler) && !interrupt_handler)
{ {
...@@ -1748,7 +1750,7 @@ expand_epilogue () ...@@ -1748,7 +1750,7 @@ expand_epilogue ()
if (unalloc_stack) if (unalloc_stack)
restore_func_len += CONST_OK_FOR_J (unalloc_stack) ? 2 : 4; restore_func_len += CONST_OK_FOR_J (unalloc_stack) ? 2 : 4;
/* see if we would have used ep to restore the registers */ /* See if we would have used ep to restore the registers. */
if (TARGET_EP && num_restore > 3 && (unsigned)actual_fsize < 255) if (TARGET_EP && num_restore > 3 && (unsigned)actual_fsize < 255)
restore_normal_len = (3 * 2) + (2 * num_restore); restore_normal_len = (3 * 2) + (2 * num_restore);
else else
...@@ -1781,6 +1783,7 @@ expand_epilogue () ...@@ -1781,6 +1783,7 @@ expand_epilogue ()
} }
code = recog (restore_all, NULL_RTX, NULL_PTR); code = recog (restore_all, NULL_RTX, NULL_PTR);
if (code >= 0) if (code >= 0)
{ {
rtx insn; rtx insn;
...@@ -1827,10 +1830,8 @@ Saved %d bytes via epilogue function (%d vs. %d) in function %s\n", ...@@ -1827,10 +1830,8 @@ Saved %d bytes via epilogue function (%d vs. %d) in function %s\n",
else else
init_stack_free = actual_fsize; init_stack_free = actual_fsize;
/* Deallocate the rest of the stack if it is > 32K or if extra stack /* Deallocate the rest of the stack if it is > 32K. */
was allocated for an interrupt handler that makes a call. */ if (actual_fsize > init_stack_free)
if (actual_fsize > init_stack_free
|| (interrupt_handler && actual_fsize))
{ {
int diff; int diff;
...@@ -1858,7 +1859,7 @@ Saved %d bytes via epilogue function (%d vs. %d) in function %s\n", ...@@ -1858,7 +1859,7 @@ Saved %d bytes via epilogue function (%d vs. %d) in function %s\n",
} }
else else
{ {
/* Restore registers from the beginning of the stack frame */ /* Restore registers from the beginning of the stack frame. */
offset = init_stack_free - 4; offset = init_stack_free - 4;
/* Restore the return pointer first. */ /* Restore the return pointer first. */
...@@ -1879,6 +1880,7 @@ Saved %d bytes via epilogue function (%d vs. %d) in function %s\n", ...@@ -1879,6 +1880,7 @@ Saved %d bytes via epilogue function (%d vs. %d) in function %s\n",
plus_constant (stack_pointer_rtx, plus_constant (stack_pointer_rtx,
offset))); offset)));
emit_insn (gen_rtx_USE (VOIDmode, restore_regs[i]));
offset -= 4; offset -= 4;
} }
......
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