summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gcc/function.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/gcc/function.c b/gcc/function.c
index 11070e0acc7..fd69b1823e1 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -3697,8 +3697,10 @@ expand_function_start (subr, parms_have_cleanups)
/* If function gets a static chain arg, store it in the stack frame.
Do this first, so it gets the first stack slot offset. */
if (current_function_needs_context)
- emit_move_insn (assign_stack_local (Pmode, GET_MODE_SIZE (Pmode), 0),
- static_chain_incoming_rtx);
+ {
+ last_ptr = assign_stack_local (Pmode, GET_MODE_SIZE (Pmode), 0);
+ emit_move_insn (last_ptr, static_chain_incoming_rtx);
+ }
/* If the parameters of this function need cleaning up, get a label
for the beginning of the code which executes those cleanups. This must
@@ -3814,7 +3816,10 @@ expand_function_start (subr, parms_have_cleanups)
/* Fetch static chain values for containing functions. */
tem = decl_function_context (current_function_decl);
- if (tem)
+ /* If not doing stupid register allocation, then start off with the static
+ chain pointer in a pseudo register. Otherwise, we use the stack
+ address that was generated above. */
+ if (tem && ! obey_regdecls)
last_ptr = copy_to_reg (static_chain_incoming_rtx);
context_display = 0;
while (tem)
OpenPOWER on IntegriCloud