imporoved loop dumper slightly
[libfirm] / ir / ir / irdump.h
1 /*
2  * Project:     libFIRM
3  * File name:   ir/ir/irdump.h
4  * Purpose:     Write vcg representation of firm to file.
5  * Author:      Martin Trapp, Christian Schaefer
6  * Modified by: Goetz Lindenmaier, Hubert Schmidt
7  * Created:
8  * CVS-ID:      $Id$
9  * Copyright:   (c) 1998-2003 Universität Karlsruhe
10  * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
11  */
12
13
14 /**
15  * @file irdump.h
16  *
17  * Dump routines for the ir graph and all type information.
18  *
19  * @author Martin Trapp, Christian Schaefer
20  *
21  * The dump format of most functions is vcg.  This is a text based graph
22  * representation. Some use the original format,
23  * but most generate an extended format that is only read by some special
24  * versions of xvcg or by the comercialized version now calles aiSee.
25  * A test version of aiSee is available at
26  * http://www.absint.de/aisee/download/index.htm.
27  *
28  * Most routines use the name of the passed entity as the name of the
29  * file dumped to.
30  */
31
32
33 # ifndef _IRDUMP_H_
34 # define _IRDUMP_H_
35
36 # include "irnode.h"
37 # include "irgraph.h"
38
39 /**
40  * The value of this string will be added to the file name before .vcg
41  *
42  * @todo  GL: A hack -- add parameter to dumper function.
43  */
44 extern char *dump_file_suffix;
45
46 /**
47  *  Dump a firm graph.
48  *
49  *  @param irg  The firm graph to be dumped.
50  *
51  *  @return
52  *     A file containing the firm graph in vcg format.
53  *
54  *  Dumps all Firm nodes of a single graph for a single procedure in
55  *  standard xvcg format.  Dumps the graph to a file.  The file name
56  *  is constructed from the name of the entity describing the
57  *  procedure (irg->entity) and the ending -pure<-ip>.vcg.  Eventually
58  *  overwrites existing files.  Visits all nodes in
59  *  interprocedural_view.
60  *
61  * @see turn_off_edge_labels()
62  */
63 void dump_ir_graph (ir_graph *irg);
64 #define dump_cg_graph dump_ir_graph
65
66 /**
67  *  Dump a firm graph without explicit block nodes.
68  *
69  *  @param irg   The firm graph to be dumped.
70  *
71  *  @return
72  *     A file containing the firm graph in vcg format.
73  *
74  *  Dumps all Firm nodes of a single graph for a single procedure in
75  *  extended xvcg format.
76  *  Dumps the graph to a file.  The file name is constructed from the
77  *  name of the entity describing the procedure (irg->entity) and the
78  *  ending <-ip>.vcg.  Eventually overwrites existing files.  Dumps several
79  *  procedures in boxes if interprocedural_view.
80  *
81  * @see turn_off_edge_labels()
82  */
83 void dump_ir_block_graph (ir_graph *irg);
84 #define dump_cg_block_graph dump_ir_block_graph
85
86 /** Dumps all graphs in interprocedural view to a file named All_graphs.vcg.
87  */
88 void dump_all_cg_block_graph(void);
89
90 /**
91  *  Dumps a firm graph and  all the type information needed for Calls,
92  *  Sels, ... in this graph.
93  *
94  *  @param irg   The firm graph to be dumped with its type information.
95  *
96  *  @return
97  *      A file containing the firm graph and the type information of the firm graph in vcg format.
98  *
99  *  Dumps the graph to a file.  The file name is constructed from the
100  *  name of the entity describing the procedure (irg->entity) and the
101  *  ending -all.vcg.  Eventually overwrites existing files.
102  *
103  * @see turn_off_edge_labels()
104  */
105 void dump_ir_graph_w_types (ir_graph *irg);
106
107 /**
108  *  Dumps a firm graph and  all the type information needed for Calls,
109  *  Sels, ... in this graph.
110  *
111  *  @param irg   The firm graph to be dumped with its type information.
112  *
113  *  @return
114  *      A file containing the firm graph and the type information of the firm graph in vcg format.
115  *
116  *  The graph is in blocked format.
117  *  Dumps the graph to a file.  The file name is constructed from the
118  *  name of the entity describing the procedure (irg->entity) and the
119  *  ending -all.vcg.  Eventually overwrites existing files.
120  *
121  * @see turn_off_edge_labels()
122  */
123 void dump_ir_block_graph_w_types (ir_graph *irg);
124
125 /**
126  *   The type of a walker function that is called for each graph.
127  *
128  *   @param irg   current visited graph
129  */
130 typedef void dump_graph_func(ir_graph *irg);
131
132 /**
133  *   A walker that calls a dumper for each graph.
134  *
135  *   @param dump_graph    The dumper to be used for dumping.
136  *
137  *   @return
138  *      Whatever the dumper creates.
139  *
140  *   Walks over all firm graphs and  calls a dumper for each graph.
141  *   The following dumpers can be passed as arguments:
142  *   - dump_ir_graph()
143  *   - dump_ir_block_graph()
144  *   - dump_cfg()
145  *   - dump_type_graph()
146  *   - dump_ir_graph_w_types()
147  *
148  * @see turn_off_edge_labels()
149  */
150 void dump_all_ir_graphs (dump_graph_func *dump_graph);
151
152
153 /**
154  *   Dump the control flow graph of a procedure.
155  *
156  *   @param irg  The firm graph whose CFG shall be dumped.
157  *
158  *   @return
159  *      A file containing the CFG in vcg format.
160  *
161  *   Dumps the control flow graph of a procedure in standard xvcg format.
162  *   Dumps the graph to a file.  The file name is constructed from the
163  *   name of the entity describing the procedure (irg->entity) and the
164  *   ending -cfg.vcg.  Eventually overwrites existing files.
165  *
166  * @see turn_off_edge_labels()
167  */
168 void dump_cfg (ir_graph *irg);
169
170 /**
171  *  Dumps all the type information needed for Calls, Sels, ... in this graph.
172  *  Does not dump the graph!
173  *
174  *  @param irg   The firm graph whose type information is to be dumped.
175  *  @return
176  *      A file containing the type information of the firm graph in vcg format.
177  *
178  *  Dumps this graph to a file.  The file name is constructed from the
179  *  name of the entity describing the procedure (irg->entity) and the
180  *  ending -type.vcg.  Eventually overwrites existing files.
181  *
182  * @see turn_off_edge_labels()
183  */
184 void dump_type_graph (ir_graph *irg);
185
186 /**
187  *   Dumps all type information.
188  *
189  *   @return
190  *      A file containing all type information for the program in standard
191  *      vcg format.
192  *
193  *   Dumps all type information that is somehow reachable in standard vcg
194  *   format.
195  *   Dumps the graph to a file named All_types.vcg.
196  *
197  * @see turn_off_edge_labels()
198  */
199 void dump_all_types (void);
200
201 /**
202  *   Dumps the class hierarchy with or without entities.
203  *
204  *   @param entities    Flag whether to dump the entities.
205  *
206  *   @return
207  *      A file containing the class hierarchy tree for the program in standard
208  *      vcg format.
209  *
210  *   Does not dump the global type.
211  *   Dumps a node for all classes and the sub/supertype relations.  If
212  *   entities is set to true also dumps the entities of classes, but without
213  *   any additional information as the entities type.  The overwrites relation
214  *   is dumped along with the entities.
215  *   Dumps to a file class_hierarchy.vcg
216  */
217 void dump_class_hierarchy (bool entities);
218
219
220 /**
221  * Dump a standalone loop tree, which contains the loop nodes and the firm nodes
222  * belonging to one loop packed together in one subgraph.  Dumps to file
223  * <name of irg><suffix>-looptree.vcg
224  * Turns on edge labels by default.
225  *
226  * @arg irg     Dump the loop tree for this graph.
227  * @arg suffix  Suffix to filename.
228  */
229 void dump_loop_tree(ir_graph *irg, char *suffix);
230
231
232 /**
233  *   Sets the vcg flag "display_edge_labels" to no.
234  *
235  *   This is necessary
236  *   as xvcg and aisee both fail to display graphs with self-edges if these
237  *   edges have labes.
238  *   Dumpers will generate vcg flags with a different header.
239  */
240 void turn_off_edge_labels(void);
241
242 /**
243  *   If set to true constants will be replicated for every use. In non blocked
244  *   view edges from constant to block are scipped.  Vcg
245  *   then layouts the graphs more compact, this makes them better readable.
246  *   The flag is automatically and temporarily set to false if other
247  *   edges are dumped, as outs, loop, ...
248  *   Default setting: false.
249  */
250 void dump_consts_local(bool b);
251 /**
252  * Returns false if dump_out_edge_flag or dump_loop_information_flag
253  * are set, else returns dump_const_local_flag.
254  */
255 bool get_opt_dump_const_local(void);
256
257 /**
258  *   Turns off dumping the values of constant entities. Makes type graphs
259  *   better readable.
260  */
261 void turn_off_constant_entity_values(void);
262
263 /**
264  *   Turns on dumping the edges from the End node to nodes to be kept
265  *   alive
266  */
267 void dump_keepalive_edges(bool b);
268 bool get_opt_dump_keepalive_edges(void);
269
270 /**
271  *   Turns on dumping the out edges starting from the Start block in
272  *   dump_ir_graph.  To test the consistency of the out datastructure.
273  */
274 void dump_out_edges(void);
275
276 /**
277  *   If this flag is set the dumper dumps edges to immediate dominator in cfg.
278  */
279 void dump_dominator_information(void);
280
281 /**
282  *   If this flag is set the dumper dumps loop nodes and edges from
283  *   these nodes to the contained ir nodes.
284  *   Can be turned off with dont_dump_loop_information().
285  *   If the loops are interprocedural nodes can be missing.
286  */
287 void dump_loop_information(void);
288
289 /**
290  * @see dump_loop_information()
291  */
292 void dont_dump_loop_information(void);
293
294 /**
295  * If set and backedge info is computed, backedges are dumped dashed
296  * and as vcg 'backedge' construct.  Default: set.
297  */
298 void dump_backedge_information(bool b);
299
300 /**
301  *  Dump the information of type field specified in ana/irtypeinfo.h.
302  *  If the flag is set, the type name is output in [] in the node label,
303  *  else it is output as info.
304  */
305 void dump_analysed_type_info(bool b);
306
307 /**
308  * Write the address of a node into the vcg info.
309  * This is off per default for automatic comparisons of
310  * vcg graphs -- these will differ in the pointer values!
311  */
312 void dump_pointer_values_to_info(bool b);
313
314
315 # endif /* _IRDUMP_H_ */