irdumptxt.c 38.1 KB
Newer Older
Christian Würdig's avatar
Christian Würdig committed
1
/*
Michael Beck's avatar
Michael Beck committed
2
 * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
Christian Würdig's avatar
Christian Würdig committed
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 *
 * This file is part of libFirm.
 *
 * This file may be distributed and/or modified under the terms of the
 * GNU General Public License version 2 as published by the Free Software
 * Foundation and appearing in the file LICENSE.GPL included in the
 * packaging of this file.
 *
 * Licensees holding valid libFirm Professional Edition licenses may use
 * this file in accordance with the libFirm Commercial License.
 * Agreement provided with the Software.
 *
 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE.
 */

Matthias Braun's avatar
Matthias Braun committed
20
21
22
23
24
/**
 * @file
 * @brief   Write vcg representation of firm to file.
 * @author  Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Hubert Schmidt
 * @version $Id$
Götz Lindenmaier's avatar
Götz Lindenmaier committed
25
 */
Michael Beck's avatar
Michael Beck committed
26
#include "config.h"
Götz Lindenmaier's avatar
Götz Lindenmaier committed
27
28
29
30
31

#include <string.h>
#include <stdlib.h>
#include <stdarg.h>

32
#include "irdump_t.h"
33
#include "irgraph_t.h"
Götz Lindenmaier's avatar
Götz Lindenmaier committed
34
35
36

#include "irprog_t.h"
#include "entity_t.h"
37
#include "trouts.h"
38
#include "irgwalk.h"
Michael Beck's avatar
Michael Beck committed
39
#include "tv_t.h"
Michael Beck's avatar
Michael Beck committed
40
#include "irprintf.h"
41
#include "error.h"
Götz Lindenmaier's avatar
Götz Lindenmaier committed
42

Götz Lindenmaier's avatar
Götz Lindenmaier committed
43
#include "irdom.h"
44
45
#include "field_temperature.h"

46
#define MY_SIZE 1024     /* Size of an array that actually should be computed. */
47

Michael Beck's avatar
Michael Beck committed
48
49
/**
 * Just opens a file, mangling a file name.
50
 *
Michael Beck's avatar
Michael Beck committed
51
 * The file name results from the concatenation of the following parts:
52
 *
Michael Beck's avatar
Michael Beck committed
53
54
55
56
 * @param basename  The basis of the name telling about the content.
 * @param suffix1   The first suffix.
 * @param suffix2   The second suffix.
 * @param suffix3   The third suffix.
57
 */
Michael Beck's avatar
Michael Beck committed
58
static FILE *text_open(const char *basename, const char * suffix1, const char *suffix2, const char *suffix3) {
Michael Beck's avatar
Michael Beck committed
59
60
61
62
63
64
65
66
67
68
	FILE *F;
	int len = strlen(basename), i, j;
	char *fname;  /* filename to put the vcg information in */

	if (!basename) assert(basename);
	if (!suffix1) suffix1 = "";
	if (!suffix2) suffix2 = "";
	if (!suffix3) suffix3 = ".txt";

	/* open file for vcg graph */
69
	fname = XMALLOCN(char, strlen(basename)*2 + strlen(suffix1) + strlen(suffix2) + 5); /* *2: space for escapes. */
Michael Beck's avatar
Michael Beck committed
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88

	j = 0;
	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] == '@') {
			fname[j] = '@'; j++; fname[j] = '2'; j++;
		} else {
			fname[j] = basename[i]; j++;
		}
	}
	fname[j] = '\0';
	strcat(fname, suffix1);  /* append file suffix */
	strcat(fname, suffix2);  /* append file suffix */
	strcat(fname, suffix3);  /* append the .txt suffix */

	F = fopen(fname, "w");   /* open file for writing */
	if (!F) {
		perror(fname);
89
		abort();
Michael Beck's avatar
Michael Beck committed
90
91
92
93
	}
	free(fname);

	return F;
94
95
}

96
/* Write the irnode and all its attributes to the file passed. */
97
int dump_irnode_to_file(FILE *F, ir_node *n) {
Michael Beck's avatar
Michael Beck committed
98
99
100
101
102
103
104
105
106
	int i, bad = 0;
	char comma;
	ir_graph *irg;

	dump_node_opcode(F, n);
	fprintf(F, " %ld\n", get_irn_node_nr(n));

	fprintf(F, "  index: %u\n", get_irn_idx(n));
	if (opt_dump_pointer_values_to_info)
107
		fprintf (F, "  addr:    %p\n", (void *)n);
Michael Beck's avatar
Michael Beck committed
108
	fprintf (F, "  mode:    %s\n", get_mode_name(get_irn_mode(n)));
109
	fprintf (F, "  visited: %ld\n", get_irn_visited(n));
Michael Beck's avatar
Michael Beck committed
110
111
112
113
114
115
116
	irg = get_irn_irg(n);
	if (irg != get_const_code_irg())
		fprintf (F, "  irg:     %s\n", get_ent_dump_name(get_irg_entity(irg)));

	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 ");
117
118
		dump_node_opcode(F, get_irn_n(n, -1));
		fprintf(F, " %ld\n", get_irn_node_nr(get_irn_n(n, -1)));
Michael Beck's avatar
Michael Beck committed
119
120
	}

121
#ifdef INTERPROCEDURAL_VIEW
Michael Beck's avatar
Michael Beck committed
122
123
	fprintf(F, "  arity:   %d\n", get_irn_intra_arity(n));
	/* show all predecessor nodes */
124
	fprintf(F, "  pred nodes:\n");
Michael Beck's avatar
Michael Beck committed
125
126
	if (!is_Block(n)) {
		fprintf(F, "    -1:    ");
127
128
		dump_node_opcode(F, get_irn_n(n, -1));
		fprintf(F, " %ld\n", get_irn_node_nr(get_irn_n(n, -1)));
Michael Beck's avatar
Michael Beck committed
129
130
131
132
133
134
	}
	for ( i = 0; i < get_irn_intra_arity(n); ++i) {
		fprintf(F, "     %d: %s ", i, is_intra_backedge(n, i) ? "be" : "  ");
		dump_node_opcode(F, get_irn_intra_n(n, i));
		fprintf(F, " %ld\n", get_irn_node_nr(get_irn_intra_n(n, i)));
	}
135
136
137
#else
	fprintf(F, "  arity:   %d\n", get_irn_arity(n));
	/* show all predecessor nodes */
138
	fprintf(F, "  pred nodes:\n");
139
140
141
142
143
144
145
146
147
148
149
	if (!is_Block(n)) {
		fprintf(F, "    -1:    ");
		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_arity(n); ++i) {
		fprintf(F, "     %d: %s ", i, is_backedge(n, i) ? "be" : "  ");
		dump_node_opcode(F, get_irn_n(n, i));
		fprintf(F, " %ld\n", get_irn_node_nr(get_irn_n(n, i)));
	}
#endif
Michael Beck's avatar
Michael Beck committed
150
151
152

	fprintf(F, "  Private Attributes:\n");

Michael Beck's avatar
Michael Beck committed
153
	if (is_Proj(n))
Michael Beck's avatar
Michael Beck committed
154
155
		fprintf(F, "  proj nr: %ld\n", get_Proj_proj(n));

156
#ifdef INTERPROCEDURAL_VIEW
Michael Beck's avatar
Michael Beck committed
157
	if ((get_irp_ip_view_state() != ip_view_no) && (is_Filter(n) || is_Block(n))) {
Michael Beck's avatar
Michael Beck committed
158
		fprintf(F, "  inter arity: %d\n", get_irn_inter_arity(n));
159
		fprintf(F, "  inter pred nodes:\n");
Michael Beck's avatar
Michael Beck committed
160
		for (i = 0; i < get_irn_inter_arity(n); ++i) {
Michael Beck's avatar
Michael Beck committed
161
162
163
164
165
			fprintf(F, "     %d: %s ", i, is_intra_backedge(n, i) ? "be" : "  ");
			dump_node_opcode(F, get_irn_inter_n(n, i));
			fprintf(F, " %ld\n", get_irn_node_nr(get_irn_inter_n(n, i)));
		}
	}
166
#endif
Michael Beck's avatar
Michael Beck committed
167
168
169
170
171
172
173

	if (is_fragile_op(n)) {
		fprintf(F, "  pinned state: %s\n", get_op_pin_state_name(get_irn_pinned(n)));
		/* not dumped: frag array */
	}

	/* This is not nice, output it as a marker in the predecessor list. */
174
175
176
	if (is_Block(n)             ||
	    get_irn_op(n) == op_Phi ||
	    (is_Filter(n) && get_interprocedural_view())) {
Michael Beck's avatar
Michael Beck committed
177
178
179
180
181
182
183
184
		fprintf(F, "  backedges:");
		comma = ' ';
		for (i = 0; i < get_irn_arity(n); i++)
			if (is_backedge(n, i)) { fprintf(F, "%c %d", comma, i); comma = ','; }
			fprintf(F, "\n");
	}

	/* Loop node.   Someone else please tell me what's wrong ... */
185
	if (get_irg_loopinfo_state(irg) & loopinfo_valid) {
Michael Beck's avatar
Michael Beck committed
186
		ir_loop *loop = get_irn_loop(n);
187
188
189
190
		if (loop != NULL) {
			fprintf(F, "  in loop %d with depth %d\n",
				get_loop_loop_nr(loop), get_loop_depth(loop));
		}
Michael Beck's avatar
Michael Beck committed
191
192
193
194
195
	}

	/* Source types */
	switch (get_irn_opcode(n)) {
	case iro_Block: {
196
197
		if (has_Block_entity(n))
			fprintf(F, "  Label: %lu\n", get_entity_label(get_Block_entity(n)));
198
		ir_fprintf(F, "  macro Block: %+F\n", get_Block_MacroBlock(n));
Michael Beck's avatar
Michael Beck committed
199
		fprintf(F, "  block visited: %ld\n", get_Block_block_visited(n));
Michael Beck's avatar
Michael Beck committed
200
		fprintf(F, "  block marked: %u\n", get_Block_mark(n));
Michael Beck's avatar
Michael Beck committed
201
202
203
204
205
206
		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));
		}

207
		fprintf(F, "  Execution frequency statistics:\n");
Michael Beck's avatar
Michael Beck committed
208
209
		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));
210
#ifdef INTERPROCEDURAL_VIEW
Michael Beck's avatar
Michael Beck committed
211
		if (get_irp_loop_nesting_depth_state() != loop_nesting_depth_none)
212
			fprintf(F, "    call frequency of procedure:   %8.2lf\n",
Michael Beck's avatar
Michael Beck committed
213
214
215
216
217
218
219
			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));
220
#endif
Michael Beck's avatar
Michael Beck committed
221
222
223
224
225
226

		/* not dumped: graph_arr */
		/* not dumped: mature    */
	}  break;
	case iro_Start: {
		ir_type *tp = get_entity_type(get_irg_entity(get_irn_irg(n)));
227
		ir_fprintf(F, "  start of method of type %+F\n", tp);
Michael Beck's avatar
Michael Beck committed
228
		for (i = 0; i < get_method_n_params(tp); ++i)
229
			ir_fprintf(F, "    param %d type: %+F\n", i, get_method_param_type(tp, i));
230
#ifdef INTERPROCEDURAL_VIEW
Michael Beck's avatar
Michael Beck committed
231
232
233
234
235
236
		if ((get_irp_ip_view_state() == ip_view_valid) && !get_interprocedural_view()) {
			ir_node *sbl = get_nodes_block(n);
			int i, n_cfgpreds = get_Block_cg_n_cfgpreds(sbl);
			fprintf(F, "  graph has %d interprocedural predecessors:\n", n_cfgpreds);
			for (i = 0; i < n_cfgpreds; ++i) {
				ir_node *cfgpred = get_Block_cg_cfgpred(sbl, i);
237
238
239
				fprintf(F, "    %d: Call %ld in graph %s\n", i,
				        get_irn_node_nr(cfgpred),
				        get_irg_dump_name(get_irn_irg(cfgpred)));
Michael Beck's avatar
Michael Beck committed
240
241
			}
		}
242
#endif
Michael Beck's avatar
Michael Beck committed
243
244
	} break;
	case iro_Cond: {
245
		fprintf(F, "  default ProjNr: %ld\n", get_Cond_default_proj(n));
246
247
248
249
		if (get_Cond_jmp_pred(n) != COND_JMP_PRED_NONE) {
			fprintf(F, "  jump prediction: %s\n",
			        get_cond_jmp_predicate_name(get_Cond_jmp_pred(n)));
		}
Michael Beck's avatar
Michael Beck committed
250
251
	} break;
	case iro_Alloc: {
252
		ir_fprintf(F, "  allocating entity of type: %+F\n", get_Alloc_type(n));
Michael Beck's avatar
Michael Beck committed
253
254
255
		fprintf(F, "  allocating on: the %s\n", (get_Alloc_where(n) == stack_alloc) ? "stack" : "heap");
	} break;
	case iro_Free: {
256
		ir_fprintf(F, "  freeing entity of type %+F\n", get_Free_type(n));
Michael Beck's avatar
Michael Beck committed
257
258
259
260
261
262
		fprintf(F, "  allocated on: the %s\n", (get_Free_where(n) == stack_alloc) ? "stack" : "heap");
	} break;
	case iro_Sel: {
		ir_entity *ent = get_Sel_entity(n);
		if (ent) {
			fprintf(F, "  Selecting entity %s (%ld)\n", get_entity_name(ent), get_entity_nr(ent));
263
264
			ir_fprintf(F, "    of type    %+F\n",  get_entity_type(ent));
			ir_fprintf(F, "    with owner %+F.\n", get_entity_owner(ent));
Michael Beck's avatar
Michael Beck committed
265
266
267
268
269
270
271
272
		}
		else {
			fprintf(F, "  <NULL entity>\n");
			bad = 1;
		}
	} break;
	case iro_Call: {
		ir_type *tp = get_Call_type(n);
273
274
		if (get_Call_tail_call(n))
			fprintf(F, "  tail call\n");
275
		ir_fprintf(F, "  calling method of type %+F\n", tp);
Michael Beck's avatar
Michael Beck committed
276
277
		if(get_unknown_type() != tp) {
			for (i = 0; i < get_method_n_params(tp); ++i)
278
				ir_fprintf(F, "    param %d type: %+F\n", i, get_method_param_type(tp, i));
Michael Beck's avatar
Michael Beck committed
279
			for (i = 0; i < get_method_n_ress(tp); ++i)
280
				ir_fprintf(F, "    result %d type: %+F\n", i, get_method_res_type(tp, i));
Michael Beck's avatar
Michael Beck committed
281
282
		}
		if (Call_has_callees(n)) {
283
			fprintf(F, "  possible callees:\n");
Michael Beck's avatar
Michael Beck committed
284
285
286
287
288
289
290
291
292
			for (i = 0; i < get_Call_n_callees(n); i++) {
				fprintf(F, "    %d: %s\n", i, get_ent_dump_name(get_Call_callee(n, i)));
			}
		}
	} break;
	case iro_CallBegin: {
		ir_node *call = get_CallBegin_call(n);
		fprintf(F, "  Call: %ld\n", get_irn_node_nr(call));
		if (Call_has_callees(call)) {
293
			fprintf(F, "  possible callees:\n");
Michael Beck's avatar
Michael Beck committed
294
295
296
297
298
299
			for (i = 0; i < get_Call_n_callees(call); i++) {
				fprintf(F, "    %d: %s\n", i, get_ent_dump_name(get_Call_callee(call, i)));
			}
		}
	} break;
	case iro_Cast: {
300
		ir_fprintf(F, "  cast to type: %+F\n", get_Cast_type(n));
Michael Beck's avatar
Michael Beck committed
301
302
303
304
	} break;
	case iro_Return: {
		if (!get_interprocedural_view()) {
			ir_type *tp = get_entity_type(get_irg_entity(get_irn_irg(n)));
305
306
307
308
309
			ir_fprintf(F, "  return in method of type %+F\n", tp);
			for (i = 0; i < get_method_n_ress(tp); ++i) {
				ir_fprintf(F, "    result %d type: %+F\n", i,
				           get_method_res_type(tp, i));
			}
Michael Beck's avatar
Michael Beck committed
310
311
312
		}
	} break;
	case iro_Const: {
313
		assert(get_Const_type(n) != firm_none_type);
314
		ir_fprintf(F, "  Const of type %+F\n", get_Const_type(n));
Michael Beck's avatar
Michael Beck committed
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
	} break;
	case iro_SymConst: {
		switch(get_SymConst_kind(n)) {
		case symconst_addr_name:
			fprintf(F, "  kind: addr_name\n");
			fprintf(F, "  name: %s\n", get_id_str(get_SymConst_name(n)));
			break;
		case symconst_addr_ent:
			fprintf(F, "  kind:   addr_ent\n");
			fprintf(F, "  entity: ");
			dump_entity_to_file(F, get_SymConst_entity(n), dump_verbosity_onlynames);
			break;
		case symconst_ofs_ent:
			fprintf(F, "  kind:   offset\n");
			fprintf(F, "  entity: ");
			dump_entity_to_file(F, get_SymConst_entity(n), dump_verbosity_onlynames);
			break;
		case symconst_type_tag:
			fprintf(F, "  kind: type_tag\n");
			fprintf(F, "  type: ");
			dump_type_to_file(F, get_SymConst_type(n), dump_verbosity_onlynames);
			break;
		case symconst_type_size:
			fprintf(F, "  kind: size\n");
			fprintf(F, "  type: ");
			dump_type_to_file(F, get_SymConst_type(n), dump_verbosity_onlynames);
			break;
		case symconst_type_align:
			fprintf(F, "  kind: alignment\n");
			fprintf(F, "  type: ");
			dump_type_to_file(F, get_SymConst_type(n), dump_verbosity_onlynames);
			break;
		case symconst_enum_const:
			fprintf(F, "  kind: enumeration\n");
349
			fprintf(F, "  name: %s\n", get_enumeration_const_name(get_SymConst_enum(n)));
Michael Beck's avatar
Michael Beck committed
350
351
			break;
		}
352
		ir_fprintf(F, "  type of value: %+F\n", get_SymConst_value_type(n));
Michael Beck's avatar
Michael Beck committed
353
354
355
356
	} break;
	case iro_Load:
		fprintf(F, "  mode of loaded value: %s\n", get_mode_name_ex(get_Load_mode(n), &bad));
		fprintf(F, "  volatility: %s\n", get_volatility_name(get_Load_volatility(n)));
Michael Beck's avatar
Michael Beck committed
357
		fprintf(F, "  align: %s\n", get_align_name(get_Load_align(n)));
Michael Beck's avatar
Michael Beck committed
358
359
360
		break;
	case iro_Store:
		fprintf(F, "  volatility: %s\n", get_volatility_name(get_Store_volatility(n)));
Michael Beck's avatar
Michael Beck committed
361
		fprintf(F, "  align: %s\n", get_align_name(get_Store_align(n)));
Michael Beck's avatar
Michael Beck committed
362
363
364
365
366
367
368
369
370
		break;
	case iro_Confirm:
		fprintf(F, "  compare operation: %s\n", get_pnc_string(get_Confirm_cmp(n)));
		break;
	case iro_ASM: {
		const ir_asm_constraint *cons;
		ident **clobber;
		int l;

Matthias Braun's avatar
Matthias Braun committed
371
		fprintf(F, "  assembler text: %s", get_id_str(get_ASM_text(n)));
Michael Beck's avatar
Michael Beck committed
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
		l = get_ASM_n_input_constraints(n);
		if (l > 0) {
			fprintf(F, "\n  inputs:  ");
			cons = get_ASM_input_constraints(n);
			for (i = 0; i < l; ++i)
				fprintf(F, "%%%u %s ", cons[i].pos, get_id_str(cons[i].constraint));
		}
		l = get_ASM_n_output_constraints(n);
		if (l > 0) {
			fprintf(F, "\n  outputs: ");
			cons = get_ASM_output_constraints(n);
			for (i = 0; i < l; ++i)
				fprintf(F, "%%%u %s ", cons[i].pos, get_id_str(cons[i].constraint));
		}
		l = get_ASM_n_clobbers(n);
		if (l > 0) {
			fprintf(F, "\n  clobber: ");
			clobber = get_ASM_clobbers(n);
			for (i = 0; i < l; ++i)
				fprintf(F, "%s ", get_id_str(clobber[i]));
		}
		if (get_irn_pinned(n) != op_pin_state_floats)
			fprintf(F, "\n  volatile");
		fprintf(F, "\n");
	} break;
	default: ;
	}

400
401
402
403
	if (n->vrp.valid) {
		dump_vrp_info(F, n);
	}

Michael Beck's avatar
Michael Beck committed
404
405
406
	if (get_irg_typeinfo_state(get_irn_irg(n)) == ir_typeinfo_consistent  ||
		get_irg_typeinfo_state(get_irn_irg(n)) == ir_typeinfo_inconsistent  )
		if (get_irn_typeinfo_type(n) != firm_none_type)
407
			ir_fprintf (F, "  Analysed type: %s\n", get_irn_typeinfo_type(n));
Michael Beck's avatar
Michael Beck committed
408
409

	return bad;
410
411
412
413
414
}



void dump_irnode(ir_node *n) {
Michael Beck's avatar
Michael Beck committed
415
	dump_irnode_to_file(stdout, n);
416
417
418
419
}


void dump_graph_to_file(FILE *F, ir_graph *irg) {
Michael Beck's avatar
Michael Beck committed
420
	fprintf(F, "graph %s\n", get_irg_dump_name(irg));
421
422
423
}

void dump_graph(ir_graph *g) {
Michael Beck's avatar
Michael Beck committed
424
	dump_graph_to_file(stdout, g);
425
426
427
}

static void dump_node_to_graph_file(ir_node *n, void *env) {
Michael Beck's avatar
Michael Beck committed
428
	FILE *F = (FILE *)env;
429

Michael Beck's avatar
Michael Beck committed
430
431
	dump_irnode_to_file(F, n);
	fprintf(F, "\n");
432
433
434
}

void dump_graph_as_text(ir_graph *irg, const char *suffix) {
Michael Beck's avatar
Michael Beck committed
435
436
	const char *basename = get_irg_dump_name(irg);
	FILE *F;
437

Michael Beck's avatar
Michael Beck committed
438
	F = text_open(basename, suffix, "", ".txt");
439

Michael Beck's avatar
Michael Beck committed
440
441
442
	dump_graph_to_file(F, irg);
	fprintf(F, "\n\n");
	irg_walk_graph(irg, NULL, dump_node_to_graph_file, F);
443

Michael Beck's avatar
Michael Beck committed
444
	fclose (F);
445
446
}

447
#ifdef EXTENDED_ACCESS_STATS
Michael Beck's avatar
Michael Beck committed
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
static int addr_is_alloc(ir_node *acc) {
	ir_node *addr = NULL;
	ir_opcode addr_op;
	if (is_memop(acc)) {
		addr = get_memop_ptr(acc);
	} else {
		assert(is_Call(acc));
		addr = get_Call_ptr(acc);
	}

	addr_op = get_irn_opcode(addr);

	while (addr_op != iro_Alloc) {
		switch (addr_op) {
		case iro_Sel:
			addr = get_Sel_ptr(addr);
			break;
		case iro_Cast:
			addr = get_Cast_op(addr);
			break;
		case iro_Proj:
			addr = get_Proj_pred(addr);
			break;
		case iro_SymConst:
		case iro_Const:
			return 0;
			break;
		case iro_Phi:
		case iro_Load:
		case iro_Call:
		case iro_Start:
			return 0;
			break;

		default:
			//DDMN(addr);
			//assert(0 && "unexpected address node");
			;
		}
		addr_op = get_irn_opcode(addr);
	}

	/* In addition, the alloc must be in the same loop. */
	return 1;
492
}
493
#endif
494

Götz Lindenmaier's avatar
Götz Lindenmaier committed
495
496
497
498
499
500
501
/** 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,
Michael Beck's avatar
Michael Beck committed
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
                           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 eight 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");
Götz Lindenmaier's avatar
Götz Lindenmaier committed
523
524
525
526
527
528
529
530
}

/** dumps something like:
 *
 *  "prefix"  "Name" (x): node1, ... node7,\n
 *  "prefix"    node8, ... node15,\n
 *  "prefix"    node16, node17\n
 */
531
static void dump_type_list(FILE *F, ir_type *tp, char *prefix,
Matthias Braun's avatar
Matthias Braun committed
532
533
534
                           int (*get_n_types)(const ir_type *tp),
                           ir_type *(*get_type)(const ir_type *tp, int pos),
                           const char *name) {
Michael Beck's avatar
Michael Beck committed
535
536
537
538
539
540
541
542
543
	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 eight node. */
			fprintf(F, ",\n%s   ", prefix);
			comma = "";
		}
544
		ir_fprintf(F, "%s %+F", comma, get_type(tp, i));
Michael Beck's avatar
Michael Beck committed
545
546
547
		comma = ",";
	}
	fprintf(F, "\n");
Götz Lindenmaier's avatar
Götz Lindenmaier committed
548
549
}

550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
static int need_nl = 1;

/**
 * Dump initializers.
 */
static void dump_ir_initializers_to_file(FILE *F, const char *prefix,
										 const ir_initializer_t *initializer, ir_type *type) {
	tarval  *tv;
	ir_node *value;

	if (need_nl) {
		fprintf(F, "\n%s    ", prefix);
		need_nl = 0;
	}
	switch (get_initializer_kind(initializer)) {
	case IR_INITIALIZER_NULL:
		fprintf(F, "\t = <NOT_SET>");
		break;
	case IR_INITIALIZER_TARVAL:
		tv = get_initializer_tarval_value(initializer);
		ir_fprintf(F, "\t = <TV>%F", tv);
		break;
	case IR_INITIALIZER_CONST:
		value = get_initializer_const_value(initializer);
		fprintf(F, "\t = <CONST>");
		dump_node_opcode(F, value);
		break;
	case IR_INITIALIZER_COMPOUND:
		if (is_Array_type(type)) {
			size_t i, n = get_initializer_compound_n_entries(initializer);
			ir_type *element_type = get_array_element_type(type);
			for (i = 0; i < n; ++i) {
				ir_initializer_t *sub_initializer
					= get_initializer_compound_value(initializer, i);

				if (need_nl) {
					fprintf(F, "\n%s    ", prefix);
					need_nl = 0;
				}
589
				fprintf(F, "[%d]", (int) i);
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
				dump_ir_initializers_to_file(F, prefix, sub_initializer, element_type);
			}
		} else {
			size_t i, n;
			assert(is_compound_type(type));
			n = get_compound_n_members(type);
			for (i = 0; i < n; ++i) {
				ir_entity        *member    = get_compound_member(type, i);
				ir_type          *subtype   = get_entity_type(member);
				ir_initializer_t *sub_initializer;

				assert(i < get_initializer_compound_n_entries(initializer));
				sub_initializer
					= get_initializer_compound_value(initializer, i);

				if (need_nl) {
					fprintf(F, "\n%s    ", prefix);
					need_nl = 0;
				}
				ir_fprintf(F, ".%F", member);
				dump_ir_initializers_to_file(F, prefix, sub_initializer, subtype);
			}
		}
		break;
	default:
		panic("invalid ir_initializer kind found");
	}
	need_nl = 1;
}

Matthias Braun's avatar
Matthias Braun committed
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
static void dump_entity_linkage(FILE *F, const ir_entity *entity)
{
	ir_linkage linkage = get_entity_linkage(entity);

	if (linkage & IR_LINKAGE_CONSTANT)
		fprintf(F, " constant");
	if (linkage & IR_LINKAGE_WEAK)
		fprintf(F, " weak");
	if (linkage & IR_LINKAGE_GARBAGE_COLLECT)
		fprintf(F, " garbage_collect");
	if (linkage & IR_LINKAGE_MERGE)
		fprintf(F, " merge");
	if (linkage & IR_LINKAGE_HIDDEN_USER)
		fprintf(F, " hidden_user");
}
635

Michael Beck's avatar
Michael Beck committed
636
637
638
639
640
641
642
643
void dump_entity_to_file_prefix(FILE *F, ir_entity *ent, char *prefix, unsigned verbosity) {
	int i, j;
	ir_type *owner, *type;

	assert(is_entity(ent));
	owner = get_entity_owner(ent);
	type  = get_entity_type(ent);
	if (verbosity & dump_verbosity_onlynames) {
644
		fprintf(F, "%sentity %s.%s (%ld)\n", prefix, get_compound_name(get_entity_owner(ent)),
Michael Beck's avatar
Michael Beck committed
645
646
647
648
649
650
			get_entity_name(ent), get_entity_nr(ent));
		return;
	}

	if (verbosity & dump_verbosity_entattrs) {
		fprintf(F, "%sentity %s (%ld)\n", prefix, get_entity_name(ent), get_entity_nr(ent));
651
652
		ir_fprintf(F, "%s  type:  %+F\n", prefix, type);
		ir_fprintf(F, "%s  owner: %+F\n", prefix, owner);
Michael Beck's avatar
Michael Beck committed
653
654
655
656
657
658

		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) {
					ir_entity *ov = get_entity_overwrites(ent, i);
659
660
					ir_fprintf(F, "%s    %d: %s of class %+F\n", prefix, i,
					        get_entity_name(ov), get_entity_owner(ov));
Michael Beck's avatar
Michael Beck committed
661
662
				}
			} else {
663
				fprintf(F, "%s  Does not overwrite other entities.\n", prefix);
Michael Beck's avatar
Michael Beck committed
664
665
666
667
668
			}
			if (get_entity_n_overwrittenby(ent) > 0) {
				fprintf(F, "%s  overwritten by:\n", prefix);
				for (i = 0; i < get_entity_n_overwrittenby(ent); ++i) {
					ir_entity *ov = get_entity_overwrittenby(ent, i);
669
670
					ir_fprintf(F, "%s    %d: %s of class %+F\n", prefix, i,
					           get_entity_name(ov), get_entity_owner(ov));
Michael Beck's avatar
Michael Beck committed
671
672
				}
			} else {
673
674
				fprintf(F, "%s  Is not overwritten by other entities.\n",
				        prefix);
Michael Beck's avatar
Michael Beck committed
675
676
677
678
679
680
681
682
			}

			if (get_irp_inh_transitive_closure_state() != inh_transitive_closure_none) {
				ir_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)) {
683
684
					ir_fprintf(F, "%s    : %s of class %+F\n", prefix,
					           get_entity_name(ov), get_entity_owner(ov));
Michael Beck's avatar
Michael Beck committed
685
686
687
688
689
				}
				fprintf(F, "%s  transitive overwritten by:\n", prefix);
				for (ov = get_entity_trans_overwrittenby_first(ent);
				ov;
				ov = get_entity_trans_overwrittenby_next(ent)) {
690
691
					ir_fprintf(F, "%s    : %s of class %+F\n", prefix,
					           get_entity_name(ov), get_entity_owner(ov));
Michael Beck's avatar
Michael Beck committed
692
693
694
695
				}
			}
		}

Matthias Braun's avatar
Matthias Braun committed
696
697
		fprintf(F, "%s  linkage:", prefix);
		dump_entity_linkage(F, ent);
Michael Beck's avatar
Michael Beck committed
698
699
700
701
702
703
704
705
706
707
708
709
710
711

		if (is_Method_type(get_entity_type(ent))) {
			unsigned mask = get_entity_additional_properties(ent);
			unsigned cc   = get_method_calling_convention(get_entity_type(ent));
			ir_graph *irg = get_entity_irg(ent);

			if (irg) {
				fprintf(F, "\n%s  estimated node count: %u", prefix, get_irg_estimated_node_cnt(irg));
				fprintf(F, "\n%s  maximum node index:   %u", prefix, get_irg_last_idx(irg));
			}

			if (mask) {
				fprintf(F, "\n%s  additional prop: ", prefix);

712
713
714
715
716
717
718
719
720
721
722
				if (mask & mtp_property_const)         fputs("const_function, ", F);
				if (mask & mtp_property_pure)          fputs("pure_function, ", F);
				if (mask & mtp_property_noreturn)      fputs("noreturn_function, ", F);
				if (mask & mtp_property_nothrow)       fputs("nothrow_function, ", F);
				if (mask & mtp_property_naked)         fputs("naked_function, ", F);
				if (mask & mtp_property_malloc)        fputs("malloc_function, ", F);
				if (mask & mtp_property_returns_twice) fputs("weak_function, ", F);
				if (mask & mtp_property_intrinsic)     fputs("intrinsic_function, ", F);
				if (mask & mtp_property_runtime)       fputs("runtime_function, ", F);
				if (mask & mtp_property_private)       fputs("private_function, ", F);
				if (mask & mtp_property_has_loop)      fputs("has_loop_function, ", F);
Michael Beck's avatar
Michael Beck committed
723
724
			}
			fprintf(F, "\n%s  calling convention: ", prefix);
725
726
727
728
			if (cc & cc_reg_param)           fputs("regparam, ", F);
			if (cc & cc_this_call)           fputs("thiscall, ", F);
			if (cc & cc_compound_ret)        fputs("compound_ret, ", F);
			if (cc & cc_frame_on_caller_stk) fputs("frame on caller's stack, ", F);
729
			cc &= ~(cc_compound_ret|cc_frame_on_caller_stk);
Michael Beck's avatar
Michael Beck committed
730
			if (IS_CDECL(cc))
731
				fputs("cdecl", F);
Michael Beck's avatar
Michael Beck committed
732
			else if (IS_STDCALL(cc))
733
				fputs("stdcall", F);
Michael Beck's avatar
Michael Beck committed
734
			else {
735
736
				fputs(cc & cc_last_on_top      ? "last param on top, " : "first param on top, ", F);
				fputs(cc & cc_callee_clear_stk ? "callee clear stack" : "caller clear stack", F);
Michael Beck's avatar
Michael Beck committed
737
738
739
740
			}
			fprintf(F, "\n%s  vtable number:        %u", prefix, get_entity_vtable_number(ent));
		}

741
		fputc('\n', F);
Michael Beck's avatar
Michael Beck committed
742
	} else {  /* no entattrs */
743
		ir_fprintf(F, "%s(%3d:%d) %+F: %s", prefix,
Michael Beck's avatar
Michael Beck committed
744
			get_entity_offset(ent), get_entity_offset_bits_remainder(ent),
745
			get_entity_type(ent), get_entity_name(ent));
746
		if (is_Method_type(get_entity_type(ent))) fputs("(...)", F);
Michael Beck's avatar
Michael Beck committed
747
748

		if (verbosity & dump_verbosity_accessStats) {
Matthias Braun's avatar
Matthias Braun committed
749
			dump_entity_linkage(F, ent);
Michael Beck's avatar
Michael Beck committed
750
		}
751
		fputc('\n', F);
Michael Beck's avatar
Michael Beck committed
752
753
754
	}

	if (verbosity & dump_verbosity_entconsts) {
Matthias Braun's avatar
Matthias Braun committed
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
		if (ent->initializer != NULL) {
			const ir_initializer_t *initializer = get_entity_initializer(ent);
			fprintf(F, "\n%s  Initializers:", prefix);
			need_nl = 1;
			dump_ir_initializers_to_file(F, prefix, initializer, get_entity_type(ent));
		} else if (entity_has_compound_ent_values(ent)) {
			fprintf(F, "%s  compound values:", prefix);
			for (i = 0; i < get_compound_ent_n_values(ent); ++i) {
				compound_graph_path *path = get_compound_ent_value_path(ent, i);
				ir_entity *ent0 = get_compound_graph_path_node(path, 0);
				fprintf(F, "\n%s    %3d:%u ", prefix, get_entity_offset(ent0), get_entity_offset_bits_remainder(ent0));
				if (get_type_state(type) == layout_fixed)
					fprintf(F, "(%3u:%u) ",   get_compound_ent_value_offset_bytes(ent, i), get_compound_ent_value_offset_bit_remainder(ent, i));
				fprintf(F, "%s", get_entity_name(ent));
				for (j = 0; j < get_compound_graph_path_length(path); ++j) {
					ir_entity *node = get_compound_graph_path_node(path, j);
					fprintf(F, ".%s", get_entity_name(node));
					if (is_Array_type(get_entity_owner(node)))
						fprintf(F, "[%d]", get_compound_graph_path_array_index(path, j));
Michael Beck's avatar
Michael Beck committed
774
				}
Matthias Braun's avatar
Matthias Braun committed
775
776
				fprintf(F, "\t = ");
				dump_node_opcode(F, get_compound_ent_value(ent, i));
Michael Beck's avatar
Michael Beck committed
777
			}
778
			fputc('\n', F);
Michael Beck's avatar
Michael Beck committed
779
780
781
782
		}
	}

	if (verbosity & dump_verbosity_entattrs) {
Matthias Braun's avatar
Matthias Braun committed
783
784
		fprintf(F, "%s  linkage:", prefix);
		dump_entity_linkage(F, ent);
Michael Beck's avatar
Michael Beck committed
785
		fprintf(F, "%s  volatility:  %s", prefix, get_volatility_name(get_entity_volatility(ent)));
Matthias Braun's avatar
Matthias Braun committed
786
787
		fprintf(F, "\n%s  aligned:  %s", prefix, get_align_name(get_entity_aligned(ent)));
		fprintf(F, "\n%s  alignment:  %u", prefix, get_entity_alignment(ent));
Michael Beck's avatar
Michael Beck committed
788
789
790
791
792
		fprintf(F, "\n%s  ld_name: %s", prefix, ent->ld_name ? get_entity_ld_name(ent) : "no yet set");
		fprintf(F, "\n%s  offset:  %d bytes, %d rem bits", prefix, get_entity_offset(ent), get_entity_offset_bits_remainder(ent));
		if (is_Method_type(get_entity_type(ent))) {
			if (get_entity_irg(ent))   /* can be null */ {
				fprintf(F, "\n%s  irg = %ld", prefix, get_irg_graph_nr(get_entity_irg(ent)));
793
#ifdef INTERPROCEDURAL_VIEW
Michael Beck's avatar
Michael Beck committed
794
795
796
797
				if (get_irp_callgraph_state() == irp_callgraph_and_calltree_consistent) {
					fprintf(F, "\n%s    recursion depth %d", prefix, get_irg_recursion_depth(get_entity_irg(ent)));
					fprintf(F, "\n%s    loop depth      %d", prefix, get_irg_loop_depth(get_entity_irg(ent)));
				}
798
#endif
Michael Beck's avatar
Michael Beck committed
799
800
801
802
			} else {
				fprintf(F, "\n%s  irg = NULL", prefix);
			}
		}
803
		fputc('\n', F);
Michael Beck's avatar
Michael Beck committed
804
805
806
807
808
809
810
811
812
813
814
	}

	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) {
815
#ifdef EXTENDED_ACCESS_STATS
Michael Beck's avatar
Michael Beck committed
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
		int n_acc = get_entity_n_accesses(ent);
		int max_depth = 0;
		int max_L_freq = -1;
		int max_S_freq = -1;
		int max_LA_freq = -1;
		int max_SA_freq = -1;
		int *L_freq;
		int *S_freq;
		int *LA_freq;
		int *SA_freq;

		/* Find maximal depth */
		for (i = 0; i < n_acc; ++i) {
			ir_node *acc = get_entity_access(ent, i);
			int depth = get_weighted_loop_depth(acc);
			max_depth = (depth > max_depth) ? depth : max_depth ;
		}

834
		L_freq = XMALLOCNZ(int, 4 * max_depth);
Michael Beck's avatar
Michael Beck committed
835
836
837
838
839
840
841
842
843

		S_freq  = L_freq + 1*max_depth;
		LA_freq = L_freq + 2*max_depth;
		SA_freq = L_freq + 3*max_depth;

		for (i = 0; i < n_acc; ++i) {
			ir_node *acc = get_entity_access(ent, i);
			int depth = get_weighted_loop_depth(acc);
			assert(depth < max_depth);
844
			if (is_Load(acc) || is_Call(acc)) {
Michael Beck's avatar
Michael Beck committed
845
846
847
848
849
850
				L_freq[depth]++;
				max_L_freq = (depth > max_L_freq) ? depth : max_L_freq;
				if (addr_is_alloc(acc)) {
					LA_freq[depth]++;
					max_LA_freq = (depth > max_LA_freq) ? depth : max_LA_freq;
				}
851
			} else if (is_Store(acc)) {
Michael Beck's avatar
Michael Beck committed
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
				S_freq[depth]++;
				max_S_freq = (depth > max_S_freq) ? depth : max_S_freq;
				if (addr_is_alloc(acc)) {
					SA_freq[depth]++;
					max_SA_freq = (depth > max_SA_freq) ? depth : max_SA_freq;
				}
			} else {
				assert(0);
			}
		}

		if (max_L_freq >= 0) {
			char comma = ':';

			fprintf(F, "%s  Load  Stats", prefix);
			for (i = 0; i <= max_L_freq; ++i) {
				if (L_freq[i])
					fprintf(F, "%c %d x  L%d", comma, L_freq[i], i);
				else
					fprintf(F, "         ");
				comma = ',';
			}
			fprintf(F, "\n");
		}
		if (max_LA_freq >= 0) {
			//fprintf(F, "%s  LoadA Stats", prefix);
			char comma = ':';
			for (i = 0; i <= max_LA_freq; ++i) {
				//if (LA_freq[i])
				//fprintf(F, "%c %d x LA%d", comma, LA_freq[i], i);
				//else
				//fprintf(F, "         ");
				comma = ',';
			}
			fprintf(F, "\n");
		}
		if (max_S_freq >= 0) {
			char comma = ':';

			fprintf(F, "%s  Store Stats", prefix);
			for (i = 0; i <= max_S_freq; ++i) {
				if (S_freq[i])
					fprintf(F, "%c %d x  S%d", comma, S_freq[i], i);
				else
					fprintf(F, "         ");
				comma = ',';
			}
			fprintf(F, "\n");
		}
		if (max_SA_freq >= 0) {
			//fprintf(F, "%s  StoreAStats", prefix);
			char comma = ':';
			for (i = 0; i <= max_SA_freq; ++i) {
				//if (SA_freq[i])
				//fprintf(F, "%c %d x SA%d", comma, SA_freq[i], i);
				//else
				//fprintf(F, "         ");
				comma = ',';
			}
			fprintf(F, "\n");
		}

		/* free allocated space */
		free(L_freq);
916
#endif
Michael Beck's avatar
Michael Beck committed
917
		if (get_trouts_state() != outs_none) {
918
#ifdef INTERPROCEDURAL_VIEW
Michael Beck's avatar
Michael Beck committed
919
920
921
922
923
924
925
			if (is_Method_type(get_entity_type(ent))) {
				fprintf(F, "%s  Estimated #Calls:    %lf\n", prefix, get_entity_estimated_n_calls(ent));
				fprintf(F, "%s  Estimated #dynCalls: %lf\n", prefix, get_entity_estimated_n_calls(ent));
			} else {
				fprintf(F, "%s  Estimated #Loads:  %lf\n", prefix, get_entity_estimated_n_loads(ent));
				fprintf(F, "%s  Estimated #Stores: %lf\n", prefix, get_entity_estimated_n_stores(ent));
			}
926
#endif
Michael Beck's avatar
Michael Beck committed
927
928
		}
	}
Götz Lindenmaier's avatar
Götz Lindenmaier committed
929
930
}

931
void    dump_entity_to_file (FILE *F, ir_entity *ent, unsigned verbosity) {
Michael Beck's avatar
Michael Beck committed
932
933
	dump_entity_to_file_prefix (F, ent, "", verbosity);
	fprintf(F, "\n");
Götz Lindenmaier's avatar
Götz Lindenmaier committed
934
935
}

Michael Beck's avatar
Michael Beck committed
936
void dump_entity(ir_entity *ent) {
Götz Lindenmaier's avatar
Götz Lindenmaier committed
937
938
939
  dump_entity_to_file(stdout, ent, dump_verbosity_max);
}

Michael Beck's avatar
Michael Beck committed
940
941
942
943
944
945
946
947
948
949
950
951
void dump_type_to_file(FILE *F, ir_type *tp, dump_verbosity verbosity) {
	int i;

	if ((is_Class_type(tp))       && (verbosity & dump_verbosity_noClassTypes)) return;
	if ((is_Struct_type(tp))      && (verbosity & dump_verbosity_noStructTypes)) return;
	if ((is_Union_type(tp))       && (verbosity & dump_verbosity_noUnionTypes)) return;
	if ((is_Array_type(tp))       && (verbosity & dump_verbosity_noArrayTypes)) return;
	if ((is_Pointer_type(tp))     && (verbosity & dump_verbosity_noPointerTypes)) return;
	if ((is_Method_type(tp))      && (verbosity & dump_verbosity_noMethodTypes)) return;
	if ((is_Primitive_type(tp))   && (verbosity & dump_verbosity_noPrimitiveTypes)) return;
	if ((is_Enumeration_type(tp)) && (verbosity & dump_verbosity_noEnumerationTypes)) return;

952
	ir_fprintf(F, "%+F", tp);
Michael Beck's avatar
Michael Beck committed
953
954
955
956
957
958
	if (verbosity & dump_verbosity_onlynames) { fprintf(F, "\n"); return; }

	switch (get_type_tpop_code(tp)) {

	case tpo_class:
		if ((verbosity & dump_verbosity_methods) || (verbosity & dump_verbosity_fields)) {
959
			fprintf(F, "\n  members:\n");
Michael Beck's avatar
Michael Beck committed
960
961
962
963
964
		}
		for (i = 0; i < get_class_n_members(tp); ++i) {
			ir_entity *mem = get_class_member(tp, i);
			if (((verbosity & dump_verbosity_methods) &&  is_Method_type(get_entity_type(mem))) ||
				((verbosity & dump_verbosity_fields)  && !is_Method_type(get_entity_type(mem)))   ) {
Matthias Braun's avatar
Matthias Braun committed
965
				if (!(verbosity & dump_verbosity_nostatic)) {
Michael Beck's avatar
Michael Beck committed
966
967
968
969
970
971
972
973
					dump_entity_to_file_prefix(F, mem, "    ", verbosity);
				}
			}
		}
		if (verbosity & dump_verbosity_typeattrs) {
			fprintf(F, "  supertypes: ");
			for (i = 0; i < get_class_n_supertypes(tp); ++i) {
				ir_type *stp = get_class_supertype(tp, i);
974
				ir_fprintf(F, "\n    %d %+F", i, stp);
Michael Beck's avatar
Michael Beck committed
975
976
977
978
			}
			fprintf(F, "\n  subtypes: ");
			for (i = 0; i < get_class_n_subtypes(tp); ++i) {
				ir_type *stp = get_class_subtype(tp, i);
979
				ir_fprintf(F, "\n    %d %+F", i, stp);
Michael Beck's avatar
Michael Beck committed
980
981
982
983
984
985
986
987
			}

			if (get_irp_inh_transitive_closure_state() != inh_transitive_closure_none) {
				ir_type *stp;
				fprintf(F, "\n  transitive supertypes: ");
				for (stp = get_class_trans_supertype_first(tp);
				stp;
				stp = get_class_trans_supertype_next(tp)) {
988
					ir_fprintf(F, "\n    %+F", stp);
Michael Beck's avatar
Michael Beck committed
989
990
991
992
993
				}
				fprintf(F, "\n  transitive subtypes: ");
				for (stp = get_class_trans_subtype_first(tp);
				stp;
				stp = get_class_trans_subtype_next(tp)) {
994
					ir_fprintf(F, "\n    %+F", stp);
Michael Beck's avatar
Michael Beck committed
995
996
997
998
999
1000
				}
			}

			fprintf(F, "\n  flags:       ");
			if (is_class_final(tp))
				fprintf(F, "final, ");
For faster browsing, not all history is shown. View entire blame