#include <stdlib.h>
#include <stdarg.h>
-#include "firm_common_t.h"
-
#include "list.h"
#include "irnode_t.h"
#include "irop.h"
#include "irdump_t.h"
+#include "irpass_t.h"
#include "irgwalk.h"
#include "tv_t.h"
fprintf(F, "color:%s", color_names[color]);
}
+/**
+ * Prints the edge kind of a given IR node.
+ *
+ * Projs should be dumped near their predecessor, so they get "nearedge".
+ */
+static void print_node_edge_kind(FILE *F, ir_node *node) {
+ if (is_Proj(node)) {
+ fprintf(F, "nearedge: ");
+ } else {
+ fprintf(F, "edge: ");
+ }
+}
+
/**
* Prints the edge from a type S to a type T with additional info fmt, ...
* to the file F.
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;
ir_node *dep = get_irn_dep(n, i);
if (dep) {
- fprintf(F, "edge: {sourcename: \"");
+ print_node_edge_kind(F, n);
+ fprintf(F, "{sourcename: \"");
PRINT_NODEID(n);
fprintf(F, "\" targetname: ");
if ((get_opt_dump_const_local()) && is_constlike_node(dep)) {
if (dump_backedge_information_flag && is_backedge(n, i))
fprintf(F, "backedge: {sourcename: \"");
- else
- fprintf(F, "edge: {sourcename: \"");
+ else {
+ print_node_edge_kind(F, n);
+ fprintf(F, "{sourcename: \"");
+ }
PRINT_NODEID(n);
fprintf(F, "\" targetname: ");
if ((get_opt_dump_const_local()) && is_constlike_node(pred)) {
foreach_out_edge(n, edge) {
ir_node *succ = get_edge_src_irn(edge);
- fprintf(F, "edge: {sourcename: \"");
+ print_node_edge_kind(F, succ);
+ fprintf(F, "{sourcename: \"");
PRINT_NODEID(n);
fprintf(F, "\" targetname: \"");
PRINT_NODEID(succ);
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_node_edge_kind(F, succ);
+ fprintf(F, "{sourcename: \"");
PRINT_NODEID(n);
fprintf(F, "\" targetname: \"");
PRINT_NODEID(succ);
* @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(const 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;
dmp_grph(get_irp_irg(i), suffix);
}
+struct pass_t {
+ ir_prog_pass_t pass;
+ dump_graph_func *dump_graph;
+ char suffix[1];
+};
+
+/**
+ * Wrapper around dump_all_ir_graphs().
+ */
+static int dump_all_ir_graphs_wrapper(ir_prog *irp, void *context) {
+ struct pass_t *pass = context;
+
+ (void)irp;
+ dump_all_ir_graphs(pass->dump_graph, pass->suffix);
+ return 0;
+}
+
+ir_prog_pass_t *dump_all_ir_graph_pass(
+ const char *name, dump_graph_func *dump_graph, const char *suffix) {
+ size_t len = strlen(suffix);
+ struct pass_t *pass = xmalloc(sizeof(*pass) + len);
+ ir_prog_pass_t *res = def_prog_pass_constructor(
+ &pass->pass, name ? name : "dump_all_graphs", dump_all_ir_graphs_wrapper);
+
+ /* this pass does not change anything, so neither dump nor verify is needed. */
+ res->dump_irprog = ir_prog_no_dump;
+ res->verify_irprog = ir_prog_no_verify;
+
+ pass->dump_graph = dump_graph;
+ strcpy(pass->suffix, suffix);
+
+ return res;
+}
/*--------------------------------------------------------------------------------*
* Dumps a stand alone loop graph with firm nodes which belong to one loop node *