added edge verification routines
[libfirm] / ir / ir / irgwalk.c
index ef9a79f..56a53c5 100644 (file)
@@ -119,7 +119,7 @@ static void collect_irgs(ir_node * node, eset * irg_set) {
   if (is_Call(node)) {
     int i;
     for (i = get_Call_n_callees(node) - 1; i >= 0; --i) {
-      entity * ent = get_Call_callee(node, i);
+      ir_entity * ent = get_Call_callee(node, i);
       ir_graph * irg = get_entity_irg(ent);
       if (irg && !eset_contains(irg_set, irg)) {
         eset_insert(irg_set, irg);
@@ -260,8 +260,11 @@ void irg_walk(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void *env)
     irg_walk_cg(node, visited, irg_set, pre, post, env);
     eset_destroy(irg_set);
   } else {
+    assert(! inside_irg_walk(current_ir_graph)); /* we must not already be inside an irg walk */
+    set_inside_irg_walk(current_ir_graph);
     inc_irg_visited(current_ir_graph);
     nodes_touched = irg_walk_2(node, pre, post, env);
+    clear_inside_irg_walk(current_ir_graph);
   }
   return;
 }
@@ -412,8 +415,11 @@ void irg_walk_in_or_dep(ir_node *node, irg_walk_func *pre, irg_walk_func *post,
   if (get_interprocedural_view()) {
        assert(0 && "This is not yet implemented.");
   } else {
+    assert(! inside_irg_walk(current_ir_graph)); /* we must not already be inside an irg walk */
+    set_inside_irg_walk(current_ir_graph);
     inc_irg_visited(current_ir_graph);
     nodes_touched = irg_walk_in_or_dep_2(node, pre, post, env);
+    clear_inside_irg_walk(current_ir_graph);
   }
   return;
 }
@@ -598,8 +604,10 @@ void irg_block_walk(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void
   assert(node);
   assert(!get_interprocedural_view());   /* interprocedural_view not implemented, because it
                     * interleaves with irg_walk */
+  assert(! inside_irg_walk(current_ir_graph)); /* we must not already be in a block walk */
   inc_irg_block_visited(current_ir_graph);
-  if (is_no_Block(node)) block = get_nodes_block(node); else block = node;
+  set_inside_block_walk(current_ir_graph);
+  block = is_Block(node) ? node : get_nodes_block(node);
   assert(get_irn_op(block) == op_Block);
   irg_block_walk_2(block, pre, post, env);
 
@@ -624,6 +632,7 @@ void irg_block_walk(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void
     }
   }
 
+  clear_inside_block_walk(current_ir_graph);
   return;
 }
 
@@ -665,7 +674,7 @@ typedef struct walk_env {
 /**
  * Walk to all constant expressions in this entity.
  */
-static void walk_entity(entity *ent, void *env)
+static void walk_entity(ir_entity *ent, void *env)
 {
   walk_env *my_env = (walk_env *)env;