* @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 "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
-
/** Dump only irgs with names that start with this prefix. */
static ident *dump_file_filter_id = NULL;
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;
}
* Prints the edge from an entity E to an entity T 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, ir_entity *E, ir_entity *T, int backedge, ird_color_t color, const char *fmt, ...)
{
va_list ap;
PRINT_ENTID(E);
fprintf(F, "\" targetname: \""); PRINT_ENTID(T); 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);
}
/*-----------------------------------------------------------------*/
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. */
#ifdef INTERPROCEDURAL_VIEW
int rem_view = get_interprocedural_view();
#endif
- int walk_flag = using_irn_visited(irg);
+ 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_irn_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);
set_interprocedural_view(rem_view);
#endif
- if(walk_flag)
- set_using_irn_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:
- ir_fprintf(F, "%T", get_Const_tarval(n));
- break;
-
case iro_SymConst:
switch (get_SymConst_kind(n)) {
case symconst_addr_name:
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 (is_Global(addr))
ent = get_Global_entity(addr);
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:
X(P_frame_base),
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);
return;
}
- mode = get_irn_mode(node);
+ mode = get_irn_mode(n);
if(mode == mode_M) {
print_vcg_color(F, ird_color_memory);
return;
/* 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;
}
-static INLINE int is_constlike_node(const ir_node *node)
+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);
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 */
/** dump edges to our inputs */
static void dump_ir_data_edges(FILE *F, ir_node *n) {
int i, num;
- unsigned long visited = get_irn_visited(n);
+ ir_visited_t visited = get_irn_visited(n);
if (!dump_keepalive && is_End(n)) {
/* the End node has only keep-alive edges */
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))
/* 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");
}
}
-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);
/* dumps a type or entity and it's edges. */
static void
-dump_type_info(type_or_ent *tore, void *env) {
+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\" "
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);
+ 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 (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);
+ 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),
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)) {
* 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_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);
}
}
-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: \"");
}
}
-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;
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 (!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 @. */
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) {
+ 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);
}
}
-#ifdef INTERPROCEDURAL_VIEW
void dump_callgraph(const char *suffix) {
FILE *F = vcg_open_name("Callgraph", suffix);
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;
- //int n_callees = get_irg_n_callees(irg);
- int color;
+ int n_callees = get_irg_n_callees(irg);
- //color = colorize ? get_entity_color(ent) : ird_color_green;
- color = 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));
}
}
}
}
+#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);