X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fproc_cloning.c;h=2f80cbce1d2bc5b84e3a6dfbf4c86d06cbc972b4;hb=6b124543aff56817fcfe6d5b5ff181ac5c790e73;hp=bf602a6761904860504293c85b9d618bf8669372;hpb=6a4b9102668449bea6e3c0905df74f7ffff2768b;p=libfirm diff --git a/ir/opt/proc_cloning.c b/ir/opt/proc_cloning.c index bf602a676..2f80cbce1 100644 --- a/ir/opt/proc_cloning.c +++ b/ir/opt/proc_cloning.c @@ -187,12 +187,12 @@ static void collect_irg_calls(ir_node *call, void *env) { callee = get_Global_entity(call_ptr); - /* we can only clone calls to existing entities */ - if (get_entity_visibility(callee) == visibility_external_allocated) + /* we don't know which function gets finally bound to a weak symbol */ + if (get_entity_linkage(callee) & IR_LINKAGE_WEAK) return; - /* we cannot clone calls to weak functions */ - if (get_entity_additional_properties(callee) & mtp_property_weak) + /* we can only clone calls to existing entities */ + if (get_entity_irg(callee) == NULL) return; process_call(call, callee, hmap); @@ -368,19 +368,17 @@ static void create_clone_proc_irg(ir_entity *ent, quadruple_t *q) { * @param ent The entity of the clone. * @param nr A pointer to the counter of clones. **/ -static void change_entity_type(quadruple_t *q, ir_entity *ent, unsigned *nr) { +static void change_entity_type(quadruple_t *q, ir_entity *ent) { ir_type *mtp, *new_mtp, *tp; - ident *tp_name; int i, j, n_params, n_ress; mtp = get_entity_type(q->ent); - tp_name = get_clone_ident(get_type_ident(mtp), q->pos, (*nr)++); n_params = get_method_n_params(mtp); n_ress = get_method_n_ress(mtp); /* Create the new type for our clone. It must have one parameter less then the original.*/ - new_mtp = new_type_method(tp_name, n_params - 1, n_ress); + new_mtp = new_type_method(n_params - 1, n_ress); /* We must set the type of the methods parameters.*/ for (i = j = 0; i < n_params; ++i) { @@ -405,10 +403,10 @@ static void change_entity_type(quadruple_t *q, ir_entity *ent, unsigned *nr) { * * @param q Contains information for the method to clone. */ -static ir_entity *clone_method(quadruple_t *q) { +static ir_entity *clone_method(quadruple_t *q) +{ ir_entity *new_entity; ident *clone_ident; - ir_graph *rem; symconst_symbol sym; /* A counter for the clones.*/ static unsigned nr = 0; @@ -419,23 +417,19 @@ static ir_entity *clone_method(quadruple_t *q) { new_entity = copy_entity_name(q->ent, clone_ident); /* a cloned entity is always local */ - set_entity_visibility(new_entity, visibility_local); + set_entity_visibility(new_entity, ir_visibility_local); /* set a ld name here: Should we mangle this ? */ set_entity_ld_ident(new_entity, get_entity_ident(new_entity)); /* set a new type here. */ - change_entity_type(q, new_entity, &nr); + change_entity_type(q, new_entity); /* We need now a new ir_graph for our clone method. */ create_clone_proc_irg(new_entity, q); /* We must set the atomic value of our "new_entity". */ sym.entity_p = new_entity; - rem = current_ir_graph; - current_ir_graph = get_const_code_irg(); - new_entity->value = new_SymConst(mode_P_code, sym, symconst_addr_ent); - current_ir_graph = rem; /* The "new_entity" don't have this information. */ new_entity->attr.mtd_attr.param_access = NULL;