We have to perform the stackframe-type alignment adjustments before we
set the immediates of the Save instruction are adjusted.
bool sparc_variadic_fixups(ir_graph *irg, calling_convention_t *cconv);
void sparc_create_stacklayout(ir_graph *irg, calling_convention_t *cconv);
bool sparc_variadic_fixups(ir_graph *irg, calling_convention_t *cconv);
void sparc_create_stacklayout(ir_graph *irg, calling_convention_t *cconv);
+void sparc_adjust_stack_entity_offsets(ir_graph *irg);
void sparc_fix_stack_bias(ir_graph *irg);
#endif
void sparc_fix_stack_bias(ir_graph *irg);
#endif
irg_walk_graph(irg, NULL, sparc_collect_frame_entity_nodes, fec_env);
be_assign_entities(fec_env, sparc_set_frame_entity, at_begin);
be_free_frame_entity_coalescer(fec_env);
irg_walk_graph(irg, NULL, sparc_collect_frame_entity_nodes, fec_env);
be_assign_entities(fec_env, sparc_set_frame_entity, at_begin);
be_free_frame_entity_coalescer(fec_env);
+ sparc_adjust_stack_entity_offsets(irg);
sparc_introduce_prolog_epilog(irg);
sparc_introduce_prolog_epilog(irg);
/* Assign entity offsets, to all stack-related entities.
* The offsets are relative to the begin of the stack frame.
*/
/* Assign entity offsets, to all stack-related entities.
* The offsets are relative to the begin of the stack frame.
*/
-static void process_frame_types(ir_graph *irg)
+void sparc_adjust_stack_entity_offsets(ir_graph *irg)
{
be_stack_layout_t *layout = be_get_irg_stack_layout(irg);
{
be_stack_layout_t *layout = be_get_irg_stack_layout(irg);
unsigned misalign = (SPARC_MIN_STACKSIZE+frame_size) % frame_align;
frame_size += misalign;
}
unsigned misalign = (SPARC_MIN_STACKSIZE+frame_size) % frame_align;
frame_size += misalign;
}
+ set_type_size_bytes(frame_type, frame_size);
ir_type *arg_type = layout->arg_type;
ir_type *arg_type = layout->arg_type;
ir_node *start_block = get_irg_start_block(irg);
ir_node *start_block = get_irg_start_block(irg);
- process_frame_types(irg);
-
ir_reserve_resources(irg, IR_RESOURCE_BLOCK_VISITED);
inc_irg_block_visited(irg);
process_bias(start_block, sp_relative, 0, 0);
ir_reserve_resources(irg, IR_RESOURCE_BLOCK_VISITED);
inc_irg_block_visited(irg);
process_bias(start_block, sp_relative, 0, 0);