void dmemory_lower_Alloc(ir_node *node) { assert(is_Alloc(node)); if (get_Alloc_where(node) != heap_alloc) return; ir_graph *irg = get_irn_irg(node); ir_type *type = get_Alloc_type(node); ir_node *count = get_Alloc_count(node); ir_node *res = NULL; ir_node *cur_mem = get_Alloc_mem(node); ir_node *block = get_nodes_block(node); if (is_Class_type(type)) { res = (*dmemory_model.alloc_object)(type, irg, block, &cur_mem); ddispatch_prepare_new_instance(type, res, irg, block, &cur_mem); } else if (is_Array_type(type)) { ir_type *eltype = get_array_element_type(type); res = (*dmemory_model.alloc_array)(eltype, count, irg, block, &cur_mem); } else { assert (0); } turn_into_tuple(node, pn_Alloc_max); set_irn_n(node, pn_Alloc_M, cur_mem); set_irn_n(node, pn_Alloc_res, res); }
void dmemory_lower_Arraylength(ir_node *arraylength) { ir_node *array_ref = get_Arraylength_arrayref(arraylength); ir_node *block = get_nodes_block(arraylength); ir_graph *irg = get_irn_irg(block); ir_node *cur_mem = get_Arraylength_mem(arraylength); ir_node *len = (*dmemory_model.get_arraylength)(array_ref, irg, block, &cur_mem); turn_into_tuple(arraylength, pn_Arraylength_max); set_irn_n(arraylength, pn_Arraylength_M, cur_mem); set_irn_n(arraylength, pn_Arraylength_res, len); }
void be_default_lower_va_arg(ir_node *const node, bool const compound_is_ptr, unsigned const stack_param_align) { ir_node *block = get_nodes_block(node); dbg_info *dbgi = get_irn_dbg_info(node); ir_graph *irg = get_irn_irg(node); ir_type *aptype = get_method_res_type(get_Builtin_type(node), 0); ir_node *const ap = get_irn_n(node, 1); ir_node *const node_mem = get_Builtin_mem(node); ir_mode *apmode = get_type_mode(aptype); ir_node *res; ir_node *new_mem; if (apmode) { goto load; } else if (compound_is_ptr) { apmode = mode_P; aptype = get_type_for_mode(apmode); load:; ir_node *const load = new_rd_Load(dbgi, block, node_mem, ap, apmode, aptype, cons_none); res = new_r_Proj(load, apmode, pn_Load_res); new_mem = new_r_Proj(load, mode_M,pn_Load_M); } else { /* aptype has no associated mode, so it is represented as a pointer. */ res = ap; new_mem = node_mem; } unsigned const round_up = round_up2(get_type_size(aptype), stack_param_align); ir_mode *const offset_mode = get_reference_offset_mode(mode_P); ir_node *const offset = new_r_Const_long(irg, offset_mode, round_up); ir_node *const new_ap = new_rd_Add(dbgi, block, ap, offset); ir_node *const in[] = { new_mem, res, new_ap }; turn_into_tuple(node, ARRAY_SIZE(in), in); }