builtins.c (expand_builtin_setjmp_receiver): Update call of get_arg_pointer_save_area.

* builtins.c (expand_builtin_setjmp_receiver): Update call of
	get_arg_pointer_save_area.
	* expr.c (init_expr): Just clear out rtl.expr.
	* function.c (free_after_compilation): Clear out whole RTL structure.
	(get_func_frame_size): Merge into ...
	(get_frame_size): ... this one.
	(assign_stack_local_1): Merge into ...
	(assign_stack_local): ... this one.
	(expand_function_end): Update call of get_arg_pointer_save_area.
	(get_art_pointer_save_area): Remove cfun argument.
	* function.h (emit_status): regno_pointer_align does not need length
	attribute. Move x_regno_reg_rtx to ...
	(regno_reg_rtx): ... new global array.
	(reg_rtx_no, seq_stack, REGNO_POINTER_ALIGN): Update accestors.
	(pending_stack_adjust, inhibit_defer_pop, saveregs_value,
	apply_args_value, forced_labels, stack_pointer_delta): Update accestors.
	(struct varasm_status): Move here from varasm.c
	(struct rtl_data): New. Move here some fields from struct function.
	(return_label, naked_return_label, stack_slot_list, parm_birth_insn,
	frame_offset, stack_check_probe_note, arg_pointer_save_area,
	used_temp_slots avail_temp_slots, temp_slot_level,
	nonlocal_goto_handler_labels): Update accesstors.
	(rtl): New global variable.
	(struct function): Move some fileds to rtl_data.
	(get_arg_pointer_save_area): Update prototype.
	* emit-rtl.c (rtl): Declare.
	(regno_reg_rtx): Declare.
	(first_insn, last_insn, cur_insn_uid, last_location, first_label_num): Update.
	(gen_reg_rtx): Update.
	(init_virtual_regs): Do not tate emit_status argument.
	(init_emit): Do not allocate emit.
	* varasm.c (varasm_statuc): Move to function.h.
	(n_deferred_constatns): Update accestor.
	(init_varasm_status): Do not allocate varasm_status.
	(force_const_mem, get_pool_size, output_constant_pool): Update.
	* stmt.c (force_label_rtx): Do not use x_ prefixes.
	(expand_nl_goto_receiver): Update get_arg_pointer_save_area.

From-SVN: r133759
This commit is contained in:
Jan Hubicka 2008-03-31 19:08:31 +02:00 committed by Jan Hubicka
parent 2566855a60
commit bd60bab2ad
8 changed files with 214 additions and 205 deletions

View File

@ -1,3 +1,43 @@
2008-03-31 Jan Hubicka <jh@suse.cz>
* builtins.c (expand_builtin_setjmp_receiver): Update call of
get_arg_pointer_save_area.
* expr.c (init_expr): Just clear out rtl.expr.
* function.c (free_after_compilation): Clear out whole RTL structure.
(get_func_frame_size): Merge into ...
(get_frame_size): ... this one.
(assign_stack_local_1): Merge into ...
(assign_stack_local): ... this one.
(expand_function_end): Update call of get_arg_pointer_save_area.
(get_art_pointer_save_area): Remove cfun argument.
* function.h (emit_status): regno_pointer_align does not need length
attribute. Move x_regno_reg_rtx to ...
(regno_reg_rtx): ... new global array.
(reg_rtx_no, seq_stack, REGNO_POINTER_ALIGN): Update accestors.
(pending_stack_adjust, inhibit_defer_pop, saveregs_value,
apply_args_value, forced_labels, stack_pointer_delta): Update accestors.
(struct varasm_status): Move here from varasm.c
(struct rtl_data): New. Move here some fields from struct function.
(return_label, naked_return_label, stack_slot_list, parm_birth_insn,
frame_offset, stack_check_probe_note, arg_pointer_save_area,
used_temp_slots avail_temp_slots, temp_slot_level,
nonlocal_goto_handler_labels): Update accesstors.
(rtl): New global variable.
(struct function): Move some fileds to rtl_data.
(get_arg_pointer_save_area): Update prototype.
* emit-rtl.c (rtl): Declare.
(regno_reg_rtx): Declare.
(first_insn, last_insn, cur_insn_uid, last_location, first_label_num): Update.
(gen_reg_rtx): Update.
(init_virtual_regs): Do not tate emit_status argument.
(init_emit): Do not allocate emit.
* varasm.c (varasm_statuc): Move to function.h.
(n_deferred_constatns): Update accestor.
(init_varasm_status): Do not allocate varasm_status.
(force_const_mem, get_pool_size, output_constant_pool): Update.
* stmt.c (force_label_rtx): Do not use x_ prefixes.
(expand_nl_goto_receiver): Update get_arg_pointer_save_area.
2008-03-31 Zdenek Dvorak <ook@ucw.cz>
PR rtl-optimization/35729

View File

@ -741,7 +741,7 @@ expand_builtin_setjmp_receiver (rtx receiver_label ATTRIBUTE_UNUSED)
/* 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)));
copy_to_reg (get_arg_pointer_save_area ()));
}
}
#endif

View File

@ -66,6 +66,16 @@ enum machine_mode word_mode; /* Mode whose width is BITS_PER_WORD. */
enum machine_mode double_mode; /* Mode whose width is DOUBLE_TYPE_SIZE. */
enum machine_mode ptr_mode; /* Mode whose width is POINTER_SIZE. */
/* Datastructures maintained for currently processed function in RTL form. */
struct rtl_data rtl;
/* Indexed by pseudo register number, gives the rtx for that pseudo.
Allocated in parallel with regno_pointer_align.
FIXME: We could put it into emit_status struct, but gengtype is not able to deal
with length attribute nested in top level structures. */
rtx * regno_reg_rtx;
/* This is *not* reset after each function. It gives each CODE_LABEL
in the entire compilation a unique label number. */
@ -162,11 +172,11 @@ static GTY ((if_marked ("ggc_marked_p"), param_is (struct rtx_def)))
static GTY ((if_marked ("ggc_marked_p"), param_is (struct rtx_def)))
htab_t const_fixed_htab;
#define first_insn (cfun->emit->x_first_insn)
#define last_insn (cfun->emit->x_last_insn)
#define cur_insn_uid (cfun->emit->x_cur_insn_uid)
#define last_location (cfun->emit->x_last_location)
#define first_label_num (cfun->emit->x_first_label_num)
#define first_insn (rtl.emit.x_first_insn)
#define last_insn (rtl.emit.x_last_insn)
#define cur_insn_uid (rtl.emit.x_cur_insn_uid)
#define last_location (rtl.emit.x_last_location)
#define first_label_num (rtl.emit.x_first_label_num)
static rtx make_call_insn_raw (rtx);
static rtx change_address_1 (rtx, enum machine_mode, rtx, int);
@ -853,7 +863,6 @@ byte_lowpart_offset (enum machine_mode outer_mode,
rtx
gen_reg_rtx (enum machine_mode mode)
{
struct function *f = cfun;
rtx val;
gcc_assert (can_create_pseudo_p ());
@ -878,22 +887,22 @@ gen_reg_rtx (enum machine_mode mode)
/* Make sure regno_pointer_align, and regno_reg_rtx are large
enough to have an element for this pseudo reg number. */
if (reg_rtx_no == f->emit->regno_pointer_align_length)
if (reg_rtx_no == rtl.emit.regno_pointer_align_length)
{
int old_size = f->emit->regno_pointer_align_length;
int old_size = rtl.emit.regno_pointer_align_length;
char *new;
rtx *new1;
new = ggc_realloc (f->emit->regno_pointer_align, old_size * 2);
new = xrealloc (rtl.emit.regno_pointer_align, old_size * 2);
memset (new + old_size, 0, old_size);
f->emit->regno_pointer_align = (unsigned char *) new;
rtl.emit.regno_pointer_align = (unsigned char *) new;
new1 = ggc_realloc (f->emit->x_regno_reg_rtx,
new1 = ggc_realloc (regno_reg_rtx,
old_size * 2 * sizeof (rtx));
memset (new1 + old_size, 0, old_size * sizeof (rtx));
regno_reg_rtx = new1;
f->emit->regno_pointer_align_length = old_size * 2;
rtl.emit.regno_pointer_align_length = old_size * 2;
}
val = gen_raw_REG (mode, reg_rtx_no);
@ -4789,14 +4798,13 @@ in_sequence_p (void)
/* Put the various virtual registers into REGNO_REG_RTX. */
static void
init_virtual_regs (struct emit_status *es)
init_virtual_regs (void)
{
rtx *ptr = es->x_regno_reg_rtx;
ptr[VIRTUAL_INCOMING_ARGS_REGNUM] = virtual_incoming_args_rtx;
ptr[VIRTUAL_STACK_VARS_REGNUM] = virtual_stack_vars_rtx;
ptr[VIRTUAL_STACK_DYNAMIC_REGNUM] = virtual_stack_dynamic_rtx;
ptr[VIRTUAL_OUTGOING_ARGS_REGNUM] = virtual_outgoing_args_rtx;
ptr[VIRTUAL_CFA_REGNUM] = virtual_cfa_rtx;
regno_reg_rtx[VIRTUAL_INCOMING_ARGS_REGNUM] = virtual_incoming_args_rtx;
regno_reg_rtx[VIRTUAL_STACK_VARS_REGNUM] = virtual_stack_vars_rtx;
regno_reg_rtx[VIRTUAL_STACK_DYNAMIC_REGNUM] = virtual_stack_dynamic_rtx;
regno_reg_rtx[VIRTUAL_OUTGOING_ARGS_REGNUM] = virtual_outgoing_args_rtx;
regno_reg_rtx[VIRTUAL_CFA_REGNUM] = virtual_cfa_rtx;
}
@ -4970,9 +4978,6 @@ copy_insn (rtx insn)
void
init_emit (void)
{
struct function *f = cfun;
f->emit = ggc_alloc (sizeof (struct emit_status));
first_insn = NULL;
last_insn = NULL;
cur_insn_uid = 1;
@ -4983,14 +4988,14 @@ init_emit (void)
/* Init the tables that describe all the pseudo regs. */
f->emit->regno_pointer_align_length = LAST_VIRTUAL_REGISTER + 101;
rtl.emit.regno_pointer_align_length = LAST_VIRTUAL_REGISTER + 101;
f->emit->regno_pointer_align
= ggc_alloc_cleared (f->emit->regno_pointer_align_length
* sizeof (unsigned char));
rtl.emit.regno_pointer_align
= xmalloc (rtl.emit.regno_pointer_align_length
* sizeof (unsigned char));
regno_reg_rtx
= ggc_alloc (f->emit->regno_pointer_align_length * sizeof (rtx));
= ggc_alloc (rtl.emit.regno_pointer_align_length * sizeof (rtx));
/* Put copies of all the hard registers into regno_reg_rtx. */
memcpy (regno_reg_rtx,
@ -4998,7 +5003,7 @@ init_emit (void)
FIRST_PSEUDO_REGISTER * sizeof (rtx));
/* Put copies of all the virtual register rtx into regno_reg_rtx. */
init_virtual_regs (f->emit);
init_virtual_regs ();
/* Indicate that the virtual registers and stack locations are
all pointers. */

View File

@ -344,7 +344,7 @@ init_expr_target (void)
void
init_expr (void)
{
cfun->expr = ggc_alloc_cleared (sizeof (struct expr_status));
memset (&rtl.expr, 0, sizeof (rtl.expr));
}
/* Copy data from FROM to TO, where the machine modes are not the same.

View File

@ -193,8 +193,6 @@ struct temp_slot GTY(())
/* Forward declarations. */
static rtx assign_stack_local_1 (enum machine_mode, HOST_WIDE_INT, int,
struct function *);
static struct temp_slot *find_temp_slot_from_address (rtx);
static void pad_to_arg_alignment (struct args_size *, int, struct args_size *);
static void pad_below (struct args_size *, enum machine_mode, tree);
@ -315,45 +313,18 @@ free_after_compilation (struct function *f)
VEC_free (int, heap, prologue);
VEC_free (int, heap, epilogue);
VEC_free (int, heap, sibcall_epilogue);
free (rtl.emit.regno_pointer_align);
memset (&rtl, 0, sizeof (rtl));
f->eh = NULL;
f->expr = NULL;
f->emit = NULL;
f->varasm = NULL;
f->machine = NULL;
f->cfg = NULL;
f->x_avail_temp_slots = NULL;
f->x_used_temp_slots = NULL;
f->arg_offset_rtx = NULL;
f->return_rtx = NULL;
f->internal_arg_pointer = NULL;
f->x_nonlocal_goto_handler_labels = NULL;
f->x_return_label = NULL;
f->x_naked_return_label = NULL;
f->x_stack_slot_list = NULL;
f->x_stack_check_probe_note = NULL;
f->x_arg_pointer_save_area = NULL;
f->x_parm_birth_insn = NULL;
f->epilogue_delay_list = NULL;
}
/* Allocate fixed slots in the stack frame of the current function. */
/* Return size needed for stack frame based on slots so far allocated in
function F.
This size counts from zero. It is not rounded to PREFERRED_STACK_BOUNDARY;
the caller may have to do that. */
static HOST_WIDE_INT
get_func_frame_size (struct function *f)
{
if (FRAME_GROWS_DOWNWARD)
return -f->x_frame_offset;
else
return f->x_frame_offset;
}
/* Return size needed for stack frame based on slots so far allocated.
This size counts from zero. It is not rounded to PREFERRED_STACK_BOUNDARY;
the caller may have to do that. */
@ -361,7 +332,10 @@ get_func_frame_size (struct function *f)
HOST_WIDE_INT
get_frame_size (void)
{
return get_func_frame_size (cfun);
if (FRAME_GROWS_DOWNWARD)
return -frame_offset;
else
return frame_offset;
}
/* Issue an error message and return TRUE if frame OFFSET overflows in
@ -393,13 +367,10 @@ frame_offset_overflow (HOST_WIDE_INT offset, tree func)
-2 means use BITS_PER_UNIT,
positive specifies alignment boundary in bits.
We do not round to stack_boundary here.
We do not round to stack_boundary here. */
FUNCTION specifies the function to allocate in. */
static rtx
assign_stack_local_1 (enum machine_mode mode, HOST_WIDE_INT size, int align,
struct function *function)
rtx
assign_stack_local (enum machine_mode mode, HOST_WIDE_INT size, int align)
{
rtx x, addr;
int bigend_correction = 0;
@ -434,14 +405,14 @@ assign_stack_local_1 (enum machine_mode mode, HOST_WIDE_INT size, int align,
alignment = align / BITS_PER_UNIT;
if (FRAME_GROWS_DOWNWARD)
function->x_frame_offset -= size;
frame_offset -= size;
/* Ignore alignment we can't do with expected alignment of the boundary. */
if (alignment * BITS_PER_UNIT > PREFERRED_STACK_BOUNDARY)
alignment = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
if (function->stack_alignment_needed < alignment * BITS_PER_UNIT)
function->stack_alignment_needed = alignment * BITS_PER_UNIT;
if (cfun->stack_alignment_needed < alignment * BITS_PER_UNIT)
cfun->stack_alignment_needed = alignment * BITS_PER_UNIT;
/* Calculate how many bytes the start of local variables is off from
stack alignment. */
@ -461,13 +432,13 @@ assign_stack_local_1 (enum machine_mode mode, HOST_WIDE_INT size, int align,
like. So we instead assume that ALIGNMENT is a power of two and
use logical operations which are unambiguous. */
if (FRAME_GROWS_DOWNWARD)
function->x_frame_offset
= (FLOOR_ROUND (function->x_frame_offset - frame_phase,
frame_offset
= (FLOOR_ROUND (frame_offset - frame_phase,
(unsigned HOST_WIDE_INT) alignment)
+ frame_phase);
else
function->x_frame_offset
= (CEIL_ROUND (function->x_frame_offset - frame_phase,
frame_offset
= (CEIL_ROUND (frame_offset - frame_phase,
(unsigned HOST_WIDE_INT) alignment)
+ frame_phase);
}
@ -479,7 +450,7 @@ assign_stack_local_1 (enum machine_mode mode, HOST_WIDE_INT size, int align,
/* If we have already instantiated virtual registers, return the actual
address relative to the frame pointer. */
if (function == cfun && virtuals_instantiated)
if (virtuals_instantiated)
addr = plus_constant (frame_pointer_rtx,
trunc_int_for_mode
(frame_offset + bigend_correction
@ -487,33 +458,23 @@ assign_stack_local_1 (enum machine_mode mode, HOST_WIDE_INT size, int align,
else
addr = plus_constant (virtual_stack_vars_rtx,
trunc_int_for_mode
(function->x_frame_offset + bigend_correction,
(frame_offset + bigend_correction,
Pmode));
if (!FRAME_GROWS_DOWNWARD)
function->x_frame_offset += size;
frame_offset += size;
x = gen_rtx_MEM (mode, addr);
MEM_NOTRAP_P (x) = 1;
function->x_stack_slot_list
= gen_rtx_EXPR_LIST (VOIDmode, x, function->x_stack_slot_list);
stack_slot_list
= gen_rtx_EXPR_LIST (VOIDmode, x, stack_slot_list);
if (frame_offset_overflow (function->x_frame_offset, function->decl))
function->x_frame_offset = 0;
if (frame_offset_overflow (frame_offset, current_function_decl))
frame_offset = 0;
return x;
}
/* Wrapper around assign_stack_local_1; assign a local stack slot for the
current function. */
rtx
assign_stack_local (enum machine_mode mode, HOST_WIDE_INT size, int align)
{
return assign_stack_local_1 (mode, size, align, cfun);
}
/* Removes temporary slot TEMP from LIST. */
@ -3975,7 +3936,7 @@ static void
prepare_function_start (void)
{
init_emit ();
init_varasm_status (cfun);
init_varasm_status ();
init_expr ();
cse_not_expected = ! optimize;
@ -4440,7 +4401,7 @@ expand_function_end (void)
/* 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);
get_arg_pointer_save_area ();
/* If we are doing stack checking and this function makes calls,
do a stack probe at the start of the function to ensure we have enough
@ -4673,17 +4634,17 @@ expand_function_end (void)
}
rtx
get_arg_pointer_save_area (struct function *f)
get_arg_pointer_save_area (void)
{
rtx ret = f->x_arg_pointer_save_area;
rtx ret = arg_pointer_save_area;
if (! ret)
{
ret = assign_stack_local_1 (Pmode, GET_MODE_SIZE (Pmode), 0, f);
f->x_arg_pointer_save_area = ret;
ret = assign_stack_local (Pmode, GET_MODE_SIZE (Pmode), 0);
arg_pointer_save_area = ret;
}
if (f == cfun && ! f->arg_pointer_save_area_init)
if (! cfun->arg_pointer_save_area_init)
{
rtx seq;

View File

@ -78,20 +78,22 @@ struct emit_status GTY(())
/* Indexed by pseudo register number, if nonzero gives the known alignment
for that pseudo (if REG_POINTER is set in x_regno_reg_rtx).
Allocated in parallel with x_regno_reg_rtx. */
unsigned char * GTY ((length ("%h.x_reg_rtx_no")))
regno_pointer_align;
/* Indexed by pseudo register number, gives the rtx for that pseudo.
Allocated in parallel with regno_pointer_align. */
rtx * GTY ((length ("%h.x_reg_rtx_no"))) x_regno_reg_rtx;
unsigned char * GTY((skip)) regno_pointer_align;
};
/* For backward compatibility... eventually these should all go away. */
#define reg_rtx_no (cfun->emit->x_reg_rtx_no)
#define regno_reg_rtx (cfun->emit->x_regno_reg_rtx)
#define seq_stack (cfun->emit->sequence_stack)
#define REGNO_POINTER_ALIGN(REGNO) (cfun->emit->regno_pointer_align[REGNO])
/* Indexed by pseudo register number, gives the rtx for that pseudo.
Allocated in parallel with regno_pointer_align.
FIXME: We could put it into emit_status struct, but gengtype is not able to deal
with length attribute nested in top level structures. */
extern GTY ((length ("rtl.emit.x_reg_rtx_no"))) rtx * regno_reg_rtx;
/* For backward compatibility... eventually these should all go away. */
#define reg_rtx_no (rtl.emit.x_reg_rtx_no)
#define seq_stack (rtl.emit.sequence_stack)
#define REGNO_POINTER_ALIGN(REGNO) (rtl.emit.regno_pointer_align[REGNO])
struct expr_status GTY(())
{
@ -134,12 +136,12 @@ struct expr_status GTY(())
rtx x_forced_labels;
};
#define pending_stack_adjust (cfun->expr->x_pending_stack_adjust)
#define inhibit_defer_pop (cfun->expr->x_inhibit_defer_pop)
#define saveregs_value (cfun->expr->x_saveregs_value)
#define apply_args_value (cfun->expr->x_apply_args_value)
#define forced_labels (cfun->expr->x_forced_labels)
#define stack_pointer_delta (cfun->expr->x_stack_pointer_delta)
#define pending_stack_adjust (rtl.expr.x_pending_stack_adjust)
#define inhibit_defer_pop (rtl.expr.x_inhibit_defer_pop)
#define saveregs_value (rtl.expr.x_saveregs_value)
#define apply_args_value (rtl.expr.x_apply_args_value)
#define forced_labels (rtl.expr.x_forced_labels)
#define stack_pointer_delta (rtl.expr.x_stack_pointer_delta)
struct gimple_df;
struct temp_slot;
@ -159,15 +161,91 @@ enum function_frequency {
FUNCTION_FREQUENCY_HOT
};
struct varasm_status GTY(())
{
/* If we're using a per-function constant pool, this is it. */
struct rtx_constant_pool *pool;
/* Number of tree-constants deferred during the expansion of this
function. */
unsigned int deferred_constants;
};
/* Datastructures maintained for currently processed function in RTL form. */
struct rtl_data GTY(())
{
struct expr_status expr;
struct emit_status emit;
struct varasm_status varasm;
/* List (chain of EXPR_LIST) of labels heading the current handlers for
nonlocal gotos. */
rtx x_nonlocal_goto_handler_labels;
/* Label that will go on function epilogue.
Jumping to this label serves as a "return" instruction
on machines which require execution of the epilogue on all returns. */
rtx x_return_label;
/* Label that will go on the end of function epilogue.
Jumping to this label serves as a "naked return" instruction
on machines which require execution of the epilogue on all returns. */
rtx x_naked_return_label;
/* List (chain of EXPR_LISTs) of all stack slots in this function.
Made for the sake of unshare_all_rtl. */
rtx x_stack_slot_list;
/* Place after which to insert the tail_recursion_label if we need one. */
rtx x_stack_check_probe_note;
/* Location at which to save the argument pointer if it will need to be
referenced. There are two cases where this is done: if nonlocal gotos
exist, or if vars stored at an offset from the argument pointer will be
needed by inner routines. */
rtx x_arg_pointer_save_area;
/* Offset to end of allocated area of stack frame.
If stack grows down, this is the address of the last stack slot allocated.
If stack grows up, this is the address for the next slot. */
HOST_WIDE_INT x_frame_offset;
/* Insn after which register parms and SAVE_EXPRs are born, if nonopt. */
rtx x_parm_birth_insn;
/* List of all used temporaries allocated, by level. */
VEC(temp_slot_p,gc) *x_used_temp_slots;
/* List of available temp slots. */
struct temp_slot *x_avail_temp_slots;
/* Current nesting level for temporaries. */
int x_temp_slot_level;
/* Highest label number in current function. */
int inl_max_label_num;
};
#define return_label (rtl.x_return_label)
#define naked_return_label (rtl.x_naked_return_label)
#define stack_slot_list (rtl.x_stack_slot_list)
#define parm_birth_insn (rtl.x_parm_birth_insn)
#define frame_offset (rtl.x_frame_offset)
#define stack_check_probe_note (rtl.x_stack_check_probe_note)
#define arg_pointer_save_area (rtl.x_arg_pointer_save_area)
#define used_temp_slots (rtl.x_used_temp_slots)
#define avail_temp_slots (rtl.x_avail_temp_slots)
#define temp_slot_level (rtl.x_temp_slot_level)
#define nonlocal_goto_handler_labels (rtl.x_nonlocal_goto_handler_labels)
extern GTY(()) struct rtl_data rtl;
/* This structure can save all the important global and static variables
describing the status of the current function. */
struct function GTY(())
{
struct eh_status *eh;
struct expr_status *expr;
struct emit_status *emit;
struct varasm_status *varasm;
/* The control flow graph for this function. */
struct control_flow_graph *cfg;
@ -228,38 +306,6 @@ struct function GTY(())
has_hard_reg_initial_val (see integrate.[hc]). */
struct initial_value_struct *hard_reg_initial_vals;
/* List (chain of EXPR_LIST) of labels heading the current handlers for
nonlocal gotos. */
rtx x_nonlocal_goto_handler_labels;
/* Label that will go on function epilogue.
Jumping to this label serves as a "return" instruction
on machines which require execution of the epilogue on all returns. */
rtx x_return_label;
/* Label that will go on the end of function epilogue.
Jumping to this label serves as a "naked return" instruction
on machines which require execution of the epilogue on all returns. */
rtx x_naked_return_label;
/* List (chain of EXPR_LISTs) of all stack slots in this function.
Made for the sake of unshare_all_rtl. */
rtx x_stack_slot_list;
/* Place after which to insert the tail_recursion_label if we need one. */
rtx x_stack_check_probe_note;
/* Location at which to save the argument pointer if it will need to be
referenced. There are two cases where this is done: if nonlocal gotos
exist, or if vars stored at an offset from the argument pointer will be
needed by inner routines. */
rtx x_arg_pointer_save_area;
/* Offset to end of allocated area of stack frame.
If stack grows down, this is the address of the last stack slot allocated.
If stack grows up, this is the address for the next slot. */
HOST_WIDE_INT x_frame_offset;
/* A PARM_DECL that should contain the static chain for this function.
It will be initialized at the beginning of the function. */
tree static_chain_decl;
@ -269,21 +315,6 @@ struct function GTY(())
pointer. */
tree nonlocal_goto_save_area;
/* Insn after which register parms and SAVE_EXPRs are born, if nonopt. */
rtx x_parm_birth_insn;
/* List of all used temporaries allocated, by level. */
VEC(temp_slot_p,gc) *x_used_temp_slots;
/* List of available temp slots. */
struct temp_slot *x_avail_temp_slots;
/* Current nesting level for temporaries. */
int x_temp_slot_level;
/* Highest label number in current function. */
int inl_max_label_num;
/* Function sequence number for profiling, debugging, etc. */
int funcdef_no;
@ -521,18 +552,6 @@ extern void instantiate_decl_rtl (rtx x);
#define current_function_has_nonlocal_goto (cfun->has_nonlocal_goto)
#define current_function_has_asm_statement (cfun->has_asm_statement)
#define return_label (cfun->x_return_label)
#define naked_return_label (cfun->x_naked_return_label)
#define stack_slot_list (cfun->x_stack_slot_list)
#define parm_birth_insn (cfun->x_parm_birth_insn)
#define frame_offset (cfun->x_frame_offset)
#define stack_check_probe_note (cfun->x_stack_check_probe_note)
#define arg_pointer_save_area (cfun->x_arg_pointer_save_area)
#define used_temp_slots (cfun->x_used_temp_slots)
#define avail_temp_slots (cfun->x_avail_temp_slots)
#define temp_slot_level (cfun->x_temp_slot_level)
#define nonlocal_goto_handler_labels (cfun->x_nonlocal_goto_handler_labels)
#define rtl_df (cfun->df)
#define current_loops (cfun->x_current_loops)
#define dom_computed (cfun->cfg->x_dom_computed)
#define n_bbs_in_dom_tree (cfun->cfg->x_n_bbs_in_dom_tree)
@ -570,14 +589,14 @@ extern struct machine_function * (*init_machine_status) (void);
extern void free_after_parsing (struct function *);
extern void free_after_compilation (struct function *);
extern void init_varasm_status (struct function *);
extern void init_varasm_status (void);
#ifdef RTX_CODE
extern void diddle_return_value (void (*)(rtx, void*), void*);
extern void clobber_return_register (void);
#endif
extern rtx get_arg_pointer_save_area (struct function *);
extern rtx get_arg_pointer_save_area (void);
/* Returns the name of the current function. */
extern const char *current_function_name (void);

View File

@ -160,8 +160,7 @@ force_label_rtx (tree label)
else
p = cfun;
p->expr->x_forced_labels = gen_rtx_EXPR_LIST (VOIDmode, ref,
p->expr->x_forced_labels);
forced_labels = gen_rtx_EXPR_LIST (VOIDmode, ref, forced_labels);
return ref;
}
@ -1821,7 +1820,7 @@ expand_nl_goto_receiver (void)
/* 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)));
copy_to_reg (get_arg_pointer_save_area ()));
}
}
#endif

View File

@ -70,17 +70,7 @@ struct addr_const;
struct constant_descriptor_rtx;
struct rtx_constant_pool;
struct varasm_status GTY(())
{
/* If we're using a per-function constant pool, this is it. */
struct rtx_constant_pool *pool;
/* Number of tree-constants deferred during the expansion of this
function. */
unsigned int deferred_constants;
};
#define n_deferred_constants (cfun->varasm->deferred_constants)
#define n_deferred_constants (rtl.varasm.deferred_constants)
/* Number for making the label on the next
constant that is stored in memory. */
@ -3464,15 +3454,10 @@ create_constant_pool (void)
/* Initialize constant pool hashing for a new function. */
void
init_varasm_status (struct function *f)
init_varasm_status (void)
{
struct varasm_status *p;
p = ggc_alloc (sizeof (struct varasm_status));
f->varasm = p;
p->pool = create_constant_pool ();
p->deferred_constants = 0;
rtl.varasm.pool = create_constant_pool ();
rtl.varasm.deferred_constants = 0;
}
/* Given a MINUS expression, simplify it if both sides
@ -3509,7 +3494,7 @@ force_const_mem (enum machine_mode mode, rtx x)
/* Decide which pool to use. */
pool = (targetm.use_blocks_for_constant_p (mode, x)
? shared_constant_pool
: cfun->varasm->pool);
: rtl.varasm.pool);
/* Lookup the value in the hashtable. */
tmp.constant = x;
@ -3621,7 +3606,7 @@ get_pool_mode (const_rtx addr)
int
get_pool_size (void)
{
return cfun->varasm->pool->offset;
return rtl.varasm.pool->offset;
}
/* Worker function for output_constant_pool_1. Emit assembly for X
@ -3863,7 +3848,7 @@ static void
output_constant_pool (const char *fnname ATTRIBUTE_UNUSED,
tree fndecl ATTRIBUTE_UNUSED)
{
struct rtx_constant_pool *pool = cfun->varasm->pool;
struct rtx_constant_pool *pool = rtl.varasm.pool;
/* It is possible for gcc to call force_const_mem and then to later
discard the instructions which refer to the constant. In such a