2 * Copyright (C) 2002-2007, The Perl Foundation.
10 compilers/imcc/debug.c
14 print debug info of various structures
16 handle info/error/warning messages from imcc
28 /* HEADERIZER HFILE: compilers/imcc/debug.h */
32 =item C<void IMCC_fatal>
34 RT#48260: Not yet documented!!!
41 PARROT_DOES_NOT_RETURN
43 IMCC_fatal(PARROT_INTERP
, SHIM(int code
), ARGIN(const char *fmt
), ...)
48 IMCC_INFO(interp
)->error_message
= Parrot_vsprintf_c(interp
, fmt
, ap
);
50 IMCC_THROW(IMCC_INFO(interp
)->jump_buf
, IMCC_FATAL_EXCEPTION
);
55 =item C<void IMCC_fataly>
57 RT#48260: Not yet documented!!!
64 PARROT_DOES_NOT_RETURN
66 IMCC_fataly(PARROT_INTERP
, SHIM(int code
), ARGIN(const char *fmt
), ...)
71 IMCC_INFO(interp
)->error_message
= Parrot_vsprintf_c(interp
, fmt
, ap
);
73 IMCC_THROW(IMCC_INFO(interp
)->jump_buf
, IMCC_FATALY_EXCEPTION
);
78 =item C<void IMCC_fatal_standalone>
80 RT#48260: Not yet documented!!!
87 PARROT_DOES_NOT_RETURN
89 IMCC_fatal_standalone(PARROT_INTERP
, int code
, ARGIN(const char *fmt
), ...)
94 imcc_vfprintf(interp
, stderr
, fmt
, ap
);
96 Parrot_exit(interp
, code
);
101 =item C<void IMCC_fataly_standalone>
103 RT#48260: Not yet documented!!!
110 PARROT_DOES_NOT_RETURN
112 IMCC_fataly_standalone(PARROT_INTERP
, int code
, ARGIN(const char *fmt
), ...)
118 fprintf(stderr
, "error:imcc:");
119 imcc_vfprintf(interp
, stderr
, fmt
, ap
);
121 IMCC_print_inc(interp
);
122 Parrot_exit(interp
, code
);
127 =item C<void IMCC_warning>
129 RT#48260: Not yet documented!!!
137 IMCC_warning(PARROT_INTERP
, ARGIN(const char *fmt
), ...)
140 if (IMCC_INFO(interp
)->imcc_warn
)
144 imcc_vfprintf(interp
, stderr
, fmt
, ap
);
150 =item C<void IMCC_info>
152 RT#48260: Not yet documented!!!
160 IMCC_info(PARROT_INTERP
, int level
, ARGIN(const char *fmt
), ...)
164 if (level
> IMCC_INFO(interp
)->verbose
)
168 imcc_vfprintf(interp
, stderr
, fmt
, ap
);
174 =item C<void IMCC_debug>
176 RT#48260: Not yet documented!!!
184 IMCC_debug(PARROT_INTERP
, int level
, ARGIN(const char *fmt
), ...)
188 if (!(level
& IMCC_INFO(interp
)->debug
))
191 imcc_vfprintf(interp
, stderr
, fmt
, ap
);
197 =item C<void dump_instructions>
199 RT#48260: Not yet documented!!!
206 dump_instructions(PARROT_INTERP
, ARGIN(const IMC_Unit
*unit
))
208 const Instruction
*ins
;
212 "\nDumping the instructions status:"
213 "\n-------------------------------\n");
215 "nins line blck deep flags\t type opnr size pc X ins\n");
216 for (pc
= 0, ins
= unit
->instructions
; ins
; ins
= ins
->next
) {
217 const Basic_block
* const bb
= unit
->bb_list
[ins
->bbindex
];
220 fprintf(stderr
, "%4i %4d %4d %4d\t%x\t%8x %4d %4d %4d %c ",
221 ins
->index
, ins
->line
, bb
->index
, bb
->loop_depth
,
222 ins
->flags
, (ins
->type
& ~ITEXT
), ins
->opnum
,
223 ins
->opsize
, pc
, ins
->type
& ITEXT
? 'X' : ' ');
226 fprintf(stderr
, "\t");
229 imcc_fprintf(interp
, stderr
, "%I\n", ins
);
232 fprintf(stderr
, "\n");
237 =item C<void dump_cfg>
239 RT#48260: Not yet documented!!!
246 dump_cfg(ARGIN(const IMC_Unit
*unit
))
251 fprintf(stderr
, "\nDumping the CFG:\n-------------------------------\n");
252 for (i
=0; i
< unit
->n_basic_blocks
; i
++) {
253 const Basic_block
* const bb
= unit
->bb_list
[i
];
255 fprintf(stderr
, "%d (%d)\t -> ", bb
->index
, bb
->loop_depth
);
256 for (e
=bb
->succ_list
; e
!= NULL
; e
=e
->succ_next
) {
257 fprintf(stderr
, "%d ", e
->to
->index
);
259 fprintf(stderr
, "\t\t <- ");
260 for (e
=bb
->pred_list
; e
!= NULL
; e
=e
->pred_next
) {
261 fprintf(stderr
, "%d ", e
->from
->index
);
263 fprintf(stderr
, "\n");
266 fprintf(stderr
, "\n");
272 =item C<void dump_loops>
274 RT#48260: Not yet documented!!!
281 dump_loops(ARGIN(const IMC_Unit
*unit
))
284 Loop_info
** loop_info
= unit
->loop_info
;
286 fprintf(stderr
, "Loop info\n---------\n");
287 for (i
= 0; i
< unit
->n_loops
; i
++) {
288 const Set
* const loop
= loop_info
[i
]->loop
;
289 const Set
* const exits
= loop_info
[i
]->exits
;
293 "Loop %d, depth %d, size %d, header %d, preheader %d\n",
294 i
, loop_info
[i
]->depth
,
295 loop_info
[i
]->size
, loop_info
[i
]->header
,
296 loop_info
[i
]->preheader
);
297 fprintf(stderr
, " Contains blocks: ");
298 for (j
= 0; j
< unit
->n_basic_blocks
; j
++)
299 if (set_contains(loop
, j
))
300 fprintf(stderr
, "%d ", j
);
301 fprintf(stderr
, "\n Exit blocks: ");
302 for (j
= 0; j
< unit
->n_basic_blocks
; j
++)
303 if (set_contains(exits
, j
))
304 fprintf(stderr
, "%d ", j
);
305 fprintf(stderr
, "\n");
307 fprintf(stderr
, "\n");
312 =item C<void dump_labels>
314 RT#48260: Not yet documented!!!
321 dump_labels(ARGIN(const IMC_Unit
*unit
))
324 const SymHash
* const hsh
= &unit
->hash
;
326 fprintf(stderr
, "Labels\n");
327 fprintf(stderr
, "name\tpos\tlast ref\n"
328 "-----------------------\n");
329 for (i
= 0; i
< hsh
->size
; i
++) {
332 for (r
= hsh
->data
[i
]; r
; r
= r
->next
) {
333 if (r
&& (r
->type
& VTADDRESS
))
334 fprintf(stderr
, "%s\t%d\t%d\n",
336 r
->first_ins
? r
->first_ins
->index
: -1,
337 r
->last_ins
? r
->last_ins
->index
: -1);
340 fprintf(stderr
, "\n");
345 =item C<void dump_symreg>
347 RT#48260: Not yet documented!!!
354 dump_symreg(ARGIN(const IMC_Unit
*unit
))
357 SymReg
** const reglist
= unit
->reglist
;
363 "\n----------------------------------------------\n");
364 fprintf(stderr
, "name\tfirst\tlast\t1.blk\t-blk\tset col \t"
365 "used\tlhs_use\tregp\tus flgs\n"
366 "----------------------------------------------\n");
367 for (i
= 0; i
< unit
->n_symbols
; i
++) {
368 const SymReg
* const r
= reglist
[i
];
369 if (!REG_NEEDS_ALLOC(r
))
373 fprintf(stderr
, "%s %c\t%d\t%d\t%d\t%d\t%c %2d %2d\t%d\t%d\t%s\t%lx\n",
375 r
->usage
& U_NON_VOLATILE
? 'P' : ' ',
376 r
->first_ins
->index
, r
->last_ins
->index
,
377 r
->first_ins
->bbindex
, r
->last_ins
->bbindex
,
379 (int)r
->color
, r
->want_regno
,
380 r
->use_count
, r
->lhs_use_count
,
381 r
->reg
? r
->reg
->name
: "",
384 fprintf(stderr
, "\n");
385 dump_liveness_status(unit
);
390 =item C<void dump_liveness_status>
392 RT#48260: Not yet documented!!!
399 dump_liveness_status(ARGIN(const IMC_Unit
*unit
))
402 SymReg
** const reglist
= unit
->reglist
;
404 fprintf(stderr
, "\nSymbols:\n--------------------------------------\n");
405 for (i
= 0; i
< unit
->n_symbols
; i
++) {
406 const SymReg
* const r
= reglist
[i
];
407 if (REG_NEEDS_ALLOC(r
))
408 dump_liveness_status_var(unit
, r
);
410 fprintf(stderr
, "\n");
417 =item C<void dump_liveness_status_var>
419 RT#48260: Not yet documented!!!
426 dump_liveness_status_var(ARGIN(const IMC_Unit
*unit
), ARGIN(const SymReg
* r
))
428 fprintf(stderr
, "\nSymbol %s:", r
->name
);
432 for (i
=0; i
<unit
->n_basic_blocks
; i
++) {
433 const Life_range
* const l
= r
->life_info
[i
];
435 if (l
->flags
& LF_lv_all
) {
436 fprintf(stderr
, "\n\t%i:ALL\t", i
);
438 else if (l
->flags
& LF_lv_inside
) {
439 fprintf(stderr
, "\n\t%i:INSIDE", i
);
442 if (l
->flags
& LF_lv_in
)
443 fprintf(stderr
, "\n\t%i: IN\t", i
);
444 else if (l
->flags
& LF_lv_out
)
445 fprintf(stderr
, "\n\t%i: OUT\t", i
);
446 else if (l
->first_ins
)
447 fprintf(stderr
, "\n\t%i: INS\t", i
);
448 if (l
->flags
& LF_use
)
449 fprintf(stderr
, "u ");
450 else if (l
->flags
& LF_def
)
451 fprintf(stderr
, "d ");
453 fprintf(stderr
, " ");
456 fprintf(stderr
, "[%d, %d]\t", l
->first_ins
->index
,
461 fprintf(stderr
, "\n");
466 =item C<void dump_interference_graph>
468 RT#48260: Not yet documented!!!
475 dump_interference_graph(ARGIN(const IMC_Unit
*unit
))
478 SymReg
** const reglist
= unit
->reglist
;
479 const int n_symbols
= unit
->n_symbols
;
481 fprintf(stderr
, "\nDumping the Interf. graph:"
482 "\n-------------------------------\n");
483 for (x
= 0; x
< n_symbols
; x
++) {
484 if (reglist
[x
]->first_ins
) {
488 fprintf(stderr
, "%s\t -> ", reglist
[x
]->name
);
489 for (y
= 0; y
< n_symbols
; y
++) {
490 if (ig_test(x
, y
, n_symbols
, unit
->interference_graph
)) {
491 const SymReg
* const r
= unit
->reglist
[y
];
493 fprintf(stderr
, "%s ", r
->name
);
497 fprintf(stderr
, "(%d)\n", cnt
);
500 fprintf(stderr
, "\n");
505 =item C<void dump_dominators>
507 RT#48260: Not yet documented!!!
514 dump_dominators(ARGIN(const IMC_Unit
*unit
))
518 fprintf(stderr
, "\nDumping the Dominators Tree:"
519 "\n-------------------------------\n");
520 for (i
=0; i
< unit
->n_basic_blocks
; i
++) {
522 fprintf(stderr
, "%2d <- (%2d)", i
, unit
->idoms
[i
]);
524 for (j
=0; j
< unit
->n_basic_blocks
; j
++) {
525 if (set_contains(unit
->dominators
[i
], j
)) {
526 fprintf(stderr
, " %2d", j
);
530 fprintf(stderr
, "\n");
533 fprintf(stderr
, "\n");
538 =item C<void dump_dominance_frontiers>
540 RT#48260: Not yet documented!!!
547 dump_dominance_frontiers(ARGIN(const IMC_Unit
*unit
))
551 fprintf(stderr
, "\nDumping the Dominance Frontiers:"
552 "\n-------------------------------\n");
553 for (i
= 0; i
< unit
->n_basic_blocks
; i
++) {
556 fprintf(stderr
, "%2d <-", i
);
557 for (j
= 0; j
< unit
->n_basic_blocks
; j
++) {
558 if (set_contains(unit
->dominance_frontiers
[i
], j
)) {
559 fprintf(stderr
, " %2d", j
);
563 fprintf(stderr
, "\n");
566 fprintf(stderr
, "\n");
579 * c-file-style: "parrot"
581 * vim: expandtab shiftwidth=4: