From 9f8628bacdb26f5c6f63aa305f29212b0d766199 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Mon, 6 Sep 2004 10:08:17 +0000 Subject: Unify the management of RTL and tree-level dump files. 2004-09-06 Paolo Bonzini 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 --- gcc/passes.c | 282 +++++++++-------------------------------------------------- 1 file changed, 43 insertions(+), 239 deletions(-) (limited to 'gcc/passes.c') diff --git a/gcc/passes.c b/gcc/passes.c index d55e9b9..0beac32 100644 --- a/gcc/passes.c +++ b/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 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_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"; + if (dump_file != NULL || dump_file_name != NULL) + abort (); - dump_name = concat (dump_base_name, seq, - dump_file_tbl[index].extension, NULL); + dump_file_name = get_dump_file_name (index); + initializing_dump = !dump_initialized_p (index); + dump_file = dump_begin (index, 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 @@ -2002,16 +1845,12 @@ rest_of_compilation (void) } 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 */ }; -- cgit v1.1