X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fsched-vis.c;h=d4a5644f6c7ef12f65e4dc80e4062b3207bb2b22;hb=16bd2f3cbfa8c8526eeb3ed89b2f880fee4a9553;hp=7ce0f0cc6407a610634583f3bbd45257a143b9db;hpb=1f1872fdb0abb413ab6da9fd4f6adce363673c02;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/sched-vis.c b/gcc/sched-vis.c index 7ce0f0cc640..d4a5644f6c7 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) @@ -28,14 +28,11 @@ along with GCC; see the file COPYING3. If not see #include "obstack.h" #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 *, const_rtx, int); -static void print_value (char *, const_rtx, int); -static void print_pattern (char *, const_rtx, int); #define BUF_LEN 2048 @@ -83,7 +80,7 @@ print_exp (char *buf, const_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,16 +422,22 @@ print_exp (char *buf, const_rtx x, int verbose) /* Prints rtxes, I customarily classified as values. They're constants, registers, labels, symbols and memory accesses. */ -static void +void print_value (char *buf, const_rtx x, int verbose) { char t[BUF_LEN]; char *cur = buf; + if (!x) + { + safe_concat (buf, buf, "(nil)"); + return; + } 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 +450,10 @@ print_value (char *buf, const_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 +525,10 @@ print_value (char *buf, const_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,7 +538,7 @@ print_value (char *buf, const_rtx x, int verbose) /* The next step in insn detalization, its pattern recognition. */ -static void +void print_pattern (char *buf, const_rtx x, int verbose) { char t1[BUF_LEN], t2[BUF_LEN], t3[BUF_LEN]; @@ -553,6 +564,10 @@ print_pattern (char *buf, const_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) @@ -589,7 +604,7 @@ print_pattern (char *buf, const_rtx x, int verbose) sprintf (buf, "asm {%s}", XSTR (x, 0)); break; case ADDR_VEC: - break; + /* Fall through. */ case ADDR_DIFF_VEC: print_value (buf, XEXP (x, 0), verbose); break; @@ -638,10 +653,10 @@ print_pattern (char *buf, const_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 +670,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 +726,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 +747,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 @@ -719,7 +768,7 @@ dump_insn_slim (FILE *f, rtx x) } /* Emit a slim dump of X (an insn) to stderr. */ -void +DEBUG_FUNCTION void debug_insn_slim (rtx x) { dump_insn_slim (stderr, x); @@ -731,13 +780,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 +814,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--; } } +DEBUG_FUNCTION void +debug_bb_slim (struct basic_block_def *bb) +{ + print_rtl_slim (stderr, BB_HEAD (bb), BB_END (bb), -1, 32); +} + +DEBUG_FUNCTION void +debug_bb_n_slim (int n) +{ + struct basic_block_def *bb = BASIC_BLOCK (n); + debug_bb_slim (bb); +} +