Don't walk over external allocated entities graph, they don't exists
authorMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Wed, 2 Jun 2004 12:53:32 +0000 (12:53 +0000)
committerMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Wed, 2 Jun 2004 12:53:32 +0000 (12:53 +0000)
[r2996]

ir/ir/ircgopt.c

index cbb2907..aef6c90 100644 (file)
@@ -54,19 +54,22 @@ void gc_irgs(int n_keep, entity ** keep_arr) {
       set_entity_link(marked[i], MARK);
     }
     for (i = 0; i < ARR_LEN(marked); ++i) {
-      ir_graph * irg = get_entity_irg(marked[i]);
-      ir_node * node = get_irg_end(irg);
-      /* collect calls */
-      irg_walk_graph(irg, clear_link, (irg_walk_func *) collect_call, node);
-      /* iterate calls */
-      for (node = get_irn_link(node); node; node = get_irn_link(node)) {
-       int i;
-       assert(get_irn_op(node) == op_Call);
-       for (i = get_Call_n_callees(node) - 1; i >= 0; --i) {
-         entity * ent = get_Call_callee(node, i);
-         if (ent && get_entity_irg(ent) && get_entity_link(ent) != MARK) {
-           set_entity_link(ent, MARK);
-           ARR_APP1(entity *, marked, ent);
+      /* check for extern methods, these don't have an IRG */
+      if (get_entity_visibility(marked[i]) != visibility_external_allocated) {
+       ir_graph * irg = get_entity_irg(marked[i]);
+       ir_node * node = get_irg_end(irg);
+       /* collect calls */
+       irg_walk_graph(irg, clear_link, (irg_walk_func *) collect_call, node);
+       /* iterate calls */
+       for (node = get_irn_link(node); node; node = get_irn_link(node)) {
+         int i;
+         assert(get_irn_op(node) == op_Call);
+         for (i = get_Call_n_callees(node) - 1; i >= 0; --i) {
+           entity * ent = get_Call_callee(node, i);
+           if (ent && get_entity_irg(ent) && get_entity_link(ent) != MARK) {
+             set_entity_link(ent, MARK);
+             ARR_APP1(entity *, marked, ent);
+           }
          }
        }
       }