Unify the management of RTL and tree-level dump files.
2004-09-06 Paolo Bonzini <bonzini@gnu.org> Unify the management of RTL and tree-level dump files. * cfgexpand.c (tree_expand_cfg): Fix incorrect comment. Don't print function name to the dump file, the pass manager would do this for us. Add code from the top of rest_of_compilation, up to the initial RTL dump. * passes.c (rest_of_handle_jump): Call fixup_tail_calls and close the DFI_sibling dump file. (rest_of_compilation): Don't do that here. Remove code up to the initial RTL dump. (init_optimization_passes): Remove. (pass_rest_of_compilation): Change pass name to NULL. * toplev.c (lang_dependent_init): Do not use an empty dump file prefix. Do not call init_optimization_passes. * toplev.h (init_optimization_passes): Remove. * graph.c (print_rtl_graph_with_bb, clean_graph_dump_file, finish_graph_dump_file): Remove SUFFIX parameter. * graph.h (print_rtl_graph_with_bb, clean_graph_dump_file, finish_graph_dump_file): Likewise. * tree-pass.h (struct tree_opt_pass): Add `letter' field. * cfgexpand.c (pass_expand): Adjust. * gimple-low.c (pass_lower_cf, pass_remove_useless_vars): Adjust. * passes.c (pass_rest_of_compilation): Adjust. * predict.c (pass_profile): Adjust. * tree-alias-common.c (pass_build_pta, pass_del_pta): Adjust. * tree-cfg.c (pass_build_cfg, pass_remove_useless_stmts, pass_split_crit_edges, pass_warn_function_return): Adjust. * tree-complex.c (pass_lower_vector_ssa, pass_pre_expand): Adjust. * tree-dfa.c (pass_referenced_vars): Adjust. * tree-eh.c (pass_lower_eh): Adjust. * tree-if-conv.c (pass_build_ssa): Adjust. * tree-into-ssa.c (pass_build_ssa): Adjust. * tree-mudflap.c (pass_mudflap_1, pass_mudflap_2): Adjust. * tree-nomudflap.c (pass_mudflap_1, pass_mudflap_2): Adjust. * tree-nrv.c (pass_nrv): Adjust. * tree-optimize.c (pass_gimple, pass_all_optimizations, pass_cleanup_cfg_post_optimizing, pass_free_datastructures, pass_init_datastructures): Adjust. * tree-outof-ssa.c (pass_del_ssa): Adjust. * tree-profile.c (pass_tree_profile): Adjust. * tree-sra.c (pass_sra): Adjust. * tree-ssa-alias.c (pass_may_alias): Adjust. * tree-ssa-ccp.c (pass_ccp, pass_fold_builtins): Adjust. * tree-ssa-copyrename.c (pass_rename_ssa_copies): Adjust. * tree-ssa-dce.c (pass_dce, pass_cd_dce): Adjust. * tree-ssa-dom.c (pass_dominator): Adjust. * tree-ssa-dse.c (pass_dse): Adjust. * tree-ssa-forwprop.c (pass_forwprop): Adjust. * tree-ssa-if-conv.c (pass_if_conversion): Adjust. * tree-ssa-loop-ch.c (pass_ch): Adjust. * tree-ssa-loop.c (pass_loop, pass_loop_init, pass_lim, pass_loop_done, pass_complete_unroll, pass_iv_canon, pass_iv_optimize, pass_vectorize): Adjust. * tree-ssa-phiopt.c (pass_phiopt): Adjust. * tree-ssa-pre.c (pass_pre, pass_fre): Adjust. * tree-ssa.c (pass_redundant_phi, pass_early_warn_uninitialized, pass_late_warn_uninnitialized): Adjust. * tree-tailcall.c (pass_tail_recursion, pass_tail_calls): Adjust. * Makefile.in (tree-dump.o): Add new dependencies. * cgraph.c (cgraph_remove_node): TDF_all -> TDF_tree_all. * cgraphunit.c (cgraph_preserve_function_body_p, cgraph_optimize): Likewise. * toplev.c (dump_file_name): New. * tree-dump.c (dump_enable_all): Add LETTER parameter. (struct dump_file_info): Add NUM and LETTER fields. (dump_files): Adjust and add RTL dump files. (dump_register): Add NUM and LETTER fields. (get_dump_file_name, dump_initialized_p, enable_rtl_dump_file): New. (dump_begin): Use get_dump_file_name. (dump_switch_p_1): Adjust call to dump_enable_all. * tree-dump.h (dump_register): Adjust prototype. * tree-optimize.c (register_one_dump_file): Take dump file index. Support flags for RTL dumps. (register_dump_files): Fill in NUM field of struct dump_file_info. Track properties both when the gate is executed and when it is not. (execute_todo): Dump RTL. Add PROPERTIES parameter. (execute_one_pass): Pass properties to execute_todo. Handle VCG dumps of RTL. * tree-pass.h (dump_file_name): New. * tree.h (TDF_TREE, TDF_RTL, get_dump_file_name, dump_initialized_p): New. * Makefile.in (passes.o): Add new dependencies. * passes.c (struct dump_file_info, enum dump_file_index, dump_file_tbl, init_optimization_passes): Remove. (open_dump_file, close_dump_file): Use tree-dumping infrastructure. (rest_of_handle_new_regalloc, rest_of_handle_old_regalloc): Use dump_enabled_p. (finish_optimization_passes): Update finish_graph_dump_file loop. (enable_rtl_dump_file): Remove. * tree-dump.c (dump_files): Adjust and add RTL dump files. (enable_rtl_dump_file): Add here. * tree.h (enum tree_dump_index): Add RTL dump file indices. * doc/invoke.texi (Debugging options): Document new RTL debugging options. Update. From-SVN: r87113
This commit is contained in:
parent
fc4d0e828d
commit
9f8628bacd
44 changed files with 772 additions and 506 deletions
101
gcc/ChangeLog
101
gcc/ChangeLog
|
@ -1,3 +1,104 @@
|
|||
2004-09-06 Paolo Bonzini <bonzini@gnu.org>
|
||||
|
||||
Unify the management of RTL and tree-level dump files.
|
||||
|
||||
* cfgexpand.c (tree_expand_cfg): Fix incorrect comment.
|
||||
Don't print function name to the dump file, the pass manager
|
||||
would do this for us. Add code from the top of
|
||||
rest_of_compilation, up to the initial RTL dump.
|
||||
* passes.c (rest_of_handle_jump): Call fixup_tail_calls and
|
||||
close the DFI_sibling dump file.
|
||||
(rest_of_compilation): Don't do that here. Remove code up to the
|
||||
initial RTL dump.
|
||||
(init_optimization_passes): Remove.
|
||||
(pass_rest_of_compilation): Change pass name to NULL.
|
||||
* toplev.c (lang_dependent_init): Do not use an empty dump file prefix.
|
||||
Do not call init_optimization_passes.
|
||||
* toplev.h (init_optimization_passes): Remove.
|
||||
|
||||
* graph.c (print_rtl_graph_with_bb, clean_graph_dump_file,
|
||||
finish_graph_dump_file): Remove SUFFIX parameter.
|
||||
* graph.h (print_rtl_graph_with_bb, clean_graph_dump_file,
|
||||
finish_graph_dump_file): Likewise.
|
||||
|
||||
* tree-pass.h (struct tree_opt_pass): Add `letter' field.
|
||||
* cfgexpand.c (pass_expand): Adjust.
|
||||
* gimple-low.c (pass_lower_cf, pass_remove_useless_vars): Adjust.
|
||||
* passes.c (pass_rest_of_compilation): Adjust.
|
||||
* predict.c (pass_profile): Adjust.
|
||||
* tree-alias-common.c (pass_build_pta, pass_del_pta): Adjust.
|
||||
* tree-cfg.c (pass_build_cfg, pass_remove_useless_stmts,
|
||||
pass_split_crit_edges, pass_warn_function_return): Adjust.
|
||||
* tree-complex.c (pass_lower_vector_ssa, pass_pre_expand): Adjust.
|
||||
* tree-dfa.c (pass_referenced_vars): Adjust.
|
||||
* tree-eh.c (pass_lower_eh): Adjust.
|
||||
* tree-if-conv.c (pass_build_ssa): Adjust.
|
||||
* tree-into-ssa.c (pass_build_ssa): Adjust.
|
||||
* tree-mudflap.c (pass_mudflap_1, pass_mudflap_2): Adjust.
|
||||
* tree-nomudflap.c (pass_mudflap_1, pass_mudflap_2): Adjust.
|
||||
* tree-nrv.c (pass_nrv): Adjust.
|
||||
* tree-optimize.c (pass_gimple, pass_all_optimizations,
|
||||
pass_cleanup_cfg_post_optimizing, pass_free_datastructures,
|
||||
pass_init_datastructures): Adjust.
|
||||
* tree-outof-ssa.c (pass_del_ssa): Adjust.
|
||||
* tree-profile.c (pass_tree_profile): Adjust.
|
||||
* tree-sra.c (pass_sra): Adjust.
|
||||
* tree-ssa-alias.c (pass_may_alias): Adjust.
|
||||
* tree-ssa-ccp.c (pass_ccp, pass_fold_builtins): Adjust.
|
||||
* tree-ssa-copyrename.c (pass_rename_ssa_copies): Adjust.
|
||||
* tree-ssa-dce.c (pass_dce, pass_cd_dce): Adjust.
|
||||
* tree-ssa-dom.c (pass_dominator): Adjust.
|
||||
* tree-ssa-dse.c (pass_dse): Adjust.
|
||||
* tree-ssa-forwprop.c (pass_forwprop): Adjust.
|
||||
* tree-ssa-if-conv.c (pass_if_conversion): Adjust.
|
||||
* tree-ssa-loop-ch.c (pass_ch): Adjust.
|
||||
* tree-ssa-loop.c (pass_loop, pass_loop_init, pass_lim,
|
||||
pass_loop_done, pass_complete_unroll, pass_iv_canon,
|
||||
pass_iv_optimize, pass_vectorize): Adjust.
|
||||
* tree-ssa-phiopt.c (pass_phiopt): Adjust.
|
||||
* tree-ssa-pre.c (pass_pre, pass_fre): Adjust.
|
||||
* tree-ssa.c (pass_redundant_phi, pass_early_warn_uninitialized,
|
||||
pass_late_warn_uninnitialized): Adjust.
|
||||
* tree-tailcall.c (pass_tail_recursion, pass_tail_calls): Adjust.
|
||||
|
||||
* Makefile.in (tree-dump.o): Add new dependencies.
|
||||
* cgraph.c (cgraph_remove_node): TDF_all -> TDF_tree_all.
|
||||
* cgraphunit.c (cgraph_preserve_function_body_p, cgraph_optimize):
|
||||
Likewise.
|
||||
* toplev.c (dump_file_name): New.
|
||||
* tree-dump.c (dump_enable_all): Add LETTER parameter.
|
||||
(struct dump_file_info): Add NUM and LETTER fields.
|
||||
(dump_files): Adjust and add RTL dump files.
|
||||
(dump_register): Add NUM and LETTER fields.
|
||||
(get_dump_file_name, dump_initialized_p, enable_rtl_dump_file): New.
|
||||
(dump_begin): Use get_dump_file_name.
|
||||
(dump_switch_p_1): Adjust call to dump_enable_all.
|
||||
* tree-dump.h (dump_register): Adjust prototype.
|
||||
* tree-optimize.c (register_one_dump_file): Take dump file index.
|
||||
Support flags for RTL dumps.
|
||||
(register_dump_files): Fill in NUM field of struct dump_file_info.
|
||||
Track properties both when the gate is executed and when it is not.
|
||||
(execute_todo): Dump RTL. Add PROPERTIES parameter.
|
||||
(execute_one_pass): Pass properties to execute_todo. Handle VCG
|
||||
dumps of RTL.
|
||||
* tree-pass.h (dump_file_name): New.
|
||||
* tree.h (TDF_TREE, TDF_RTL, get_dump_file_name, dump_initialized_p):
|
||||
New.
|
||||
|
||||
* Makefile.in (passes.o): Add new dependencies.
|
||||
* passes.c (struct dump_file_info, enum dump_file_index,
|
||||
dump_file_tbl, init_optimization_passes): Remove.
|
||||
(open_dump_file, close_dump_file): Use tree-dumping infrastructure.
|
||||
(rest_of_handle_new_regalloc, rest_of_handle_old_regalloc): Use
|
||||
dump_enabled_p.
|
||||
(finish_optimization_passes): Update finish_graph_dump_file loop.
|
||||
(enable_rtl_dump_file): Remove.
|
||||
* tree-dump.c (dump_files): Adjust and add RTL dump files.
|
||||
(enable_rtl_dump_file): Add here.
|
||||
* tree.h (enum tree_dump_index): Add RTL dump file indices.
|
||||
* doc/invoke.texi (Debugging options): Document new RTL debugging
|
||||
options. Update.
|
||||
|
||||
2004-09-05 Kazu Hirata <kazu@cs.umass.edu>
|
||||
|
||||
* c-common.c, c-decl.c, combine.c, defaults.h, fold-const.c,
|
||||
|
|
|
@ -1587,7 +1587,7 @@ tree.o : tree.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
|
|||
real.h gt-tree.h tree-iterator.h $(BASIC_BLOCK_H) $(TREE_FLOW_H)
|
||||
tree-dump.o: tree-dump.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
|
||||
$(C_TREE_H) $(FLAGS_H) langhooks.h toplev.h output.h $(C_PRAGMA_H) $(RTL_H) \
|
||||
$(GGC_H) $(EXPR_H) $(SPLAY_TREE_H) $(TREE_DUMP_H) tree-iterator.h
|
||||
$(GGC_H) $(EXPR_H) $(SPLAY_TREE_H) $(TREE_DUMP_H) tree-iterator.h tree-pass.h
|
||||
tree-inline.o : tree-inline.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
|
||||
$(TREE_H) $(RTL_H) $(EXPR_H) $(FLAGS_H) $(PARAMS_H) input.h insn-config.h \
|
||||
$(INTEGRATE_H) $(VARRAY_H) $(HASHTAB_H) $(SPLAY_TREE_H) toplev.h \
|
||||
|
@ -1818,7 +1818,8 @@ passes.o : passes.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
|
|||
graph.h $(LOOP_H) except.h $(REGS_H) $(TIMEVAR_H) value-prof.h \
|
||||
$(PARAMS_H) $(TM_P_H) reload.h dwarf2asm.h $(TARGET_H) \
|
||||
langhooks.h insn-flags.h $(CFGLAYOUT_H) real.h $(CFGLOOP_H) \
|
||||
hosthooks.h $(LANGHOOKS_DEF_H) cgraph.h $(COVERAGE_H) alloc-pool.h
|
||||
hosthooks.h $(LANGHOOKS_DEF_H) cgraph.h $(COVERAGE_H) alloc-pool.h \
|
||||
tree-pass.h tree-dump.h
|
||||
|
||||
main.o : main.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) toplev.h
|
||||
|
||||
|
|
|
@ -1188,14 +1188,6 @@ tree_expand_cfg (void)
|
|||
basic_block bb, init_block;
|
||||
sbitmap blocks;
|
||||
|
||||
if (dump_file)
|
||||
{
|
||||
fprintf (dump_file, "\n;; Function %s",
|
||||
(*lang_hooks.decl_printable_name) (current_function_decl, 2));
|
||||
fprintf (dump_file, " (%s)\n",
|
||||
IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (current_function_decl)));
|
||||
}
|
||||
|
||||
profile_status = PROFILE_ABSENT;
|
||||
|
||||
/* Some backends want to know that we are expanding to RTL. */
|
||||
|
@ -1231,8 +1223,7 @@ tree_expand_cfg (void)
|
|||
currently_expanding_to_rtl = 0;
|
||||
|
||||
/* Convert from NOTE_INSN_EH_REGION style notes, and do other
|
||||
sorts of eh initialization. Delay this until after the
|
||||
initial rtl dump so that we can see the original nesting. */
|
||||
sorts of eh initialization. */
|
||||
convert_from_eh_region_ranges ();
|
||||
|
||||
rebuild_jump_labels (get_insns ());
|
||||
|
@ -1248,6 +1239,16 @@ tree_expand_cfg (void)
|
|||
#ifdef ENABLE_CHECKING
|
||||
verify_flow_info();
|
||||
#endif
|
||||
|
||||
/* There's no need to defer outputting this function any more; we
|
||||
know we want to output it. */
|
||||
DECL_DEFER_OUTPUT (current_function_decl) = 0;
|
||||
|
||||
/* Now that we're done expanding trees to RTL, we shouldn't have any
|
||||
more CONCATs anywhere. */
|
||||
generating_concat_p = 0;
|
||||
|
||||
finalize_block_changes ();
|
||||
}
|
||||
|
||||
struct tree_opt_pass pass_expand =
|
||||
|
@ -1264,5 +1265,6 @@ struct tree_opt_pass pass_expand =
|
|||
PROP_rtl, /* properties_provided */
|
||||
PROP_gimple_leh, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
0 /* todo_flags_finish */
|
||||
0, /* todo_flags_finish */
|
||||
'r' /* letter */
|
||||
};
|
||||
|
|
|
@ -328,7 +328,7 @@ cgraph_remove_node (struct cgraph_node *node)
|
|||
else
|
||||
{
|
||||
htab_clear_slot (cgraph_hash, slot);
|
||||
if (!dump_enabled_p (TDI_all))
|
||||
if (!dump_enabled_p (TDI_tree_all))
|
||||
{
|
||||
DECL_SAVED_TREE (node->decl) = NULL;
|
||||
DECL_STRUCT_FUNCTION (node->decl) = NULL;
|
||||
|
@ -356,7 +356,7 @@ cgraph_remove_node (struct cgraph_node *node)
|
|||
|| (!n->global.inlined_to
|
||||
&& !TREE_ASM_WRITTEN (n->decl) && !DECL_EXTERNAL (n->decl)))
|
||||
break;
|
||||
if (!n && !dump_enabled_p (TDI_all))
|
||||
if (!n && !dump_enabled_p (TDI_tree_all))
|
||||
{
|
||||
DECL_SAVED_TREE (node->decl) = NULL;
|
||||
DECL_STRUCT_FUNCTION (node->decl) = NULL;
|
||||
|
|
|
@ -1712,7 +1712,7 @@ cgraph_preserve_function_body_p (tree decl)
|
|||
{
|
||||
struct cgraph_node *node;
|
||||
/* Keep the body; we're going to dump it. */
|
||||
if (dump_enabled_p (TDI_all))
|
||||
if (dump_enabled_p (TDI_tree_all))
|
||||
return true;
|
||||
if (!cgraph_global_info_ready)
|
||||
return (DECL_INLINE (decl) && !flag_really_no_inline);
|
||||
|
@ -1771,7 +1771,7 @@ cgraph_optimize (void)
|
|||
/* Double check that all inline clones are gone and that all
|
||||
function bodies have been released from memory. */
|
||||
if (flag_unit_at_a_time
|
||||
&& !dump_enabled_p (TDI_all)
|
||||
&& !dump_enabled_p (TDI_tree_all)
|
||||
&& !(sorrycount || errorcount))
|
||||
{
|
||||
struct cgraph_node *node;
|
||||
|
|
|
@ -3349,160 +3349,280 @@ generate test coverage data. Coverage data will match the source files
|
|||
more closely, if you do not optimize.
|
||||
|
||||
@item -d@var{letters}
|
||||
@item -fdump-rtl-@var{pass}
|
||||
@opindex d
|
||||
Says to make debugging dumps during compilation at times specified by
|
||||
@var{letters}. This is used for debugging the compiler. The file names
|
||||
for most of the dumps are made by appending a pass number and a word to
|
||||
the @var{dumpname}. @var{dumpname} is generated from the name of the
|
||||
output file, if explicitly specified and it is not an executable,
|
||||
otherwise it is the basename of the source file. In both cases any
|
||||
suffix is removed (e.g. @file{foo.01.rtl} or @file{foo.02.sibling}).
|
||||
Here are the possible letters for use in @var{letters}, and their
|
||||
meanings:
|
||||
@var{letters}. This is used for debugging the RTL-based passes of the
|
||||
compiler. The file names for most of the dumps are made by appending a
|
||||
pass number and a word to the @var{dumpname}. @var{dumpname} is generated
|
||||
from the name of the output file, if explicitly specified and it is not
|
||||
an executable, otherwise it is the basename of the source file.
|
||||
|
||||
@table @samp
|
||||
@item A
|
||||
Most debug dumps can be enabled either passing a letter to the @option{-d}
|
||||
option, or with a long @option{-fdump-rtl} switch; here are the possible
|
||||
letters for use in @var{letters} and @var{pass}, and their meanings:
|
||||
|
||||
@table @gcctabopt
|
||||
@item -dA
|
||||
@opindex dA
|
||||
Annotate the assembler output with miscellaneous debugging information.
|
||||
@item b
|
||||
|
||||
@item -db
|
||||
@itemx -fdump-rtl-bp
|
||||
@opindex db
|
||||
Dump after computing branch probabilities, to @file{@var{file}.12.bp}.
|
||||
@item B
|
||||
@opindex fdump-rtl-bp
|
||||
Dump after computing branch probabilities, to @file{@var{file}.09.bp}.
|
||||
|
||||
@item -dB
|
||||
@itemx -fdump-rtl-bbro
|
||||
@opindex dB
|
||||
Dump after block reordering, to @file{@var{file}.32.bbro}.
|
||||
@item c
|
||||
@opindex fdump-rtl-bbro
|
||||
Dump after block reordering, to @file{@var{file}.30.bbro}.
|
||||
|
||||
@item -dc
|
||||
@itemx -fdump-rtl-combine
|
||||
@opindex dc
|
||||
Dump after instruction combination, to the file @file{@var{file}.20.combine}.
|
||||
@item C
|
||||
@opindex fdump-rtl-combine
|
||||
Dump after instruction combination, to the file @file{@var{file}.17.combine}.
|
||||
|
||||
@item -dC
|
||||
@itemx -fdump-rtl-ce1
|
||||
@itemx -fdump-rtl-ce2
|
||||
@opindex dC
|
||||
Dump after the first if conversion, to the file @file{@var{file}.14.ce1}.
|
||||
Also dump after the second if conversion, to the file @file{@var{file}.21.ce2}.
|
||||
@item d
|
||||
@opindex fdump-rtl-ce1
|
||||
@opindex fdump-rtl-ce2
|
||||
@option{-dC} and @option{-fdump-rtl-ce1} enable dumping after the
|
||||
first if conversion, to the file @file{@var{file}.11.ce1}. @option{-dC}
|
||||
and @option{-fdump-rtl-ce2} enable dumping after the second if
|
||||
conversion, to the file @file{@var{file}.18.ce2}.
|
||||
|
||||
@item -dd
|
||||
@itemx -fdump-rtl-btl
|
||||
@itemx -fdump-rtl-dbr
|
||||
@opindex dd
|
||||
Dump after branch target load optimization, to to @file{@var{file}.33.btl}.
|
||||
Also dump after delayed branch scheduling, to @file{@var{file}.37.dbr}.
|
||||
@item D
|
||||
@opindex fdump-rtl-btl
|
||||
@opindex fdump-rtl-dbr
|
||||
@option{-dd} and @option{-fdump-rtl-btl} enable dumping after branch
|
||||
target load optimization, to to @file{@var{file}.31.btl}. @option{-dd}
|
||||
and @option{-fdump-rtl-dbr} enable dumping after delayed branch
|
||||
scheduling, to @file{@var{file}.36.dbr}.
|
||||
|
||||
@item -dD
|
||||
@opindex dD
|
||||
Dump all macro definitions, at the end of preprocessing, in addition to
|
||||
normal output.
|
||||
@item E
|
||||
|
||||
@item -dE
|
||||
@itemx -fdump-rtl-ce3
|
||||
@opindex dE
|
||||
Dump after the third if conversion, to @file{@var{file}.31.ce3}.
|
||||
@item f
|
||||
@opindex fdump-rtl-ce3
|
||||
Dump after the third if conversion, to @file{@var{file}.28.ce3}.
|
||||
|
||||
@item -df
|
||||
@itemx -fdump-rtl-cfg
|
||||
@itemx -fdump-rtl-life
|
||||
@opindex df
|
||||
Dump after control and data flow analysis, to @file{@var{file}.11.cfg}.
|
||||
Also dump after life analysis, to @file{@var{file}.19.life}.
|
||||
@item g
|
||||
@opindex fdump-rtl-cfg
|
||||
@opindex fdump-rtl-life
|
||||
@option{-df} and @option{-fdump-rtl-cfg} enable dumping after control
|
||||
and data flow analysis, to @file{@var{file}.08.cfg}. @option{-df}
|
||||
and @option{-fdump-rtl-cfg} enable dumping dump after life analysis,
|
||||
to @file{@var{file}.16.life}.
|
||||
|
||||
@item -dg
|
||||
@itemx -fdump-rtl-greg
|
||||
@opindex dg
|
||||
Dump after global register allocation, to @file{@var{file}.26.greg}.
|
||||
@item G
|
||||
@opindex fdump-rtl-greg
|
||||
Dump after global register allocation, to @file{@var{file}.23.greg}.
|
||||
|
||||
@item -dG
|
||||
@itemx -fdump-rtl-gcse
|
||||
@itemx -fdump-rtl-bypass
|
||||
@opindex dG
|
||||
Dump after GCSE, to @file{@var{file}.08.gcse}.
|
||||
Also dump after jump bypassing and control flow optimizations, to
|
||||
@file{@var{file}.10.bypass}.
|
||||
@item h
|
||||
@opindex fdump-rtl-gcse
|
||||
@opindex fdump-rtl-bypass
|
||||
@option{-dG} and @option{-fdump-rtl-gcse} enable dumping after GCSE, to
|
||||
@file{@var{file}.05.gcse}. @option{-dG} and @option{-fdump-rtl-bypass}
|
||||
enable dumping after jump bypassing and control flow optimizations, to
|
||||
@file{@var{file}.07.bypass}.
|
||||
|
||||
@item -dh
|
||||
@itemx -fdump-rtl-eh
|
||||
@opindex dh
|
||||
Dump after finalization of EH handling code, to @file{@var{file}.03.eh}.
|
||||
@item i
|
||||
@opindex fdump-rtl-eh
|
||||
Dump after finalization of EH handling code, to @file{@var{file}.02.eh}.
|
||||
|
||||
@item -di
|
||||
@itemx -fdump-rtl-sibling
|
||||
@opindex di
|
||||
Dump after sibling call optimizations, to @file{@var{file}.02.sibling}.
|
||||
@item j
|
||||
@opindex fdump-rtl-sibling
|
||||
Dump after sibling call optimizations, to @file{@var{file}.01.sibling}.
|
||||
|
||||
@item -dj
|
||||
@itemx -fdump-rtl-jump
|
||||
@opindex dj
|
||||
Dump after the first jump optimization, to @file{@var{file}.04.jump}.
|
||||
@item k
|
||||
@opindex fdump-rtl-jump
|
||||
Dump after the first jump optimization, to @file{@var{file}.03.jump}.
|
||||
|
||||
@item -dk
|
||||
@itemx -fdump-rtl-stack
|
||||
@opindex dk
|
||||
Dump after conversion from registers to stack, to @file{@var{file}.35.stack}.
|
||||
@item l
|
||||
@opindex fdump-rtl-stack
|
||||
Dump after conversion from registers to stack, to @file{@var{file}.33.stack}.
|
||||
|
||||
@item -dl
|
||||
@itemx -fdump-rtl-lreg
|
||||
@opindex dl
|
||||
Dump after local register allocation, to @file{@var{file}.25.lreg}.
|
||||
@item L
|
||||
@opindex fdump-rtl-lreg
|
||||
Dump after local register allocation, to @file{@var{file}.22.lreg}.
|
||||
|
||||
@item -dL
|
||||
@itemx -fdump-rtl-loop
|
||||
@itemx -fdump-rtl-loop2
|
||||
@opindex dL
|
||||
Dump after loop optimization passes, to @file{@var{file}.09.loop} and
|
||||
@file{@var{file}.16.loop2}.
|
||||
@item m
|
||||
@opindex fdump-rtl-loop
|
||||
@opindex fdump-rtl-loop2
|
||||
@option{-dL} and @option{-fdump-rtl-loop} enable dumping after the first
|
||||
loop optimization pass, to @file{@var{file}.06.loop}. @option{-dL} and
|
||||
@option{-fdump-rtl-loop2} enable dumping after the second pass, to
|
||||
@file{@var{file}.13.loop2}.
|
||||
|
||||
@item -dm
|
||||
@itemx -fdump-rtl-sms
|
||||
@opindex dm
|
||||
Dump after modulo scheduling, to @file{@var{file}.23.sms}.
|
||||
@item M
|
||||
@opindex fdump-rtl-sms
|
||||
Dump after modulo scheduling, to @file{@var{file}.20.sms}.
|
||||
|
||||
@item -dM
|
||||
@itemx -fdump-rtl-mach
|
||||
@opindex dM
|
||||
@opindex fdump-rtl-mach
|
||||
Dump after performing the machine dependent reorganization pass, to
|
||||
@file{@var{file}.36.mach}.
|
||||
@item n
|
||||
@file{@var{file}.35.mach}.
|
||||
|
||||
@item -dn
|
||||
@itemx -fdump-rtl-rnreg
|
||||
@opindex dn
|
||||
Dump after register renumbering, to @file{@var{file}.30.rnreg}.
|
||||
@item N
|
||||
@opindex fdump-rtl-rnreg
|
||||
Dump after register renumbering, to @file{@var{file}.29.rnreg}.
|
||||
|
||||
@item -dN
|
||||
@itemx -fdump-rtl-regmove
|
||||
@opindex dN
|
||||
Dump after the register move pass, to @file{@var{file}.22.regmove}.
|
||||
@item o
|
||||
@opindex fdump-rtl-regmove
|
||||
Dump after the register move pass, to @file{@var{file}.19.regmove}.
|
||||
|
||||
@item -do
|
||||
@itemx -fdump-rtl-postreload
|
||||
@opindex do
|
||||
Dump after post-reload optimizations, to @file{@var{file}.27.postreload}.
|
||||
@item r
|
||||
@opindex fdump-rtl-postreload
|
||||
Dump after post-reload optimizations, to @file{@var{file}.24.postreload}.
|
||||
|
||||
@item -dr
|
||||
@itemx -fdump-rtl-expand
|
||||
@opindex dr
|
||||
Dump after RTL generation, to @file{@var{file}.01.rtl}.
|
||||
@item R
|
||||
@opindex fdump-rtl-expand
|
||||
Dump after RTL generation, to @file{@var{file}.00.expand}.
|
||||
|
||||
@item -dR
|
||||
@itemx -fdump-rtl-sched2
|
||||
@opindex dR
|
||||
Dump after the second scheduling pass, to @file{@var{file}.34.sched2}.
|
||||
@item s
|
||||
@opindex fdump-rtl-sched2
|
||||
Dump after the second scheduling pass, to @file{@var{file}.32.sched2}.
|
||||
|
||||
@item -ds
|
||||
@itemx -fdump-rtl-cse
|
||||
@opindex ds
|
||||
@opindex fdump-rtl-cse
|
||||
Dump after CSE (including the jump optimization that sometimes follows
|
||||
CSE), to @file{@var{file}.06.cse}.
|
||||
@item S
|
||||
CSE), to @file{@var{file}.04.cse}.
|
||||
|
||||
@item -dS
|
||||
@itemx -fdump-rtl-sched
|
||||
@opindex dS
|
||||
Dump after the first scheduling pass, to @file{@var{file}.24.sched}.
|
||||
@item t
|
||||
@opindex fdump-rtl-sched
|
||||
Dump after the first scheduling pass, to @file{@var{file}.21.sched}.
|
||||
|
||||
@item -dt
|
||||
@itemx -fdump-rtl-cse2
|
||||
@opindex dt
|
||||
@opindex fdump-rtl-cse2
|
||||
Dump after the second CSE pass (including the jump optimization that
|
||||
sometimes follows CSE), to @file{@var{file}.18.cse2}.
|
||||
@item T
|
||||
sometimes follows CSE), to @file{@var{file}.15.cse2}.
|
||||
|
||||
@item -dT
|
||||
@itemx -fdump-rtl-tracer
|
||||
@opindex dT
|
||||
Dump after running tracer, to @file{@var{file}.15.tracer}.
|
||||
@item u
|
||||
@opindex du
|
||||
Dump after null pointer elimination pass to @file{@var{file}.05.null}.
|
||||
@item U
|
||||
@opindex dU
|
||||
Dump callgraph and unit-at-a-time optimization @file{@var{file}.00.unit}.
|
||||
@item V
|
||||
@opindex fdump-rtl-tracer
|
||||
Dump after running tracer, to @file{@var{file}.12.tracer}.
|
||||
|
||||
@item -dV
|
||||
@itemx -fdump-rtl-vpt
|
||||
@itemx -fdump-rtl-vartrack
|
||||
@opindex dV
|
||||
Dump after the value profile transformations, to @file{@var{file}.13.vpt}.
|
||||
Also dump after variable tracking, to @file{@var{file}.35.vartrack}.
|
||||
@item w
|
||||
@opindex fdump-rtl-vpt
|
||||
@opindex fdump-rtl-vartrack
|
||||
@option{-dV} and @option{-fdump-rtl-vpt} enable dumping after the value
|
||||
profile transformations, to @file{@var{file}.10.vpt}. @option{-dV}
|
||||
and @option{-fdump-rtl-vartrack} enable dumping after variable tracking,
|
||||
to @file{@var{file}.34.vartrack}.
|
||||
|
||||
@item -dw
|
||||
@itemx -fdump-rtl-flow2
|
||||
@opindex dw
|
||||
Dump after the second flow pass, to @file{@var{file}.28.flow2}.
|
||||
@item z
|
||||
@opindex fdump-rtl-flow2
|
||||
Dump after the second flow pass, to @file{@var{file}.26.flow2}.
|
||||
|
||||
@item -dz
|
||||
@itemx -fdump-rtl-peephole2
|
||||
@opindex dz
|
||||
Dump after the peephole pass, to @file{@var{file}.29.peephole2}.
|
||||
@item Z
|
||||
@opindex fdump-rtl-peephole2
|
||||
Dump after the peephole pass, to @file{@var{file}.27.peephole2}.
|
||||
|
||||
@item -dZ
|
||||
@itemx -fdump-rtl-web
|
||||
@opindex dZ
|
||||
Dump after constructing the web, to @file{@var{file}.17.web}.
|
||||
@item a
|
||||
@opindex fdump-rtl-web
|
||||
Dump after live range splitting, to @file{@var{file}.14.web}.
|
||||
|
||||
@item -da
|
||||
@itemx -fdump-rtl-all
|
||||
@opindex da
|
||||
@opindex fdump-rtl-all
|
||||
Produce all the dumps listed above.
|
||||
@item H
|
||||
|
||||
@item -dH
|
||||
@opindex dH
|
||||
Produce a core dump whenever an error occurs.
|
||||
@item m
|
||||
|
||||
@item -dm
|
||||
@opindex dm
|
||||
Print statistics on memory usage, at the end of the run, to
|
||||
standard error.
|
||||
@item p
|
||||
|
||||
@item -dp
|
||||
@opindex dp
|
||||
Annotate the assembler output with a comment indicating which
|
||||
pattern and alternative was used. The length of each instruction is
|
||||
also printed.
|
||||
@item P
|
||||
|
||||
@item -dP
|
||||
@opindex dP
|
||||
Dump the RTL in the assembler output as a comment before each instruction.
|
||||
Also turns on @option{-dp} annotation.
|
||||
@item v
|
||||
|
||||
@item -dv
|
||||
@opindex dv
|
||||
For each of the other indicated dump files (except for
|
||||
@file{@var{file}.01.rtl}), dump a representation of the control flow graph
|
||||
suitable for viewing with VCG to @file{@var{file}.@var{pass}.vcg}.
|
||||
@item x
|
||||
For each of the other indicated dump files (either with @option{-d} or
|
||||
@option{-fdump-rtl-@var{pass}}), dump a representation of the control flow
|
||||
graph suitable for viewing with VCG to @file{@var{file}.@var{pass}.vcg}.
|
||||
|
||||
@item -dx
|
||||
@opindex dx
|
||||
Just generate RTL for a function instead of compiling it. Usually used
|
||||
with @samp{r}.
|
||||
@item y
|
||||
with @samp{r} (@option{-fdump-rtl-expand}).
|
||||
|
||||
@item -dy
|
||||
@opindex dy
|
||||
Dump debugging information during parsing, to standard error.
|
||||
@end table
|
||||
|
|
|
@ -138,7 +138,8 @@ struct tree_opt_pass pass_lower_cf =
|
|||
PROP_gimple_lcf, /* properties_provided */
|
||||
PROP_gimple_any, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func /* todo_flags_finish */
|
||||
TODO_dump_func, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
|
||||
|
@ -538,5 +539,6 @@ struct tree_opt_pass pass_remove_useless_vars =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func /* todo_flags_finish */
|
||||
TODO_dump_func, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
|
24
gcc/graph.c
24
gcc/graph.c
|
@ -220,21 +220,19 @@ end_fct (FILE *fp)
|
|||
/* Like print_rtl, but also print out live information for the start of each
|
||||
basic block. */
|
||||
void
|
||||
print_rtl_graph_with_bb (const char *base, const char *suffix, rtx rtx_first)
|
||||
print_rtl_graph_with_bb (const char *base, rtx rtx_first)
|
||||
{
|
||||
rtx tmp_rtx;
|
||||
size_t namelen = strlen (base);
|
||||
size_t suffixlen = strlen (suffix);
|
||||
size_t extlen = strlen (graph_ext[graph_dump_format]) + 1;
|
||||
char *buf = alloca (namelen + suffixlen + extlen);
|
||||
char *buf = alloca (namelen + extlen);
|
||||
FILE *fp;
|
||||
|
||||
if (basic_block_info == NULL)
|
||||
return;
|
||||
|
||||
memcpy (buf, base, namelen);
|
||||
memcpy (buf + namelen, suffix, suffixlen);
|
||||
memcpy (buf + namelen + suffixlen, graph_ext[graph_dump_format], extlen);
|
||||
memcpy (buf + namelen, graph_ext[graph_dump_format], extlen);
|
||||
|
||||
fp = fopen (buf, "a");
|
||||
if (fp == NULL)
|
||||
|
@ -385,17 +383,15 @@ print_rtl_graph_with_bb (const char *base, const char *suffix, rtx rtx_first)
|
|||
/* Similar as clean_dump_file, but this time for graph output files. */
|
||||
|
||||
void
|
||||
clean_graph_dump_file (const char *base, const char *suffix)
|
||||
clean_graph_dump_file (const char *base)
|
||||
{
|
||||
size_t namelen = strlen (base);
|
||||
size_t suffixlen = strlen (suffix);
|
||||
size_t extlen = strlen (graph_ext[graph_dump_format]) + 1;
|
||||
char *buf = alloca (namelen + extlen + suffixlen);
|
||||
char *buf = alloca (namelen + extlen);
|
||||
FILE *fp;
|
||||
|
||||
memcpy (buf, base, namelen);
|
||||
memcpy (buf + namelen, suffix, suffixlen);
|
||||
memcpy (buf + namelen + suffixlen, graph_ext[graph_dump_format], extlen);
|
||||
memcpy (buf + namelen, graph_ext[graph_dump_format], extlen);
|
||||
|
||||
fp = fopen (buf, "w");
|
||||
|
||||
|
@ -417,17 +413,15 @@ clean_graph_dump_file (const char *base, const char *suffix)
|
|||
|
||||
/* Do final work on the graph output file. */
|
||||
void
|
||||
finish_graph_dump_file (const char *base, const char *suffix)
|
||||
finish_graph_dump_file (const char *base)
|
||||
{
|
||||
size_t namelen = strlen (base);
|
||||
size_t suffixlen = strlen (suffix);
|
||||
size_t extlen = strlen (graph_ext[graph_dump_format]) + 1;
|
||||
char *buf = alloca (namelen + suffixlen + extlen);
|
||||
char *buf = alloca (namelen + extlen);
|
||||
FILE *fp;
|
||||
|
||||
memcpy (buf, base, namelen);
|
||||
memcpy (buf + namelen, suffix, suffixlen);
|
||||
memcpy (buf + namelen + suffixlen, graph_ext[graph_dump_format], extlen);
|
||||
memcpy (buf + namelen, graph_ext[graph_dump_format], extlen);
|
||||
|
||||
fp = fopen (buf, "a");
|
||||
if (fp != NULL)
|
||||
|
|
|
@ -21,8 +21,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
|||
#ifndef GCC_GRAPH_H
|
||||
#define GCC_GRAPH_H
|
||||
|
||||
extern void print_rtl_graph_with_bb (const char *, const char *, rtx);
|
||||
extern void clean_graph_dump_file (const char *, const char *);
|
||||
extern void finish_graph_dump_file (const char *, const char *);
|
||||
extern void print_rtl_graph_with_bb (const char *, rtx);
|
||||
extern void clean_graph_dump_file (const char *);
|
||||
extern void finish_graph_dump_file (const char *);
|
||||
|
||||
#endif /* ! GCC_GRAPH_H */
|
||||
|
|
282
gcc/passes.c
282
gcc/passes.c
|
@ -81,6 +81,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
|||
#include "value-prof.h"
|
||||
#include "alloc-pool.h"
|
||||
#include "tree-pass.h"
|
||||
#include "tree-dump.h"
|
||||
|
||||
#if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
|
||||
#include "dwarf2out.h"
|
||||
|
@ -108,166 +109,27 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
|||
#define DUMPFILE_FORMAT ".%02d."
|
||||
#endif
|
||||
|
||||
/* Describes a dump file. */
|
||||
|
||||
struct dump_file_info
|
||||
{
|
||||
/* The unique extension to apply, e.g. ".jump". */
|
||||
const char *const extension;
|
||||
|
||||
/* The -d<c> character that enables this dump file. */
|
||||
char const debug_switch;
|
||||
|
||||
/* True if there is a corresponding graph dump file. */
|
||||
char const graph_dump_p;
|
||||
|
||||
/* True if the user selected this dump. */
|
||||
char enabled;
|
||||
|
||||
/* True if the files have been initialized (ie truncated). */
|
||||
char initialized;
|
||||
};
|
||||
|
||||
/* Enumerate the extant dump files. */
|
||||
|
||||
enum dump_file_index
|
||||
{
|
||||
DFI_cgraph,
|
||||
DFI_rtl,
|
||||
DFI_sibling,
|
||||
DFI_eh,
|
||||
DFI_jump,
|
||||
DFI_null,
|
||||
DFI_cse,
|
||||
DFI_gcse,
|
||||
DFI_loop,
|
||||
DFI_bypass,
|
||||
DFI_cfg,
|
||||
DFI_bp,
|
||||
DFI_vpt,
|
||||
DFI_ce1,
|
||||
DFI_tracer,
|
||||
DFI_loop2,
|
||||
DFI_web,
|
||||
DFI_cse2,
|
||||
DFI_life,
|
||||
DFI_combine,
|
||||
DFI_ce2,
|
||||
DFI_regmove,
|
||||
DFI_sms,
|
||||
DFI_sched,
|
||||
DFI_lreg,
|
||||
DFI_greg,
|
||||
DFI_postreload,
|
||||
DFI_gcse2,
|
||||
DFI_flow2,
|
||||
DFI_peephole2,
|
||||
DFI_ce3,
|
||||
DFI_rnreg,
|
||||
DFI_bbro,
|
||||
DFI_branch_target_load,
|
||||
DFI_sched2,
|
||||
DFI_stack,
|
||||
DFI_vartrack,
|
||||
DFI_mach,
|
||||
DFI_dbr,
|
||||
DFI_MAX
|
||||
};
|
||||
|
||||
/* Describes all the dump files. Should be kept in order of the
|
||||
pass and in sync with dump_file_index above.
|
||||
|
||||
Remaining -d letters:
|
||||
|
||||
" e q "
|
||||
" F K O Q WXY "
|
||||
*/
|
||||
|
||||
static struct dump_file_info dump_file_tbl[DFI_MAX] =
|
||||
{
|
||||
{ "cgraph", 'U', 0, 0, 0 },
|
||||
{ "rtl", 'r', 0, 0, 0 },
|
||||
{ "sibling", 'i', 0, 0, 0 },
|
||||
{ "eh", 'h', 0, 0, 0 },
|
||||
{ "jump", 'j', 0, 0, 0 },
|
||||
{ "null", 'u', 0, 0, 0 },
|
||||
{ "cse", 's', 0, 0, 0 },
|
||||
{ "gcse", 'G', 1, 0, 0 },
|
||||
{ "loop", 'L', 1, 0, 0 },
|
||||
{ "bypass", 'G', 1, 0, 0 }, /* Yes, duplicate enable switch. */
|
||||
{ "cfg", 'f', 1, 0, 0 },
|
||||
{ "bp", 'b', 1, 0, 0 },
|
||||
{ "vpt", 'V', 1, 0, 0 },
|
||||
{ "ce1", 'C', 1, 0, 0 },
|
||||
{ "tracer", 'T', 1, 0, 0 },
|
||||
{ "loop2", 'L', 1, 0, 0 },
|
||||
{ "web", 'Z', 0, 0, 0 },
|
||||
{ "cse2", 't', 1, 0, 0 },
|
||||
{ "life", 'f', 1, 0, 0 }, /* Yes, duplicate enable switch. */
|
||||
{ "combine", 'c', 1, 0, 0 },
|
||||
{ "ce2", 'C', 1, 0, 0 },
|
||||
{ "regmove", 'N', 1, 0, 0 },
|
||||
{ "sms", 'm', 0, 0, 0 },
|
||||
{ "sched", 'S', 1, 0, 0 },
|
||||
{ "lreg", 'l', 1, 0, 0 },
|
||||
{ "greg", 'g', 1, 0, 0 },
|
||||
{ "postreload", 'o', 1, 0, 0 },
|
||||
{ "gcse2", 'J', 0, 0, 0 },
|
||||
{ "flow2", 'w', 1, 0, 0 },
|
||||
{ "peephole2", 'z', 1, 0, 0 },
|
||||
{ "ce3", 'E', 1, 0, 0 },
|
||||
{ "rnreg", 'n', 1, 0, 0 },
|
||||
{ "bbro", 'B', 1, 0, 0 },
|
||||
{ "btl", 'd', 1, 0, 0 }, /* Yes, duplicate enable switch. */
|
||||
{ "sched2", 'R', 1, 0, 0 },
|
||||
{ "stack", 'k', 1, 0, 0 },
|
||||
{ "vartrack", 'V', 1, 0, 0 }, /* Yes, duplicate enable switch. */
|
||||
{ "mach", 'M', 1, 0, 0 },
|
||||
{ "dbr", 'd', 0, 0, 0 },
|
||||
};
|
||||
static int initializing_dump = 0;
|
||||
|
||||
/* Routine to open a dump file. Return true if the dump file is enabled. */
|
||||
|
||||
static int
|
||||
open_dump_file (enum dump_file_index index, tree decl)
|
||||
open_dump_file (enum tree_dump_index index, tree decl)
|
||||
{
|
||||
char *dump_name;
|
||||
const char *open_arg;
|
||||
char seq[16];
|
||||
|
||||
if (! dump_file_tbl[index].enabled)
|
||||
if (! dump_enabled_p (index))
|
||||
return 0;
|
||||
|
||||
timevar_push (TV_DUMP);
|
||||
if (dump_file != NULL)
|
||||
fclose (dump_file);
|
||||
|
||||
sprintf (seq, DUMPFILE_FORMAT, index);
|
||||
if (dump_file != NULL || dump_file_name != NULL)
|
||||
abort ();
|
||||
|
||||
if (! dump_file_tbl[index].initialized)
|
||||
{
|
||||
/* If we've not initialized the files, do so now. */
|
||||
if (graph_dump_format != no_graph
|
||||
&& dump_file_tbl[index].graph_dump_p)
|
||||
{
|
||||
dump_name = concat (seq, dump_file_tbl[index].extension, NULL);
|
||||
clean_graph_dump_file (dump_base_name, dump_name);
|
||||
free (dump_name);
|
||||
}
|
||||
dump_file_tbl[index].initialized = 1;
|
||||
open_arg = "w";
|
||||
}
|
||||
else
|
||||
open_arg = "a";
|
||||
dump_file_name = get_dump_file_name (index);
|
||||
initializing_dump = !dump_initialized_p (index);
|
||||
dump_file = dump_begin (index, NULL);
|
||||
|
||||
dump_name = concat (dump_base_name, seq,
|
||||
dump_file_tbl[index].extension, NULL);
|
||||
|
||||
dump_file = fopen (dump_name, open_arg);
|
||||
if (dump_file == NULL)
|
||||
fatal_error ("can't open %s: %m", dump_name);
|
||||
|
||||
free (dump_name);
|
||||
fatal_error ("can't open %s: %m", dump_file_name);
|
||||
|
||||
if (decl)
|
||||
fprintf (dump_file, "\n;; Function %s%s\n\n",
|
||||
|
@ -285,7 +147,7 @@ open_dump_file (enum dump_file_index index, tree decl)
|
|||
/* Routine to close a dump file. */
|
||||
|
||||
static void
|
||||
close_dump_file (enum dump_file_index index,
|
||||
close_dump_file (enum tree_dump_index index,
|
||||
void (*func) (FILE *, rtx),
|
||||
rtx insns)
|
||||
{
|
||||
|
@ -294,25 +156,23 @@ close_dump_file (enum dump_file_index index,
|
|||
|
||||
timevar_push (TV_DUMP);
|
||||
if (insns
|
||||
&& graph_dump_format != no_graph
|
||||
&& dump_file_tbl[index].graph_dump_p)
|
||||
&& graph_dump_format != no_graph)
|
||||
{
|
||||
char seq[16];
|
||||
char *suffix;
|
||||
/* If we've not initialized the files, do so now. */
|
||||
if (initializing_dump)
|
||||
clean_graph_dump_file (dump_file_name);
|
||||
|
||||
sprintf (seq, DUMPFILE_FORMAT, index);
|
||||
suffix = concat (seq, dump_file_tbl[index].extension, NULL);
|
||||
print_rtl_graph_with_bb (dump_base_name, suffix, insns);
|
||||
free (suffix);
|
||||
print_rtl_graph_with_bb (dump_file_name, insns);
|
||||
}
|
||||
|
||||
if (func && insns)
|
||||
func (dump_file, insns);
|
||||
|
||||
fflush (dump_file);
|
||||
fclose (dump_file);
|
||||
dump_end (index, dump_file);
|
||||
free ((char *) dump_file_name);
|
||||
|
||||
dump_file = NULL;
|
||||
dump_file_name = NULL;
|
||||
timevar_pop (TV_DUMP);
|
||||
}
|
||||
|
||||
|
@ -603,7 +463,7 @@ rest_of_handle_new_regalloc (void)
|
|||
|
||||
ggc_collect ();
|
||||
|
||||
if (dump_file_tbl[DFI_greg].enabled)
|
||||
if (dump_enabled_p (DFI_greg))
|
||||
{
|
||||
timevar_push (TV_DUMP);
|
||||
dump_global_regs (dump_file);
|
||||
|
@ -657,7 +517,7 @@ rest_of_handle_old_regalloc (void)
|
|||
timevar_pop (TV_JUMP);
|
||||
}
|
||||
|
||||
if (dump_file_tbl[DFI_lreg].enabled)
|
||||
if (dump_enabled_p (DFI_lreg))
|
||||
{
|
||||
timevar_push (TV_DUMP);
|
||||
dump_flow_info (dump_file);
|
||||
|
@ -683,7 +543,7 @@ rest_of_handle_old_regalloc (void)
|
|||
failure = reload (get_insns (), 0);
|
||||
}
|
||||
|
||||
if (dump_file_tbl[DFI_greg].enabled)
|
||||
if (dump_enabled_p (DFI_greg))
|
||||
{
|
||||
timevar_push (TV_DUMP);
|
||||
dump_global_regs (dump_file);
|
||||
|
@ -1454,6 +1314,11 @@ rest_of_handle_jump (void)
|
|||
#ifdef ENABLE_CHECKING
|
||||
verify_flow_info ();
|
||||
#endif
|
||||
|
||||
if (cfun->tail_call_emit)
|
||||
fixup_tail_calls ();
|
||||
|
||||
close_dump_file (DFI_sibling, print_rtl, get_insns ());
|
||||
timevar_pop (TV_JUMP);
|
||||
}
|
||||
|
||||
|
@ -1713,27 +1578,8 @@ rest_of_clean_state (void)
|
|||
void
|
||||
rest_of_compilation (void)
|
||||
{
|
||||
/* There's no need to defer outputting this function any more; we
|
||||
know we want to output it. */
|
||||
DECL_DEFER_OUTPUT (current_function_decl) = 0;
|
||||
|
||||
/* Now that we're done expanding trees to RTL, we shouldn't have any
|
||||
more CONCATs anywhere. */
|
||||
generating_concat_p = 0;
|
||||
|
||||
/* When processing delayed functions, prepare_function_start () won't
|
||||
have been run to re-initialize it. */
|
||||
cse_not_expected = ! optimize;
|
||||
|
||||
finalize_block_changes ();
|
||||
|
||||
/* Dump the rtl code if we are dumping rtl. */
|
||||
if (open_dump_file (DFI_rtl, current_function_decl))
|
||||
close_dump_file (DFI_rtl, print_rtl, get_insns ());
|
||||
|
||||
/* Convert from NOTE_INSN_EH_REGION style notes, and do other
|
||||
sorts of eh initialization. Delay this until after the
|
||||
initial rtl dump so that we can see the original nesting. */
|
||||
sorts of eh initialization. */
|
||||
convert_from_eh_region_ranges ();
|
||||
|
||||
/* If we're emitting a nested function, make sure its parent gets
|
||||
|
@ -1770,9 +1616,6 @@ rest_of_compilation (void)
|
|||
|
||||
rest_of_handle_jump ();
|
||||
|
||||
if (cfun->tail_call_emit)
|
||||
fixup_tail_calls ();
|
||||
|
||||
rest_of_handle_eh ();
|
||||
|
||||
/* Delay emitting hard_reg_initial_value sets until after EH landing pad
|
||||
|
@ -2001,17 +1844,13 @@ rest_of_compilation (void)
|
|||
rest_of_clean_state ();
|
||||
}
|
||||
|
||||
void
|
||||
init_optimization_passes (void)
|
||||
{
|
||||
open_dump_file (DFI_cgraph, NULL);
|
||||
cgraph_dump_file = dump_file;
|
||||
dump_file = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
finish_optimization_passes (void)
|
||||
{
|
||||
enum tree_dump_index i;
|
||||
struct dump_file_info *dfi;
|
||||
char *name;
|
||||
|
||||
timevar_push (TV_DUMP);
|
||||
if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
|
||||
{
|
||||
|
@ -2026,59 +1865,23 @@ finish_optimization_passes (void)
|
|||
close_dump_file (DFI_combine, NULL, NULL_RTX);
|
||||
}
|
||||
|
||||
dump_file = cgraph_dump_file;
|
||||
cgraph_dump_file = NULL;
|
||||
close_dump_file (DFI_cgraph, NULL, NULL_RTX);
|
||||
|
||||
/* Do whatever is necessary to finish printing the graphs. */
|
||||
if (graph_dump_format != no_graph)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < (int) DFI_MAX; ++i)
|
||||
if (dump_file_tbl[i].initialized && dump_file_tbl[i].graph_dump_p)
|
||||
{
|
||||
char seq[16];
|
||||
char *suffix;
|
||||
|
||||
sprintf (seq, DUMPFILE_FORMAT, i);
|
||||
suffix = concat (seq, dump_file_tbl[i].extension, NULL);
|
||||
finish_graph_dump_file (dump_base_name, suffix);
|
||||
free (suffix);
|
||||
}
|
||||
}
|
||||
for (i = DFI_MIN; (dfi = get_dump_file_info (i)) != NULL; ++i)
|
||||
if (dump_initialized_p (i)
|
||||
&& (dfi->flags & TDF_RTL) != 0
|
||||
&& (name = get_dump_file_name (i)) != NULL)
|
||||
{
|
||||
finish_graph_dump_file (name);
|
||||
free (name);
|
||||
}
|
||||
|
||||
timevar_pop (TV_DUMP);
|
||||
}
|
||||
|
||||
bool
|
||||
enable_rtl_dump_file (int letter)
|
||||
{
|
||||
bool matched = false;
|
||||
int i;
|
||||
|
||||
if (letter == 'a')
|
||||
{
|
||||
for (i = 0; i < (int) DFI_MAX; ++i)
|
||||
dump_file_tbl[i].enabled = 1;
|
||||
matched = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < (int) DFI_MAX; ++i)
|
||||
if (letter == dump_file_tbl[i].debug_switch)
|
||||
{
|
||||
dump_file_tbl[i].enabled = 1;
|
||||
matched = true;
|
||||
}
|
||||
}
|
||||
|
||||
return matched;
|
||||
}
|
||||
|
||||
struct tree_opt_pass pass_rest_of_compilation =
|
||||
{
|
||||
"rest of compilation", /* name */
|
||||
NULL, /* name */
|
||||
NULL, /* gate */
|
||||
rest_of_compilation, /* execute */
|
||||
NULL, /* sub */
|
||||
|
@ -2089,7 +1892,8 @@ struct tree_opt_pass pass_rest_of_compilation =
|
|||
0, /* properties_provided */
|
||||
PROP_rtl, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_ggc_collect /* todo_flags_finish */
|
||||
TODO_ggc_collect, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -1471,5 +1471,6 @@ struct tree_opt_pass pass_profile =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_ggc_collect | TODO_verify_ssa /* todo_flags_finish */
|
||||
TODO_ggc_collect | TODO_verify_ssa, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
|
|
@ -423,6 +423,7 @@ FILE *asm_out_file;
|
|||
FILE *aux_info_file;
|
||||
FILE *dump_file = NULL;
|
||||
FILE *cgraph_dump_file = NULL;
|
||||
char *dump_file_name;
|
||||
|
||||
/* The current working directory of a translation. It's generally the
|
||||
directory from which compilation was initiated, but a preprocessed
|
||||
|
@ -1984,7 +1985,7 @@ lang_dependent_init (const char *name)
|
|||
{
|
||||
location_t save_loc = input_location;
|
||||
if (dump_base_name == 0)
|
||||
dump_base_name = name ? name : "gccdump";
|
||||
dump_base_name = name && name[0] ? name : "gccdump";
|
||||
|
||||
/* Other front-end initialization. */
|
||||
#ifdef USE_MAPPED_LOCATION
|
||||
|
@ -2003,7 +2004,6 @@ lang_dependent_init (const char *name)
|
|||
front end is initialized. */
|
||||
init_eh ();
|
||||
init_optabs ();
|
||||
init_optimization_passes ();
|
||||
|
||||
/* The following initialization functions need to generate rtl, so
|
||||
provide a dummy function context for them. */
|
||||
|
|
|
@ -78,7 +78,6 @@ extern void rest_of_type_compilation (tree, int);
|
|||
extern void rest_of_compilation (void);
|
||||
extern void tree_rest_of_compilation (tree, bool);
|
||||
extern void init_tree_optimization_passes (void);
|
||||
extern void init_optimization_passes (void);
|
||||
extern void finish_optimization_passes (void);
|
||||
extern bool enable_rtl_dump_file (int);
|
||||
|
||||
|
|
|
@ -1052,7 +1052,8 @@ struct tree_opt_pass pass_build_pta =
|
|||
PROP_pta, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
0 /* todo_flags_finish */
|
||||
0, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
|
||||
|
@ -1097,7 +1098,8 @@ struct tree_opt_pass pass_del_pta =
|
|||
0, /* properties_provided */
|
||||
PROP_pta, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
0 /* todo_flags_finish */
|
||||
0, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -207,7 +207,8 @@ struct tree_opt_pass pass_build_cfg =
|
|||
PROP_cfg, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_verify_stmts /* todo_flags_finish */
|
||||
TODO_verify_stmts, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
/* Search the CFG for any computed gotos. If found, factor them to a
|
||||
|
@ -1647,7 +1648,8 @@ struct tree_opt_pass pass_remove_useless_stmts =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func /* todo_flags_finish */
|
||||
TODO_dump_func, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
|
||||
|
@ -4765,7 +4767,8 @@ struct tree_opt_pass pass_split_crit_edges =
|
|||
PROP_no_crit_edges, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func, /* todo_flags_finish */
|
||||
TODO_dump_func, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
|
||||
|
@ -4959,7 +4962,8 @@ struct tree_opt_pass pass_warn_function_return =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
0 /* todo_flags_finish */
|
||||
0, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
#include "gt-tree-cfg.h"
|
||||
|
|
|
@ -935,7 +935,8 @@ struct tree_opt_pass pass_lower_vector_ssa =
|
|||
0, /* todo_flags_start */
|
||||
TODO_dump_func | TODO_rename_vars /* todo_flags_finish */
|
||||
| TODO_ggc_collect | TODO_verify_ssa
|
||||
| TODO_verify_stmts | TODO_verify_flow
|
||||
| TODO_verify_stmts | TODO_verify_flow,
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
struct tree_opt_pass pass_pre_expand =
|
||||
|
@ -952,5 +953,6 @@ struct tree_opt_pass pass_pre_expand =
|
|||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func | TODO_ggc_collect
|
||||
| TODO_verify_stmts /* todo_flags_finish */
|
||||
| TODO_verify_stmts, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
|
|
@ -135,7 +135,8 @@ struct tree_opt_pass pass_referenced_vars =
|
|||
PROP_referenced_vars, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
0, /* todo_flags_finish */
|
||||
0, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
|
||||
|
|
182
gcc/tree-dump.c
182
gcc/tree-dump.c
|
@ -28,6 +28,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
|||
#include "diagnostic.h"
|
||||
#include "toplev.h"
|
||||
#include "tree-dump.h"
|
||||
#include "tree-pass.h"
|
||||
#include "langhooks.h"
|
||||
#include "tree-iterator.h"
|
||||
|
||||
|
@ -37,7 +38,7 @@ static void dequeue_and_dump (dump_info_p);
|
|||
static void dump_new_line (dump_info_p);
|
||||
static void dump_maybe_newline (dump_info_p);
|
||||
static void dump_string_field (dump_info_p, const char *, const char *);
|
||||
static void dump_enable_all (int);
|
||||
static int dump_enable_all (int, int);
|
||||
|
||||
/* Add T to the end of the queue of nodes to dump. Returns the index
|
||||
assigned to T. */
|
||||
|
@ -658,30 +659,61 @@ dump_node (tree t, int flags, FILE *stream)
|
|||
}
|
||||
splay_tree_delete (di.nodes);
|
||||
}
|
||||
|
||||
/* Define a tree dump switch. */
|
||||
struct dump_file_info
|
||||
{
|
||||
const char *suffix; /* suffix to give output file. */
|
||||
const char *swtch; /* command line switch */
|
||||
int flags; /* user flags */
|
||||
int state; /* state of play */
|
||||
};
|
||||
|
||||
|
||||
/* Table of tree dump switches. This must be consistent with the
|
||||
TREE_DUMP_INDEX enumeration in tree.h */
|
||||
static struct dump_file_info dump_files[TDI_end] =
|
||||
{
|
||||
{NULL, NULL, 0, 0},
|
||||
{".tu", "translation-unit", 0, 0},
|
||||
{".class", "class-hierarchy", 0, 0},
|
||||
{".original", "tree-original", 0, 0},
|
||||
{".generic", "tree-generic", 0, 0},
|
||||
{".nested", "tree-nested", 0, 0},
|
||||
{".inlined", "tree-inlined", 0, 0},
|
||||
{".vcg", "tree-vcg", 0, 0},
|
||||
{".xml", "call-graph", 0, 0},
|
||||
{NULL, "tree-all", 0, 0},
|
||||
{NULL, NULL, 0, 0, 0, 0},
|
||||
{".tu", "translation-unit", TDF_TREE, 0, 0, 0},
|
||||
{".class", "class-hierarchy", TDF_TREE, 0, 1, 0},
|
||||
{".original", "tree-original", TDF_TREE, 0, 2, 0},
|
||||
{".generic", "tree-generic", TDF_TREE, 0, 3, 0},
|
||||
{".nested", "tree-nested", TDF_TREE, 0, 4, 0},
|
||||
{".inlined", "tree-inlined", TDF_TREE, 0, 5, 0},
|
||||
{".vcg", "tree-vcg", TDF_TREE, 0, 6, 0},
|
||||
/* FIXME -fdump-call-graph is broken. Set TDF_TREE when it is fixed. */
|
||||
{".xml", "call-graph", 0, 0, 7, 0},
|
||||
{NULL, "tree-all", TDF_TREE, 0, 0, 0},
|
||||
{NULL, "rtl-all", TDF_RTL, 0, 0, 0},
|
||||
|
||||
{ ".sibling", "rtl-sibling", TDF_RTL, 0, 1, 'i'},
|
||||
{ ".eh", "rtl-eh", TDF_RTL, 0, 2, 'h'},
|
||||
{ ".jump", "rtl-jump", TDF_RTL, 0, 3, 'j'},
|
||||
{ ".cse", "rtl-cse", TDF_RTL, 0, 4, 's'},
|
||||
{ ".gcse", "rtl-gcse", TDF_RTL, 0, 5, 'G'},
|
||||
{ ".loop", "rtl-loop", TDF_RTL, 0, 6, 'L'},
|
||||
{ ".bypass", "rtl-bypass", TDF_RTL, 0, 7, 'G'},
|
||||
{ ".cfg", "rtl-cfg", TDF_RTL, 0, 8, 'f'},
|
||||
{ ".bp", "rtl-bp", TDF_RTL, 0, 9, 'b'},
|
||||
{ ".vpt", "rtl-vpt", TDF_RTL, 0, 10, 'V'},
|
||||
{ ".ce1", "rtl-ce1", TDF_RTL, 0, 11, 'C'},
|
||||
{ ".tracer", "rtl-tracer", TDF_RTL, 0, 12, 'T'},
|
||||
{ ".loop2", "rtl-loop2", TDF_RTL, 0, 13, 'L'},
|
||||
{ ".web", "rtl-web", TDF_RTL, 0, 14, 'Z'},
|
||||
{ ".cse2", "rtl-cse2", TDF_RTL, 0, 15, 't'},
|
||||
{ ".life", "rtl-life", TDF_RTL, 0, 16, 'f'},
|
||||
{ ".combine", "rtl-combine", TDF_RTL, 0, 17, 'c'},
|
||||
{ ".ce2", "rtl-ce2", TDF_RTL, 0, 18, 'C'},
|
||||
{ ".regmove", "rtl-regmove", TDF_RTL, 0, 19, 'N'},
|
||||
{ ".sms", "rtl-sms", TDF_RTL, 0, 20, 'm'},
|
||||
{ ".sched", "rtl-sched", TDF_RTL, 0, 21, 'S'},
|
||||
{ ".lreg", "rtl-lreg", TDF_RTL, 0, 22, 'l'},
|
||||
{ ".greg", "rtl-greg", TDF_RTL, 0, 23, 'g'},
|
||||
{ ".postreload", "rtl-postreload", TDF_RTL, 0, 24, 'o'},
|
||||
{ ".gcse2", "rtl-gcse2", TDF_RTL, 0, 25, 'J'},
|
||||
{ ".flow2", "rtl-flow2", TDF_RTL, 0, 26, 'w'},
|
||||
{ ".peephole2", "rtl-peephole2", TDF_RTL, 0, 27, 'z'},
|
||||
{ ".ce3", "rtl-ce3", TDF_RTL, 0, 28, 'E'},
|
||||
{ ".rnreg", "rtl-rnreg", TDF_RTL, 0, 29, 'n'},
|
||||
{ ".bbro", "rtl-bbro", TDF_RTL, 0, 30, 'B'},
|
||||
{ ".btl", "rtl-btl", TDF_RTL, 0, 31, 'd'},
|
||||
{ ".sched2", "rtl-sched2", TDF_RTL, 0, 32, 'R'},
|
||||
{ ".stack", "rtl-stack", TDF_RTL, 0, 33, 'k'},
|
||||
{ ".vartrack", "rtl-vartrack", TDF_RTL, 0, 34, 'V'},
|
||||
{ ".mach", "rtl-mach", TDF_RTL, 0, 35, 'M'},
|
||||
{ ".dbr", "rtl-dbr", TDF_RTL, 0, 36, 'd'}
|
||||
};
|
||||
|
||||
/* Dynamically registered tree dump files and switches. */
|
||||
|
@ -714,7 +746,8 @@ static const struct dump_option_value_info dump_options[] =
|
|||
};
|
||||
|
||||
unsigned int
|
||||
dump_register (const char *suffix, const char *swtch)
|
||||
dump_register (const char *suffix, const char *swtch, int flags,
|
||||
unsigned int num, int letter)
|
||||
{
|
||||
size_t this = extra_dump_files_in_use++;
|
||||
|
||||
|
@ -732,35 +765,35 @@ dump_register (const char *suffix, const char *swtch)
|
|||
memset (&extra_dump_files[this], 0, sizeof (struct dump_file_info));
|
||||
extra_dump_files[this].suffix = suffix;
|
||||
extra_dump_files[this].swtch = swtch;
|
||||
extra_dump_files[this].flags = flags;
|
||||
extra_dump_files[this].num = num;
|
||||
extra_dump_files[this].letter = letter;
|
||||
|
||||
return this + TDI_end;
|
||||
}
|
||||
|
||||
|
||||
/* Return the dump_file_info for the given phase. */
|
||||
|
||||
static struct dump_file_info *
|
||||
struct dump_file_info *
|
||||
get_dump_file_info (enum tree_dump_index phase)
|
||||
{
|
||||
if (phase < TDI_end)
|
||||
return &dump_files[phase];
|
||||
else if (phase - TDI_end >= extra_dump_files_in_use)
|
||||
abort ();
|
||||
return NULL;
|
||||
else
|
||||
return extra_dump_files + (phase - TDI_end);
|
||||
}
|
||||
|
||||
|
||||
/* Begin a tree dump for PHASE. Stores any user supplied flag in
|
||||
*FLAG_PTR and returns a stream to write to. If the dump is not
|
||||
enabled, returns NULL.
|
||||
Multiple calls will reopen and append to the dump file. */
|
||||
/* Return the name of the dump file for the given phase.
|
||||
If the dump is not enabled, returns NULL. */
|
||||
|
||||
FILE *
|
||||
dump_begin (enum tree_dump_index phase, int *flag_ptr)
|
||||
char *
|
||||
get_dump_file_name (enum tree_dump_index phase)
|
||||
{
|
||||
FILE *stream;
|
||||
char *name;
|
||||
char dump_id[10];
|
||||
char dump_id[7];
|
||||
struct dump_file_info *dfi;
|
||||
|
||||
if (phase == TDI_none)
|
||||
|
@ -770,10 +803,31 @@ dump_begin (enum tree_dump_index phase, int *flag_ptr)
|
|||
if (dfi->state == 0)
|
||||
return NULL;
|
||||
|
||||
if (snprintf (dump_id, sizeof (dump_id), ".t%02d", phase) < 0)
|
||||
if (dfi->num < 0
|
||||
|| snprintf (dump_id, sizeof (dump_id), ".%s%02d",
|
||||
(dfi->flags & TDF_TREE) ? "t" : "", dfi->num) < 0)
|
||||
dump_id[0] = '\0';
|
||||
|
||||
name = concat (dump_base_name, dump_id, dfi->suffix, NULL);
|
||||
return concat (dump_base_name, dump_id, dfi->suffix, NULL);
|
||||
}
|
||||
|
||||
/* Begin a tree dump for PHASE. Stores any user supplied flag in
|
||||
*FLAG_PTR and returns a stream to write to. If the dump is not
|
||||
enabled, returns NULL.
|
||||
Multiple calls will reopen and append to the dump file. */
|
||||
|
||||
FILE *
|
||||
dump_begin (enum tree_dump_index phase, int *flag_ptr)
|
||||
{
|
||||
char *name;
|
||||
struct dump_file_info *dfi;
|
||||
FILE *stream;
|
||||
|
||||
if (phase == TDI_none || !dump_enabled_p (phase))
|
||||
return NULL;
|
||||
|
||||
name = get_dump_file_name (phase);
|
||||
dfi = get_dump_file_info (phase);
|
||||
stream = fopen (name, dfi->state < 0 ? "w" : "a");
|
||||
if (!stream)
|
||||
error ("could not open dump file `%s': %s", name, strerror (errno));
|
||||
|
@ -796,6 +850,15 @@ dump_enabled_p (enum tree_dump_index phase)
|
|||
return dfi->state;
|
||||
}
|
||||
|
||||
/* Returns nonzero if tree dump PHASE has been initialized. */
|
||||
|
||||
int
|
||||
dump_initialized_p (enum tree_dump_index phase)
|
||||
{
|
||||
struct dump_file_info *dfi = get_dump_file_info (phase);
|
||||
return dfi->state > 0;
|
||||
}
|
||||
|
||||
/* Returns the switch name of PHASE. */
|
||||
|
||||
const char *
|
||||
|
@ -814,28 +877,33 @@ dump_end (enum tree_dump_index phase ATTRIBUTE_UNUSED, FILE *stream)
|
|||
fclose (stream);
|
||||
}
|
||||
|
||||
/* Enable all tree dumps. */
|
||||
/* Enable all tree dumps. Return number of enabled tree dumps. */
|
||||
|
||||
static void
|
||||
dump_enable_all (int flags)
|
||||
static int
|
||||
dump_enable_all (int flags, int letter)
|
||||
{
|
||||
int n = 0;
|
||||
size_t i;
|
||||
|
||||
for (i = TDI_none + 1; i < (size_t) TDI_end; i++)
|
||||
{
|
||||
dump_files[i].state = -1;
|
||||
dump_files[i].flags = flags;
|
||||
}
|
||||
if ((dump_files[i].flags & flags)
|
||||
&& (letter == 0 || letter == dump_files[i].letter))
|
||||
{
|
||||
dump_files[i].state = -1;
|
||||
dump_files[i].flags = flags;
|
||||
n++;
|
||||
}
|
||||
|
||||
for (i = 0; i < extra_dump_files_in_use; i++)
|
||||
{
|
||||
extra_dump_files[i].state = -1;
|
||||
extra_dump_files[i].flags = flags;
|
||||
}
|
||||
if ((extra_dump_files[i].flags & flags)
|
||||
&& (letter == 0 || letter == extra_dump_files[i].letter))
|
||||
{
|
||||
extra_dump_files[i].state = -1;
|
||||
extra_dump_files[i].flags = flags;
|
||||
n++;
|
||||
}
|
||||
|
||||
/* FIXME -fdump-call-graph is broken. */
|
||||
dump_files[TDI_xml].state = 0;
|
||||
dump_files[TDI_xml].flags = 0;
|
||||
return n;
|
||||
}
|
||||
|
||||
/* Parse ARG as a dump switch. Return nonzero if it is, and store the
|
||||
|
@ -882,11 +950,12 @@ dump_switch_p_1 (const char *arg, struct dump_file_info *dfi)
|
|||
}
|
||||
|
||||
dfi->state = -1;
|
||||
dfi->flags = flags;
|
||||
dfi->flags |= flags;
|
||||
|
||||
/* Process -fdump-tree-all by enabling all the known dumps. */
|
||||
/* Process -fdump-tree-all and -fdump-rtl-all, by enabling all the
|
||||
known dumps. */
|
||||
if (dfi->suffix == NULL)
|
||||
dump_enable_all (flags);
|
||||
dump_enable_all (dfi->flags, 0);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -921,3 +990,14 @@ dump_function (enum tree_dump_index phase, tree fn)
|
|||
dump_end (phase, stream);
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
enable_rtl_dump_file (int letter)
|
||||
{
|
||||
if (letter == 'a')
|
||||
letter = 0;
|
||||
|
||||
return dump_enable_all (TDF_RTL, letter) > 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -88,6 +88,6 @@ extern void queue_and_dump_type (dump_info_p, tree);
|
|||
extern void dump_function (enum tree_dump_index, tree);
|
||||
extern void dump_function_to_file (tree, FILE *, int);
|
||||
|
||||
extern unsigned int dump_register (const char *, const char *);
|
||||
extern unsigned int dump_register (const char *, const char *, int, unsigned int, int);
|
||||
|
||||
#endif /* ! GCC_TREE_DUMP_H */
|
||||
|
|
|
@ -1660,7 +1660,8 @@ struct tree_opt_pass pass_lower_eh =
|
|||
PROP_gimple_leh, /* properties_provided */
|
||||
PROP_gimple_lcf, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func /* todo_flags_finish */
|
||||
TODO_dump_func, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -1097,5 +1097,6 @@ struct tree_opt_pass pass_if_conversion =
|
|||
TODO_dump_func
|
||||
| TODO_verify_ssa
|
||||
| TODO_verify_stmts
|
||||
| TODO_verify_flow /* todo_flags_finish */
|
||||
| TODO_verify_flow, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
|
|
@ -1723,5 +1723,6 @@ struct tree_opt_pass pass_build_ssa =
|
|||
PROP_ssa, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func | TODO_verify_ssa /* todo_flags_finish */
|
||||
TODO_dump_func | TODO_verify_ssa, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
|
|
@ -1253,7 +1253,8 @@ struct tree_opt_pass pass_mudflap_1 =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func /* todo_flags_finish */
|
||||
TODO_dump_func, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
struct tree_opt_pass pass_mudflap_2 =
|
||||
|
@ -1270,7 +1271,8 @@ struct tree_opt_pass pass_mudflap_2 =
|
|||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_verify_flow | TODO_verify_stmts
|
||||
| TODO_dump_func /* todo_flags_finish */
|
||||
| TODO_dump_func, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
#include "gt-tree-mudflap.h"
|
||||
|
|
|
@ -98,7 +98,8 @@ struct tree_opt_pass pass_mudflap_1 =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
0 /* todo_flags_finish */
|
||||
0, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
struct tree_opt_pass pass_mudflap_2 =
|
||||
|
@ -114,7 +115,8 @@ struct tree_opt_pass pass_mudflap_2 =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
0 /* todo_flags_finish */
|
||||
0, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
/* Instead of:
|
||||
|
|
|
@ -214,5 +214,6 @@ struct tree_opt_pass pass_nrv =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func | TODO_ggc_collect /* todo_flags_finish */
|
||||
TODO_dump_func | TODO_ggc_collect, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
|
|
@ -47,6 +47,7 @@ Boston, MA 02111-1307, USA. */
|
|||
#include "tree-alias-common.h"
|
||||
#include "ggc.h"
|
||||
#include "cgraph.h"
|
||||
#include "graph.h"
|
||||
|
||||
|
||||
/* Global variables used to communicate with passes. */
|
||||
|
@ -72,7 +73,8 @@ static struct tree_opt_pass pass_gimple =
|
|||
PROP_gimple_any, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func /* todo_flags_finish */
|
||||
TODO_dump_func, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
/* Gate: execute, or not, all of the non-trivial optimizations. */
|
||||
|
@ -98,7 +100,8 @@ static struct tree_opt_pass pass_all_optimizations =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
0 /* todo_flags_finish */
|
||||
0, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
/* Pass: cleanup the CFG just before expanding trees to RTL.
|
||||
|
@ -127,7 +130,8 @@ static struct tree_opt_pass pass_cleanup_cfg_post_optimizing =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
0 /* todo_flags_finish */
|
||||
0, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
/* Pass: do the actions required to finish with tree-ssa optimization
|
||||
|
@ -170,7 +174,8 @@ static struct tree_opt_pass pass_free_datastructures =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
0 /* todo_flags_finish */
|
||||
0, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
|
||||
|
@ -197,7 +202,8 @@ static struct tree_opt_pass pass_init_datastructures =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
0 /* todo_flags_finish */
|
||||
0, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
/* Iterate over the pass tree allocating dump file numbers. We want
|
||||
|
@ -205,14 +211,11 @@ static struct tree_opt_pass pass_init_datastructures =
|
|||
enabled or not. */
|
||||
|
||||
static void
|
||||
register_one_dump_file (struct tree_opt_pass *pass)
|
||||
register_one_dump_file (struct tree_opt_pass *pass, int n)
|
||||
{
|
||||
char *dot_name, *flag_name;
|
||||
char num[10];
|
||||
|
||||
if (!pass->name)
|
||||
return;
|
||||
|
||||
/* See below in next_pass_1. */
|
||||
num[0] = '\0';
|
||||
if (pass->static_pass_number != -1)
|
||||
|
@ -220,31 +223,55 @@ register_one_dump_file (struct tree_opt_pass *pass)
|
|||
? 1 : pass->static_pass_number));
|
||||
|
||||
dot_name = concat (".", pass->name, num, NULL);
|
||||
flag_name = concat ("tree-", pass->name, num, NULL);
|
||||
|
||||
pass->static_pass_number = dump_register (dot_name, flag_name);
|
||||
if (pass->properties_provided & PROP_trees)
|
||||
{
|
||||
flag_name = concat ("tree-", pass->name, num, NULL);
|
||||
pass->static_pass_number = dump_register (dot_name, flag_name,
|
||||
TDF_TREE, n + TDI_tree_all, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
flag_name = concat ("rtl-", pass->name, num, NULL);
|
||||
pass->static_pass_number = dump_register (dot_name, flag_name,
|
||||
TDF_RTL, n, pass->letter);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
register_dump_files (struct tree_opt_pass *pass, int properties)
|
||||
{
|
||||
static int n = 0;
|
||||
do
|
||||
{
|
||||
/* Verify that all required properties are present. */
|
||||
if (pass->properties_required & ~properties)
|
||||
abort ();
|
||||
|
||||
if (pass->properties_destroyed & pass->properties_provided)
|
||||
abort ();
|
||||
int new_properties;
|
||||
int pass_number;
|
||||
|
||||
pass->properties_required = properties;
|
||||
pass->properties_provided = properties =
|
||||
new_properties =
|
||||
(properties | pass->properties_provided) & ~pass->properties_destroyed;
|
||||
|
||||
if (properties & PROP_trees)
|
||||
register_one_dump_file (pass);
|
||||
/* Reset the counter when we reach RTL-based passes. */
|
||||
if ((pass->properties_provided ^ pass->properties_required) & PROP_rtl)
|
||||
n = 0;
|
||||
|
||||
pass_number = n;
|
||||
if (pass->name)
|
||||
n++;
|
||||
|
||||
if (pass->sub)
|
||||
properties = register_dump_files (pass->sub, properties);
|
||||
new_properties = register_dump_files (pass->sub, new_properties);
|
||||
|
||||
/* If we have a gate, combine the properties that we could have with
|
||||
and without the pass being examined. */
|
||||
if (pass->gate)
|
||||
properties &= new_properties;
|
||||
else
|
||||
properties = new_properties;
|
||||
|
||||
pass->properties_provided = properties;
|
||||
if (pass->name)
|
||||
register_one_dump_file (pass, pass_number);
|
||||
|
||||
pass = pass->next;
|
||||
}
|
||||
while (pass);
|
||||
|
@ -386,7 +413,7 @@ static void execute_pass_list (struct tree_opt_pass *);
|
|||
static unsigned int last_verified;
|
||||
|
||||
static void
|
||||
execute_todo (unsigned int flags)
|
||||
execute_todo (int properties, unsigned int flags)
|
||||
{
|
||||
if (flags & TODO_rename_vars)
|
||||
{
|
||||
|
@ -396,8 +423,13 @@ execute_todo (unsigned int flags)
|
|||
|
||||
if ((flags & TODO_dump_func) && dump_file)
|
||||
{
|
||||
dump_function_to_file (current_function_decl,
|
||||
dump_file, dump_flags);
|
||||
if (properties & PROP_trees)
|
||||
dump_function_to_file (current_function_decl,
|
||||
dump_file, dump_flags);
|
||||
else if (properties & PROP_cfg)
|
||||
print_rtl_with_bb (dump_file, get_insns ());
|
||||
else
|
||||
print_rtl (dump_file, get_insns ());
|
||||
|
||||
/* Flush the file. If verification fails, we won't be able to
|
||||
close the file before aborting. */
|
||||
|
@ -433,11 +465,13 @@ execute_one_pass (struct tree_opt_pass *pass)
|
|||
/* Run pre-pass verification. */
|
||||
todo = pass->todo_flags_start & ~last_verified;
|
||||
if (todo)
|
||||
execute_todo (todo);
|
||||
execute_todo (pass->properties_required, todo);
|
||||
|
||||
/* If a dump file name is present, open it if enabled. */
|
||||
if (pass->static_pass_number != -1)
|
||||
{
|
||||
bool initializing_dump = !dump_initialized_p (pass->static_pass_number);
|
||||
dump_file_name = get_dump_file_name (pass->static_pass_number);
|
||||
dump_file = dump_begin (pass->static_pass_number, &dump_flags);
|
||||
if (dump_file)
|
||||
{
|
||||
|
@ -445,8 +479,19 @@ execute_one_pass (struct tree_opt_pass *pass)
|
|||
dname = lang_hooks.decl_printable_name (current_function_decl, 2);
|
||||
aname = (IDENTIFIER_POINTER
|
||||
(DECL_ASSEMBLER_NAME (current_function_decl)));
|
||||
fprintf (dump_file, "\n;; Function %s (%s)\n\n", dname, aname);
|
||||
fprintf (dump_file, "\n;; Function %s (%s)%s\n\n", dname, aname,
|
||||
cfun->function_frequency == FUNCTION_FREQUENCY_HOT
|
||||
? " (hot)"
|
||||
: cfun->function_frequency == FUNCTION_FREQUENCY_UNLIKELY_EXECUTED
|
||||
? " (unlikely executed)"
|
||||
: "");
|
||||
}
|
||||
|
||||
if (initializing_dump
|
||||
&& graph_dump_format != no_graph
|
||||
&& (pass->properties_provided & (PROP_cfg | PROP_rtl))
|
||||
== (PROP_cfg | PROP_rtl))
|
||||
clean_graph_dump_file (dump_file_name);
|
||||
}
|
||||
|
||||
/* If a timevar is present, start it. */
|
||||
|
@ -457,15 +502,25 @@ execute_one_pass (struct tree_opt_pass *pass)
|
|||
if (pass->execute)
|
||||
pass->execute ();
|
||||
|
||||
if (dump_file
|
||||
&& (pass->properties_provided & (PROP_cfg | PROP_rtl))
|
||||
== (PROP_cfg | PROP_rtl))
|
||||
print_rtl_graph_with_bb (dump_file_name, get_insns ());
|
||||
|
||||
/* Run post-pass cleanup and verification. */
|
||||
todo = pass->todo_flags_finish;
|
||||
last_verified = todo & TODO_verify_all;
|
||||
if (todo)
|
||||
execute_todo (todo);
|
||||
execute_todo (pass->properties_provided, todo);
|
||||
|
||||
/* Close down timevar and dump file. */
|
||||
if (pass->tv_id)
|
||||
timevar_pop (pass->tv_id);
|
||||
if (dump_file_name)
|
||||
{
|
||||
free ((char *) dump_file_name);
|
||||
dump_file_name = NULL;
|
||||
}
|
||||
if (dump_file)
|
||||
{
|
||||
dump_end (pass->static_pass_number, dump_file);
|
||||
|
|
|
@ -2102,5 +2102,6 @@ struct tree_opt_pass pass_del_ssa =
|
|||
PROP_ssa, /* properties_destroyed */
|
||||
TODO_verify_ssa | TODO_verify_flow
|
||||
| TODO_verify_stmts, /* todo_flags_start */
|
||||
TODO_dump_func | TODO_ggc_collect /* todo_flags_finish */
|
||||
TODO_dump_func | TODO_ggc_collect, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
|
|
@ -26,9 +26,13 @@ Boston, MA 02111-1307, USA. */
|
|||
/* Global variables used to communicate with passes. */
|
||||
extern FILE *dump_file;
|
||||
extern int dump_flags;
|
||||
extern const char *dump_file_name;
|
||||
|
||||
extern struct bitmap_head_def *vars_to_rename;
|
||||
|
||||
/* Return the dump_file_info for the given phase. */
|
||||
extern struct dump_file_info *get_dump_file_info (enum tree_dump_index);
|
||||
|
||||
/* Describe one pass. */
|
||||
struct tree_opt_pass
|
||||
{
|
||||
|
@ -64,6 +68,20 @@ struct tree_opt_pass
|
|||
/* Flags indicating common sets things to do before and after. */
|
||||
unsigned int todo_flags_start;
|
||||
unsigned int todo_flags_finish;
|
||||
|
||||
/* Letter for RTL dumps. */
|
||||
char letter;
|
||||
};
|
||||
|
||||
/* Define a tree dump switch. */
|
||||
struct dump_file_info
|
||||
{
|
||||
const char *suffix; /* suffix to give output file. */
|
||||
const char *swtch; /* command line switch */
|
||||
int flags; /* user flags */
|
||||
int state; /* state of play */
|
||||
int num; /* dump file number */
|
||||
int letter; /* enabling letter for RTL dumps */
|
||||
};
|
||||
|
||||
/* Pass properties. */
|
||||
|
|
|
@ -175,7 +175,8 @@ struct tree_opt_pass pass_tree_profile =
|
|||
PROP_gimple_leh | PROP_cfg, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_verify_stmts /* todo_flags_finish */
|
||||
TODO_verify_stmts, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
struct profile_hooks tree_profile_hooks =
|
||||
|
|
|
@ -2107,5 +2107,6 @@ struct tree_opt_pass pass_sra =
|
|||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func | TODO_rename_vars
|
||||
| TODO_ggc_collect | TODO_verify_ssa /* todo_flags_finish */
|
||||
| TODO_ggc_collect | TODO_verify_ssa, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
|
|
@ -359,7 +359,8 @@ struct tree_opt_pass pass_may_alias =
|
|||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func | TODO_rename_vars
|
||||
| TODO_ggc_collect | TODO_verify_ssa /* todo_flags_finish */
|
||||
| TODO_ggc_collect | TODO_verify_ssa, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -181,7 +181,6 @@ get_default_value (tree var)
|
|||
return val;
|
||||
}
|
||||
|
||||
|
||||
/* Get the constant value associated with variable VAR. */
|
||||
|
||||
static value *
|
||||
|
@ -1220,7 +1219,8 @@ struct tree_opt_pass pass_ccp =
|
|||
0, /* todo_flags_start */
|
||||
TODO_dump_func | TODO_rename_vars
|
||||
| TODO_ggc_collect | TODO_verify_ssa
|
||||
| TODO_verify_stmts /* todo_flags_finish */
|
||||
| TODO_verify_stmts, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
|
||||
|
@ -2164,5 +2164,6 @@ struct tree_opt_pass pass_fold_builtins =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func | TODO_verify_ssa /* todo_flags_finish */
|
||||
TODO_dump_func | TODO_verify_ssa, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
|
|
@ -391,6 +391,7 @@ struct tree_opt_pass pass_rename_ssa_copies =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func | TODO_verify_ssa /* todo_flags_finish */
|
||||
TODO_dump_func | TODO_verify_ssa, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
|
|
|
@ -943,7 +943,8 @@ struct tree_opt_pass pass_dce =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_ggc_collect | TODO_verify_ssa /* todo_flags_finish */
|
||||
TODO_ggc_collect | TODO_verify_ssa, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
struct tree_opt_pass pass_cd_dce =
|
||||
|
@ -959,7 +960,8 @@ struct tree_opt_pass pass_cd_dce =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_ggc_collect | TODO_verify_ssa | TODO_verify_flow
|
||||
TODO_ggc_collect | TODO_verify_ssa | TODO_verify_flow,
|
||||
/* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
|
|
|
@ -432,7 +432,8 @@ struct tree_opt_pass pass_dominator =
|
|||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func | TODO_rename_vars
|
||||
| TODO_verify_ssa /* todo_flags_finish */
|
||||
| TODO_verify_ssa, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -443,5 +443,6 @@ struct tree_opt_pass pass_dse = {
|
|||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func | TODO_ggc_collect /* todo_flags_finish */
|
||||
| TODO_verify_ssa
|
||||
| TODO_verify_ssa,
|
||||
0 /* letter */
|
||||
};
|
||||
|
|
|
@ -523,5 +523,6 @@ struct tree_opt_pass pass_forwprop = {
|
|||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func | TODO_ggc_collect /* todo_flags_finish */
|
||||
| TODO_verify_ssa
|
||||
| TODO_verify_ssa,
|
||||
0 /* letter */
|
||||
};
|
||||
|
|
|
@ -284,5 +284,6 @@ struct tree_opt_pass pass_ch =
|
|||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
(TODO_dump_func
|
||||
| TODO_verify_ssa) /* todo_flags_finish */
|
||||
| TODO_verify_ssa), /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
|
|
@ -89,7 +89,8 @@ struct tree_opt_pass pass_loop =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
TODO_ggc_collect, /* todo_flags_start */
|
||||
TODO_dump_func | TODO_verify_ssa | TODO_ggc_collect /* todo_flags_finish */
|
||||
TODO_dump_func | TODO_verify_ssa | TODO_ggc_collect, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
/* Loop optimizer initialization. */
|
||||
|
@ -120,7 +121,8 @@ struct tree_opt_pass pass_loop_init =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func /* todo_flags_finish */
|
||||
TODO_dump_func, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
/* Loop invariant motion pass. */
|
||||
|
@ -153,7 +155,8 @@ struct tree_opt_pass pass_lim =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func /* todo_flags_finish */
|
||||
TODO_dump_func, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
/* Loop autovectorization. */
|
||||
|
@ -187,7 +190,8 @@ struct tree_opt_pass pass_vectorize =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func /* todo_flags_finish */
|
||||
TODO_dump_func, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
/* Canonical induction variable creation pass. */
|
||||
|
@ -220,7 +224,8 @@ struct tree_opt_pass pass_iv_canon =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func /* todo_flags_finish */
|
||||
TODO_dump_func, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
/* Complete unrolling of loops. */
|
||||
|
@ -253,7 +258,8 @@ struct tree_opt_pass pass_complete_unroll =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func /* todo_flags_finish */
|
||||
TODO_dump_func, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
/* Induction variable optimizations. */
|
||||
|
@ -286,7 +292,8 @@ struct tree_opt_pass pass_iv_optimize =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func /* todo_flags_finish */
|
||||
TODO_dump_func, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
/* Loop optimizer finalization. */
|
||||
|
@ -322,6 +329,7 @@ struct tree_opt_pass pass_loop_done =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func /* todo_flags_finish */
|
||||
TODO_dump_func, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
|
|
|
@ -674,7 +674,8 @@ struct tree_opt_pass pass_phiopt =
|
|||
0, /* todo_flags_start */
|
||||
TODO_dump_func | TODO_ggc_collect /* todo_flags_finish */
|
||||
| TODO_verify_ssa | TODO_rename_vars
|
||||
| TODO_verify_flow
|
||||
| TODO_verify_flow,
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -2087,7 +2087,8 @@ struct tree_opt_pass pass_pre =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func | TODO_ggc_collect | TODO_verify_ssa /* todo_flags_finish */
|
||||
TODO_dump_func | TODO_ggc_collect | TODO_verify_ssa, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
|
||||
|
@ -2118,5 +2119,6 @@ struct tree_opt_pass pass_fre =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func | TODO_ggc_collect | TODO_verify_ssa /* todo_flags_finish */
|
||||
TODO_dump_func | TODO_ggc_collect | TODO_verify_ssa, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
|
|
@ -1164,7 +1164,8 @@ struct tree_opt_pass pass_redundant_phi =
|
|||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func | TODO_rename_vars
|
||||
| TODO_ggc_collect | TODO_verify_ssa /* todo_flags_finish */
|
||||
| TODO_ggc_collect | TODO_verify_ssa, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
/* Emit warnings for uninitialized variables. This is done in two passes.
|
||||
|
@ -1304,7 +1305,8 @@ struct tree_opt_pass pass_early_warn_uninitialized =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
0 /* todo_flags_finish */
|
||||
0, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
struct tree_opt_pass pass_late_warn_uninitialized =
|
||||
|
@ -1320,5 +1322,6 @@ struct tree_opt_pass pass_late_warn_uninitialized =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
0 /* todo_flags_finish */
|
||||
0, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
|
|
@ -952,7 +952,8 @@ struct tree_opt_pass pass_tail_recursion =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func | TODO_verify_ssa /* todo_flags_finish */
|
||||
TODO_dump_func | TODO_verify_ssa, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
||||
struct tree_opt_pass pass_tail_calls =
|
||||
|
@ -968,5 +969,6 @@ struct tree_opt_pass pass_tail_calls =
|
|||
0, /* properties_provided */
|
||||
0, /* properties_destroyed */
|
||||
0, /* todo_flags_start */
|
||||
TODO_dump_func | TODO_verify_ssa /* todo_flags_finish */
|
||||
TODO_dump_func | TODO_verify_ssa, /* todo_flags_finish */
|
||||
0 /* letter */
|
||||
};
|
||||
|
|
50
gcc/tree.h
50
gcc/tree.h
|
@ -3714,12 +3714,52 @@ enum tree_dump_index
|
|||
TDI_vcg, /* create a VCG graph file for each
|
||||
function's flowgraph. */
|
||||
TDI_xml, /* dump function call graph. */
|
||||
TDI_all, /* enable all the dumps. */
|
||||
TDI_tree_all, /* enable all the GENERIC/GIMPLE dumps. */
|
||||
TDI_rtl_all, /* enable all the RTL dumps. */
|
||||
|
||||
DFI_MIN, /* For now, RTL dumps are placed here. */
|
||||
DFI_sibling = DFI_MIN,
|
||||
DFI_eh,
|
||||
DFI_jump,
|
||||
DFI_cse,
|
||||
DFI_gcse,
|
||||
DFI_loop,
|
||||
DFI_bypass,
|
||||
DFI_cfg,
|
||||
DFI_bp,
|
||||
DFI_vpt,
|
||||
DFI_ce1,
|
||||
DFI_tracer,
|
||||
DFI_loop2,
|
||||
DFI_web,
|
||||
DFI_cse2,
|
||||
DFI_life,
|
||||
DFI_combine,
|
||||
DFI_ce2,
|
||||
DFI_regmove,
|
||||
DFI_sms,
|
||||
DFI_sched,
|
||||
DFI_lreg,
|
||||
DFI_greg,
|
||||
DFI_postreload,
|
||||
DFI_gcse2,
|
||||
DFI_flow2,
|
||||
DFI_peephole2,
|
||||
DFI_ce3,
|
||||
DFI_rnreg,
|
||||
DFI_bbro,
|
||||
DFI_branch_target_load,
|
||||
DFI_sched2,
|
||||
DFI_stack,
|
||||
DFI_vartrack,
|
||||
DFI_mach,
|
||||
DFI_dbr,
|
||||
|
||||
TDI_end
|
||||
};
|
||||
|
||||
/* Bit masks to control tree dumping. Not all values are applicable to
|
||||
all tree dumps. Add new ones at the end. When you define new
|
||||
/* Bit masks to control dumping. Not all values are applicable to
|
||||
all dumps. Add new ones at the end. When you define new
|
||||
values, extend the DUMP_OPTIONS array in tree-dump.c */
|
||||
#define TDF_ADDRESS (1 << 0) /* dump node addresses */
|
||||
#define TDF_SLIM (1 << 1) /* don't go wild following links */
|
||||
|
@ -3733,11 +3773,15 @@ enum tree_dump_index
|
|||
#define TDF_LINENO (1 << 7) /* display statement line numbers */
|
||||
#define TDF_UID (1 << 8) /* display decl UIDs */
|
||||
|
||||
#define TDF_TREE (1 << 9) /* is a tree dump */
|
||||
#define TDF_RTL (1 << 10) /* is a RTL dump */
|
||||
|
||||
typedef struct dump_info *dump_info_p;
|
||||
|
||||
extern char *get_dump_file_name (enum tree_dump_index);
|
||||
extern int dump_flag (dump_info_p, int, tree);
|
||||
extern int dump_enabled_p (enum tree_dump_index);
|
||||
extern int dump_initialized_p (enum tree_dump_index);
|
||||
extern FILE *dump_begin (enum tree_dump_index, int *);
|
||||
extern void dump_end (enum tree_dump_index, FILE *);
|
||||
extern void dump_node (tree, int, FILE *);
|
||||
|
|
Loading…
Add table
Reference in a new issue