2 * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
4 * This file is part of libFirm.
6 * This file may be distributed and/or modified under the terms of the
7 * GNU General Public License version 2 as published by the Free Software
8 * Foundation and appearing in the file LICENSE.GPL included in the
9 * packaging of this file.
11 * Licensees holding valid libFirm Professional Edition licenses may use
12 * this file in accordance with the libFirm Commercial License.
13 * Agreement provided with the Software.
15 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * @brief Code for dumping backend datastructures (i.e. interference graphs)
23 * @author Matthias Braun
32 #include "becopyopt_t.h"
35 static void dump_ifg_nodes(FILE *F, const be_ifg_t *ifg)
37 nodes_iter_t ifg_iter;
39 be_ifg_foreach_node(ifg, &ifg_iter, node) {
44 static void dump_ifg_edges(FILE *F, const be_ifg_t *ifg)
46 nodes_iter_t ifg_iter;
49 be_ifg_foreach_node(ifg, &ifg_iter, node) {
50 neighbours_iter_t neigh_iter;
53 be_ifg_foreach_neighbour(ifg, &neigh_iter, node, neighbour) {
54 /* interference is bidirectional, but it's enough to dump 1
56 if (get_irn_node_nr(node) >= get_irn_node_nr(neighbour))
59 fprintf(F, "edge: {sourcename: ");
60 print_nodeid(F, node);
61 fprintf(F, " targetname: ");
62 print_nodeid(F, neighbour);
63 fprintf(F, " arrowstyle:none class:1}\n");
68 void be_dump_ifg(FILE *F, ir_graph *irg, const be_ifg_t *ifg)
71 "graph: { title: \"interference graph of %+F\"\n"
72 "layoutalgorithm: mindepth //$ \"circular\"\n"
73 "classname 1: \"interference\"\n"
75 dump_vcg_infonames(F);
76 dump_vcg_header_colors(F);
78 dump_ifg_nodes(F, ifg);
79 dump_ifg_edges(F, ifg);
84 static void dump_affinity_edges(FILE *F, const copy_opt_t *co,
85 bool dump_costs, bool dump_colors)
87 co_gs_foreach_aff_node(co, a) {
90 co_gs_foreach_neighb(a, n) {
91 /* edges are bidirection, dumping one direction is enough */
92 if (get_irn_node_nr(a->irn) >= get_irn_node_nr(n->irn))
95 fprintf(F, "edge: {sourcename: ");
96 print_nodeid(F, a->irn);
97 fprintf(F, " targetname: ");
98 print_nodeid(F, n->irn);
99 fprintf(F, " arrowstyle:none");
102 fprintf(F, " label:\"%d\"", n->costs);
104 const arch_register_t *ar = arch_get_irn_register(a->irn);
105 const arch_register_t *nr = arch_get_irn_register(n->irn);
106 const char *color = nr == ar ? "blue" : "red";
107 fprintf(F, " color:%s", color);
109 fprintf(F, " linestyle:dashed class:2");
115 void be_dump_ifg_co(FILE *F, const copy_opt_t *co, bool dump_costs,
118 ir_graph *irg = co->irg;
119 be_ifg_t *ifg = co->cenv->ifg;
122 "graph: { title: \"interference graph of %+F\"\n"
123 "layoutalgorithm: mindepth //$ \"circular\"\n"
124 "classname 1: \"interference\"\n"
125 "classname 2: \"affinity\"\n"
127 dump_vcg_infonames(F);
128 dump_vcg_header_colors(F);
130 dump_ifg_nodes(F, ifg);
131 dump_ifg_edges(F, ifg);
132 dump_affinity_edges(F, co, dump_costs, dump_colors);
137 static const char *lv_flags_to_str(unsigned flags)
139 static const char *states[] = {
150 return states[flags & 7];
153 void be_dump_liveness_block(void *context, FILE *F, const ir_node *bl)
156 be_lv_t *lv = (be_lv_t*)context;
157 be_lv_info_t *info = (be_lv_info_t*)ir_nodehashmap_get(&lv->map, bl);
159 fprintf(F, "liveness:\n");
161 unsigned n = info[0].head.n_members;
164 for (i = 0; i < n; ++i) {
165 be_lv_info_node_t *n = &info[i+1].node;
166 ir_fprintf(F, "%s %+F\n", lv_flags_to_str(n->flags), get_idx_irn(lv->irg, n->idx));
172 typedef struct lv_walker_t {
177 static void lv_dump_block_walker(ir_node *irn, void *data)
179 lv_walker_t *w = (lv_walker_t*)data;
182 be_dump_liveness_block(w->lv, (FILE*)w->data, irn);
185 void be_liveness_dump(FILE *F, const be_lv_t *lv)
189 w.lv = (be_lv_t *) lv;
191 irg_block_walk_graph(lv->irg, lv_dump_block_walker, NULL, &w);