X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fgarbage_collect.c;h=0d5161d83a769bea045581efd5a0bd99944828f9;hb=3398ae4a8b3cbf66cb0b274ddcd85a2ea863ece1;hp=5e8c529b7ab00baee4040adf65729a22e5ae1437;hpb=11344bd09b754d61bd636a2358c82700aefa9314;p=libfirm diff --git a/ir/opt/garbage_collect.c b/ir/opt/garbage_collect.c index 5e8c529b7..0d5161d83 100644 --- a/ir/opt/garbage_collect.c +++ b/ir/opt/garbage_collect.c @@ -45,12 +45,16 @@ static void visit_node(ir_node *node, void *env) ir_entity *entity; (void) env; - if (!is_SymConst(node)) - return; - if (!SYMCONST_HAS_ENT(get_SymConst_kind(node))) + if (is_SymConst(node)) { + if (!SYMCONST_HAS_ENT(get_SymConst_kind(node))) + return; + entity = get_SymConst_entity(node); + } else if (is_Sel(node)) { + entity = get_Sel_entity(node); + } else { return; + } - entity = get_SymConst_entity(node); visit_entity(entity); } @@ -61,7 +65,6 @@ static void start_visit_node(ir_node *node) if (get_irg_visited(irg) < get_max_irg_visited()) { set_irg_visited(irg, get_max_irg_visited()); } - current_ir_graph = irg; irg_walk_2(node, visit_node, NULL, NULL); } @@ -77,7 +80,7 @@ static void visit_initializer(ir_initializer_t *initializer) case IR_INITIALIZER_COMPOUND: { size_t i; - for(i = 0; i < initializer->compound.n_initializers; ++i) { + for (i = 0; i < initializer->compound.n_initializers; ++i) { ir_initializer_t *subinitializer = initializer->compound.initializers[i]; visit_initializer(subinitializer); @@ -140,8 +143,7 @@ static void garbage_collect_in_segment(ir_type *segment) DB((dbg, LEVEL_1, " removing entity %+F\n", entity)); - /* TODO: this is O(n^2) improve our interfaces! */ - remove_class_member(get_entity_owner(entity), entity); + free_entity(entity); } } @@ -174,7 +176,7 @@ void garbage_collect_entities(void) if (entity_visited(entity)) continue; - DB((dbg, LEVEL_1, " freeing method %+F\n", entity)); + DB((dbg, LEVEL_1, " freeing method %+F\n", entity)); remove_irp_irg(irg); }