diff options
| author | bonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-09-06 10:08:17 +0000 | 
|---|---|---|
| committer | bonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-09-06 10:08:17 +0000 | 
| commit | 0f9005ddc07f0919938a893f0fb526b68783c72c (patch) | |
| tree | 97abeef925c810d92e8f8fe91a694ecb3c7ca58b /gcc/tree-dump.c | |
| parent | ccf99faab79a66c17a2f673be854c95761a79a53 (diff) | |
| download | ppe42-gcc-0f9005ddc07f0919938a893f0fb526b68783c72c.tar.gz ppe42-gcc-0f9005ddc07f0919938a893f0fb526b68783c72c.zip | |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@87113 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-dump.c')
| -rw-r--r-- | gcc/tree-dump.c | 180 | 
1 files changed, 130 insertions, 50 deletions
| diff --git a/gcc/tree-dump.c b/gcc/tree-dump.c index c42e33f32f7..dfe2ebbae6e 100644 --- a/gcc/tree-dump.c +++ b/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,24 +765,52 @@ 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);  } +/* Return the name of the dump file for the given phase. +   If the dump is not enabled, returns NULL.  */ + +char * +get_dump_file_name (enum tree_dump_index phase) +{ +  char dump_id[7]; +  struct dump_file_info *dfi; + +  if (phase == TDI_none) +    return NULL; + +  dfi = get_dump_file_info (phase); +  if (dfi->state == 0) +    return NULL; + +  if (dfi->num < 0 +      || snprintf (dump_id, sizeof (dump_id), ".%s%02d", +		   (dfi->flags & TDF_TREE) ? "t" : "", dfi->num) < 0) +    dump_id[0] = '\0'; + +  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. @@ -758,22 +819,15 @@ get_dump_file_info (enum tree_dump_index phase)  FILE *  dump_begin (enum tree_dump_index phase, int *flag_ptr)  { -  FILE *stream;    char *name; -  char dump_id[10];    struct dump_file_info *dfi; +  FILE *stream; -  if (phase == TDI_none) +  if (phase == TDI_none || !dump_enabled_p (phase))      return NULL; +  name = get_dump_file_name (phase);    dfi = get_dump_file_info (phase); -  if (dfi->state == 0) -    return NULL; - -  if (snprintf (dump_id, sizeof (dump_id), ".t%02d", phase) < 0) -    dump_id[0] = '\0'; - -  name = concat (dump_base_name, dump_id, dfi->suffix, NULL);    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; +} + + | 

