X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fana%2Fcallgraph.c;h=068cbe6622dbdb199ddc5fb3337c45efb098b2fc;hb=83d1882a9e3dd5f74aa87c6fdb534516c75cb857;hp=f9098c664536f5fb45cdd58c6ec841584113960a;hpb=4b1138a9eee25ce11adbb7d7162eaa49421e8b51;p=libfirm diff --git a/ir/ana/callgraph.c b/ir/ana/callgraph.c index f9098c664..068cbe662 100644 --- a/ir/ana/callgraph.c +++ b/ir/ana/callgraph.c @@ -24,9 +24,7 @@ * @date 21.7.2004 * @version $Id$ */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif +#include "config.h" #ifdef HAVE_STRING_H # include @@ -52,10 +50,10 @@ #include "irgwalk.h" -static int 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, int i); +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, ir_visited_t i); /** Returns the callgraph state of the program representation. */ irp_callgraph_state get_irp_callgraph_state(void) { @@ -390,16 +388,18 @@ void callgraph_walk(callgraph_walk_func *pre, callgraph_walk_func *post, void *e int i, n_irgs = get_irp_n_irgs(); ++master_cg_visited; - do_walk(get_irp_main_irg(), pre, post, env); - 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); } } @@ -431,7 +431,7 @@ typedef struct scc_info { /** * allocates a new scc_info on the obstack */ -static INLINE scc_info *new_scc_info(struct obstack *obst) { +static inline scc_info *new_scc_info(struct obstack *obst) { scc_info *info = obstack_alloc(obst, sizeof(*info)); memset(info, 0, sizeof(*info)); return info; @@ -440,76 +440,68 @@ static INLINE scc_info *new_scc_info(struct obstack *obst) { /** * Returns non-zero if a graph was already visited. */ -static INLINE int cg_irg_visited(ir_graph *irg) { - scc_info *info = get_irg_link(irg); - assert(info && "missing call to init_scc()"); - return info->visited >= master_cg_visited; +static inline int cg_irg_visited(ir_graph *irg) { + return irg->self_visited >= master_cg_visited; } /** * Marks a graph as visited. */ -static INLINE void mark_cg_irg_visited(ir_graph *irg) { - scc_info *info = get_irg_link(irg); - assert(info && "missing call to init_scc()"); - info->visited = master_cg_visited; +static inline void mark_cg_irg_visited(ir_graph *irg) { + irg->self_visited = master_cg_visited; } /** * Set a graphs visited flag to i. */ -static INLINE void set_cg_irg_visited(ir_graph *irg, int i) { - scc_info *info = get_irg_link(irg); - assert(info && "missing call to init_scc()"); - info->visited = 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 int get_cg_irg_visited(ir_graph *irg) { - scc_info *info = get_irg_link(irg); - assert(info && "missing call to init_scc()"); - return info->visited; +static inline ir_visited_t get_cg_irg_visited(ir_graph *irg) { + return irg->self_visited; } -static INLINE void mark_irg_in_stack(ir_graph *irg) { +static inline void mark_irg_in_stack(ir_graph *irg) { scc_info *info = get_irg_link(irg); assert(info && "missing call to init_scc()"); info->in_stack = 1; } -static INLINE void mark_irg_not_in_stack(ir_graph *irg) { +static inline void mark_irg_not_in_stack(ir_graph *irg) { scc_info *info = get_irg_link(irg); assert(info && "missing call to init_scc()"); info->in_stack = 0; } -static INLINE int irg_is_in_stack(ir_graph *irg) { +static inline int irg_is_in_stack(ir_graph *irg) { scc_info *info = get_irg_link(irg); assert(info && "missing call to init_scc()"); return info->in_stack; } -static INLINE void set_irg_uplink(ir_graph *irg, int uplink) { +static inline void set_irg_uplink(ir_graph *irg, int uplink) { scc_info *info = get_irg_link(irg); assert(info && "missing call to init_scc()"); info->uplink = uplink; } -static INLINE int get_irg_uplink(ir_graph *irg) { +static inline int get_irg_uplink(ir_graph *irg) { scc_info *info = get_irg_link(irg); assert(info && "missing call to init_scc()"); return info->uplink; } -static INLINE void set_irg_dfn(ir_graph *irg, int dfn) { +static inline void set_irg_dfn(ir_graph *irg, int dfn) { scc_info *info = get_irg_link(irg); assert(info && "missing call to init_scc()"); info->dfn = dfn; } -static INLINE int get_irg_dfn(ir_graph *irg) { +static inline int get_irg_dfn(ir_graph *irg) { scc_info *info = get_irg_link(irg); assert(info && "missing call to init_scc()"); return info->dfn; @@ -525,7 +517,7 @@ static int tos = 0; /**< top of stack */ /** * Initialize the irg stack. */ -static INLINE void init_stack(void) { +static inline void init_stack(void) { if (stack) { ARR_RESIZE(ir_graph *, stack, 1000); } else { @@ -538,7 +530,7 @@ static INLINE void init_stack(void) { * push a graph on the irg stack * @param n the graph to be pushed */ -static INLINE void push(ir_graph *irg) { +static inline void push(ir_graph *irg) { if (tos == ARR_LEN(stack)) { int nlen = ARR_LEN(stack) * 2; ARR_RESIZE(ir_node *, stack, nlen); @@ -550,7 +542,7 @@ static INLINE void push(ir_graph *irg) { /** * return the topmost graph on the stack and pop it */ -static INLINE ir_graph *pop(void) { +static inline ir_graph *pop(void) { ir_graph *irg = stack[--tos]; mark_irg_not_in_stack(irg); return irg; @@ -560,7 +552,7 @@ static INLINE ir_graph *pop(void) { * The nodes up to irg belong to the current loop. * Removes them from the stack and adds them to the current loop. */ -static INLINE void pop_scc_to_loop(ir_graph *irg) { +static inline void pop_scc_to_loop(ir_graph *irg) { ir_graph *m; do { @@ -602,7 +594,7 @@ static void close_loop(ir_loop *l) { * Removes and unmarks all nodes up to n from the stack. * The nodes must be visited once more to assign them to a scc. */ -static INLINE void pop_scc_unmark_visit(ir_graph *n) { +static inline void pop_scc_unmark_visit(ir_graph *n) { ir_graph *m = NULL; while (m != n) { @@ -1015,7 +1007,7 @@ static void reset_isbe(void) { static void compute_loop_depth(ir_graph *irg, void *env) { int current_nesting = *(int *) env; int old_nesting = irg->callgraph_loop_depth; - int old_visited = get_cg_irg_visited(irg); + ir_visited_t old_visited = get_cg_irg_visited(irg); int i, n_callees; //return ;