#include "firm_common_t.h"
+#include "list.h"
+
#include "irnode.h"
#include "irgraph.h"
#include "irprog_t.h"
#include "irloop_t.h"
#include "callgraph.h"
#include "irextbb_t.h"
+#include "irhooks.h"
#include "dbginfo_t.h"
#include "irtools.h"
/** An option to dump ld_names instead of names. */
static int dump_ld_name = 1;
/** Compiler options to dump analysis information in dump_ir_graph */
-int dump_out_edge_flag = 0;
+static int dump_out_edge_flag = 0;
+static int dump_loop_information_flag = 0;
+static int dump_backedge_information_flag = 1;
+static int dump_const_local = 0;
+/** An option to dump all graph anchors */
+static int dump_anchors = 0;
+
int dump_dominator_information_flag = 0;
-int dump_loop_information_flag = 0;
-int dump_backedge_information_flag = 1;
-int dump_const_local = 0;
int opt_dump_analysed_type_info = 1;
int opt_dump_pointer_values_to_info = 0; /* default off: for test compares!! */
}
+static DUMP_NODE_EDGE_FUNC dump_block_edge_hook = NULL;
+
+void set_dump_block_edge_hook(DUMP_NODE_EDGE_FUNC func)
+{
+ dump_block_edge_hook = func;
+}
+
+DUMP_NODE_EDGE_FUNC get_dump_block_edge_hook(void)
+{
+ return dump_node_edge_hook;
+}
+
+
/** The vcg node attribute hook. */
static DUMP_IR_GRAPH_FUNC dump_ir_graph_hook = NULL;
/** The vcg node attribute hook. */
dump_edge_vcgattr_hook = hook;
}
-INLINE int get_opt_dump_const_local(void) {
+int get_opt_dump_const_local(void) {
if (!dump_out_edge_flag && !dump_loop_information_flag)
return dump_const_local;
else
dump_ld_name = flag;
}
+void dump_all_anchors(int flag) {
+ dump_anchors = flag;
+}
+
/* -------------- some extended helper functions ----------------- */
/**
(get_irg_pinned(current_ir_graph) == op_pin_state_floats));
}
+/**
+ * Walker that visits the anchors
+ */
+static void ird_walk_graph(ir_graph *irg, irg_walk_func *pre, irg_walk_func *post, void *env) {
+ irg_walk_graph(irg, pre, post, env);
+
+ if (dump_anchors) {
+ int i;
+
+ for (i = anchor_max - 1; i >= 0; --i) {
+ ir_node *n = irg->anchors[i];
+
+ if (n) {
+ /* reset the visit flag: will be increase in the walker */
+ set_irg_visited(irg, get_irg_visited(irg) - 1);
+ irg_walk(n, pre, post, env);
+ }
+ }
+ }
+}
+
/**
* Walker, allocates an array for all blocks and puts it's nodes non-floating nodes into this array.
*/
for (i = get_irp_n_irgs() - 1; i >= 0; --i)
ird_set_irg_link(get_irp_irg(i), NULL);
- irg_walk_graph(current_ir_graph, clear_link, collect_node, current_ir_graph);
+ ird_walk_graph(current_ir_graph, clear_link, collect_node, current_ir_graph);
/* Collect also EndReg and EndExcept. We do not want to change the walker. */
set_interprocedural_view(0);
ir_extblk **extbb_list;
} list_tuple;
-/** Construct lists to walk ir extended block-wise.
+/** Construct lists to walk IR extended block-wise.
* Free the lists in the tuple with DEL_ARR_F().
+ * Sets the irg link field to NULL in all
+ * graphs not visited.
*/
static list_tuple *construct_extblock_lists(ir_graph *irg) {
ir_node **blk_list = construct_block_lists(irg);
case iro_Phi:
print_vcg_color(F, ird_color_green);
break;
+ case iro_Mux:
+ case iro_Psi:
+ print_vcg_color(F, ird_color_gold);
+ break;
case iro_Const:
case iro_Proj:
case iro_Filter:
}
}
+/* Adds a new node info dumper callback. */
+void *dump_add_node_info_callback(dump_node_info_cb_t *cb, void *data)
+{
+ hook_entry_t *info = xmalloc(sizeof(*info));
+
+ info->hook._hook_node_info = cb;
+ info->context = data;
+ register_hook(hook_node_info, info);
+
+ return info;
+}
+
+/* Remove a previously added info dumper callback. */
+void dump_remv_node_info_callback(void *handle)
+{
+ hook_entry_t *info = handle;
+ unregister_hook(hook_node_info, info);
+ xfree(info);
+}
/**
* Dump the node information of a node n to a file F.
/* call the dump_node operation if available */
if (ops->dump_node)
bad = ops->dump_node(n, F, dump_node_info_txt);
+
+ /* allow additional info to be added */
+ hook_node_info(F, n);
fprintf(F, "\"\n");
return bad;
/* dump the blocks edges */
dump_ir_data_edges(F, block);
+ if (dump_block_edge_hook)
+ dump_block_edge_hook(F, block);
+
/* dump the nodes that go into the block */
for (node = ird_get_irn_link(block); node; node = ird_get_irn_link(node)) {
dump_node(F, node);
ir_extblk **arr = ird_get_irg_link(irg);
current_ir_graph = irg;
- compute_extbb(irg);
for (i = ARR_LEN(arr) - 1; i >= 0; --i) {
ir_extblk *extbb = arr[i];
ir_node *leader = get_extbb_leader(extbb);
/* walk over the graph */
/* dump_whole_node must be called in post visiting predecessors */
- irg_walk(get_irg_end(irg), NULL, dump_whole_node, f);
+ ird_walk_graph(irg, NULL, dump_whole_node, f);
/* dump the out edges in a separate walk */
if ((dump_out_edge_flag) && (get_irg_outs_state(irg) != outs_none)) {
if (!is_filtered_dump_name(get_entity_ident(get_irg_entity(irg))))
return;
- compute_extbb(irg);
+ if (get_irg_extblk_state(irg) != extblk_valid)
+ compute_extbb(irg);
if (get_interprocedural_view()) suffix1 = "-ip";
else suffix1 = "";