From 964be02f4434ee0244a69dcaf345e46ab36100d2 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Mon, 3 Sep 2001 13:50:33 -0700 Subject: function.h (struct function): Add arg_pointer_save_area_init. * function.h (struct function): Add arg_pointer_save_area_init. * function.c (expand_function_end): Init arg_pointer_save_area. (get_arg_pointer_save_area): Do not init arg_pointer_save_area when called from a nested function. From-SVN: r45362 --- gcc/function.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) (limited to 'gcc/function.c') diff --git a/gcc/function.c b/gcc/function.c index 07f9960..ae19e07a 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -6681,6 +6681,11 @@ expand_function_end (filename, line, end_bindings) finish_expr_for_function (); + /* If arg_pointer_save_area was referenced only from a nested + function, we will not have initialized it yet. Do that now. */ + if (arg_pointer_save_area && ! cfun->arg_pointer_save_area_init) + get_arg_pointer_save_area (cfun); + #ifdef NON_SAVING_SETJMP /* Don't put any variables in registers if we call setjmp on a machine that fails to restore the registers. */ @@ -6998,27 +7003,25 @@ get_arg_pointer_save_area (f) if (! ret) { - rtx seq; - ret = assign_stack_local_1 (Pmode, GET_MODE_SIZE (Pmode), 0, f); f->x_arg_pointer_save_area = ret; + } + + if (f == cfun && ! f->arg_pointer_save_area_init) + { + rtx seq; /* Save the arg pointer at the beginning of the function. The - generated stack slot may not be a valid memory address, so w + generated stack slot may not be a valid memory address, so we have to check it and fix it if necessary. */ start_sequence (); emit_move_insn (validize_mem (ret), virtual_incoming_args_rtx); seq = gen_sequence (); end_sequence (); - if (f == cfun) - { - push_topmost_sequence (); - emit_insn_after (seq, get_insns ()); - pop_topmost_sequence (); - } - else - emit_insn_before (seq, f->x_tail_recursion_reentry); + push_topmost_sequence (); + emit_insn_after (seq, get_insns ()); + pop_topmost_sequence (); } return ret; -- cgit v1.1