X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fsched-vis.c;h=5754a56a5fa744860557b33f167d9d4cfb20d3ff;hb=a219f6a52a9801cb4f78a160ede2232e8feeb564;hp=1d9dd4bf62549fb886787fd1dd1613275a9879fa;hpb=8c4c00c181e6df4f0a9afc76e4c9edbbc1c2fd41;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/sched-vis.c b/gcc/sched-vis.c index 1d9dd4bf625..5754a56a5fa 100644 --- a/gcc/sched-vis.c +++ b/gcc/sched-vis.c @@ -1,6 +1,6 @@ /* Instruction scheduling pass. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by, and currently maintained by, Jim Wilson (wilson@cygnus.com) @@ -29,13 +29,11 @@ along with GCC; see the file COPYING3. If not see #include "hard-reg-set.h" #include "basic-block.h" #include "real.h" +#include "insn-attr.h" #include "sched-int.h" #include "tree-pass.h" static char *safe_concat (char *, char *, const char *); -static void print_exp (char *, rtx, int); -static void print_value (char *, rtx, int); -static void print_pattern (char *, rtx, int); #define BUF_LEN 2048 @@ -63,7 +61,7 @@ safe_concat (char *buf, char *cur, const char *str) may be stored in objects representing values. */ static void -print_exp (char *buf, rtx x, int verbose) +print_exp (char *buf, const_rtx x, int verbose) { char tmp[BUF_LEN]; const char *st[4]; @@ -83,7 +81,7 @@ print_exp (char *buf, rtx x, int verbose) { case PLUS: op[0] = XEXP (x, 0); - if (GET_CODE (XEXP (x, 1)) == CONST_INT + if (CONST_INT_P (XEXP (x, 1)) && INTVAL (XEXP (x, 1)) < 0) { st[1] = "-"; @@ -425,8 +423,8 @@ print_exp (char *buf, rtx x, int verbose) /* Prints rtxes, I customarily classified as values. They're constants, registers, labels, symbols and memory accesses. */ -static void -print_value (char *buf, rtx x, int verbose) +void +print_value (char *buf, const_rtx x, int verbose) { char t[BUF_LEN]; char *cur = buf; @@ -434,7 +432,8 @@ print_value (char *buf, rtx x, int verbose) switch (GET_CODE (x)) { case CONST_INT: - sprintf (t, HOST_WIDE_INT_PRINT_HEX, INTVAL (x)); + sprintf (t, HOST_WIDE_INT_PRINT_HEX, + (unsigned HOST_WIDE_INT) INTVAL (x)); cur = safe_concat (buf, cur, t); break; case CONST_DOUBLE: @@ -447,6 +446,10 @@ print_value (char *buf, rtx x, int verbose) (unsigned HOST_WIDE_INT) CONST_DOUBLE_HIGH (x)); cur = safe_concat (buf, cur, t); break; + case CONST_FIXED: + fixed_to_decimal (t, CONST_FIXED_VALUE (x), sizeof (t)); + cur = safe_concat (buf, cur, t); + break; case CONST_STRING: cur = safe_concat (buf, cur, "\""); cur = safe_concat (buf, cur, XSTR (x, 0)); @@ -518,6 +521,10 @@ print_value (char *buf, rtx x, int verbose) cur = safe_concat (buf, cur, t); cur = safe_concat (buf, cur, "]"); break; + case DEBUG_EXPR: + sprintf (t, "D#%i", DEBUG_TEMP_UID (DEBUG_EXPR_TREE_DECL (x))); + cur = safe_concat (buf, cur, t); + break; default: print_exp (t, x, verbose); cur = safe_concat (buf, cur, t); @@ -527,8 +534,8 @@ print_value (char *buf, rtx x, int verbose) /* The next step in insn detalization, its pattern recognition. */ -static void -print_pattern (char *buf, rtx x, int verbose) +void +print_pattern (char *buf, const_rtx x, int verbose) { char t1[BUF_LEN], t2[BUF_LEN], t3[BUF_LEN]; @@ -553,6 +560,10 @@ print_pattern (char *buf, rtx x, int verbose) print_value (t1, XEXP (x, 0), verbose); sprintf (buf, "use %s", t1); break; + case VAR_LOCATION: + print_value (t1, PAT_VAR_LOCATION_LOC (x), verbose); + sprintf (buf, "loc %s", t1); + break; case COND_EXEC: if (GET_CODE (COND_EXEC_TEST (x)) == NE && XEXP (COND_EXEC_TEST (x), 1) == const0_rtx) @@ -638,10 +649,10 @@ print_pattern (char *buf, rtx x, int verbose) depends now on sched.c inner variables ...) */ void -print_insn (char *buf, rtx x, int verbose) +print_insn (char *buf, const_rtx x, int verbose) { char t[BUF_LEN]; - rtx insn = x; + const_rtx insn = x; switch (GET_CODE (x)) { @@ -655,6 +666,41 @@ print_insn (char *buf, rtx x, int verbose) #endif sprintf (buf, " %4d %s", INSN_UID (x), t); break; + + case DEBUG_INSN: + { + const char *name = "?"; + + if (DECL_P (INSN_VAR_LOCATION_DECL (insn))) + { + tree id = DECL_NAME (INSN_VAR_LOCATION_DECL (insn)); + char idbuf[32]; + if (id) + name = IDENTIFIER_POINTER (id); + else if (TREE_CODE (INSN_VAR_LOCATION_DECL (insn)) + == DEBUG_EXPR_DECL) + { + sprintf (idbuf, "D#%i", + DEBUG_TEMP_UID (INSN_VAR_LOCATION_DECL (insn))); + name = idbuf; + } + else + { + sprintf (idbuf, "D.%i", + DECL_UID (INSN_VAR_LOCATION_DECL (insn))); + name = idbuf; + } + } + if (VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn))) + sprintf (buf, " %4d: debug %s optimized away", INSN_UID (insn), name); + else + { + print_pattern (t, INSN_VAR_LOCATION_LOC (insn), verbose); + sprintf (buf, " %4d: debug %s => %s", INSN_UID (insn), name, t); + } + } + break; + case JUMP_INSN: print_pattern (t, PATTERN (x), verbose); #ifdef INSN_SCHEDULING @@ -676,7 +722,7 @@ print_insn (char *buf, rtx x, int verbose) strcpy (t, "call <...>"); #ifdef INSN_SCHEDULING if (verbose && current_sched_info) - sprintf (buf, "%s: %s", (*current_sched_info->print_insn) (x, 1), t); + sprintf (buf, "%s: %s", (*current_sched_info->print_insn) (insn, 1), t); else #endif sprintf (buf, " %4d %s", INSN_UID (insn), t); @@ -697,7 +743,6 @@ print_insn (char *buf, rtx x, int verbose) } } /* print_insn */ - /* Emit a slim dump of X (an insn) to the file F, including any register note attached to the instruction. */ void @@ -731,13 +776,24 @@ debug_insn_slim (rtx x) void print_rtl_slim_with_bb (FILE *f, rtx first, int flags) { + print_rtl_slim (f, first, NULL, -1, flags); +} + +/* Same as above, but stop at LAST or when COUNT == 0. + If COUNT < 0 it will stop only at LAST or NULL rtx. */ +void +print_rtl_slim (FILE *f, rtx first, rtx last, int count, int flags) +{ basic_block current_bb = NULL; - rtx insn; + rtx insn, tail; - for (insn = first; NULL != insn; insn = NEXT_INSN (insn)) + tail = last ? NEXT_INSN (last) : NULL_RTX; + for (insn = first; + (insn != NULL) && (insn != tail) && (count != 0); + insn = NEXT_INSN (insn)) { if ((flags & TDF_BLOCKS) - && (INSN_P (insn) || GET_CODE (insn) == NOTE) + && (INSN_P (insn) || NOTE_P (insn)) && BLOCK_FOR_INSN (insn) && !current_bb) { @@ -754,6 +810,21 @@ print_rtl_slim_with_bb (FILE *f, rtx first, int flags) dump_bb_info (current_bb, false, true, flags, ";; ", f); current_bb = NULL; } + if (count > 0) + count--; } } +void +debug_bb_slim (struct basic_block_def *bb) +{ + print_rtl_slim (stderr, BB_HEAD (bb), BB_END (bb), -1, 32); +} + +void +debug_bb_n_slim (int n) +{ + struct basic_block_def *bb = BASIC_BLOCK (n); + debug_bb_slim (bb); +} +