#include "irgwalk.h"
-static unsigned long master_cg_visited = 0;
-static INLINE int cg_irg_visited (ir_graph *n);
+static ir_visited_t master_cg_visited = 0;
+static INLINE int cg_irg_visited (ir_graph *n);
static INLINE void mark_cg_irg_visited(ir_graph *n);
-static INLINE void set_cg_irg_visited (ir_graph *n, unsigned long i);
+static INLINE void set_cg_irg_visited (ir_graph *n, ir_visited_t i);
/** Returns the callgraph state of the program representation. */
irp_callgraph_state get_irp_callgraph_state(void) {
post(irg, env);
}
-void callgraph_walk(ir_entity **roots, unsigned n_roots,
- callgraph_walk_func *pre, callgraph_walk_func *post, void *env) {
- //int i, n_irgs = get_irp_n_irgs();
- unsigned r;
+void callgraph_walk(callgraph_walk_func *pre, callgraph_walk_func *post, void *env) {
+ int i, n_irgs = get_irp_n_irgs();
++master_cg_visited;
- for (r = 0; r < n_roots; ++r) {
- ir_graph *irg = get_entity_irg(roots[r]);
- if (irg == NULL)
- continue;
-
- do_walk(irg, pre, post, env);
- }
-
-#if 0
- for (i = 0; i < n_irgs; i++) {
+ /* 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);
- if (!cg_irg_visited(irg) && get_irg_n_callers(irg) == 0)
+
+ if (get_irg_n_callers(irg) == 0)
do_walk(irg, pre, post, env);
}
+
+ /* 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);
}
-#endif
}
/* ----------------------------------------------------------------------------------- */
/**
* Set a graphs visited flag to i.
*/
-static INLINE void set_cg_irg_visited(ir_graph *irg, unsigned long i) {
+static INLINE void set_cg_irg_visited(ir_graph *irg, ir_visited_t i) {
irg->self_visited = i;
}
/**
* Returns the visited flag of a graph.
*/
-static INLINE unsigned long get_cg_irg_visited(ir_graph *irg) {
+static INLINE ir_visited_t get_cg_irg_visited(ir_graph *irg) {
return irg->self_visited;
}
static void compute_loop_depth(ir_graph *irg, void *env) {
int current_nesting = *(int *) env;
int old_nesting = irg->callgraph_loop_depth;
- unsigned long old_visited = get_cg_irg_visited(irg);
+ ir_visited_t old_visited = get_cg_irg_visited(irg);
int i, n_callees;
//return ;