Keep track of the FUNCTION_BEG note
function.cc emits a NOTE_FUNCTION_BEG after all arguments have been copied to pseudos. It then records this note in parm_birth_insn. Various other pieces of code use this insn as a convenient place to insert things at the start of the function. However, cfgexpand later changes parm_birth_insn as follows: /* If we emitted any instructions for setting up the variables, emit them before the FUNCTION_START note. */ if (var_seq) { emit_insn_before (var_seq, parm_birth_insn); /* In expand_function_end we'll insert the alloca save/restore before parm_birth_insn. We've just insertted an alloca call. Adjust the pointer to match. */ parm_birth_insn = var_seq; } But the FUNCTION_BEG note is still useful for things that aren't sensitive to stack allocation, and it has the advantage that (unlike the var_seq above) it is never deleted or combined. This patch adds a separate variable to track it. gcc/ * emit-rtl.h (rtl_data::x_function_beg_note): New member variable. (function_beg_insn): New macro. * function.cc (expand_function_start): Initialize function_beg_insn.
This commit is contained in:
parent
81d309168b
commit
0d74ff2d7e
2 changed files with 5 additions and 1 deletions
|
@ -141,6 +141,9 @@ struct GTY(()) rtl_data {
|
|||
If stack grows up, this is the address for the next slot. */
|
||||
poly_int64 x_frame_offset;
|
||||
|
||||
/* The function's FUNCTION_BEG note. */
|
||||
rtx_insn *x_function_beg_insn;
|
||||
|
||||
/* Insn after which register parms and SAVE_EXPRs are born, if nonopt. */
|
||||
rtx_insn *x_parm_birth_insn;
|
||||
|
||||
|
@ -323,6 +326,7 @@ struct GTY(()) rtl_data {
|
|||
#define return_label (crtl->x_return_label)
|
||||
#define naked_return_label (crtl->x_naked_return_label)
|
||||
#define stack_slot_list (crtl->x_stack_slot_list)
|
||||
#define function_beg_insn (crtl->x_function_beg_insn)
|
||||
#define parm_birth_insn (crtl->x_parm_birth_insn)
|
||||
#define frame_offset (crtl->x_frame_offset)
|
||||
#define stack_check_probe_note (crtl->x_stack_check_probe_note)
|
||||
|
|
|
@ -5202,7 +5202,7 @@ expand_function_start (tree subr)
|
|||
|
||||
gcc_assert (NOTE_P (get_last_insn ()));
|
||||
|
||||
parm_birth_insn = get_last_insn ();
|
||||
function_beg_insn = parm_birth_insn = get_last_insn ();
|
||||
|
||||
/* If the function receives a non-local goto, then store the
|
||||
bits we need to restore the frame pointer. */
|
||||
|
|
Loading…
Add table
Reference in a new issue