X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeabi.c;h=ba8347320461419121d5357a4fef73ddda88927e;hb=22b354ac921664032c93e5f0176fa668c95dfc60;hp=b4a390f4f0c0992c2cf663fbb3832de39089960b;hpb=95617329d1409c4662ab0a1dcca5a923a9abd897;p=libfirm diff --git a/ir/be/beabi.c b/ir/be/beabi.c index b4a390f4f..ba8347320 100644 --- a/ir/be/beabi.c +++ b/ir/be/beabi.c @@ -771,8 +771,10 @@ static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp) int n = 0; int curr_res_proj = pn_be_Call_first_res + n_reg_results; pset_new_iterator_t iter; + int n_ins; - in = ALLOCAN(ir_node *, pset_new_size(&destroyed_regs) + n_reg_results); + n_ins = (int)pset_new_size(&destroyed_regs) + n_reg_results + 1; + in = ALLOCAN(ir_node *, n_ins); /* also keep the stack pointer */ set_irn_link(curr_sp, (void*) sp); @@ -796,6 +798,7 @@ static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp) set_irn_link(proj, (void*) reg); in[n++] = proj; } + assert(n <= n_ins); /* create the Keep for the caller save registers */ keep = be_new_Keep(bl, n, in); @@ -1230,8 +1233,6 @@ static ir_type *compute_arg_type(be_abi_irg_t *env, be_abi_call_t *call, arg->stack_ent = copy_entity_own(val_ent, res); set_entity_link(val_ent, arg->stack_ent); set_entity_link(arg->stack_ent, NULL); - /* must be automatic to set a fixed layout */ - set_entity_allocation(arg->stack_ent, allocation_automatic); } else { /* create a new entity */ snprintf(buf, sizeof(buf), "param_%d", i); @@ -1504,7 +1505,6 @@ static ir_entity *get_argument_entity(ir_entity *ent, lower_frame_sels_env_t *ct argument_ent = copy_entity_own(ent, frame_tp); /* must be automatic to set a fixed layout */ - set_entity_allocation(argument_ent, allocation_automatic); set_entity_offset(argument_ent, offset); offset += get_type_size_bytes(tp); @@ -1664,7 +1664,6 @@ static void fix_address_of_parameter_access(be_abi_irg_t *env, ent_pos_pair *val 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); } @@ -1756,7 +1755,9 @@ static void fix_outer_variable_access(be_abi_irg_t *env, if (! is_method_entity(ent)) continue; - if (get_entity_peculiarity(ent) == peculiarity_description) + + irg = get_entity_irg(ent); + if (irg == NULL) continue; /* @@ -1765,7 +1766,6 @@ static void fix_outer_variable_access(be_abi_irg_t *env, */ ctx->static_link_pos = 0; - irg = get_entity_irg(ent); irg_walk_graph(irg, NULL, update_outer_frame_sels, ctx); } } @@ -1832,6 +1832,11 @@ static void modify_irg(be_abi_irg_t *env) ctx.link_class = env->arch_env->link_class; ctx.frame_tp = get_irg_frame_type(irg); + /* layout the stackframe now */ + if (get_type_state(ctx.frame_tp) == layout_undefined) { + default_layout_compound_type(ctx.frame_tp); + } + /* we will possible add new entities to the frame: set the layout to undefined */ assert(get_type_state(ctx.frame_tp) == layout_fixed); set_type_state(ctx.frame_tp, layout_undefined); @@ -1975,6 +1980,9 @@ static void modify_irg(be_abi_irg_t *env) /* rewire old mem users to new mem */ exchange(old_mem, mem); + /* keep the mem (for functions with an endless loop = no return) */ + keep_alive(mem); + set_irg_initial_mem(irg, mem); /* Now, introduce stack param nodes for all parameters passed on the stack */ @@ -2103,8 +2111,7 @@ static ir_entity *create_trampoline(be_main_env_t *be, ir_entity *method) ir_type *parent = be->pic_trampolines_type; ir_entity *ent = new_entity(parent, old_id, type); set_entity_ld_ident(ent, id); - set_entity_visibility(ent, visibility_local); - set_entity_variability(ent, variability_uninitialized); + set_entity_visibility(ent, ir_visibility_local); return ent; } @@ -2128,12 +2135,11 @@ static ir_entity *create_pic_symbol(be_main_env_t *be, ir_entity *entity) ident *old_id = get_entity_ld_ident(entity); ident *id = id_mangle3("L", old_id, "$non_lazy_ptr"); ir_type *e_type = get_entity_type(entity); - ir_type *type = new_type_pointer(id, e_type, mode_P_data); + ir_type *type = new_type_pointer(e_type); ir_type *parent = be->pic_symbols_type; ir_entity *ent = new_entity(parent, old_id, type); set_entity_ld_ident(ent, id); - set_entity_visibility(ent, visibility_local); - set_entity_variability(ent, variability_uninitialized); + set_entity_visibility(ent, ir_visibility_local); return ent; } @@ -2156,7 +2162,8 @@ static ir_entity *get_pic_symbol(be_main_env_t *env, ir_entity *entity) */ static int can_address_relative(ir_entity *entity) { - return get_entity_visibility(entity) != visibility_external_allocated; + return get_entity_visibility(entity) != ir_visibility_external + && !(get_entity_linkage(entity) & IR_LINKAGE_MERGE); } /** patches SymConsts to work in position independent code */ @@ -2166,7 +2173,6 @@ static void fix_pic_symconsts(ir_node *node, void *data) ir_node *pic_base; ir_node *add; ir_node *block; - ir_node *unknown; ir_mode *mode; ir_node *load; ir_node *load_res; @@ -2208,7 +2214,6 @@ static void fix_pic_symconsts(ir_node *node, void *data) /* everything else is accessed relative to EIP */ mode = get_irn_mode(pred); - unknown = new_r_Unknown(irg, mode); pic_base = arch_code_generator_get_pic_base(env->birg->cg); /* all ok now for locally constructed stuff */ @@ -2248,7 +2253,6 @@ be_abi_irg_t *be_abi_introduce(be_irg_t *birg) pmap_entry *ent; ir_node *dummy; - optimization_state_t state; unsigned *limited_bitset; arch_register_req_t *sp_req; @@ -2282,12 +2286,7 @@ be_abi_irg_t *be_abi_introduce(be_irg_t *birg) sp_req->type |= arch_register_req_type_ignore; } - /* Beware: later we replace this node by the real one, ensure it is not CSE'd - to another Unknown or the stack pointer gets used */ - save_optimization_state(&state); - set_optimize(0); - env->init_sp = dummy = new_r_Unknown(irg, env->arch_env->sp->reg_class->mode); - restore_optimization_state(&state); + env->init_sp = dummy = new_r_Dummy(irg, env->arch_env->sp->reg_class->mode); env->calls = NEW_ARR_F(ir_node*, 0); @@ -2628,10 +2627,9 @@ void be_abi_fix_stack_bias(be_abi_irg_t *env) frame_tp = get_irg_frame_type(irg); for (i = get_class_n_members(frame_tp) - 1; i >= 0; --i) { ir_entity *ent = get_class_member(frame_tp, i); + ir_graph *irg = get_entity_irg(ent); - if (is_method_entity(ent) && get_entity_peculiarity(ent) != peculiarity_description) { - ir_graph *irg = get_entity_irg(ent); - + if (irg != NULL) { irg_walk_graph(irg, NULL, lower_outer_frame_sels, env); } }