]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
function.c (expand_function_end): Don't init arg_pointer_save_area.
authorRichard Henderson <rth@gcc.gnu.org>
Mon, 27 Aug 2001 17:36:20 +0000 (10:36 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Mon, 27 Aug 2001 17:36:20 +0000 (10:36 -0700)
        * function.c (expand_function_end): Don't init arg_pointer_save_area.
        (get_arg_pointer_save_area): New.  Create an init it here.
        (fix_lexical_addr): Use it.
        * function.h: Declare it.
        * builtins.c (expand_builtin_setjmp_receiver): Use it.
        * stmt.c (expand_nl_goto_receiver): Use it.

From-SVN: r45200

gcc/ChangeLog
gcc/builtins.c
gcc/function.c
gcc/function.h
gcc/stmt.c

index 6b90b3eb84fd0d622e3e8ccb1e2876bc701f436b..2484f2fd9700d53851a89a91cda1cd836052283f 100644 (file)
@@ -1,3 +1,12 @@
+2001-08-27  Richard Henderson  <rth@redhat.com>
+
+       * function.c (expand_function_end): Don't init arg_pointer_save_area.
+       (get_arg_pointer_save_area): New.  Create an init it here.
+       (fix_lexical_addr): Use it.
+       * function.h: Declare it.
+       * builtins.c (expand_builtin_setjmp_receiver): Use it.
+       * stmt.c (expand_nl_goto_receiver): Use it.
+
 2001-08-27  Richard Henderson  <rth@redhat.com>
 
        * final.c (final_scan_insn): Don't enter APP_ON mode for
@@ -13,7 +22,7 @@
 
 2001-08-25 Dan Nicolaescu  <dann@ics.uci.edu>
   
-        * ssa-ccp.c (ssa_const_prop): Free ssa_edges.
+       * ssa-ccp.c (ssa_const_prop): Free ssa_edges.
 
 2001-08-27  Alan Modra  <amodra@bigpond.net.au>
 
@@ -79,8 +88,8 @@ Sun Aug 26 20:25:44 2001  Denis Chertykov  <denisc@overta.ru>
 
 2001-08-26  Aldy Hernandez  <aldyh@redhat.com>
 
-        * config/mips/mips.c (mips_function_value): Handle complex return
-        values.
+       * config/mips/mips.c (mips_function_value): Handle complex return
+       values.
 
 2001-08-25  Hans-Peter Nilsson  <hp@bitrange.com>
 
index 53f6fa006b61fd0f5703fb08a4dd99054fb65f0a..70ed30e118a5d6d975f234457c1c39960dd6eda0 100644 (file)
@@ -557,14 +557,9 @@ expand_builtin_setjmp_receiver (receiver_label)
 #endif
        {
          /* Now restore our arg pointer from the address at which it
-            was saved in our stack frame.
-            If there hasn't be space allocated for it yet, make
-            some now.  */
-         if (arg_pointer_save_area == 0)
-           arg_pointer_save_area
-             = assign_stack_local (Pmode, GET_MODE_SIZE (Pmode), 0);
+            was saved in our stack frame.  */
          emit_move_insn (virtual_incoming_args_rtx,
-                         copy_to_reg (arg_pointer_save_area));
+                         copy_to_reg (get_arg_pointer_save_area (cfun)));
        }
     }
 #endif
index fa440e362842ed33897b0df8b8d9bdbe7a40b4cc..4c87e5814727ab14f6639a23c6f39e3e0316912d 100644 (file)
@@ -5557,11 +5557,8 @@ fix_lexical_addr (addr, var)
 #ifdef NEED_SEPARATE_AP
       rtx addr;
 
-      if (fp->x_arg_pointer_save_area == 0)
-       fp->x_arg_pointer_save_area
-         = assign_stack_local_1 (Pmode, GET_MODE_SIZE (Pmode), 0, fp);
-
-      addr = fix_lexical_addr (XEXP (fp->x_arg_pointer_save_area, 0), var);
+      addr = get_arg_pointer_save_area (fp);
+      addr = fix_lexical_addr (XEXP (addr, 0), var);
       addr = memory_address (Pmode, addr);
 
       base = gen_rtx_MEM (Pmode, addr);
@@ -6703,20 +6700,6 @@ expand_function_end (filename, line, end_bindings)
     }
 #endif
 
-  /* Save the argument pointer if a save area was made for it.  */
-  if (arg_pointer_save_area)
-    {
-      /* arg_pointer_save_area may not be a valid memory address, so we
-        have to check it and fix it if necessary.  */
-      rtx seq;
-      start_sequence ();
-      emit_move_insn (validize_mem (arg_pointer_save_area),
-                     virtual_incoming_args_rtx);
-      seq = gen_sequence ();
-      end_sequence ();
-      emit_insn_before (seq, tail_recursion_reentry);
-    }
-
   /* Initialize any trampolines required by this function.  */
   for (link = trampoline_list; link; link = TREE_CHAIN (link))
     {
@@ -7013,6 +6996,40 @@ expand_function_end (filename, line, end_bindings)
      then you will lose.  */
   expand_fixups (get_insns ());
 }
+
+rtx
+get_arg_pointer_save_area (f)
+     struct function *f;
+{
+  rtx ret = f->x_arg_pointer_save_area;
+
+  if (! ret)
+    {
+      rtx seq;
+
+      ret = assign_stack_local_1 (Pmode, GET_MODE_SIZE (Pmode), 0, f);
+      f->x_arg_pointer_save_area = ret;
+
+      /* Save the arg pointer at the beginning of the function.  The 
+        generated stack slot may not be a valid memory address, so w
+        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);
+    }
+
+  return ret;
+}
 \f
 /* Extend a vector that records the INSN_UIDs of INSNS (either a
    sequence or a single insn).  */
index b35f85901128dd93dd5f34e702e6b6c5abe56585..24c99ccb97c3f84d543440a2b8c0b72897b7425b 100644 (file)
@@ -609,6 +609,8 @@ extern void clobber_return_register PARAMS ((void));
 extern void use_return_register                PARAMS ((void));
 #endif
 
+extern rtx get_arg_pointer_save_area   PARAMS ((struct function *));
+
 extern void init_virtual_regs          PARAMS ((struct emit_status *));
 
 /* Called once, at initialization, to initialize function.c.  */
index 0a15a4a89929a5cb33fbfe834c37d9fc65907476..123c9d3c2b78cfbc71a2aa6b176c0db2a0b58898 100644 (file)
@@ -3490,16 +3490,9 @@ expand_nl_goto_receiver ()
 #endif
        {
          /* Now restore our arg pointer from the address at which it
-            was saved in our stack frame.
-            If there hasn't be space allocated for it yet, make
-            some now.  */
-         if (arg_pointer_save_area == 0)
-           arg_pointer_save_area
-             = assign_stack_local (Pmode, GET_MODE_SIZE (Pmode), 0);
+            was saved in our stack frame.  */
          emit_move_insn (virtual_incoming_args_rtx,
-                         /* We need a pseudo here, or else
-                            instantiate_virtual_regs_1 complains.  */
-                         copy_to_reg (arg_pointer_save_area));
+                         copy_to_reg (get_arg_pointer_save_area (cfun)));
        }
     }
 #endif