This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: Restoration of arg pointer in expand_builtin_setjmp_receiver


On Thu, Aug 23, 2001 at 04:03:34PM -0400, John David Anglin wrote:
> Any suggestions on the best way to fix this?

Try this.


r~


	* 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.

Index: builtins.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/builtins.c,v
retrieving revision 1.115
diff -c -p -d -r1.115 builtins.c
*** builtins.c	2001/08/22 14:34:42	1.115
--- builtins.c	2001/08/23 22:54:17
*************** expand_builtin_setjmp_receiver (receiver
*** 557,570 ****
  #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);
  	  emit_move_insn (virtual_incoming_args_rtx,
! 			  copy_to_reg (arg_pointer_save_area));
  	}
      }
  #endif
--- 557,565 ----
  #endif
  	{
  	  /* Now restore our arg pointer from the address at which it
! 	     was saved in our stack frame.  */
  	  emit_move_insn (virtual_incoming_args_rtx,
! 			  copy_to_reg (get_arg_pointer_save_area (cfun)));
  	}
      }
  #endif
Index: function.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/function.c,v
retrieving revision 1.301
diff -c -p -d -r1.301 function.c
*** function.c	2001/08/23 15:33:12	1.301
--- function.c	2001/08/23 22:54:17
*************** fix_lexical_addr (addr, var)
*** 5557,5567 ****
  #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 = memory_address (Pmode, addr);
  
        base = gen_rtx_MEM (Pmode, addr);
--- 5557,5564 ----
  #ifdef NEED_SEPARATE_AP
        rtx addr;
  
!       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);
*************** expand_function_end (filename, line, end
*** 6703,6722 ****
      }
  #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))
      {
--- 6700,6705 ----
*************** expand_function_end (filename, line, end
*** 7012,7017 ****
--- 6995,7034 ----
       and they need to create temporary variables,
       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;
  }
  
  /* Extend a vector that records the INSN_UIDs of INSNS (either a
Index: function.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/function.h,v
retrieving revision 1.64
diff -c -p -d -r1.64 function.h
*** function.h	2001/08/22 14:35:11	1.64
--- function.h	2001/08/23 22:54:17
*************** extern void clobber_return_register	PARA
*** 609,614 ****
--- 609,616 ----
  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: stmt.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/stmt.c,v
retrieving revision 1.213
diff -c -p -d -r1.213 stmt.c
*** stmt.c	2001/08/22 14:51:32	1.213
--- stmt.c	2001/08/23 22:54:18
*************** expand_nl_goto_receiver ()
*** 3490,3505 ****
  #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);
  	  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));
  	}
      }
  #endif
--- 3490,3498 ----
  #endif
  	{
  	  /* Now restore our arg pointer from the address at which it
! 	     was saved in our stack frame.  */
  	  emit_move_insn (virtual_incoming_args_rtx,
! 			  copy_to_reg (get_arg_pointer_save_area (cfun)));
  	}
      }
  #endif


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]