diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 91868b7dcc0..312b2e069c4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2001-09-03 Richard Henderson + + * 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. + 2001-09-02 Angela Marie Thomas * fixinc/Makefile.in: Regenerate fixincl.x only if maintainer-mode diff --git a/gcc/function.c b/gcc/function.c index 07f9960cd2b..ae19e07a0a7 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; diff --git a/gcc/function.h b/gcc/function.h index ff8aeb975ec..8eeda3a2902 100644 --- a/gcc/function.h +++ b/gcc/function.h @@ -477,6 +477,9 @@ struct function /* Nonzero if the current function needs an lsda for exception handling. */ unsigned int uses_eh_lsda : 1; + + /* Nonzero if code to initialize arg_pointer_save_area has been emited. */ + unsigned int arg_pointer_save_area_init : 1; }; /* The function currently being compiled. */