diff options
author | steven <steven@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-07-17 23:17:20 +0000 |
---|---|---|
committer | steven <steven@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-07-17 23:17:20 +0000 |
commit | 5147ec0758d033a3f21f831c878ec8fa5dcd2a94 (patch) | |
tree | 9d5c1ea84c526379245c9986d831f4ce16757d79 /gcc/cfg.c | |
parent | f25dbbf707698795ff642f32c290d25d5c356975 (diff) | |
download | gcc-5147ec0758d033a3f21f831c878ec8fa5dcd2a94.tar.gz |
* dumpfile.h (TDF_COMMENT): New define.
* basic-block.h (EDGE_FALLTHRU, EDGE_ABNORMAL, EDGE_ABNORMAL_CALL,
EDGE_EH, EDGE_FAKE, EDGE_DFS_BACK, EDGE_CAN_FALLTHRU,
EDGE_IRREDUCIBLE_LOOP, EDGE_SIBCALL, EDGE_LOOP_EXIT, EDGE_TRUE_VALUE,
EDGE_FALSE_VALUE, EDGE_EXECUTABLE, EDGE_CROSSING, EDGE_PRESERVE):
Move to new file cfg-flags.h.
(enum cfg_edge_flags): New enum, using cfg-flags.h.
(EDGE_ALL_FLAGS): Compute value automatically.
(BB_NEW, BB_REACHABLE, BB_IRREDUCIBLE_LOOP, BB_SUPERBLOCK,
BB_DISABLE_SCHEDULE, BB_HOT_PARTITION, BB_COLD_PARTITION,
BB_DUPLICATED, BB_NON_LOCAL_GOTO_TARGET, BB_RTL,
BB_FORWARDER_BLOCK, BB_NONTHREADABLE_BLOCK, BB_MODIFIED, BB_VISITED,
BB_IN_TRANSACTION): Move to new file cfg-flags.h.
(enum bb_flags): Rename to cfg_bb_flags. Use cfg-flags.h.
(BB_ALL_FLAGS): New, compute value automatically.
(dump_bb_info): Update prototype.
(dump_edge_info): Update prototype.
* cfg-flags.h: New file.
* cfg.c (dump_edge_info): Take flags argument. Be verbose only if
TDF_DETAILS and not TDF_SLIM. Include cfg-flags.h for bitnames.
Check that the edge flags are within the range of EDGE_ALL_FLAGS.
(debug_bb): Update dump_bb call.
(dump_cfg_bb_info): Remove.
(dump_bb_info): New function. Use cfg-flags.h for bitnames.
Adjust verbosity using TDF_* flags. Check that the basic block flags
are within the range of BB_ALL_FLAGS.
(brief_dump_cfg): Use dump_bb_info instead of dump_cfg_bb_info.
* cfghooks.h (struct cfghooks): Update dump_bb hook, take a FILE
first for consistency with other dump functions.
(dump_bb): Update prototype accordingly.
* cfghooks.c: Include dumpfile.h.
(verify_flow_info): Update dump_edge_info calls.
(dump_bb): Take a flags argument and pass it around.
Use dump_bb_info to dump common information about a basic block.
(dump_flow_info): Moved here from cfgrtl.c. Make IL agnostic.
(debug_flow_info): Moved here from cfgrtl.c.
* profile.c (is_edge_inconsistent): Update dump_bb calls.
* loop-invariant.c (find_defs): Update print_rtl_with_bb call.
* rtl.h (debug_bb_n_slim, debug_bb_slim, print_rtl_slim,
print_rtl_slim_with_bb): Remove prototypes.
(dump_insn_slim): Adjust prototype to take a const_rtx.
(print_rtl_with_bb): Adjust prototype.
* sched-rgn.c (debug_region): Use dump_bb instead of debug_bb_n_slim.
* sched-vis.c (dump_insn_slim): Take a const_rtx.
(debug_insn_slim): Prototype here near DEBUG_FUNCTION marker.
(print_rtl_slim_with_bb): Remove.
(print_rtl_slim): Rename to debug_rtl_slim. Print only insn info,
not basic block info (print_rtl_with_bb with TDF_SLIM should be used
for that. Prototype here near DEBUG_FUNCTION marker.
(debug_bb_slim): Prototype here near DEBUG_FUNCTION marker.
Use dump_bb.
(debug_bb_n_slim): Prototype here near DEBUG_FUNCTION marker.
* tree-cfg.c (gimple_can_merge_blocks_p): Use EDGE_COMPLEX.
(remove_bb): Update dump_bb call.
(gimple_debug_bb): Use dump_bb.
(dump_function_to_file): Update gimple_dump_bb call.
(print_loops_bb): Likewise.
* tree-flow.h (gimple_dump_bb): Update prototype.
* gimple-pretty-print.c (dump_bb_header): Rename to
dump_gimple_bb_header. Write to a stream instead of a pretty
printer. Use dump_bb_info to dump basic block info.
(dump_bb_end): Rename to dump_gimple_bb_footer. Write to a
stream instead of a pretty printer. Use dump_bb_info.
(gimple_dump_bb_buff): Do not call dump_bb_header and dump_bb_end.
(gimple_dump_bb): Do it here with dump_gimple_bb_header and
dump_gimple_bb_footer.
* cfgrtl.c (rtl_dump_bb): Update prototype. Only dump DF if the
dump flags have TDF_DETAILS. Use dump_insn_slim if TDF_SLIM.
(print_rtl_with_bb): Take a flags argument and pass it around.
Use dump_insn_slim if TDF_SLIM.
(dump_bb_info): Removed and re-incarnated in cfg.c.
(dump_flow_info): Moved to cfghooks.c.
(debug_flow_info): Moved to cfghooks.c.
* passes.c (execute_function_dump): Unconditionally use
print_rtl_with_bb for RTL dumps, now that it understands TDF_SLIM.
* final.c (dump_basic_block_info): Update dump_edge_info calls.
* tree-vrp.c (dump_asserts_for): Likewise.
* ifcvt.c (if_convert): Unconditionally use print_rtl_with_bb.
* tree-if-conv.c (if_convertible_bb_p): Don't look at
EDGE_ABNORMAL_CALL, it has no meaning in the GIMPLE world.
* trans-mem.c (make_tm_edge): Don't set EDGE_ABNORMAL_CALL,
for the same reason.
* config/rl78/rl78.c (rl78_reorg): Update print_rtl_with_bb calls.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@189590 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cfg.c')
-rw-r--r-- | gcc/cfg.c | 163 |
1 files changed, 113 insertions, 50 deletions
diff --git a/gcc/cfg.c b/gcc/cfg.c index b87318639c9..fc16ecd7f7d 100644 --- a/gcc/cfg.c +++ b/gcc/cfg.c @@ -444,9 +444,15 @@ check_bb_profile (basic_block bb, FILE * file) } void -dump_edge_info (FILE *file, edge e, int do_succ) +dump_edge_info (FILE *file, edge e, int flags, int do_succ) { basic_block side = (do_succ ? e->dest : e->src); + bool do_details = false; + + if ((flags & TDF_DETAILS) != 0 + && (flags & TDF_SLIM) == 0) + do_details = true; + /* ENTRY_BLOCK_PTR/EXIT_BLOCK_PTR depend on cfun. Compare against ENTRY_BLOCK/EXIT_BLOCK to avoid that dependency. */ if (side->index == ENTRY_BLOCK) @@ -456,25 +462,28 @@ dump_edge_info (FILE *file, edge e, int do_succ) else fprintf (file, " %d", side->index); - if (e->probability) + if (e->probability && do_details) fprintf (file, " [%.1f%%] ", e->probability * 100.0 / REG_BR_PROB_BASE); - if (e->count) + if (e->count && do_details) { fputs (" count:", file); fprintf (file, HOST_WIDEST_INT_PRINT_DEC, e->count); } - if (e->flags) + if (e->flags && do_details) { - static const char * const bitnames[] = { - "fallthru", "ab", "abcall", "eh", "fake", "dfs_back", - "can_fallthru", "irreducible", "sibcall", "loop_exit", - "true", "false", "exec", "crossing", "preserve" - }; - int comma = 0; + static const char * const bitnames[] = + { +#define DEF_EDGE_FLAG(NAME,IDX) #NAME , +#include "cfg-flags.def" + NULL +#undef DEF_EDGE_FLAG + }; + bool comma = false; int i, flags = e->flags; + gcc_assert (e->flags <= EDGE_ALL_FLAGS); fputs (" (", file); for (i = 0; flags; i++) if (flags & (1 << i)) @@ -483,11 +492,8 @@ dump_edge_info (FILE *file, edge e, int do_succ) if (comma) fputc (',', file); - if (i < (int) ARRAY_SIZE (bitnames)) - fputs (bitnames[i], file); - else - fprintf (file, "%d", i); - comma = 1; + fputs (bitnames[i], file); + comma = true; } fputc (')', file); @@ -641,57 +647,114 @@ free_aux_for_edges (void) DEBUG_FUNCTION void debug_bb (basic_block bb) { - dump_bb (bb, stderr, 0); + dump_bb (stderr, bb, 0, dump_flags | TDF_BLOCKS); } DEBUG_FUNCTION basic_block debug_bb_n (int n) { basic_block bb = BASIC_BLOCK (n); - dump_bb (bb, stderr, 0); + debug_bb (bb); return bb; } -/* Dumps cfg related information about basic block BB to FILE. */ +/* Dumps cfg related information about basic block BB to OUTF. + If HEADER is true, dump things that appear before the instructions + contained in BB. If FOOTER is true, dump things that appear after. + Flags are the TDF_* masks as documented in dumpfile.h. + NB: With TDF_DETAILS, it is assumed that cfun is available, so + that maybe_hot_bb_p and probably_never_executed_bb_p don't ICE. */ -static void -dump_cfg_bb_info (FILE *file, basic_block bb) +void +dump_bb_info (FILE *outf, basic_block bb, int indent, int flags, + bool do_header, bool do_footer) { - unsigned i; edge_iterator ei; - bool first = true; + edge e; static const char * const bb_bitnames[] = { - "new", "reachable", "irreducible_loop", "superblock", - "nosched", "hot", "cold", "dup", "xlabel", "rtl", - "fwdr", "nothrd" +#define DEF_BASIC_BLOCK_FLAG(NAME,IDX) #NAME , +#include "cfg-flags.def" + NULL +#undef DEF_BASIC_BLOCK_FLAG }; const unsigned n_bitnames = sizeof (bb_bitnames) / sizeof (char *); - edge e; + char *s_indent = (char *) alloca ((size_t) indent + 1); + memset ((void *) s_indent, ' ', (size_t) indent); + s_indent[indent] = '\0'; - fprintf (file, "Basic block %d", bb->index); - for (i = 0; i < n_bitnames; i++) - if (bb->flags & (1 << i)) - { - if (first) - fputs (" (", file); - else - fputs (", ", file); - first = false; - fputs (bb_bitnames[i], file); - } - if (!first) - putc (')', file); - putc ('\n', file); - - fputs ("Predecessors: ", file); - FOR_EACH_EDGE (e, ei, bb->preds) - dump_edge_info (file, e, 0); - - fprintf (file, "\nSuccessors: "); - FOR_EACH_EDGE (e, ei, bb->succs) - dump_edge_info (file, e, 1); - fputs ("\n\n", file); + gcc_assert (bb->flags <= BB_ALL_FLAGS); + + if (do_header) + { + unsigned i; + + if (flags & TDF_COMMENT) + fputs (";; ", outf); + fprintf (outf, "%sbasic block %d", s_indent, bb->index); + if (flags & TDF_DETAILS) + { + fprintf (outf, ", loop depth %d, count " HOST_WIDEST_INT_PRINT_DEC, + bb->loop_depth, (HOST_WIDEST_INT) bb->count); + fprintf (outf, ", freq %i", bb->frequency); + if (maybe_hot_bb_p (bb)) + fputs (", maybe hot", outf); + if (probably_never_executed_bb_p (bb)) + fputs (", probably never executed", outf); + } + fputc ('\n', outf); + + if (flags & TDF_DETAILS) + { + bool first = true; + + if (flags & TDF_COMMENT) + fputs (";; ", outf); + fprintf (outf, "%s prev block ", s_indent); + if (bb->prev_bb) + fprintf (outf, "%d", bb->prev_bb->index); + else + fprintf (outf, "(nil)"); + fprintf (outf, ", next block "); + if (bb->next_bb) + fprintf (outf, "%d", bb->next_bb->index); + else + fprintf (outf, "(nil)"); + + fputs (", flags:", outf); + for (i = 0; i < n_bitnames; i++) + if (bb->flags & (1 << i)) + { + if (first) + fputs (" (", outf); + else + fputs (", ", outf); + first = false; + fputs (bb_bitnames[i], outf); + } + if (!first) + fputc (')', outf); + } + fputc ('\n', outf); + + if (flags & TDF_COMMENT) + fputs (";; ", outf); + fprintf (outf, "%s pred: ", s_indent); + FOR_EACH_EDGE (e, ei, bb->preds) + dump_edge_info (outf, e, flags, 0); + fputc ('\n', outf); + } + + if (do_footer) + { + fputc ('\n', outf); + if (flags & TDF_COMMENT) + fputs (";; ", outf); + fprintf (outf, "%s succ: ", s_indent); + FOR_EACH_EDGE (e, ei, bb->succs) + dump_edge_info (outf, e, flags, 1); + fputs ("\n\n", outf); + } } /* Dumps a brief description of cfg to FILE. */ @@ -703,7 +766,7 @@ brief_dump_cfg (FILE *file) FOR_EACH_BB (bb) { - dump_cfg_bb_info (file, bb); + dump_bb_info (file, bb, 0, 0, true, true); } } |