#include "entity_t.h"
#include "trouts.h"
#include "irgwalk.h"
-#include "tv.h"
+#include "tv_t.h"
+#include "irdom.h"
#include "field_temperature.h"
#define MY_SIZE 1024 /* Size of an array that actually should be computed. */
-int dump_node_opcode(FILE *F, ir_node *n); /* from irdump.c */
-
-
/* Just opens a file, mangling a file name.
*
* The name consists of the following parts:
fname = malloc (strlen(basename)*2 + strlen(suffix1) + strlen(suffix2) + 5); /* *2: space for excapes. */
j = 0;
- for (i = 0; i < len; ++i) { /* replase '/' in the name: escape by @. */
+ for (i = 0; i < len; ++i) { /* replace '/' in the name: escape by @. */
if (basename[i] == '/') {
fname[j] = '@'; j++; fname[j] = '1'; j++;
} else if (basename[i] == '@') {
if (get_irn_pinned(n) == op_pin_state_floats &&
get_irg_pinned(get_irn_irg(n)) == op_pin_state_floats) {
fprintf(F, " node was pinned in ");
- dump_node_opcode(F, get_nodes_block(n));
- fprintf(F, " %ld\n", get_irn_node_nr(get_nodes_block(n)));
+ dump_node_opcode(F, get_irn_n(n, -1));
+ fprintf(F, " %ld\n", get_irn_node_nr(get_irn_n(n, -1)));
}
fprintf(F, " arity: %d\n", get_irn_intra_arity(n));
fprintf(F, " pred nodes: \n");
if (!is_Block(n)) {
fprintf(F, " -1: ");
- dump_node_opcode(F, get_nodes_block(n));
- fprintf(F, " %ld\n", get_irn_node_nr(get_nodes_block(n)));
+ dump_node_opcode(F, get_irn_n(n, -1));
+ fprintf(F, " %ld\n", get_irn_node_nr(get_irn_n(n, -1)));
}
for ( i = 0; i < get_irn_intra_arity(n); ++i) {
fprintf(F, " %d: %s ", i, is_intra_backedge(n, i) ? "be" : " ");
switch (get_irn_opcode(n)) {
case iro_Block: {
fprintf(F, " block visited: %ld\n", get_Block_block_visited(n));
- fprintf(F, " dominator info: output not implemented\n");
+ if (get_irg_dom_state(get_irn_irg(n)) != dom_none) {
+ fprintf(F, " dom depth %d\n", get_Block_dom_depth(n));
+ fprintf(F, " tree pre num %d\n", get_Block_dom_tree_pre_num(n));
+ fprintf(F, " max subtree pre num %d\n", get_Block_dom_max_subtree_pre_num(n));
+ }
+
+ fprintf(F, " Execution freqency statistics:\n");
+ if (get_irg_exec_freq_state(get_irn_irg(n)) != exec_freq_none)
+ fprintf(F, " procedure local evaluation: %8.2lf\n", get_irn_exec_freq(n));
+ if (get_irp_loop_nesting_depth_state() != loop_nesting_depth_none)
+ fprintf(F, " call freqency of procedure: %8.2lf\n",
+ get_irg_method_execution_frequency(get_irn_irg(n)));
+ if (get_irp_callgraph_state() == irp_callgraph_and_calltree_consistent)
+ fprintf(F, " recursion depth of procedure: %8.2lf\n", (double)get_irn_recursion_depth(n));
+ if ((get_irg_exec_freq_state(get_irn_irg(n)) != exec_freq_none) &&
+ (get_irp_loop_nesting_depth_state() != loop_nesting_depth_none) &&
+ (get_irp_callgraph_state() == irp_callgraph_and_calltree_consistent))
+ fprintf(F, " final evaluation: **%8.2lf**\n", get_irn_final_cost(n));
+
/* not dumped: graph_arr */
/* not dumped: mature */
} break;
return 1;
}
+/** dumps something like:
+ *
+ * "prefix" "Name" (x): node1, ... node7,\n
+ * "prefix" node8, ... node15,\n
+ * "prefix" node16, node17\n
+ */
+static void dump_node_list(FILE *F, firm_kind *k, char *prefix,
+ int (*get_entity_n_nodes)(firm_kind *ent),
+ ir_node *(*get_entity_node)(firm_kind *ent, int pos),
+ char *name) {
+ int i, n_nodes = get_entity_n_nodes(k);
+ char *comma = "";
+
+ fprintf(F, "%s %s (%d):", prefix, name, n_nodes);
+ for (i = 0; i < n_nodes; ++i) {
+ int rem;
+ if (i > 7 && !(i & 7)) { /* line break every eigth node. */
+ fprintf(F, ",\n%s ", prefix);
+ comma = "";
+ }
+ fprintf(F, "%s ", comma);
+ rem = opt_dump_analysed_type_info;
+ opt_dump_analysed_type_info = 0;
+ dump_node_label(F, get_entity_node(k, i));
+ opt_dump_analysed_type_info = rem;
+ comma = ",";
+ }
+ fprintf(F, "\n");
+}
+
+/** dumps something like:
+ *
+ * "prefix" "Name" (x): node1, ... node7,\n
+ * "prefix" node8, ... node15,\n
+ * "prefix" node16, node17\n
+ */
+static void dump_type_list(FILE *F, type *tp, char *prefix,
+ int (*get_n_types)(type *tp),
+ type *(*get_type)(type *tp, int pos),
+ char *name) {
+ int i, n_nodes = get_n_types(tp);
+ char *comma = "";
+
+ fprintf(F, "%s %s (%d):", prefix, name, n_nodes);
+ for (i = 0; i < n_nodes; ++i) {
+ if (i > 7 && !(i & 7)) { /* line break every eigth node. */
+ fprintf(F, ",\n%s ", prefix);
+ comma = "";
+ }
+ fprintf(F, "%s %s(%ld)", comma, get_type_name(get_type(tp, i)), get_type_nr(tp));
+ //dump_type_to_file(F, get_type(tp, i), dump_verbosity_onlynames);
+ comma = ",";
+ }
+ fprintf(F, "\n");
+}
+
#define X(a) case a: fprintf(F, #a); break
void dump_entity_to_file_prefix (FILE *F, entity *ent, char *prefix, unsigned verbosity) {
int i, j;
if (is_Class_type(get_entity_owner(ent))) {
if (get_entity_n_overwrites(ent) > 0) {
- fprintf(F, "%s overwrites:\n", prefix);
- for (i = 0; i < get_entity_n_overwrites(ent); ++i) {
- entity *ov = get_entity_overwrites(ent, i);
- fprintf(F, "%s %d: %s of class %s\n", prefix, i, get_entity_name(ov),
- get_type_name(get_entity_owner(ov)));
- }
+ fprintf(F, "%s overwrites:\n", prefix);
+ for (i = 0; i < get_entity_n_overwrites(ent); ++i) {
+ entity *ov = get_entity_overwrites(ent, i);
+ fprintf(F, "%s %d: %s of class %s\n", prefix, i, get_entity_name(ov),
+ get_type_name(get_entity_owner(ov)));
+ }
} else {
- fprintf(F, "%s Does not overwrite other entities. \n", prefix);
+ fprintf(F, "%s Does not overwrite other entities. \n", prefix);
}
if (get_entity_n_overwrittenby(ent) > 0) {
- fprintf(F, "%s overwritten by:\n", prefix);
- for (i = 0; i < get_entity_n_overwrittenby(ent); ++i) {
- entity *ov = get_entity_overwrittenby(ent, i);
- fprintf(F, "%s %d: %s of class %s\n", prefix, i, get_entity_name(ov),
- get_type_name(get_entity_owner(ov)));
+ fprintf(F, "%s overwritten by:\n", prefix);
+ for (i = 0; i < get_entity_n_overwrittenby(ent); ++i) {
+ entity *ov = get_entity_overwrittenby(ent, i);
+ fprintf(F, "%s %d: %s of class %s\n", prefix, i, get_entity_name(ov),
+ get_type_name(get_entity_owner(ov)));
}
} else {
- fprintf(F, "%s Is not overwritten by other entities. \n", prefix);
+ fprintf(F, "%s Is not overwritten by other entities. \n", prefix);
+ }
+
+ if (get_irp_inh_transitive_closure_state() != inh_transitive_closure_none) {
+ entity *ov;
+ fprintf(F, "%s transitive overwrites:\n", prefix);
+ for (ov = get_entity_trans_overwrites_first(ent);
+ ov;
+ ov = get_entity_trans_overwrites_next(ent)) {
+ fprintf(F, "%s : %s of class %s\n", prefix, get_entity_name(ov),
+ get_type_name(get_entity_owner(ov)));
+ }
+ fprintf(F, "%s transitive overwritten by:\n", prefix);
+ for (ov = get_entity_trans_overwrittenby_first(ent);
+ ov;
+ ov = get_entity_trans_overwrittenby_next(ent)) {
+ fprintf(F, "%s : %s of class %s\n", prefix, get_entity_name(ov),
+ get_type_name(get_entity_owner(ov)));
+ }
}
}
fprintf(F, "\n");
}
+ if (get_trouts_state()) {
+ fprintf(F, "%s Entity outs:\n", prefix);
+ dump_node_list(F, (firm_kind *)ent, prefix, (int(*)(firm_kind *))get_entity_n_accesses,
+ (ir_node *(*)(firm_kind *, int))get_entity_access, "Accesses");
+ dump_node_list(F, (firm_kind *)ent, prefix, (int(*)(firm_kind *))get_entity_n_references,
+ (ir_node *(*)(firm_kind *, int))get_entity_reference, "References");
+ }
+
if (verbosity & dump_verbosity_accessStats) {
#if 0
int n_acc = get_entity_n_accesses(ent);
if (verbosity & dump_verbosity_typeattrs) {
fprintf(F, " supertypes: ");
for (i = 0; i < get_class_n_supertypes(tp); ++i) {
- type *stp = get_class_supertype(tp, i);
- fprintf(F, "\n %s", get_type_name(stp));
+ type *stp = get_class_supertype(tp, i);
+ fprintf(F, "\n %s", get_type_name(stp));
}
fprintf(F, "\n subtypes: ");
for (i = 0; i < get_class_n_subtypes(tp); ++i) {
- type *stp = get_class_subtype(tp, i);
- fprintf(F, "\n %s", get_type_name(stp));
+ type *stp = get_class_subtype(tp, i);
+ fprintf(F, "\n %s", get_type_name(stp));
}
- fprintf(F, "\n peculiarity: %s", get_peculiarity_string(get_class_peculiarity(tp)));
+ if (get_irp_inh_transitive_closure_state() != inh_transitive_closure_none) {
+ type *stp;
+ fprintf(F, "\n transitive supertypes: ");
+ for (stp = get_class_trans_supertype_first(tp);
+ stp;
+ stp = get_class_trans_supertype_next(tp)) {
+ fprintf(F, "\n %s", get_type_name(stp));
+ }
+ fprintf(F, "\n transitive subtypes: ");
+ for (stp = get_class_trans_subtype_first(tp);
+ stp;
+ stp = get_class_trans_subtype_next(tp)) {
+ fprintf(F, "\n %s", get_type_name(stp));
+ }
+ }
+
+ fprintf(F, "\n peculiarity: %s\n", get_peculiarity_string(get_class_peculiarity(tp)));
+
}
break;
}
break;
- case tpo_pointer:
- if (verbosity & dump_verbosity_typeattrs) {
- type *tt = get_pointer_points_to_type(tp);
- fprintf(F, "\n points to %s (%ld)", get_type_name(tt), get_type_nr(tt));
- }
- break;
-
case tpo_array:
if (verbosity & dump_verbosity_typeattrs) {
int i, n_dim;
}
break;
+ case tpo_pointer:
+ if (verbosity & dump_verbosity_typeattrs) {
+ type *tt = get_pointer_points_to_type(tp);
+ fprintf(F, "\n points to %s (%ld)\n", get_type_name(tt), get_type_nr(tt));
+ }
+ break;
+
+ case tpo_method:
+ if (verbosity & dump_verbosity_typeattrs) {
+ fprintf(F, "\n variadicity: %s", get_variadicity_name(get_method_variadicity(tp)));
+ fprintf(F, "\n return types: %d", get_method_n_ress(tp));
+ for (i = 0; i < get_method_n_ress(tp); ++i) {
+ type *rtp = get_method_res_type(tp, i);
+ fprintf(F, "\n %s", get_type_name(rtp));
+ }
+
+ fprintf(F, "\n parameter types: %d", get_method_n_params(tp));
+ for (i = 0; i < get_method_n_params(tp); ++i) {
+ type *ptp = get_method_param_type(tp, i);
+ fprintf(F, "\n %s", get_type_name(ptp));
+ }
+ if (get_method_variadicity(tp)) {
+ fprintf(F, "\n ...");
+ }
+ fprintf(F, "\n");
+ }
+ break;
+
+ case tpo_primitive:
+ case tpo_id:
+ case tpo_none:
+ case tpo_unknown:
+ fprintf(F, "\n");
+ break;
+
default:
if (verbosity & dump_verbosity_typeattrs) {
fprintf(F, ": details not implemented\n");
}
}
+ fprintf(F, " visibility: %s,\n", get_visibility_name(get_type_visibility(tp)));
+ fprintf(F, " state: %s,\n", get_type_state_name(get_type_state(tp)));
+ fprintf(F, " size: %2d Bits,\n", get_type_size_bits(tp));
+ fprintf(F, " alignment: %2d Bits,\n", get_type_alignment_bits(tp));
+ if (is_atomic_type(tp) || is_Method_type(tp))
+ fprintf(F, " mode: %s,\n", get_mode_name(get_type_mode(tp)));
+ fprintf(F, " dbg info: %p,\n", (void *)get_type_dbg_info(tp));
+
+ if (get_trouts_state()) {
+ fprintf(F, "\n Type outs:\n");
+ dump_node_list(F, (firm_kind *)tp, " ", (int(*)(firm_kind *))get_type_n_allocs,
+ (ir_node *(*)(firm_kind *, int))get_type_alloc, "Allocations");
+ dump_node_list(F, (firm_kind *)tp, " ", (int(*)(firm_kind *))get_type_n_casts,
+ (ir_node *(*)(firm_kind *, int))get_type_cast, "Casts");
+ dump_type_list(F, tp, " ", get_type_n_pointertypes_to, get_type_pointertype_to, "PointerTpsTo");
+ }
+
+
if (verbosity & dump_verbosity_accessStats) {
#if 0
int n_all = get_type_n_allocs(tp);
#endif
if (get_trouts_state() != outs_none) {
fprintf(F, " Estimated #Instances: %lf\n", get_type_estimated_n_instances(tp));
- if (is_Class_type(tp)) {
+ if (is_Class_type(tp) && (get_irp_typeinfo_state() != ir_typeinfo_none)) {
fprintf(F, " Estimated #dyn Calls: %lf\n", get_class_estimated_n_dyncalls(tp));
fprintf(F, " Estimated #Upcasts: %lf (#CastOps: %d)\n", get_class_estimated_n_upcasts(tp), get_class_n_upcasts(tp));
fprintf(F, " Estimated #Downcasts: %lf (#CastOps: %d)\n", get_class_estimated_n_downcasts(tp), get_class_n_downcasts(tp));