/*
- * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved.
+ * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
*
* This file is part of libFirm.
*
* @brief Representation and computation of the callgraph.
* @author Goetz Lindenmaier
* @date 21.7.2004
- * @version $Id$
- * @summary
+ * @brief callgraph analysis
+ */
+#ifndef FIRM_ANA_CALLGRAPH_H
+#define FIRM_ANA_CALLGRAPH_H
+
+#include "firm_types.h"
+#include "begin.h"
+
+/**
+ * @ingroup irana
+ * @defgroup callgraph Callgraph
+ *
* This file contains the representation of the callgraph.
* The nodes of the call graph are ir_graphs. The edges between
* the nodes are calling relations. I.e., if method a calls method
* Finally this file contains an algorithm that computes backedges
* in the callgraph, i.e., the algorithm finds possibly recursive calls.
* The algorithm computes an upper bound of all recursive calls.
+ * @{
*/
-#ifndef FIRM_ANA_CALLGRAPH_H
-#define FIRM_ANA_CALLGRAPH_H
-
-#include "firm_types.h"
/** Flag to indicate state of callgraph. */
typedef enum {
} irp_callgraph_state;
/** Returns the callgraph state of the program representation. */
-irp_callgraph_state get_irp_callgraph_state(void);
+FIRM_API irp_callgraph_state get_irp_callgraph_state(void);
/** Sets the callgraph state of the program representation. */
-void set_irp_callgraph_state(irp_callgraph_state s);
+FIRM_API void set_irp_callgraph_state(irp_callgraph_state s);
/** Returns the number of procedures that call the given irg. */
-int get_irg_n_callers(ir_graph *irg);
+FIRM_API size_t get_irg_n_callers(const ir_graph *irg);
/** Returns the caller at position pos. */
-ir_graph *get_irg_caller(ir_graph *irg, int pos);
+ir_graph *get_irg_caller(const ir_graph *irg, size_t pos);
/** Returns non-zero if the caller at position pos is "a backedge", i.e. a recursion. */
-int is_irg_caller_backedge(ir_graph *irg, int pos);
+FIRM_API int is_irg_caller_backedge(const ir_graph *irg, size_t pos);
/** Returns non-zero if the irg has a backedge caller. */
-int has_irg_caller_backedge(ir_graph *irg);
+FIRM_API int has_irg_caller_backedge(const ir_graph *irg);
/** Returns the maximal loop depth of call nodes that call along this edge. */
-int get_irg_caller_loop_depth(ir_graph *irg, int pos);
+FIRM_API size_t get_irg_caller_loop_depth(const ir_graph *irg, size_t pos);
/** Returns the number of procedures that are called by the given irg. */
-int get_irg_n_callees(ir_graph *irg);
+FIRM_API size_t get_irg_n_callees(const ir_graph *irg);
/** Returns the callee at position pos. */
-ir_graph *get_irg_callee(ir_graph *irg, int pos);
+FIRM_API ir_graph *get_irg_callee(const ir_graph *irg, size_t pos);
/** Returns non-zero if the callee at position pos is "a backedge", i.e. a recursion. */
-int is_irg_callee_backedge(ir_graph *irg, int pos);
+FIRM_API int is_irg_callee_backedge(const ir_graph *irg, size_t pos);
/** Returns non-zero if the irg has a backedge callee. */
-int has_irg_callee_backedge(ir_graph *irg);
+FIRM_API int has_irg_callee_backedge(const ir_graph *irg);
/** Returns the maximal loop depth of call nodes that call along this edge. */
-int get_irg_callee_loop_depth(ir_graph *irg, int pos);
+FIRM_API size_t get_irg_callee_loop_depth(const ir_graph *irg, size_t pos);
/** Returns the maximal loop depth of all paths from an external visible method to
this irg. */
-int get_irg_loop_depth(ir_graph *irg);
+FIRM_API size_t get_irg_loop_depth(const ir_graph *irg);
/** Returns the maximal recursion depth of all paths from an external visible method to
this irg. */
-int get_irg_recursion_depth(ir_graph *irg);
+FIRM_API size_t get_irg_recursion_depth(const ir_graph *irg);
/** Returns the method execution frequency of a graph. */
-double get_irg_method_execution_frequency(ir_graph *irg);
+FIRM_API double get_irg_method_execution_frequency(const ir_graph *irg);
/**
* Construct the callgraph. Expects callee information, i.e.,
* irg_callee_info_consistent must be set. This can be computed with
* cgana().
*/
-void compute_callgraph(void);
+FIRM_API void compute_callgraph(void);
/** Destruct the callgraph. */
-void free_callgraph(void);
+FIRM_API void free_callgraph(void);
/** A function type for functions passed to the callgraph walker. */
* @param post - walker function, executed after the predecessor of a node are visited
* @param env - environment, passed to pre and post
*/
-void callgraph_walk(callgraph_walk_func *pre, callgraph_walk_func *post, void *env);
+FIRM_API void callgraph_walk(callgraph_walk_func *pre,
+ callgraph_walk_func *post, void *env);
/**
* Compute the backedges that represent recursions and a looptree.
*/
-void find_callgraph_recursions(void);
-
-/** Compute interprocedural performance estimates.
- *
- * Computes
- * - the loop depth of the method.
- * The loop depth of an edge between two methods is the
- * maximal loop depth of the Call nodes that call along this edge.
- * The loop depth of the method is the loop depth of the most expensive
- * path from main().
- * - The recursion depth. The maximal number of recursions passed
- * on all paths reaching this method.
- * - The execution frequency. As loop depth, but the edge weight is the sum
- * of the execution frequencies of all Calls along the edge.
- *
- * Expects the main irg is set, see set_irp_main_irg();
- **/
-void compute_performance_estimates(void);
+FIRM_API void find_callgraph_recursions(void);
/** Computes the interprocedural loop nesting information.
*
*
* Expects the main irg is set, see set_irp_main_irg();
*/
-void analyse_loop_nesting_depth(void);
+FIRM_API void analyse_loop_nesting_depth(void);
/** The state of loop nesting depth. */
typedef enum {
} loop_nesting_depth_state;
/** Returns the nesting depth state of the program representation. */
-loop_nesting_depth_state get_irp_loop_nesting_depth_state(void);
+FIRM_API loop_nesting_depth_state get_irp_loop_nesting_depth_state(void);
/** Sets the nesting depth state of the program representation. */
-void set_irp_loop_nesting_depth_state(loop_nesting_depth_state s);
+FIRM_API void set_irp_loop_nesting_depth_state(loop_nesting_depth_state s);
/** Marks the nesting depth state of the program representation as inconsistent. */
-void set_irp_loop_nesting_depth_state_inconsistent(void);
+FIRM_API void set_irp_loop_nesting_depth_state_inconsistent(void);
+
+/** @} */
+#include "end.h"
-#endif /* _CALLGRAPH_H_ */
+#endif