OSDN Git Service

* function.h (struct function): Add arg_pointer_save_area_init.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 3 Sep 2001 20:50:33 +0000 (20:50 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 3 Sep 2001 20:50:33 +0000 (20:50 +0000)
        * 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45362 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/function.c
gcc/function.h

index 91868b7..312b2e0 100644 (file)
@@ -1,3 +1,10 @@
+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
index 07f9960..ae19e07 100644 (file)
@@ -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;
index ff8aeb9..8eeda3a 100644 (file)
@@ -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.  */