This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Re: Restoration of arg pointer in expand_builtin_setjmp_receiver
- To: John David Anglin <dave at hiauly1 dot hia dot nrc dot ca>
- Subject: Re: Restoration of arg pointer in expand_builtin_setjmp_receiver
- From: Richard Henderson <rth at redhat dot com>
- Date: Thu, 23 Aug 2001 15:59:21 -0700
- Cc: gcc-bugs at gcc dot gnu dot org
- References: <200108232003.f7NK3YAS021196@hiauly1.hia.nrc.ca>
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