X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana%2Fcallgraph.c;h=dac267e3afc5ac5e8d4d8b30745d31054f90d42e;hb=dd4cd761ab637d4488c7e29f49843b1b02366acf;hp=b9102dec4bd6c13d19531f5b04925ce0f8c15109;hpb=fe131120d5f0063d84b46b64fdb89b5ef20cbf38;p=libfirm diff --git a/ir/ana/callgraph.c b/ir/ana/callgraph.c index b9102dec4..dac267e3a 100644 --- a/ir/ana/callgraph.c +++ b/ir/ana/callgraph.c @@ -386,28 +386,22 @@ static void do_walk(ir_graph *irg, callgraph_walk_func *pre, callgraph_walk_func post(irg, env); } -void callgraph_walk(ir_entity **roots, unsigned n_roots, - callgraph_walk_func *pre, callgraph_walk_func *post, void *env) { +void callgraph_walk(callgraph_walk_func *pre, callgraph_walk_func *post, void *env) { int i, n_irgs = get_irp_n_irgs(); - unsigned r; ++master_cg_visited; - for (r = 0; r < n_roots; ++r) { - ir_graph *irg = get_entity_irg(roots[r]); - if (irg == NULL) - continue; + /* roots are methods which have no callers in the current program */ + for (i = 0; i < n_irgs; ++i) { + ir_graph *irg = get_irp_irg(i); - do_walk(irg, pre, post, env); + if (get_irg_n_callers(irg) == 0) + do_walk(irg, pre, post, env); } - /* cgana "optimizes" the graph instead of just analysing it so the - * roots list isn't even correct anymore when passed to this method... - * so we hack around this and search for more unreferenced/free - * methods... */ + /* in case of unreachable call loops we haven't visited some irgs yet */ for (i = 0; i < n_irgs; i++) { ir_graph *irg = get_irp_irg(i); - if (!cg_irg_visited(irg)) - do_walk(irg, pre, post, env); + do_walk(irg, pre, post, env); } }