- assert(first_bl);
- /* we had already removed critical edges, so the following
- assertion should be always true. */
- assert(get_Block_n_cfgpreds(first_bl) == 1);
-
- /* now create backing stores */
- frame = get_irg_frame(irg);
- imem = get_irg_initial_mem(irg);
-
- save_optimization_state(&state);
- set_optimize(0);
- nmem = new_r_Proj(irg, first_bl, get_irg_start(irg), mode_M, pn_Start_M);
- restore_optimization_state(&state);
-
- /* reroute all edges to the new memory source */
- edges_reroute(imem, nmem, irg);
-
- store = NULL;
- mem = imem;
- args = get_irg_args(irg);
- args_bl = get_nodes_block(args);
- for (ent = new_list; ent; ent = get_entity_link(ent)) {
- int i = get_struct_member_index(get_entity_owner(ent), ent);
- ir_type *tp = get_entity_type(ent);
- ir_mode *mode = get_type_mode(tp);
- ir_node *addr;
-
- /* address for the backing store */
- addr = be_new_FrameAddr(env->isa->sp->reg_class, irg, first_bl, frame, ent);
-
- if (store)
- mem = new_r_Proj(irg, first_bl, store, mode_M, pn_Store_M);
-
- /* the backing store itself */
- store = new_r_Store(irg, first_bl, mem, addr,
- new_r_Proj(irg, args_bl, args, mode, i));
- }
- /* the new memory Proj gets the last Proj from store */
- set_Proj_pred(nmem, store);
- set_Proj_proj(nmem, pn_Store_M);
-
- /* move all entities to the frame type */
- frame_tp = get_irg_frame_type(irg);
- offset = get_type_size_bytes(frame_tp);
- for (ent = new_list; ent; ent = get_entity_link(ent)) {
- ir_type *tp = get_entity_type(ent);
- unsigned align = get_type_alignment_bytes(tp);
-
- offset += align - 1;
- offset &= ~(align - 1);
- set_entity_owner(ent, frame_tp);
- add_class_member(frame_tp, ent);
- /* must be automatic to set a fixed layout */
- set_entity_allocation(ent, allocation_automatic);
- set_entity_offset(ent, offset);
- offset += get_type_size_bytes(tp);
- }
- set_type_size_bytes(frame_tp, offset);