/*
- * 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.
*
* @author Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Hubert Schmidt
* @version $Id$
*/
-#ifdef HAVE_CONFIG_H
#include "config.h"
-#endif
-#ifdef HAVE_STRING_H
#include <string.h>
-#endif
-#ifdef HAVE_STDLIB_H
#include <stdlib.h>
-#endif
#include <stdarg.h>
#include "firm_common_t.h"
#include "list.h"
-#include "irnode.h"
-#include "irgraph.h"
+#include "irnode_t.h"
+#include "irgraph_t.h"
#include "irprog_t.h"
#include "entity_t.h"
#include "irop.h"
#include "irgwalk.h"
#include "tv_t.h"
#include "irouts.h"
+#include "iredges.h"
#include "irdom.h"
#include "irloop_t.h"
#include "callgraph.h"
#include "irhooks.h"
#include "dbginfo_t.h"
#include "irtools.h"
+#include "irprintf.h"
#include "irvrfy.h"
#include "eset.h"
#include "pset.h"
-#if DO_HEAPANALYSIS
-extern void dump_irn_chi_term(FILE *FL, ir_node *n);
-extern void dump_irn_state(FILE *FL, ir_node *n);
-extern int get_opt_dump_abstvals(void);
-typedef unsigned long SeqNo;
-extern SeqNo get_Block_seqno(ir_node *n);
-#endif
-
-/* basis for a color range for vcg */
-static int n_colors = 0;
-static int base_color = 0;
-
-/** Dump only irgs with names that start with this string */
+/** Dump only irgs with names that start with this prefix. */
static ident *dump_file_filter_id = NULL;
#define ERROR_TXT "<ERROR>"
/** An option to turn off dumping values of constant entities */
static int const_entities = 1;
/** An option to dump the keep alive edges */
-static int dump_keepalive = 0;
+static int dump_keepalive = 1;
+/** An option to dump the new out edges */
+static int dump_new_edges_flag = 0;
/** 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 */
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 const-like nodes locally. */
+static int dump_const_local = 1;
+/** An option to dump the node index number. */
+static int dump_node_idx_labels = 0;
/** An option to dump all graph anchors */
static int dump_anchors = 0;
+/** An option to dump the macro block edges. */
+static int dump_macro_block_edges = 0;
+/** An option to dump block marker in the block title */
+static int dump_block_marker = 0;
int dump_dominator_information_flag = 0;
int opt_dump_analysed_type_info = 1;
int opt_dump_pointer_values_to_info = 0; /* default off: for test compares!! */
-static dumper_colors overrule_nodecolor = ird_color_default;
+static ird_color_t overrule_nodecolor = ird_color_default_node;
/** The vcg node attribute hook. */
static DUMP_IR_GRAPH_FUNC dump_ir_graph_hook = NULL;
dump_edge_vcgattr_hook = hook;
}
-/* Returns 0 if dump_out_edge_flag or dump_loop_information_flag
+/** Returns 0 if dump_out_edge_flag or dump_loop_information_flag
* are set, else returns dump_const_local_flag.
*/
-int get_opt_dump_const_local(void) {
- if (!dump_out_edge_flag && !dump_loop_information_flag)
- return dump_const_local;
- else
+static int get_opt_dump_const_local(void) {
+ if (dump_out_edge_flag || dump_loop_information_flag || (dump_new_edges_flag && edges_activated(current_ir_graph)))
return 0;
+ return dump_const_local;
}
/* Set a prefix filter for output functions. */
dump_const_local = flag;
}
+void dump_node_idx_label(int flag) {
+ dump_node_idx_labels = flag;
+}
+
void dump_constant_entity_values(int flag) {
const_entities = flag;
}
dump_keepalive = flag;
}
+void dump_new_edges(int flag) {
+ dump_new_edges_flag = flag;
+}
+
int get_opt_dump_keepalive_edges(void) {
return dump_keepalive;
}
dump_anchors = flag;
}
+void dump_macroblock_edges(int flag) {
+ dump_macro_block_edges = flag;
+}
+
+void dump_block_marker_in_title(int flag) {
+ dump_block_marker = flag;
+}
+
/* -------------- some extended helper functions ----------------- */
/**
- * returns the name of a mode or <ERROR> if mode is NOT a mode object.
- * in the later case, sets bad
+ * returns the name of a mode or ERROR_TXT if mode is NOT a mode object.
+ * in the later case, sets bad.
*/
-const char *get_mode_name_ex(ir_mode *mode, int *bad) {
+const char *get_mode_name_ex(const ir_mode *mode, int *bad) {
if (is_mode(mode))
return get_mode_name(mode);
*bad |= 1;
* returns the name of a type or <ERROR> if mode is NOT a mode object.
* in the later case, sets bad
*/
-const char *get_type_name_ex(ir_type *tp, int *bad) {
+const char *get_type_name_ex(const ir_type *tp, int *bad) {
if (is_type(tp))
return get_type_name(tp);
*bad |= 1;
return ERROR_TXT;
}
+#define CUSTOM_COLOR_BASE 100
+static const char *color_names[ird_color_count];
+static const char *color_rgb[ird_color_count];
+static struct obstack color_obst;
+
+/** define a custom color. */
+static void custom_color(int num, const char *rgb_def)
+{
+ assert(num < ird_color_count);
+ obstack_printf(&color_obst, "%d", CUSTOM_COLOR_BASE + num);
+ obstack_1grow(&color_obst, '\0');
+
+ color_rgb[num] = rgb_def;
+ color_names[num] = obstack_finish(&color_obst);
+}
+
+/** Define a named color. */
+static void named_color(int num, const char *name)
+{
+ assert(num < ird_color_count);
+ color_rgb[num] = NULL;
+ color_names[num] = name;
+}
+
+/** Initializes the used colors. */
+static void init_colors(void)
+{
+ static int initialized = 0;
+ if (initialized)
+ return;
+
+ obstack_init(&color_obst);
+
+ custom_color(ird_color_prog_background, "204 204 204");
+ custom_color(ird_color_block_background, "255 255 0");
+ custom_color(ird_color_dead_block_background, "190 150 150");
+ named_color(ird_color_block_inout, "lightblue");
+ named_color(ird_color_default_node, "white");
+ custom_color(ird_color_memory, "153 153 255");
+ custom_color(ird_color_controlflow, "255 153 153");
+ custom_color(ird_color_const, "204 255 255");
+ custom_color(ird_color_proj, "255 255 153");
+ custom_color(ird_color_uses_memory, "153 153 255");
+ custom_color(ird_color_phi, "105 255 105");
+ custom_color(ird_color_anchor, "100 100 255");
+ named_color(ird_color_error, "red");
+ custom_color(ird_color_entity, "204 204 255");
+
+ initialized = 1;
+}
+
/**
- * printf the VCG color to a file
+ * Prints the VCG color to a file.
*/
-static void print_vcg_color(FILE *F, dumper_colors color) {
- static const char *color_names[32] = {
- "white", "blue", "red", "green",
- "yellow", "magenta", "cyan", "darkgray",
- "darkblue", "darkred", "darkgreen", "darkyellow",
- "darkmagenta", "darkcyan", "gold", "lightgray",
- "lightblue", "lightred", "lightgreen", "lightyellow",
- "lightmagenta", "lightcyan", "lilac", "turquoise",
- "aquamarine", "khaki", "purple", "yellowgreen",
- "pink", "orange", "orchid", "black"
- };
-
- if (color != ird_color_default)
- fprintf(F, "color:%s", color_names[color]);
+static void print_vcg_color(FILE *F, ird_color_t color) {
+ assert(color < ird_color_count);
+ fprintf(F, "color:%s", color_names[color]);
}
/**
- * prints the edge from a type S to a type T with additional info fmt, ...
- * to the file F
+ * Prints the edge from a type S to a type T with additional info fmt, ...
+ * to the file F.
*/
-static void print_type_type_edge(FILE *F, ir_type *S, ir_type *T, const char *fmt, ...)
+static void print_type_type_edge(FILE *F, const ir_type *S, const ir_type *T, const char *fmt, ...)
{
va_list ap;
}
/**
- * prints the edge from a type T to an entity E with additional info fmt, ...
- * to the file F
+ * Prints the edge from a type tp to an entity ent with additional info fmt, ...
+ * to the file F.
*/
-static void print_type_ent_edge(FILE *F, ir_type *T, ir_entity *E, const char *fmt, ...)
+static void print_type_ent_edge(FILE *F, const ir_type *tp, const ir_entity *ent, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
- fprintf(F, "edge: { sourcename: "); PRINT_TYPEID(T);
- fprintf(F, " targetname: \""); PRINT_ENTID(E); fprintf(F, "\"");
+ fprintf(F, "edge: { sourcename: "); PRINT_TYPEID(tp);
+ fprintf(F, " targetname: \""); PRINT_ENTID(ent); fprintf(F, "\"");
vfprintf(F, fmt, ap);
fprintf(F, "}\n");
va_end(ap);
}
/**
- * prints the edge from an entity E to an entity T with additional info fmt, ...
- * to the file F
+ * Prints the edge from an entity ent1 to an entity ent2 with additional info fmt, ...
+ * to the file F.
*/
-static void print_ent_ent_edge(FILE *F, ir_entity *E, ir_entity *T, int backedge, const char *fmt, ...)
+static void print_ent_ent_edge(FILE *F, const ir_entity *ent1, const ir_entity *ent2, int backedge, ird_color_t color, const char *fmt, ...)
{
va_list ap;
fprintf(F, "backedge: { sourcename: \"");
else
fprintf(F, "edge: { sourcename: \"");
- PRINT_ENTID(E);
- fprintf(F, "\" targetname: \""); PRINT_ENTID(T); fprintf(F, "\"");
+ PRINT_ENTID(ent1);
+ fprintf(F, "\" targetname: \""); PRINT_ENTID(ent2); fprintf(F, "\"");
vfprintf(F, fmt, ap);
+ fprintf(F, " ");
+ if (color != (ird_color_t) -1)
+ print_vcg_color(F, color);
fprintf(F, "}\n");
va_end(ap);
}
/**
- * prints the edge from an entity E to a type T with additional info fmt, ...
- * to the file F
+ * Prints the edge from an entity ent to a type tp with additional info fmt, ...
+ * to the file F.
*/
-static void print_ent_type_edge(FILE *F, ir_entity *E, ir_type *T, const char *fmt, ...)
+static void print_ent_type_edge(FILE *F, const ir_entity *ent, const ir_type *tp, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
- fprintf(F, "edge: { sourcename: \""); PRINT_ENTID(E);
- fprintf(F, "\" targetname: "); PRINT_TYPEID(T);
+ fprintf(F, "edge: { sourcename: \""); PRINT_ENTID(ent);
+ fprintf(F, "\" targetname: "); PRINT_TYPEID(tp);
vfprintf(F, fmt, ap);
fprintf(F,"}\n");
va_end(ap);
}
/**
- * prints the edge from a node N to a type T with additional info fmt, ...
- * to the file F
+ * Prints the edge from a node irn to a type tp with additional info fmt, ...
+ * to the file F.
*/
-static void print_node_type_edge(FILE *F, const ir_node *N, ir_type *T, const char *fmt, ...)
+static void print_node_type_edge(FILE *F, const ir_node *irn, ir_type *tp, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
- fprintf(F, "edge: { sourcename: \""); PRINT_NODEID(N);
- fprintf(F, "\" targetname: "); PRINT_TYPEID(T);
+ fprintf(F, "edge: { sourcename: \""); PRINT_NODEID(irn);
+ fprintf(F, "\" targetname: "); PRINT_TYPEID(tp);
vfprintf(F, fmt, ap);
fprintf(F,"}\n");
va_end(ap);
}
/**
- * prints the edge from a node N to an entity E with additional info fmt, ...
- * to the file F
+ * Prints the edge from a node irn to an entity ent with additional info fmt, ...
+ * to the file F.
*/
-static void print_node_ent_edge(FILE *F, const ir_node *N, ir_entity *E, const char *fmt, ...)
+static void print_node_ent_edge(FILE *F, const ir_node *irn, const ir_entity *ent, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
- fprintf(F, "edge: { sourcename: \""); PRINT_NODEID(N);
- fprintf(F, "\" targetname: \""); PRINT_ENTID(E);
+ fprintf(F, "edge: { sourcename: \""); PRINT_NODEID(irn);
+ fprintf(F, "\" targetname: \""); PRINT_ENTID(ent);
fprintf(F, "\"");
vfprintf(F, fmt, ap);
fprintf(F,"}\n");
}
/**
- * prints the edge from an entity E to a node N with additional info fmt, ...
- * to the file F
+ * Prints the edge from an entity ent to a node irn with additional info fmt, ...
+ * to the file F.
*/
-static void print_ent_node_edge(FILE *F, ir_entity *E, const ir_node *N, const char *fmt, ...)
+static void print_ent_node_edge(FILE *F, const ir_entity *ent, const ir_node *irn, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
- fprintf(F, "edge: { sourcename: \""); PRINT_ENTID(E);
- fprintf(F, "\" targetname: \""); PRINT_NODEID(N); fprintf(F, "\"");
+ fprintf(F, "edge: { sourcename: \""); PRINT_ENTID(ent);
+ fprintf(F, "\" targetname: \""); PRINT_NODEID(irn); fprintf(F, "\"");
vfprintf(F, fmt, ap);
fprintf(F,"}\n");
va_end(ap);
}
/**
- * prints the edge from a type E to an enumeration item item with additional info fmt, ...
- * to the file F
+ * Prints the edge from a type tp to an enumeration item item with additional info fmt, ...
+ * to the file F.
*/
-static void print_enum_item_edge(FILE *F, ir_type *E, int item, const char *fmt, ...)
+static void print_enum_item_edge(FILE *F, const ir_type *tp, int item, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
- fprintf(F, "edge: { sourcename: "); PRINT_TYPEID(E);
- fprintf(F, " targetname: \""); PRINT_ITEMID(E, item); fprintf(F, "\" ");
+ fprintf(F, "edge: { sourcename: "); PRINT_TYPEID(tp);
+ fprintf(F, " targetname: \""); PRINT_ITEMID(tp, item); fprintf(F, "\" ");
vfprintf(F, fmt, ap);
fprintf(F,"}\n");
va_end(ap);
/*-----------------------------------------------------------------*/
static void dump_whole_node(ir_node *n, void *env);
-static INLINE void dump_loop_nodes_into_graph(FILE *F, ir_graph *irg);
+static inline void dump_loop_nodes_into_graph(FILE *F, ir_graph *irg);
/*-----------------------------------------------------------------*/
/* Helper functions. */
/**
* Returns the private link field.
*/
-static void *ird_get_irn_link(ir_node *n) {
+static void *ird_get_irn_link(const ir_node *n) {
void *res = NULL;
- if (!irdump_link_map) return NULL;
+ if (irdump_link_map == NULL)
+ return NULL;
- if (pmap_contains(irdump_link_map, (void *)n))
- res = pmap_get(irdump_link_map, (void *)n);
+ if (pmap_contains(irdump_link_map, n))
+ res = pmap_get(irdump_link_map, n);
return res;
}
/**
* Sets the private link field.
*/
-static void ird_set_irn_link(ir_node *n, void *x) {
- if (!irdump_link_map)
+static void ird_set_irn_link(const ir_node *n, void *x) {
+ if (irdump_link_map == NULL)
init_irdump();
- pmap_insert(irdump_link_map, (void *)n, x);
+ pmap_insert(irdump_link_map, n, x);
}
/**
* Gets the private link field of an irg.
*/
-static void *ird_get_irg_link(ir_graph *irg) {
+static void *ird_get_irg_link(const ir_graph *irg) {
void *res = NULL;
- if (!irdump_link_map) return NULL;
+ if (irdump_link_map == NULL)
+ return NULL;
- if (pmap_contains(irdump_link_map, (void *)irg))
- res = pmap_get(irdump_link_map, (void *)irg);
+ if (pmap_contains(irdump_link_map, irg))
+ res = pmap_get(irdump_link_map, irg);
return res;
}
/**
* Sets the private link field of an irg.
*/
-static void ird_set_irg_link(ir_graph *irg, void *x) {
- if (!irdump_link_map) init_irdump();
- pmap_insert(irdump_link_map, (void *)irg, x);
+static void ird_set_irg_link(const ir_graph *irg, void *x) {
+ if (irdump_link_map == NULL)
+ init_irdump();
+ pmap_insert(irdump_link_map, irg, x);
}
/**
* Walker, clears the private link field.
*/
-static void clear_link(ir_node * node, void * env) {
+static void clear_link(ir_node *node, void *env) {
+ (void) env;
ird_set_irn_link(node, NULL);
}
* If the entity has a ld_name, returns it if the dump_ld_name is set,
* else returns the name of the entity.
*/
-static const char *_get_ent_dump_name(ir_entity *ent, int dump_ld_name) {
- if (!ent)
+static const char *_get_ent_dump_name(const ir_entity *ent, int dump_ld_name) {
+ if (ent == NULL)
return "<NULL entity>";
if (dump_ld_name) {
/* Don't use get_entity_ld_ident (ent) as it computes the mangled name! */
- if (ent->ld_name) return get_id_str(ent->ld_name);
+ if (ent->ld_name != NULL)
+ return get_id_str(ent->ld_name);
}
return get_id_str(ent->name);
}
* If the entity has a ld_name, returns it if the option dump_ld_name is set,
* else returns the name of the entity.
*/
-const char *get_ent_dump_name(ir_entity *ent) {
+const char *get_ent_dump_name(const ir_entity *ent) {
return _get_ent_dump_name(ent, dump_ld_name);
}
/* Returns the name of an IRG. */
-const char *get_irg_dump_name(ir_graph *irg) {
+const char *get_irg_dump_name(const ir_graph *irg) {
/* Don't use get_entity_ld_ident (ent) as it computes the mangled name! */
return _get_ent_dump_name(get_irg_entity(irg), 1);
}
/**
* Returns non-zero if a node is in floating state.
*/
-static int node_floats(ir_node *n) {
+static int node_floats(const ir_node *n) {
return ((get_irn_pinned(n) == op_pin_state_floats) &&
(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);
- }
- }
+ if (dump_anchors || (dump_new_edges_flag && edges_activated(irg))) {
+ irg_walk_anchors(irg, pre, post, env);
+ } else {
+ irg_walk_graph(irg, pre, post, env);
}
}
/**
* Walker, allocates an array for all blocks and puts it's nodes non-floating nodes into this array.
*/
-static void collect_node(ir_node * node, void *env) {
+static void collect_node(ir_node *node, void *env) {
+ (void) env;
if (is_Block(node)
|| node_floats(node)
- || get_irn_op(node) == op_Bad
- || get_irn_op(node) == op_Unknown
- || get_irn_op(node) == op_NoMem) {
+ || (get_op_flags(get_irn_op(node)) & irop_flag_dump_noblock)) {
ir_node ** arr = (ir_node **) ird_get_irg_link(get_irn_irg(node));
if (!arr) arr = NEW_ARR_F(ir_node *, 0);
ARR_APP1(ir_node *, arr, node);
*/
static ir_node **construct_block_lists(ir_graph *irg) {
int i;
+#ifdef INTERPROCEDURAL_VIEW
int rem_view = get_interprocedural_view();
- int walk_flag = using_visited(irg);
+#endif
+ int walk_flag = ir_resources_reserved(irg) & IR_RESOURCE_IRN_VISITED;
ir_graph *rem = current_ir_graph;
current_ir_graph = irg;
- if(walk_flag)
- clear_using_visited(current_ir_graph);
+ if(walk_flag) {
+ ir_free_resources(irg, IR_RESOURCE_IRN_VISITED);
+ }
for (i = get_irp_n_irgs() - 1; i >= 0; --i)
ird_set_irg_link(get_irp_irg(i), NULL);
ird_walk_graph(current_ir_graph, clear_link, collect_node, current_ir_graph);
+#ifdef INTERPROCEDURAL_VIEW
/* Collect also EndReg and EndExcept. We do not want to change the walker. */
set_interprocedural_view(0);
+#endif
set_irg_visited(current_ir_graph, get_irg_visited(current_ir_graph)-1);
irg_walk(get_irg_end_reg(current_ir_graph), clear_link, collect_node, current_ir_graph);
set_irg_visited(current_ir_graph, get_irg_visited(current_ir_graph)-1);
irg_walk(get_irg_end_except(current_ir_graph), clear_link, collect_node, current_ir_graph);
+#ifdef INTERPROCEDURAL_VIEW
set_interprocedural_view(rem_view);
+#endif
- if(walk_flag)
- set_using_visited(current_ir_graph);
+ if (walk_flag) {
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED);
+ }
current_ir_graph = rem;
return ird_get_irg_link(irg);
ir_node **blk_list = construct_block_lists(irg);
int i;
ir_graph *rem = current_ir_graph;
- list_tuple *lists = xmalloc(sizeof(*lists));
+ list_tuple *lists = XMALLOC(list_tuple);
current_ir_graph = irg;
/* implementation for default nodes */
switch (get_irn_opcode(n)) {
-
- case iro_Const: {
- int res;
- char buf[1024];
- res = tarval_snprintf(buf, sizeof(buf), get_Const_tarval(n));
- assert(res < sizeof(buf) && "buffer to small for tarval_snprintf");
- fprintf(F, buf);
- } break;
-
- case iro_SymConst: {
+ case iro_SymConst:
switch (get_SymConst_kind(n)) {
case symconst_addr_name:
/* don't use get_SymConst_ptr_info as it mangles the name. */
case symconst_enum_const:
fprintf(F, "SymC %s enum", get_enumeration_name(get_SymConst_enum(n)));
break;
+ case symconst_label:
+ fprintf(F, "SymC %lu label", get_SymConst_label(n));
+ break;
}
- } break;
+ break;
- case iro_Filter: {
+ case iro_Filter:
if (!get_interprocedural_view())
fprintf(F, "Proj'");
else
goto default_case;
- } break;
+ break;
case iro_Proj: {
ir_node *pred = get_Proj_pred(n);
if (get_irn_opcode(pred) == iro_Cond
- && get_Proj_proj(n) == get_Cond_defaultProj(pred)
+ && get_Proj_proj(n) == get_Cond_default_proj(pred)
&& get_irn_mode(get_Cond_selector(pred)) != mode_b)
fprintf(F, "defProj");
else
case iro_Start:
case iro_End:
case iro_EndExcept:
- case iro_EndReg: {
+ case iro_EndReg:
if (get_interprocedural_view()) {
fprintf(F, "%s %s", get_irn_opname(n), get_ent_dump_name(get_irg_entity(get_irn_irg(n))));
break;
} else
goto default_case;
- }
+
case iro_CallBegin: {
ir_node *addr = get_CallBegin_ptr(n);
ir_entity *ent = NULL;
- if (get_irn_op(addr) == op_Sel)
+ if (is_Sel(addr))
ent = get_Sel_entity(addr);
- else if ((get_irn_op(addr) == op_SymConst) && (get_SymConst_kind(addr) == symconst_addr_ent))
- ent = get_SymConst_entity(addr);
+ else if (is_Global(addr))
+ ent = get_Global_entity(addr);
fprintf(F, "%s", get_irn_opname(n));
if (ent) fprintf(F, " %s", get_entity_name(ent));
break;
}
case iro_Load:
+ if (get_Load_align(n) == align_non_aligned)
+ fprintf(F, "ua");
fprintf(F, "%s[%s]", get_irn_opname(n), get_mode_name_ex(get_Load_mode(n), &bad));
break;
+ case iro_Store:
+ if (get_Store_align(n) == align_non_aligned)
+ fprintf(F, "ua");
+ fprintf(F, "%s", get_irn_opname(n));
+ break;
case iro_Block:
- fprintf(F, "%s%s", is_Block_dead(n) ? "Dead " : "", get_irn_opname(n));
+ fprintf(F, "%s%s%s",
+ is_Block_dead(n) ? "Dead " : "", get_irn_opname(n),
+ dump_block_marker ? (get_Block_mark(n) ? "*" : "") : "");
break;
case iro_Conv:
if (get_Conv_strict(n))
fprintf(F, "strict");
fprintf(F, "%s", get_irn_opname(n));
break;
+ case iro_Div:
+ fprintf(F, "%s", get_irn_opname(n));
+ if (get_Div_no_remainder(n))
+ fprintf(F, "RL");
+ fprintf(F, "[%s]", get_mode_name_ex(get_Div_resmode(n), &bad));
+ break;
+ case iro_Mod:
+ fprintf(F, "%s[%s]", get_irn_opname(n), get_mode_name_ex(get_Mod_resmode(n), &bad));
+ break;
+ case iro_DivMod:
+ fprintf(F, "%s[%s]", get_irn_opname(n), get_mode_name_ex(get_DivMod_resmode(n), &bad));
+ break;
+ case iro_Builtin:
+ fprintf(F, "%s[%s]", get_irn_opname(n), get_builtin_kind_name(get_Builtin_kind(n)));
+ break;
default:
default_case:
*/
static int dump_node_mode(FILE *F, ir_node *n)
{
- int bad = 0;
+ int bad = 0;
const ir_op_ops *ops = get_op_ops(get_irn_op(n));
- ir_opcode iro;
+ ir_opcode iro;
+ ir_mode *mode;
/* call the dump_node operation if available */
if (ops->dump_node)
case iro_Jmp:
case iro_NoMem:
break;
- default: {
- ir_mode *mode = get_irn_mode(n);
+ default:
+ mode = get_irn_mode(n);
- if (mode && mode != mode_BB && mode != mode_ANY && mode != mode_BAD &&
+ if (mode != NULL && mode != mode_BB && mode != mode_ANY && mode != mode_BAD &&
(mode != mode_T || iro == iro_Proj))
fprintf(F, "%s", get_mode_name_ex(mode, &bad));
}
- }
-
return bad;
}
#define X(a) { pn_Start_##a, #a }
X(X_initial_exec),
X(P_frame_base),
- X(P_globals),
X(P_tls),
X(T_args),
- X(P_value_arg_base)
#undef X
};
}
break;
+ case iro_Const:
+ ir_fprintf(F, "%T ", get_Const_tarval(n));
+ break;
+
case iro_Proj:
pred = get_Proj_pred(n);
proj_nr = get_Proj_proj(n);
#include "execution_frequency.h"
static void dump_node_ana_vals(FILE *F, ir_node *n) {
+ (void) F;
+ (void) n;
return;
+#ifdef INTERPROCEDURAL_VIEW
fprintf(F, " %lf*(%2.0lf + %2.0lf) = %2.0lf ",
get_irn_exec_freq(n),
get_irg_method_execution_frequency(get_irn_irg(n)),
pow(5, get_irg_recursion_depth(get_irn_irg(n))),
get_irn_exec_freq(n) * (get_irg_method_execution_frequency(get_irn_irg(n)) + pow(5, get_irg_recursion_depth(get_irn_irg(n))))
);
+#endif
}
fprintf(F, " ");
bad |= dump_node_typeinfo(F, n);
bad |= dump_node_nodeattr(F, n);
- fprintf(F, "%ld:%d", get_irn_node_nr(n), get_irn_idx(n));
+ if(dump_node_idx_labels) {
+ fprintf(F, "%ld:%d", get_irn_node_nr(n), get_irn_idx(n));
+ } else {
+ fprintf(F, "%ld", get_irn_node_nr(n));
+ }
return bad;
}
-
/**
* Dumps the attributes of a node n into the file F.
* Currently this is only the color of a node.
*/
static void dump_node_vcgattr(FILE *F, ir_node *node, ir_node *local, int bad)
{
+ ir_mode *mode;
ir_node *n;
if (bad) {
- print_vcg_color(F, ird_color_red);
+ print_vcg_color(F, ird_color_error);
return;
}
n = local ? local : node;
- if (overrule_nodecolor != ird_color_default) {
+ if (overrule_nodecolor != ird_color_default_node) {
print_vcg_color(F, overrule_nodecolor);
return;
}
+ mode = get_irn_mode(n);
+ if(mode == mode_M) {
+ print_vcg_color(F, ird_color_memory);
+ return;
+ }
+ if(mode == mode_X) {
+ print_vcg_color(F, ird_color_controlflow);
+ return;
+ }
+
switch (get_irn_opcode(n)) {
case iro_Start:
case iro_EndReg:
- /* fall through */
case iro_EndExcept:
- /* fall through */
case iro_End:
- print_vcg_color(F, ird_color_blue);
+ print_vcg_color(F, ird_color_anchor);
+ break;
+ case iro_Bad:
+ print_vcg_color(F, ird_color_error);
break;
case iro_Block:
if (is_Block_dead(n))
- print_vcg_color(F, ird_color_lightred);
+ print_vcg_color(F, ird_color_dead_block_background);
else
- print_vcg_color(F, ird_color_lightyellow);
+ print_vcg_color(F, ird_color_block_background);
break;
case iro_Phi:
- print_vcg_color(F, ird_color_green);
- break;
- case iro_Mux:
- case iro_Psi:
- print_vcg_color(F, ird_color_gold);
+ print_vcg_color(F, ird_color_phi);
break;
case iro_Pin:
- print_vcg_color(F, ird_color_orchid);
+ print_vcg_color(F, ird_color_memory);
break;
+ case iro_SymConst:
case iro_Const:
- case iro_Proj:
- case iro_Filter:
- case iro_Tuple:
- print_vcg_color(F, ird_color_yellow);
+ print_vcg_color(F, ird_color_const);
break;
- case iro_ASM:
- print_vcg_color(F, ird_color_darkyellow);
+ case iro_Proj:
+ print_vcg_color(F, ird_color_proj);
break;
- default:
- PRINT_DEFAULT_NODE_ATTR;
+ default: {
+ ir_op *op = get_irn_op(node);
+
+ if(is_op_constlike(op)) {
+ print_vcg_color(F, ird_color_const);
+ } else if(is_op_uses_memory(op)) {
+ print_vcg_color(F, ird_color_uses_memory);
+ } else if(is_op_cfopcode(op) || is_op_forking(op)) {
+ print_vcg_color(F, ird_color_controlflow);
+ } else {
+ PRINT_DEFAULT_NODE_ATTR;
+ }
+ }
}
}
/* 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));
+ hook_entry_t *info = XMALLOC(hook_entry_t);
info->hook._hook_node_info = cb;
info->context = data;
/**
* Dump the node information of a node n to a file F.
*/
-static INLINE int dump_node_info(FILE *F, ir_node *n)
+static inline int dump_node_info(FILE *F, ir_node *n)
{
int bad = 0;
const ir_op_ops *ops = get_op_ops(get_irn_op(n));
return bad;
}
-/**
- * checks whether a node is "constant-like" ie can be treated "block-less"
- */
-static INLINE
-int is_constlike_node(ir_node *n) {
- ir_opcode code = get_irn_opcode(n);
- return (code == iro_Const || code == iro_Bad || code == iro_NoMem || code == iro_SymConst || code == iro_Unknown);
+static inline int is_constlike_node(const ir_node *node)
+{
+ const ir_op *op = get_irn_op(node);
+ return is_op_constlike(op);
}
for (i = 0; i < get_irn_arity(n); i++) {
ir_node *con = get_irn_n(n, i);
- if (is_constlike_node(con) && irn_not_visited(con)) {
+ if (is_constlike_node(con) && !irn_visited(con)) {
int bad = 0;
mark_irn_visited(con);
return;
/* dump this node */
- fprintf(F, "node: {title: \""); PRINT_NODEID(n); fprintf(F, "\" label: \"");
+ fputs("node: {title: \"", F);
+ PRINT_NODEID(n);
+ fputs("\"", F);
+ fputs(" label: \"", F);
bad = ! irn_vrfy_irg_dump(n, current_ir_graph, &p);
bad |= dump_node_label(F, n);
dump_node_ana_vals(F, n);
//dump_node_ana_info(F, n);
- fprintf(F, "\" ");
+ fputs("\" ", F);
+
+ if (get_op_flags(get_irn_op(n)) & irop_flag_dump_noinput) {
+ //fputs(" node_class:23", F);
+ }
+
bad |= dump_node_info(F, n);
print_node_error(F, p);
print_dbg_info(F, get_irn_dbg_info(n));
dump_node_vcgattr(F, n, NULL, bad);
- fprintf(F, "}\n");
+ fputs("}\n", F);
dump_const_node_local(F, n);
if(dump_node_edge_hook)
dump_node_edge_hook(F, n);
-#if DO_HEAPANALYSIS
- dump_irn_chi_term(F, n);
- dump_irn_state(F, n);
-#endif
}
/** dump the edge to the block this node belongs to */
fprintf(F, INTER_MEM_EDGE_ATTR);
}
-static void
-print_edge_vcgattr(FILE *F, ir_node *from, int to) {
+/** Print the vcg attributes for the edge from node from to it's to's input */
+static void print_edge_vcgattr(FILE *F, ir_node *from, int to) {
assert(from);
if (dump_edge_vcgattr_hook)
case iro_End:
if (to >= 0) {
if (get_irn_mode(get_End_keepalive(from, to)) == mode_BB)
- fprintf(F, CF_EDGE_ATTR);
- if (get_irn_mode(get_End_keepalive(from, to)) == mode_X)
- fprintf(F, INTER_MEM_EDGE_ATTR);
+ fprintf(F, KEEP_ALIVE_CF_EDGE_ATTR);
+ else
+ fprintf(F, KEEP_ALIVE_DF_EDGE_ATTR);
}
break;
default:
}
}
-/* dump edges to our inputs */
-static void
-dump_ir_data_edges(FILE *F, ir_node *n) {
- int i;
- unsigned long visited = get_irn_visited(n);
+/** dump edges to our inputs */
+static void dump_ir_data_edges(FILE *F, ir_node *n) {
+ int i, num;
+ ir_visited_t visited = get_irn_visited(n);
- if ((get_irn_op(n) == op_End) && (!dump_keepalive))
+ if (!dump_keepalive && is_End(n)) {
+ /* the End node has only keep-alive edges */
return;
+ }
/* dump the dependency edges. */
- for (i = 0; i < get_irn_deps(n); ++i) {
+ num = get_irn_deps(n);
+ for (i = 0; i < num; ++i) {
ir_node *dep = get_irn_dep(n, i);
- if(dep) {
+ if (dep) {
fprintf(F, "edge: {sourcename: \"");
PRINT_NODEID(n);
fprintf(F, "\" targetname: ");
}
}
- for (i = 0; i < get_irn_arity(n); i++) {
- ir_node * pred = get_irn_n(n, i);
+ num = get_irn_arity(n);
+ for (i = 0; i < num; i++) {
+ ir_node *pred = get_irn_n(n, i);
assert(pred);
if ((get_interprocedural_view() && get_irn_visited(pred) < visited))
print_edge_vcgattr(F, n, i);
fprintf(F, "}\n");
}
+
+ if (dump_macro_block_edges && is_Block(n)) {
+ ir_node *mb = get_Block_MacroBlock(n);
+ fprintf(F, "edge: {sourcename: \"");
+ PRINT_NODEID(n);
+ fprintf(F, "\" targetname: \"");
+ PRINT_NODEID(mb);
+ fprintf(F, "\" label: \"mb\" " MACROBLOCK_EDGE_ATTR);
+ fprintf(F, "}\n");
+ }
}
-/** Dumps a node and its edges but not the block edge
+/**
+ * Dump the ir_edges
*/
-static INLINE void
-dump_node_wo_blockedge(ir_node *n, void *env) {
+static void
+dump_ir_edges(FILE *F, ir_node *n) {
+ const ir_edge_t *edge;
+ int i = 0;
+
+ foreach_out_edge(n, edge) {
+ ir_node *succ = get_edge_src_irn(edge);
+
+ fprintf(F, "edge: {sourcename: \"");
+ PRINT_NODEID(n);
+ fprintf(F, "\" targetname: \"");
+ PRINT_NODEID(succ);
+ fprintf(F, "\"");
+
+ fprintf(F, " label: \"%d\" ", i);
+ fprintf(F, OUT_EDGE_ATTR);
+ fprintf(F, "}\n");
+ ++i;
+ }
+}
+
+
+/** Dumps a node and its edges but not the block edge */
+static void dump_node_wo_blockedge(ir_node *n, void *env) {
FILE *F = env;
dump_node(F, n);
dump_ir_data_edges(F, n);
}
-/** Dumps a node and its edges.
- */
-static void
-dump_whole_node(ir_node *n, void *env) {
+/** Dumps a node and its edges. */
+static void dump_whole_node(ir_node *n, void *env) {
FILE *F = env;
dump_node_wo_blockedge(n, env);
- if (!node_floats(n)) dump_ir_block_edge(F, n);
+ if (!node_floats(n))
+ dump_ir_block_edge(F, n);
+ if (dump_new_edges_flag && edges_activated(current_ir_graph))
+ dump_ir_edges(F, n);
}
-static void
-dump_const_node(ir_node *n, void *env) {
+/** Dumps a const-like node. */
+static void dump_const_node(ir_node *n, void *env) {
if (is_Block(n)) return;
dump_node_wo_blockedge(n, env);
}
* Expects to find nodes belonging to the block as list in its
* link field.
* Dumps the edges of all nodes including itself. */
-static void
-dump_whole_block(FILE *F, ir_node *block) {
+static void dump_whole_block(FILE *F, ir_node *block) {
ir_node *node;
- dumper_colors color = ird_color_yellow;
+ ird_color_t color = ird_color_block_background;
assert(is_Block(block));
PRINT_NODEID(block);
fprintf(F, "\" label: \"");
dump_node_label(F, block);
-#if DO_HEAPANALYSIS
- if (get_opt_dump_abstvals())
- fprintf(F, " seqno: %d", (int)get_Block_seqno(block));
-#endif
/* colorize blocks */
if (! get_Block_matured(block))
- color = ird_color_red;
+ color = ird_color_block_background;
if (is_Block_dead(block))
- color = ird_color_orange;
+ color = ird_color_dead_block_background;
fprintf(F, "\" status:clustered ");
print_vcg_color(F, color);
/* Close the vcg information for the block */
fprintf(F, "}\n");
dump_const_node_local(F, block);
-#if DO_HEAPANALYSIS
- dump_irn_chi_term(F, block);
-#endif
fprintf(F, "\n");
}
}
dump_ir_data_edges(F, node);
}
+ if (dump_new_edges_flag && edges_activated(irg))
+ dump_ir_edges(F, node);
}
if (dump_loop_information_flag && (get_irg_loopinfo_state(irg) & loopinfo_valid))
fprintf(F, "graph: { title: \"");
PRINT_IRGID(irg);
- fprintf(F, "\" label: \"%s\" status:clustered color:white \n",
- get_ent_dump_name(ent));
+ fprintf(F, "\" label: \"%s\" status:clustered color:%s \n",
+ get_ent_dump_name(ent), color_names[ird_color_prog_background]);
dump_graph_info(F, irg);
print_dbg_info(F, get_entity_dbg_info(ent));
}
-void dump_entity_node(FILE *F, ir_entity *ent, int color)
+void dump_entity_node(FILE *F, ir_entity *ent)
{
fprintf(F, "node: {title: \"");
PRINT_ENTID(ent); fprintf(F, "\"");
fprintf(F, DEFAULT_TYPE_ATTRIBUTE);
fprintf(F, "label: ");
- fprintf(F, "\"ent %s\" ", get_ent_dump_name(ent));
- if (color)
- fprintf(F, "color:%d", color);
- else
- fprintf(F, ENTITY_NODE_ATTR);
+ fprintf(F, "\"%s\" ", get_ent_dump_name(ent));
+
+ print_vcg_color(F, ird_color_entity);
fprintf(F, "\n info1: \"");
dump_entity_to_file(F, ent, dump_verbosity_entattrs | dump_verbosity_entconsts);
fprintf(F, "\n info1: \"value: %s\"}\n", buf);
}
-/* dumps a type or entity and it's edges. */
-static void
-dump_type_info(type_or_ent *tore, void *env) {
+/**
+ * Dumps a new style initializer.
+ */
+static void dump_entity_initializer(FILE *F, const ir_entity *ent) {
+
+}
+
+/** Dumps a type or entity and it's edges. */
+static void dump_type_info(type_or_ent tore, void *env) {
FILE *F = env;
int i = 0; /* to shutup gcc */
/* dump this type or entity */
- switch (get_kind(tore)) {
+ switch (get_kind(tore.ent)) {
case k_entity: {
- ir_entity *ent = (ir_entity *)tore;
+ ir_entity *ent = tore.ent;
ir_node *value;
/* The node */
- dump_entity_node(F, ent, 0);
+ dump_entity_node(F, ent);
/* The Edges */
/* skip this to reduce graph. Member edge of type is parallel to this edge. *
fprintf(F, "edge: { sourcename: \"%p\" targetname: \"%p\" "
ENT_OWN_EDGE_ATTR "}\n", ent, get_entity_owner(ent));*/
print_ent_type_edge(F,ent, get_entity_type(ent), ENT_TYPE_EDGE_ATTR);
if (is_Class_type(get_entity_owner(ent))) {
- for(i = 0; i < get_entity_n_overwrites(ent); i++)
- print_ent_ent_edge(F,ent, get_entity_overwrites(ent, i), 0, ENT_OVERWRITES_EDGE_ATTR);
+ for (i = get_entity_n_overwrites(ent) - 1; i >= 0; --i)
+ print_ent_ent_edge(F,ent, get_entity_overwrites(ent, i), 0, -1, ENT_OVERWRITES_EDGE_ATTR);
}
/* attached subgraphs */
if (const_entities && (get_entity_variability(ent) != variability_uninitialized)) {
}
}
if (is_compound_entity(ent)) {
- for (i = 0; i < get_compound_ent_n_values(ent); i++) {
- value = get_compound_ent_value(ent, i);
- if (value) {
- print_ent_node_edge(F, ent, value, ENT_VALUE_EDGE_ATTR, i);
- dump_const_expression(F, value);
- print_ent_ent_edge(F, ent, get_compound_ent_value_member(ent, i), 0, ENT_CORR_EDGE_ATTR, i);
- /*
- fprintf(F, "edge: { sourcename: \"%p\" targetname: \"%p\" "
- ENT_CORR_EDGE_ATTR "}\n", GET_ENTID(ent),
- get_compound_ent_value_member(ent, i), i);
- */
+ if (has_entity_initializer(ent)) {
+ /* new style initializers */
+ dump_entity_initializer(F, ent);
+ } else {
+ /* old style compound entity values */
+ for (i = get_compound_ent_n_values(ent) - 1; i >= 0; --i) {
+ value = get_compound_ent_value(ent, i);
+ if (value) {
+ print_ent_node_edge(F, ent, value, ENT_VALUE_EDGE_ATTR, i);
+ dump_const_expression(F, value);
+ print_ent_ent_edge(F, ent, get_compound_ent_value_member(ent, i), 0, -1, ENT_CORR_EDGE_ATTR, i);
+ /*
+ fprintf(F, "edge: { sourcename: \"%p\" targetname: \"%p\" "
+ ENT_CORR_EDGE_ATTR "}\n", GET_ENTID(ent),
+ get_compound_ent_value_member(ent, i), i);
+ */
+ }
}
}
}
break;
}
case k_type: {
- ir_type *tp = (ir_type *)tore;
+ ir_type *tp = tore.typ;
dump_type_node(F, tp);
/* and now the edges */
switch (get_type_tpop_code(tp)) {
case tpo_class:
- for (i=0; i < get_class_n_supertypes(tp); i++)
- print_type_type_edge(F, tp,get_class_supertype(tp, i),TYPE_SUPER_EDGE_ATTR);
- for (i=0; i < get_class_n_members(tp); i++)
- print_type_ent_edge(F,tp,get_class_member(tp, i),TYPE_MEMBER_EDGE_ATTR);
+ for (i = get_class_n_supertypes(tp) - 1; i >= 0; --i)
+ print_type_type_edge(F, tp, get_class_supertype(tp, i), TYPE_SUPER_EDGE_ATTR);
+ for (i = get_class_n_members(tp) - 1; i >= 0; --i)
+ print_type_ent_edge(F, tp, get_class_member(tp, i), TYPE_MEMBER_EDGE_ATTR);
break;
case tpo_struct:
- for (i=0; i < get_struct_n_members(tp); i++)
- print_type_ent_edge(F,tp,get_struct_member(tp, i),TYPE_MEMBER_EDGE_ATTR);
+ for (i = get_struct_n_members(tp) - 1; i >= 0; --i)
+ print_type_ent_edge(F, tp, get_struct_member(tp, i), TYPE_MEMBER_EDGE_ATTR);
break;
case tpo_method:
- for (i = 0; i < get_method_n_params(tp); i++)
- print_type_type_edge(F,tp,get_method_param_type(tp, i),METH_PAR_EDGE_ATTR,i);
- for (i = 0; i < get_method_n_ress(tp); i++)
- print_type_type_edge(F,tp,get_method_res_type(tp, i),METH_RES_EDGE_ATTR,i);
+ for (i = get_method_n_params(tp) - 1; i >= 0; --i)
+ print_type_type_edge(F, tp, get_method_param_type(tp, i), METH_PAR_EDGE_ATTR,i);
+ for (i = get_method_n_ress(tp) - 1; i >= 0; --i)
+ print_type_type_edge(F, tp, get_method_res_type(tp, i), METH_RES_EDGE_ATTR,i);
break;
case tpo_union:
- for (i = 0; i < get_union_n_members(tp); i++)
- print_type_ent_edge(F,tp,get_union_member(tp, i),UNION_EDGE_ATTR);
+ for (i = get_union_n_members(tp) - 1; i >= 0; --i)
+ print_type_ent_edge(F, tp, get_union_member(tp, i), UNION_EDGE_ATTR);
break;
case tpo_array:
- print_type_type_edge(F,tp,get_array_element_type(tp),ARR_ELT_TYPE_EDGE_ATTR);
- print_type_ent_edge(F,tp,get_array_element_entity(tp),ARR_ENT_EDGE_ATTR);
- for (i = 0; i < get_array_n_dimensions(tp); i++) {
+ print_type_type_edge(F, tp, get_array_element_type(tp), ARR_ELT_TYPE_EDGE_ATTR);
+ print_type_ent_edge(F, tp, get_array_element_entity(tp), ARR_ENT_EDGE_ATTR);
+ for (i = get_array_n_dimensions(tp) - 1; i >= 0; --i) {
ir_node *upper = get_array_upper_bound(tp, i);
ir_node *lower = get_array_lower_bound(tp, i);
print_node_type_edge(F, upper, tp, "label: \"upper %d\"", get_array_order(tp, i));
}
break;
case tpo_enumeration:
- for (i = 0; i < get_enumeration_n_enums(tp); ++i) {
+ for (i = get_enumeration_n_enums(tp) - 1; i >= 0; --i) {
dump_enum_item(F, tp, i);
print_enum_item_edge(F, tp, i, "label: \"item %d\"", i);
}
break;
case tpo_pointer:
- print_type_type_edge(F,tp,get_pointer_points_to_type(tp), PTR_PTS_TO_EDGE_ATTR);
+ print_type_type_edge(F, tp, get_pointer_points_to_type(tp), PTR_PTS_TO_EDGE_ATTR);
break;
case tpo_primitive:
break;
* If env->dump_ent dumps entities of classes and overwrites edges.
*/
static void
-dump_class_hierarchy_node(type_or_ent *tore, void *ctx) {
+dump_class_hierarchy_node(type_or_ent tore, void *ctx) {
h_env_t *env = ctx;
FILE *F = env->f;
int i = 0; /* to shutup gcc */
/* dump this type or entity */
- switch (get_kind(tore)) {
+ switch (get_kind(tore.ent)) {
case k_entity: {
- ir_entity *ent = (ir_entity *)tore;
+ ir_entity *ent = tore.ent;
if (get_entity_owner(ent) == get_glob_type()) break;
- if (!is_Method_type(get_entity_type(ent))) break; /* GL */
+ if (!is_Method_type(get_entity_type(ent)))
+ break; /* GL */
if (env->dump_ent && is_Class_type(get_entity_owner(ent))) {
/* The node */
- dump_entity_node(F, ent, 0);
+ dump_entity_node(F, ent);
/* The edges */
- print_type_ent_edge(F,get_entity_owner(ent),ent,TYPE_MEMBER_EDGE_ATTR);
- for(i = 0; i < get_entity_n_overwrites(ent); i++)
- print_ent_ent_edge(F, get_entity_overwrites(ent, i), ent, 0, ENT_OVERWRITES_EDGE_ATTR);
+ print_type_ent_edge(F, get_entity_owner(ent), ent, TYPE_MEMBER_EDGE_ATTR);
+ for (i = get_entity_n_overwrites(ent) - 1; i >= 0; --i)
+ print_ent_ent_edge(F, get_entity_overwrites(ent, i), ent, 0, -1, ENT_OVERWRITES_EDGE_ATTR);
}
break;
}
case k_type: {
- ir_type *tp = (ir_type *)tore;
- if (tp == get_glob_type()) break;
+ ir_type *tp = tore.typ;
+ if (tp == get_glob_type())
+ break;
switch (get_type_tpop_code(tp)) {
case tpo_class:
dump_type_node(F, tp);
/* and now the edges */
- for (i=0; i < get_class_n_supertypes(tp); i++) {
+ for (i = get_class_n_supertypes(tp) - 1; i >= 0; --i) {
print_type_type_edge(F,tp,get_class_supertype(tp, i),TYPE_SUPER_EDGE_ATTR);
}
break;
dump_out_edge(ir_node *n, void *env) {
FILE *F = env;
int i;
- for (i = 0; i < get_irn_n_outs(n); i++) {
- assert(get_irn_out(n, i));
+ for (i = get_irn_n_outs(n) - 1; i >= 0; --i) {
+ ir_node *succ = get_irn_out(n, i);
+ assert(succ);
fprintf(F, "edge: {sourcename: \"");
PRINT_NODEID(n);
fprintf(F, "\" targetname: \"");
- PRINT_NODEID(get_irn_out(n, i));
+ PRINT_NODEID(succ);
fprintf(F, "\" color: red linestyle: dashed");
fprintf(F, "}\n");
}
}
-static INLINE void
+static inline void
dump_loop_label(FILE *F, ir_loop *loop) {
fprintf(F, "loop %d, %d sons, %d nodes",
get_loop_depth(loop), get_loop_n_sons(loop), get_loop_n_nodes(loop));
}
-static INLINE void dump_loop_info(FILE *F, ir_loop *loop) {
+static inline void dump_loop_info(FILE *F, ir_loop *loop) {
fprintf(F, " info1: \"");
fprintf(F, " loop nr: %d", get_loop_loop_nr(loop));
#ifdef DEBUG_libfirm /* GL @@@ debug analyses */
fprintf(F, "\"");
}
-static INLINE void
+static inline void
dump_loop_node(FILE *F, ir_loop *loop) {
fprintf(F, "node: {title: \"");
PRINT_LOOPID(loop);
fprintf(F, "}\n");
}
-static INLINE void
+static inline void
dump_loop_node_edge(FILE *F, ir_loop *loop, int i) {
assert(loop);
fprintf(F, "edge: {sourcename: \"");
fprintf(F, "}\n");
}
-static INLINE void
+static inline void
dump_loop_son_edge(FILE *F, ir_loop *loop, int i) {
assert(loop);
fprintf(F, "edge: {sourcename: \"");
/* dump edges to nodes in loop -- only if it is a real loop */
if (get_loop_depth(loop) != 0) {
- for (i = 0; i < get_loop_n_nodes(loop); i++) {
+ for (i = get_loop_n_nodes(loop) - 1; i >= 0; --i) {
dump_loop_node_edge(F, loop, i);
}
}
- for (i = 0; i < get_loop_n_sons(loop); i++) {
+ for (i = get_loop_n_sons(loop) - 1; i >= 0; --i) {
dump_loops(F, get_loop_son(loop, i));
dump_loop_son_edge(F, loop, i);
}
}
-static INLINE
+static inline
void dump_loop_nodes_into_graph(FILE *F, ir_graph *irg) {
- ir_graph *rem = current_ir_graph;
- current_ir_graph = irg;
+ ir_loop *loop = get_irg_loop(irg);
- if (get_irg_loop(irg)) dump_loops(F, get_irg_loop(irg));
+ if (loop != NULL) {
+ ir_graph *rem = current_ir_graph;
+ current_ir_graph = irg;
- current_ir_graph = rem;
+ dump_loops(F, loop);
+
+ current_ir_graph = rem;
+ }
}
/**
* dumps the VCG header
*/
-void dump_vcg_header(FILE *F, const char *name, const char *orientation) {
+void dump_vcg_header(FILE *F, const char *name, const char *layout, const char *orientation) {
+ int i;
char *label;
- if (edge_label) {
- label = "yes";
- } else {
- label = "no";
- }
+ init_colors();
+ label = edge_label ? "yes" : "no";
+ if (! layout) layout = "Compilergraph";
if (!orientation) orientation = "bottom_to_top";
/* print header */
fprintf(F,
"graph: { title: \"ir graph of %s\"\n"
"display_edge_labels: %s\n"
- "layoutalgorithm: mindepth\n"
+ "layoutalgorithm: mindepth //$ \"%s\"\n"
"manhattan_edges: yes\n"
"port_sharing: no\n"
"orientation: %s\n"
"classname 17: \"interblock Memory\"\n"
"classname 18: \"Exception Control Flow for Interval Analysis\"\n"
"classname 19: \"Postdominators\"\n"
+ "classname 20: \"Keep Alive\"\n"
+ "classname 21: \"Out Edges\"\n"
+ "classname 22: \"Macro Block Edges\"\n"
+ //"classname 23: \"NoInput Nodes\"\n"
"infoname 1: \"Attribute\"\n"
"infoname 2: \"Verification errors\"\n"
"infoname 3: \"Debug info\"\n",
- name, label, orientation);
-
- /* don't use all, the range is too whith/black. */
- n_colors = 18;
- base_color = 105;
- fprintf(F,
- "colorentry 100: 0 0 0\n"
- "colorentry 101: 20 0 0\n"
- "colorentry 102: 40 0 0\n"
- "colorentry 103: 60 0 0\n"
- "colorentry 104: 80 0 0\n"
- "colorentry 105: 100 0 0\n"
- "colorentry 106: 120 0 0\n"
- "colorentry 107: 140 0 0\n"
- "colorentry 108: 150 0 0\n"
- "colorentry 109: 180 0 0\n"
- "colorentry 110: 200 0 0\n"
- "colorentry 111: 220 0 0\n"
- "colorentry 112: 240 0 0\n"
- "colorentry 113: 255 0 0\n"
- "colorentry 113: 255 20 20\n"
- "colorentry 114: 255 40 40\n"
- "colorentry 115: 255 60 60\n"
- "colorentry 116: 255 80 80\n"
- "colorentry 117: 255 100 100\n"
- "colorentry 118: 255 120 120\n"
- "colorentry 119: 255 140 140\n"
- "colorentry 120: 255 150 150\n"
- "colorentry 121: 255 180 180\n"
- "colorentry 122: 255 200 200\n"
- "colorentry 123: 255 220 220\n"
- "colorentry 124: 255 240 240\n"
- "colorentry 125: 255 250 250\n"
- );
+ name, label, layout, orientation);
+ for (i = 0; i < ird_color_count; ++i) {
+ if (color_rgb[i] != NULL) {
+ fprintf(F, "colorentry %s: %s\n", color_names[i], color_rgb[i]);
+ }
+ }
fprintf(F, "\n"); /* a separator */
}
* @param suffix1 first filename suffix
* @param suffix2 second filename suffix
*/
-FILE *vcg_open(ir_graph *irg, const char * suffix1, const char *suffix2) {
+FILE *vcg_open(ir_graph *irg, const char *suffix1, const char *suffix2) {
FILE *F;
const char *nm = get_irg_dump_name(irg);
int len = strlen(nm), i, j;
if (!suffix2) suffix2 = "";
/* open file for vcg graph */
- fname = xmalloc (len * 2 + strlen(suffix1) + strlen(suffix2) + 5);
+ fname = XMALLOCN(char, len * 2 + strlen(suffix1) + strlen(suffix2) + 5);
/* strncpy (fname, nm, len); */ /* copy the filename */
j = 0;
if (!F) {
perror(fname);
}
- free(fname);
+ xfree(fname);
return F;
}
if (!suffix) suffix = "";
/** open file for vcg graph */
- fname = xmalloc(len * 2 + 5 + strlen(suffix));
+ fname = XMALLOCN(char, len * 2 + 5 + strlen(suffix));
/* strcpy (fname, name);*/ /* copy the filename */
j = 0;
for (i = 0; i < len; ++i) { /* replace '/' in the name: escape by @. */
if (!F) {
perror(fname);
}
- free(fname);
+ xfree(fname);
return F;
}
/**
* Dumps the vcg file footer
*/
-static void dump_vcg_footer(FILE *F) {
+void dump_vcg_footer(FILE *F) {
fprintf(F, "}\n");
}
-/**
- * close the vcg file
- */
-void vcg_close(FILE *F) {
- dump_vcg_footer(F); /* print footer */
- fclose (F); /* close vcg file */
-}
-
/************************************************************************/
/************************************************************************/
/* Routines that dump all or parts of the firm representation to a file */
/* Dump ir graphs, different formats and additional information. */
/************************************************************************/
-/** Routine to dump a graph, blocks as conventional nodes. */
-void
-dump_ir_graph(ir_graph *irg, const char *suffix )
+typedef void (*do_dump_graph_func) (ir_graph *irg, FILE *out);
+
+static void do_dump(ir_graph *irg, const char *suffix, const char *suffix_ip,
+ const char *suffix_nonip, do_dump_graph_func dump_func)
{
- FILE *f;
- ir_graph *rem;
- char *suffix1;
+ FILE *out;
+ ir_graph *rem;
+ const char *suffix1;
if (!is_filtered_dump_name(get_entity_ident(get_irg_entity(irg))))
return;
- if (dump_backedge_information_flag && get_irg_loopinfo_state(irg) != loopinfo_consistent) {
- construct_backedges(irg);
- }
-
rem = current_ir_graph;
current_ir_graph = irg;
- if (get_interprocedural_view()) suffix1 = "-pure-ip";
- else suffix1 = "-pure";
- f = vcg_open(irg, suffix, suffix1);
- if (f != NULL) {
- dump_vcg_header(f, get_irg_dump_name(irg), NULL);
+ if (get_interprocedural_view())
+ suffix1 = suffix_ip;
+ else
+ suffix1 = suffix_nonip;
+ current_ir_graph = rem;
- /* call the dump graph hook */
- if (dump_ir_graph_hook)
- if (dump_ir_graph_hook(f, irg)) {
- current_ir_graph = rem;
- return;
- }
+ out = vcg_open(irg, suffix, suffix1);
+ if (out != NULL) {
+ dump_func(irg, out);
+ fclose(out);
+ }
+}
- /* walk over the graph */
- /* dump_whole_node must be called in post visiting predecessors */
- ird_walk_graph(irg, NULL, dump_whole_node, f);
+void dump_ir_graph_file(ir_graph *irg, FILE *out)
+{
+ if (dump_backedge_information_flag
+ && get_irg_loopinfo_state(irg) != loopinfo_consistent) {
+ construct_backedges(irg);
+ }
- /* dump the out edges in a separate walk */
- if ((dump_out_edge_flag) && (get_irg_outs_state(irg) != outs_none)) {
- irg_out_walk(get_irg_start(irg), dump_out_edge, NULL, f);
- }
+ dump_vcg_header(out, get_irg_dump_name(irg), NULL, NULL);
- vcg_close(f);
+ /* call the dump graph hook */
+ if (dump_ir_graph_hook) {
+ if (dump_ir_graph_hook(out, irg)) {
+ return;
+ }
}
- current_ir_graph = rem;
+
+ /* walk over the graph */
+ /* dump_whole_node must be called in post visiting predecessors */
+ ird_walk_graph(irg, NULL, dump_whole_node, out);
+
+ /* dump the out edges in a separate walk */
+ if ((dump_out_edge_flag) && (get_irg_outs_state(irg) != outs_none)) {
+ irg_out_walk(get_irg_start(irg), dump_out_edge, NULL, out);
+ }
+
+ dump_vcg_footer(out);
}
-/* Dump a firm graph without explicit block nodes. */
-void dump_ir_block_graph(ir_graph *irg, const char *suffix)
+/** Routine to dump a graph, blocks as conventional nodes. */
+void dump_ir_graph(ir_graph *irg, const char *suffix )
{
- FILE *f;
- int i;
- char *suffix1;
-
- if (!is_filtered_dump_name(get_entity_ident(get_irg_entity(irg))))
- return;
+ do_dump(irg, suffix, "-pure-ip", "-pure", dump_ir_graph_file);
+}
- if (get_interprocedural_view()) suffix1 = "-ip";
- else suffix1 = "";
- f = vcg_open(irg, suffix, suffix1);
+void dump_ir_block_graph_file(ir_graph *irg, FILE *out)
+{
+ int i;
- if (f != NULL) {
- dump_vcg_header(f, get_irg_dump_name(irg), NULL);
+ dump_vcg_header(out, get_irg_dump_name(irg), NULL, NULL);
- construct_block_lists(irg);
+ construct_block_lists(irg);
- /*
- * If we are in the interprocedural view, we dump not
- * only the requested irg but also all irgs that can be reached
- * from irg.
- */
- for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
- ir_node **arr = ird_get_irg_link(get_irp_irg(i));
- if (arr) {
- dump_graph_from_list(f, get_irp_irg(i));
- DEL_ARR_F(arr);
- }
+ /*
+ * If we are in the interprocedural view, we dump not
+ * only the requested irg but also all irgs that can be reached
+ * from irg.
+ */
+ for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
+ ir_graph *g = get_irp_irg(i);
+ ir_node **arr = ird_get_irg_link(g);
+ if (arr) {
+ dump_graph_from_list(out, g);
+ DEL_ARR_F(arr);
}
-
- vcg_close(f);
}
+
+ dump_vcg_footer(out);
}
-/* Dump a firm graph without explicit block nodes but grouped in extended blocks. */
-void dump_ir_extblock_graph(ir_graph *irg, const char *suffix)
+/* Dump a firm graph without explicit block nodes. */
+void dump_ir_block_graph(ir_graph *irg, const char *suffix)
{
- FILE *F;
- int i;
- char *suffix1;
- ir_entity *ent;
+ do_dump(irg, suffix, "-ip", "", dump_ir_block_graph_file);
+}
- if (!is_filtered_dump_name(get_entity_ident(get_irg_entity(irg))))
- return;
+void dump_ir_extblock_graph_file(ir_graph *irg, FILE *F)
+{
+ int i;
+ ir_entity *ent = get_irg_entity(irg);
if (get_irg_extblk_state(irg) != extblk_valid)
compute_extbb(irg);
- if (get_interprocedural_view()) suffix1 = "-ip";
- else suffix1 = "";
+ dump_vcg_header(F, get_irg_dump_name(irg), NULL, NULL);
- ent = get_irg_entity(irg);
+ construct_extblock_lists(irg);
- F = vcg_open(irg, suffix, suffix1);
- if (F != NULL) {
- dump_vcg_header(F, get_irg_dump_name(irg), NULL);
-
- construct_extblock_lists(irg);
-
- fprintf(F, "graph: { title: \"");
- PRINT_IRGID(irg);
- fprintf(F, "\" label: \"%s\" status:clustered color: white \n",
- get_ent_dump_name(ent));
+ fprintf(F, "graph: { title: \"");
+ PRINT_IRGID(irg);
+ fprintf(F, "\" label: \"%s\" status:clustered color: white \n",
+ get_ent_dump_name(ent));
- dump_graph_info(F, irg);
- print_dbg_info(F, get_entity_dbg_info(ent));
+ dump_graph_info(F, irg);
+ print_dbg_info(F, get_entity_dbg_info(ent));
- for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
- ir_graph *irg = get_irp_irg(i);
- list_tuple *lists = ird_get_irg_link(irg);
-
- if (lists) {
- /* dump the extended blocks first */
- if (ARR_LEN(lists->extbb_list)) {
- ird_set_irg_link(irg, lists->extbb_list);
- dump_extblock_graph(F, irg);
- }
+ for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
+ ir_graph *irg = get_irp_irg(i);
+ list_tuple *lists = ird_get_irg_link(irg);
- /* we may have blocks without extended blocks, bad for instance */
- if (ARR_LEN(lists->blk_list)) {
- ird_set_irg_link(irg, lists->blk_list);
- dump_block_graph(F, irg);
- }
+ if (lists) {
+ /* dump the extended blocks first */
+ if (ARR_LEN(lists->extbb_list)) {
+ ird_set_irg_link(irg, lists->extbb_list);
+ dump_extblock_graph(F, irg);
+ }
- DEL_ARR_F(lists->extbb_list);
- DEL_ARR_F(lists->blk_list);
- xfree(lists);
+ /* we may have blocks without extended blocks, bad for instance */
+ if (ARR_LEN(lists->blk_list)) {
+ ird_set_irg_link(irg, lists->blk_list);
+ dump_block_graph(F, irg);
}
+
+ DEL_ARR_F(lists->extbb_list);
+ DEL_ARR_F(lists->blk_list);
+ xfree(lists);
}
+ }
- /* Close the vcg information for the irg */
- fprintf(F, "}\n\n");
+ /* Close the vcg information for the irg */
+ fprintf(F, "}\n\n");
- vcg_close(F);
- free_extbb(irg);
- }
+ dump_vcg_footer(F);
+ free_extbb(irg);
}
-/* dumps a graph with type information */
-void
-dump_ir_graph_w_types(ir_graph *irg, const char *suffix)
+/* Dump a firm graph without explicit block nodes but grouped in extended blocks. */
+void dump_ir_extblock_graph(ir_graph *irg, const char *suffix)
{
- FILE *f;
- char *suffix1;
-
- /* if a filter is set, dump only the irg's that match the filter */
- if (!is_filtered_dump_name(get_entity_ident(get_irg_entity(irg))))
- return;
+ do_dump(irg, suffix, "-ip", "", dump_ir_extblock_graph_file);
+}
- if (get_interprocedural_view()) suffix1 = "-pure-wtypes-ip";
- else suffix1 = "-pure-wtypes";
- f = vcg_open(irg,suffix, suffix1);
- if (f != NULL) {
- ir_graph *rem = current_ir_graph;
- int rem_dump_const_local;
+void dump_ir_graph_w_types_file(ir_graph *irg, FILE *out)
+{
+ ir_graph *rem = current_ir_graph;
+ int rem_dump_const_local;
- current_ir_graph = irg;
- rem_dump_const_local = dump_const_local;
- /* dumping types does not work with local nodes */
- dump_const_local = 0;
+ rem = current_ir_graph;
+ current_ir_graph = irg;
+ rem_dump_const_local = dump_const_local;
+ /* dumping types does not work with local nodes */
+ dump_const_local = 0;
- dump_vcg_header(f, get_irg_dump_name(irg), NULL);
+ dump_vcg_header(out, get_irg_dump_name(irg), NULL, NULL);
- /* dump common ir graph */
- irg_walk(get_irg_end(irg), NULL, dump_whole_node, f);
- /* dump type info */
- type_walk_irg(irg, dump_type_info, NULL, f);
- inc_irg_visited(get_const_code_irg());
- /* dump edges from graph to type info */
- irg_walk(get_irg_end(irg), dump_node2type_edges, NULL, f);
+ /* dump common ir graph */
+ irg_walk(get_irg_end(irg), NULL, dump_whole_node, out);
+ /* dump type info */
+ type_walk_irg(irg, dump_type_info, NULL, out);
+ inc_irg_visited(get_const_code_irg());
+ /* dump edges from graph to type info */
+ irg_walk(get_irg_end(irg), dump_node2type_edges, NULL, out);
- vcg_close(f);
- dump_const_local = rem_dump_const_local;
- current_ir_graph = rem;
- }
+ dump_vcg_footer(out);
+ dump_const_local = rem_dump_const_local;
+ current_ir_graph = rem;
}
-void
-dump_ir_block_graph_w_types(ir_graph *irg, const char *suffix)
+/* dumps a graph with type information */
+void dump_ir_graph_w_types(ir_graph *irg, const char *suffix)
{
- FILE *f;
- int i;
- char *suffix1;
-
- /* if a filter is set, dump only the irg's that match the filter */
- if (!is_filtered_dump_name(get_entity_ident(get_irg_entity(irg))))
- return;
+ do_dump(irg, suffix, "-pure-wtypes-ip", "-pure-wtypes",
+ dump_ir_graph_w_types_file);
+}
- if (get_interprocedural_view()) suffix1 = "-wtypes-ip";
- else suffix1 = "-wtypes";
- f = vcg_open(irg, suffix, suffix1);
- if (f != NULL) {
- ir_graph *rem = current_ir_graph;
- int rem_dump_const_local;
+void dump_ir_block_graph_w_types_file(ir_graph *irg, FILE *out)
+{
+ int i;
+ int rem_dump_const_local;
+ ir_graph *rem = current_ir_graph;
- rem_dump_const_local = dump_const_local;
- /* dumping types does not work with local nodes */
- dump_const_local = 0;
+ rem_dump_const_local = dump_const_local;
+ /* dumping types does not work with local nodes */
+ dump_const_local = 0;
- dump_vcg_header(f, get_irg_dump_name(irg), NULL);
+ dump_vcg_header(out, get_irg_dump_name(irg), NULL, NULL);
- /* dump common blocked ir graph */
- construct_block_lists(irg);
+ /* dump common blocked ir graph */
+ construct_block_lists(irg);
- for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
- ir_node **arr = ird_get_irg_link(get_irp_irg(i));
- if (arr) {
- dump_graph_from_list(f, get_irp_irg(i));
- DEL_ARR_F(arr);
- }
+ for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
+ ir_node **arr = ird_get_irg_link(get_irp_irg(i));
+ if (arr) {
+ dump_graph_from_list(out, get_irp_irg(i));
+ DEL_ARR_F(arr);
}
+ }
- /* dump type info */
- current_ir_graph = irg;
- type_walk_irg(irg, dump_type_info, NULL, f);
- inc_irg_visited(get_const_code_irg());
+ /* dump type info */
+ current_ir_graph = irg;
+ type_walk_irg(irg, dump_type_info, NULL, out);
+ inc_irg_visited(get_const_code_irg());
- /* dump edges from graph to type info */
- irg_walk(get_irg_end(irg), dump_node2type_edges, NULL, f);
+ /* dump edges from graph to type info */
+ irg_walk(get_irg_end(irg), dump_node2type_edges, NULL, out);
- vcg_close(f);
- dump_const_local = rem_dump_const_local;
- current_ir_graph = rem;
- }
+ dump_vcg_footer(out);
+ dump_const_local = rem_dump_const_local;
+ current_ir_graph = rem;
+}
+
+void dump_ir_block_graph_w_types(ir_graph *irg, const char *suffix)
+{
+ do_dump(irg, suffix, "-wtypes-ip", "-wtypes",
+ dump_ir_block_graph_w_types_file);
}
/*---------------------------------------------------------------------*/
dump_irnode_to_file(F, block);
/* Check whether we have bad predecessors to color the block. */
- for (i = 0; i < get_Block_n_cfgpreds(block); ++i)
+ for (i = get_Block_n_cfgpreds(block) - 1; i >= 0; --i)
if ((fl = is_Bad(get_Block_cfgpred(block, i))))
break;
fprintf(F, "}\n");
/* Dump the edges */
- for ( i = 0; i < get_Block_n_cfgpreds(block); i++)
- if (get_irn_op(skip_Proj(get_Block_cfgpred(block, i))) != op_Bad) {
+ for (i = get_Block_n_cfgpreds(block) - 1; i >= 0; --i)
+ if (!is_Bad(skip_Proj(get_Block_cfgpred(block, i)))) {
pred = get_nodes_block(skip_Proj(get_Block_cfgpred(block, i)));
fprintf(F, "edge: { sourcename: \"");
PRINT_NODEID(block);
}
}
-void
-dump_cfg(ir_graph *irg, const char *suffix)
+void dump_cfg(ir_graph *irg, const char *suffix)
{
FILE *f;
/* if a filter is set, dump only the irg's that match the filter */
f = vcg_open(irg, suffix, "-cfg");
if (f != NULL) {
ir_graph *rem = current_ir_graph;
+#ifdef INTERPROCEDURAL_VIEW
int ipv = get_interprocedural_view();
+#endif
current_ir_graph = irg;
- dump_vcg_header(f, get_irg_dump_name(irg), NULL);
+ dump_vcg_header(f, get_irg_dump_name(irg), NULL, NULL);
+#ifdef INTERPROCEDURAL_VIEW
if (ipv) {
printf("Warning: dumping cfg not in interprocedural view!\n");
set_interprocedural_view(0);
}
+#endif
/* walk over the blocks in the graph */
irg_block_walk(get_irg_end(irg), dump_block_to_cfg, NULL, f);
dump_node(f, get_irg_bad(irg));
+#ifdef INTERPROCEDURAL_VIEW
set_interprocedural_view(ipv);
- vcg_close(f);
+#endif
+ dump_vcg_footer(f);
+ fclose(f);
current_ir_graph = rem;
}
}
static void descend_and_dump(FILE *F, ir_node *n, int depth, pset *mark_set) {
- if (pset_find_ptr(mark_set, n)) return;
+ if (pset_find_ptr(mark_set, n))
+ return;
pset_insert_ptr(mark_set, n);
F = vcg_open(get_irn_irg(root), suffix, buf);
if (F != NULL) {
pset *mark_set = pset_new_ptr(1);
- dump_vcg_header(F, get_irg_dump_name(get_irn_irg(root)), NULL);
+ dump_vcg_header(F, get_irg_dump_name(get_irn_irg(root)), NULL, NULL);
descend_and_dump(F, root, depth, mark_set);
- vcg_close(F);
+ dump_vcg_footer(F);
+ fclose(F);
del_pset(mark_set);
}
}
-
-static int weight_overall(int rec, int loop) {
- return 2*rec + loop;
-}
-
-static int compute_color(int my, int max) {
- int color;
- if (!max) {
- color = 0;
- } else {
- int step;
-
- /* if small, scale to the full color range. */
- if (max < n_colors)
- my = my * (n_colors/max);
-
- step = 1 + (max / n_colors);
-
- color = my/step;
- }
- return base_color + n_colors - color;
-}
-
-/**
- * Calculate a entity color depending on it's execution propability.
- */
-static int get_entity_color(ir_entity *ent) {
- ir_graph *irg = get_entity_irg(ent);
- assert(irg);
-
- {
- int rec_depth = get_irg_recursion_depth(irg);
- int loop_depth = get_irg_loop_depth(irg);
- int overall_depth = weight_overall(rec_depth, loop_depth);
-
- int max_rec_depth = irp->max_callgraph_recursion_depth;
- int max_loop_depth = irp->max_callgraph_loop_depth;
- int max_overall_depth = weight_overall(max_rec_depth, max_loop_depth);
-
- /* int my_rec_color = compute_color(rec_depth, max_rec_depth); */
- /* int my_loop_color = compute_color(loop_depth, max_loop_depth); */
- int my_overall_color = compute_color(overall_depth, max_overall_depth);
-
- return my_overall_color;
- }
-}
-
void dump_callgraph(const char *suffix) {
FILE *F = vcg_open_name("Callgraph", suffix);
if (F != NULL) {
- int i, rem = edge_label, colorize;
+ int i, rem = edge_label;
+ //int colorize;
edge_label = 1;
- dump_vcg_header(F, "Callgraph", NULL);
-
- colorize = get_irp_callgraph_state() == irp_callgraph_and_calltree_consistent;
+ dump_vcg_header(F, "Callgraph", "Hierarchiv", NULL);
for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
ir_graph *irg = get_irp_irg(i);
ir_entity *ent = get_irg_entity(irg);
- int j, n_callees = get_irg_n_callees(irg);
- int color;
+ int j;
+ int n_callees = get_irg_n_callees(irg);
- color = colorize ? get_entity_color(ent) : ird_color_green;
- dump_entity_node(F, ent, color);
+ dump_entity_node(F, ent);
for (j = 0; j < n_callees; ++j) {
ir_entity *c = get_irg_entity(get_irg_callee(irg, j));
//if (id_is_prefix(prefix, get_entity_ld_ident(c))) continue;
int be = is_irg_callee_backedge(irg, j);
char *attr;
attr = (be) ?
- "label:\"recursion %d\" color:%d" :
- "label:\"calls %d\" color:%d";
- print_ent_ent_edge(F, ent, c, be, attr, get_irg_callee_loop_depth(irg, j), color);
+ "label:\"recursion %d\"" :
+ "label:\"calls %d\"";
+ print_ent_ent_edge(F, ent, c, be, ird_color_entity, attr, get_irg_callee_loop_depth(irg, j));
}
}
edge_label = rem;
- vcg_close(F);
+ dump_vcg_footer(F);
+ fclose(F);
}
}
+#if 0
/* Dump all irgs in interprocedural view to a single file. */
void dump_all_cg_block_graph(const char *suffix) {
FILE *f = vcg_open_name("All_graphs", suffix);
DEL_ARR_F(ird_get_irg_link(current_ir_graph));
}
- vcg_close(f);
+ dump_vcg_footer(f);
+ fclose(f);
set_interprocedural_view(rem_view);
}
}
+#endif
/*---------------------------------------------------------------------*/
/* the following routines dumps type information without any ir nodes. */
ir_graph *rem = current_ir_graph;
current_ir_graph = irg;
- dump_vcg_header(f, get_irg_dump_name(irg), NULL);
+ dump_vcg_header(f, get_irg_dump_name(irg), "Hierarchic", NULL);
/* walk over the blocks in the graph */
type_walk_irg(irg, dump_type_info, NULL, f);
walk. So now increase it finally. */
inc_irg_visited(get_const_code_irg());
- vcg_close(f);
+ dump_vcg_footer(f);
+ fclose(f);
current_ir_graph = rem;
}
}
dump_all_types(const char *suffix)
{
FILE *f = vcg_open_name("All_types", suffix);
- if (f) {
- dump_vcg_header(f, "All_types", NULL);
+ if (f != NULL) {
+ dump_vcg_header(f, "All_types", "Hierarchic", NULL);
type_walk(dump_type_info, NULL, f);
inc_irg_visited(get_const_code_irg());
- vcg_close(f);
+
+ dump_vcg_footer(f);
+ fclose(f);
}
}
h_env_t env;
env.f = f;
env.dump_ent = entities;
- dump_vcg_header(f, "class_hierarchy", NULL);
+ dump_vcg_header(f, "class_hierarchy", "Hierarchic", NULL);
type_walk(dump_class_hierarchy_node, NULL, &env);
- vcg_close(f);
+
+ dump_vcg_footer(f);
+ fclose(f);
}
}
dump_loop_node(F, loop);
/* Dump the loop elements. */
-
- for(i = 0; i < get_loop_n_elements(loop); i++) {
+ for (i = 0; i < get_loop_n_elements(loop); i++) {
le = get_loop_element(loop, i);
son = le.son;
if (get_kind(son) == k_ir_loop) {
/* We are a loop son -> Recurse */
- if(loop_node_started) { /* Close the "firm-nodes" node first if we started one. */
+ if (loop_node_started) { /* Close the "firm-nodes" node first if we started one. */
fprintf(F, "\" }\n");
fprintf(F, "edge: {sourcename: \"");
PRINT_LOOPID(loop);
assert(get_kind(son) == k_ir_graph);
/* We are a loop node -> Collect firm graphs */
- n = (ir_graph *)le.node;
+ n = le.irg;
if (!loop_node_started) {
/* Start a new node which contains all firm nodes of the current loop */
fprintf(F, "node: { title: \"");
FILE *f;
/* if a filter is set, dump only the irg's that match the filter */
- if (!is_filtered_dump_name(get_entity_ident(get_irg_entity(irg)))) return;
+ if (!is_filtered_dump_name(get_entity_ident(get_irg_entity(irg))))
+ return;
f = vcg_open(irg, suffix, "-looptree");
if (f != NULL) {
current_ir_graph = irg;
edge_label = 1;
- dump_vcg_header(f, get_irg_dump_name(irg), "top_to_bottom");
+ dump_vcg_header(f, get_irg_dump_name(irg), "Tree", "top_to_bottom");
- if (get_irg_loop(irg)) dump_loops_standalone(f, get_irg_loop(irg));
+ if (get_irg_loop(irg))
+ dump_loops_standalone(f, get_irg_loop(irg));
- vcg_close(f);
+ dump_vcg_footer(f);
+ fclose(f);
edge_label = el_rem;
current_ir_graph = rem;
void dump_callgraph_loop_tree(const char *suffix) {
FILE *F;
F = vcg_open_name("Callgraph_looptree", suffix);
- dump_vcg_header(F, "callgraph looptree", "top_to_bottom");
+ dump_vcg_header(F, "callgraph looptree", "Tree", "top_to_bottom");
dump_loops_standalone(F, irp->outermost_cg_loop);
- vcg_close(F);
+ dump_vcg_footer(F);
+ fclose(F);
}
eset *extnodes = eset_create();
ir_node *n, *b;
- dump_vcg_header(F, name, NULL);
+ dump_vcg_header(F, name, NULL, NULL);
/* collect all nodes to dump */
collect_nodeloop(F, l, loopnodes);
/* dump the nodes that go into the block */
for (n = get_irn_link(b); n; n = get_irn_link(n)) {
if (eset_contains(extnodes, n))
- overrule_nodecolor = ird_color_lightblue;
+ overrule_nodecolor = ird_color_block_inout;
dump_node(F, n);
- overrule_nodecolor = ird_color_default;
+ overrule_nodecolor = ird_color_default_node;
if (!eset_contains(extnodes, n)) dump_ir_data_edges(F, n);
}
/* dump the nodes that go into the block */
for (n = get_irn_link(b); n; n = get_irn_link(n)) {
if (!eset_contains(loopnodes, n))
- overrule_nodecolor = ird_color_lightblue;
+ overrule_nodecolor = ird_color_block_inout;
dump_node(F, n);
- overrule_nodecolor = ird_color_default;
+ overrule_nodecolor = ird_color_default_node;
if (eset_contains(loopnodes, n)) dump_ir_data_edges(F, n);
}
}
eset_destroy(loopnodes);
eset_destroy(extnodes);
- vcg_close(F);
+
+ dump_vcg_footer(F);
+ fclose(F);
}
}