+2001-09-03 Richard Henderson <rth@redhat.com>
+
+ * 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 <angela@cygnus.com>
* fixinc/Makefile.in: Regenerate fixincl.x only if maintainer-mode
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. */
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;
/* 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. */