X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Ftree-dump.c;h=3e89cdf11f363397e61e7457bd69d9b027723836;hb=f53dc1beca14933ff21b68564c9ff4f93eb882ac;hp=a377deb959f778e5746292230faed042c055dc75;hpb=de9ebaea83568ecb27f946aaaf84df8366b3088a;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/tree-dump.c b/gcc/tree-dump.c index a377deb959f..3e89cdf11f3 100644 --- a/gcc/tree-dump.c +++ b/gcc/tree-dump.c @@ -1,6 +1,6 @@ /* Tree-dumping functionality for intermediate representation. - Copyright (C) 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008 - Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, + 2010, 2011 Free Software Foundation, Inc. Written by Mark Mitchell This file is part of GCC. @@ -25,21 +25,24 @@ along with GCC; see the file COPYING3. If not see #include "tm.h" #include "tree.h" #include "splay-tree.h" -#include "diagnostic.h" +#include "filenames.h" +#include "diagnostic-core.h" #include "toplev.h" #include "tree-dump.h" #include "tree-pass.h" #include "langhooks.h" #include "tree-iterator.h" -#include "real.h" -#include "fixed-value.h" + +/* If non-NULL, return one past-the-end of the matching SUBPART of + the WHOLE string. */ +#define skip_leading_substring(whole, part) \ + (strncmp (whole, part, strlen (part)) ? NULL : whole + strlen (part)) static unsigned int queue (dump_info_p, const_tree, int); static void dump_index (dump_info_p, unsigned int); 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 int dump_enable_all (int, int); /* Add T to the end of the queue of nodes to dump. Returns the index assigned to T. */ @@ -357,12 +360,7 @@ dequeue_and_dump (dump_info_p di) xloc = expand_location (DECL_SOURCE_LOCATION (t)); if (xloc.file) { - const char *filename = strrchr (xloc.file, '/'); - if (!filename) - filename = xloc.file; - else - /* Skip the slash. */ - ++filename; + const char *filename = lbasename (xloc.file); dump_maybe_newline (di); fprintf (di->stream, "srcp: %s:%-6d ", filename, @@ -373,8 +371,8 @@ dequeue_and_dump (dump_info_p di) if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_DECL_COMMON) && DECL_ARTIFICIAL (t)) dump_string_field (di, "note", "artificial"); - if (TREE_CHAIN (t) && !dump_flag (di, TDF_SLIM, NULL)) - dump_child ("chan", TREE_CHAIN (t)); + if (DECL_CHAIN (t) && !dump_flag (di, TDF_SLIM, NULL)) + dump_child ("chain", DECL_CHAIN (t)); } else if (code_class == tcc_type) { @@ -511,11 +509,10 @@ dequeue_and_dump (dump_info_p di) case CONST_DECL: dump_child ("cnst", DECL_INITIAL (t)); break; - - case SYMBOL_MEMORY_TAG: - case NAME_MEMORY_TAG: - case STRUCT_FIELD_TAG: - break; + + case DEBUG_EXPR_DECL: + dump_int (di, "-uid", DEBUG_TEMP_UID (t)); + /* Fall through. */ case VAR_DECL: case PARM_DECL: @@ -576,8 +573,6 @@ dequeue_and_dump (dump_info_p di) case TRUTH_NOT_EXPR: case ADDR_EXPR: case INDIRECT_REF: - case ALIGN_INDIRECT_REF: - case MISALIGNED_INDIRECT_REF: case CLEANUP_POINT_EXPR: case SAVE_EXPR: case REALPART_EXPR: @@ -600,11 +595,6 @@ dequeue_and_dump (dump_info_p di) dump_child ("op 1", TREE_OPERAND (t, 1)); break; - case GIMPLE_MODIFY_STMT: - dump_child ("op 0", GIMPLE_STMT_OPERAND (t, 0)); - dump_child ("op 1", GIMPLE_STMT_OPERAND (t, 1)); - break; - case COMPONENT_REF: dump_child ("op 0", TREE_OPERAND (t, 0)); dump_child ("op 1", TREE_OPERAND (t, 1)); @@ -782,19 +772,20 @@ dump_node (const_tree t, int flags, FILE *stream) tree_dump_index enumeration in tree-pass.h. */ static struct dump_file_info dump_files[TDI_end] = { - {NULL, NULL, NULL, 0, 0, 0, 0}, - {".cgraph", "ipa-cgraph", NULL, TDF_IPA, 0, 0, 0}, - {".tu", "translation-unit", NULL, TDF_TREE, 0, 1, 0}, - {".class", "class-hierarchy", NULL, TDF_TREE, 0, 2, 0}, - {".original", "tree-original", NULL, TDF_TREE, 0, 3, 0}, - {".gimple", "tree-gimple", NULL, TDF_TREE, 0, 4, 0}, - {".nested", "tree-nested", NULL, TDF_TREE, 0, 5, 0}, - {".vcg", "tree-vcg", NULL, TDF_TREE, 0, 6, 0}, -#define FIRST_AUTO_NUMBERED_DUMP 7 - - {NULL, "tree-all", NULL, TDF_TREE, 0, 0, 0}, - {NULL, "rtl-all", NULL, TDF_RTL, 0, 0, 0}, - {NULL, "ipa-all", NULL, TDF_IPA, 0, 0, 0}, + {NULL, NULL, NULL, 0, 0, 0}, + {".cgraph", "ipa-cgraph", NULL, TDF_IPA, 0, 0}, + {".tu", "translation-unit", NULL, TDF_TREE, 0, 1}, + {".class", "class-hierarchy", NULL, TDF_TREE, 0, 2}, + {".original", "tree-original", NULL, TDF_TREE, 0, 3}, + {".gimple", "tree-gimple", NULL, TDF_TREE, 0, 4}, + {".nested", "tree-nested", NULL, TDF_TREE, 0, 5}, + {".vcg", "tree-vcg", NULL, TDF_TREE, 0, 6}, + {".ads", "ada-spec", NULL, 0, 0, 7}, +#define FIRST_AUTO_NUMBERED_DUMP 8 + + {NULL, "tree-all", NULL, TDF_TREE, 0, 0}, + {NULL, "rtl-all", NULL, TDF_RTL, 0, 0}, + {NULL, "ipa-all", NULL, TDF_IPA, 0, 0}, }; /* Dynamically registered tree dump files and switches. */ @@ -814,9 +805,12 @@ struct dump_option_value_info static const struct dump_option_value_info dump_options[] = { {"address", TDF_ADDRESS}, + {"asmname", TDF_ASMNAME}, {"slim", TDF_SLIM}, {"raw", TDF_RAW}, + {"graph", TDF_GRAPH}, {"details", TDF_DETAILS}, + {"cselib", TDF_CSELIB}, {"stats", TDF_STATS}, {"blocks", TDF_BLOCKS}, {"vops", TDF_VOPS}, @@ -824,51 +818,57 @@ static const struct dump_option_value_info dump_options[] = {"uid", TDF_UID}, {"stmtaddr", TDF_STMTADDR}, {"memsyms", TDF_MEMSYMS}, - {"all", ~(TDF_RAW | TDF_SLIM | TDF_LINENO | TDF_TREE | TDF_RTL | TDF_IPA - | TDF_STMTADDR | TDF_GRAPH | TDF_DIAGNOSTIC)}, + {"verbose", TDF_VERBOSE}, + {"eh", TDF_EH}, + {"alias", TDF_ALIAS}, + {"nouid", TDF_NOUID}, + {"enumerate_locals", TDF_ENUMERATE_LOCALS}, + {"scev", TDF_SCEV}, + {"all", ~(TDF_RAW | TDF_SLIM | TDF_LINENO | TDF_TREE | TDF_RTL | TDF_IPA + | TDF_STMTADDR | TDF_GRAPH | TDF_DIAGNOSTIC | TDF_VERBOSE + | TDF_RHS_ONLY | TDF_NOUID | TDF_ENUMERATE_LOCALS | TDF_SCEV)}, {NULL, 0} }; unsigned int dump_register (const char *suffix, const char *swtch, const char *glob, - int flags, int letter) + int flags) { static int next_dump = FIRST_AUTO_NUMBERED_DUMP; int num = next_dump++; - size_t this = extra_dump_files_in_use++; + size_t count = extra_dump_files_in_use++; - if (this >= extra_dump_files_alloced) + if (count >= extra_dump_files_alloced) { if (extra_dump_files_alloced == 0) extra_dump_files_alloced = 32; else extra_dump_files_alloced *= 2; - extra_dump_files = xrealloc (extra_dump_files, - sizeof (struct dump_file_info) - * extra_dump_files_alloced); + extra_dump_files = XRESIZEVEC (struct dump_file_info, + extra_dump_files, + extra_dump_files_alloced); } - 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].glob = glob; - extra_dump_files[this].flags = flags; - extra_dump_files[this].num = num; - extra_dump_files[this].letter = letter; + memset (&extra_dump_files[count], 0, sizeof (struct dump_file_info)); + extra_dump_files[count].suffix = suffix; + extra_dump_files[count].swtch = swtch; + extra_dump_files[count].glob = glob; + extra_dump_files[count].flags = flags; + extra_dump_files[count].num = num; - return this + TDI_end; + return count + TDI_end; } /* Return the dump_file_info for the given phase. */ struct dump_file_info * -get_dump_file_info (enum tree_dump_index phase) +get_dump_file_info (int phase) { if (phase < TDI_end) return &dump_files[phase]; - else if (phase - TDI_end >= extra_dump_files_in_use) + else if ((size_t) (phase - TDI_end) >= extra_dump_files_in_use) return NULL; else return extra_dump_files + (phase - TDI_end); @@ -879,7 +879,7 @@ get_dump_file_info (enum tree_dump_index phase) If the dump is not enabled, returns NULL. */ char * -get_dump_file_name (enum tree_dump_index phase) +get_dump_file_name (int phase) { char dump_id[10]; struct dump_file_info *dfi; @@ -916,7 +916,7 @@ get_dump_file_name (enum tree_dump_index phase) Multiple calls will reopen and append to the dump file. */ FILE * -dump_begin (enum tree_dump_index phase, int *flag_ptr) +dump_begin (int phase, int *flag_ptr) { char *name; struct dump_file_info *dfi; @@ -929,7 +929,7 @@ dump_begin (enum tree_dump_index phase, int *flag_ptr) dfi = get_dump_file_info (phase); stream = fopen (name, dfi->state < 0 ? "w" : "a"); if (!stream) - error ("could not open dump file %qs: %s", name, strerror (errno)); + error ("could not open dump file %qs: %m", name); else dfi->state = 1; free (name); @@ -944,7 +944,7 @@ dump_begin (enum tree_dump_index phase, int *flag_ptr) TDI_tree_all, return nonzero if any dump is enabled. */ int -dump_enabled_p (enum tree_dump_index phase) +dump_enabled_p (int phase) { if (phase == TDI_tree_all) { @@ -967,7 +967,7 @@ dump_enabled_p (enum tree_dump_index phase) /* Returns nonzero if tree dump PHASE has been initialized. */ int -dump_initialized_p (enum tree_dump_index phase) +dump_initialized_p (int phase) { struct dump_file_info *dfi = get_dump_file_info (phase); return dfi->state > 0; @@ -976,7 +976,7 @@ dump_initialized_p (enum tree_dump_index phase) /* Returns the switch name of PHASE. */ const char * -dump_flag_name (enum tree_dump_index phase) +dump_flag_name (int phase) { struct dump_file_info *dfi = get_dump_file_info (phase); return dfi->swtch; @@ -986,7 +986,7 @@ dump_flag_name (enum tree_dump_index phase) dump_begin. */ void -dump_end (enum tree_dump_index phase ATTRIBUTE_UNUSED, FILE *stream) +dump_end (int phase ATTRIBUTE_UNUSED, FILE *stream) { fclose (stream); } @@ -994,15 +994,14 @@ dump_end (enum tree_dump_index phase ATTRIBUTE_UNUSED, FILE *stream) /* Enable all tree dumps. Return number of enabled tree dumps. */ static int -dump_enable_all (int flags, int letter) +dump_enable_all (int flags) { int ir_dump_type = (flags & (TDF_TREE | TDF_RTL | TDF_IPA)); int n = 0; size_t i; for (i = TDI_none + 1; i < (size_t) TDI_end; i++) - if ((dump_files[i].flags & ir_dump_type) - && (letter == 0 || letter == dump_files[i].letter)) + if ((dump_files[i].flags & ir_dump_type)) { dump_files[i].state = -1; dump_files[i].flags |= flags; @@ -1010,8 +1009,7 @@ dump_enable_all (int flags, int letter) } for (i = 0; i < extra_dump_files_in_use; i++) - if ((extra_dump_files[i].flags & ir_dump_type) - && (letter == 0 || letter == extra_dump_files[i].letter)) + if ((extra_dump_files[i].flags & ir_dump_type)) { extra_dump_files[i].state = -1; extra_dump_files[i].flags |= flags; @@ -1030,7 +1028,7 @@ dump_switch_p_1 (const char *arg, struct dump_file_info *dfi, bool doglob) const char *option_value; const char *ptr; int flags; - + if (doglob && !dfi->glob) return 0; @@ -1076,7 +1074,7 @@ dump_switch_p_1 (const char *arg, struct dump_file_info *dfi, bool doglob) /* Process -fdump-tree-all and -fdump-rtl-all, by enabling all the known dumps. */ if (dfi->suffix == NULL) - dump_enable_all (dfi->flags, 0); + dump_enable_all (dfi->flags); return 1; } @@ -1097,7 +1095,7 @@ dump_switch_p (const char *arg) for (i = 0; i < extra_dump_files_in_use; i++) any |= dump_switch_p_1 (arg, &extra_dump_files[i], false); - + if (!any) for (i = 0; i < extra_dump_files_in_use; i++) any |= dump_switch_p_1 (arg, &extra_dump_files[i], true); @@ -1109,7 +1107,7 @@ dump_switch_p (const char *arg) /* Dump FUNCTION_DECL FN as tree dump PHASE. */ void -dump_function (enum tree_dump_index phase, tree fn) +dump_function (int phase, tree fn) { FILE *stream; int flags; @@ -1123,12 +1121,7 @@ dump_function (enum tree_dump_index phase, tree fn) } bool -enable_rtl_dump_file (int letter) +enable_rtl_dump_file (void) { - if (letter == 'a') - letter = 0; - - return dump_enable_all (TDF_RTL | TDF_DETAILS | TDF_BLOCKS, letter) > 0; + return dump_enable_all (TDF_RTL | TDF_DETAILS | TDF_BLOCKS) > 0; } - -