OSDN Git Service

2012-01-27 Tobias Burnus <burnus@net-b.de>
[pf3gnuchains/gcc-fork.git] / gcc / print-rtl.c
index 5ba5e63..9bd8621 100644 (file)
@@ -1,6 +1,6 @@
 /* Print RTL for GCC.
    Copyright (C) 1987, 1988, 1992, 1997, 1998, 1999, 2000, 2002, 2003,
-   2004, 2005, 2007, 2008, 2009
+   2004, 2005, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -36,12 +36,14 @@ along with GCC; see the file COPYING3.  If not see
    generator programs.  */
 #ifndef GENERATOR_FILE
 #include "tree.h"
-#include "real.h"
 #include "flags.h"
 #include "hard-reg-set.h"
 #include "basic-block.h"
 #include "diagnostic.h"
+#include "tree-pretty-print.h"
 #include "cselib.h"
+#include "tree-pass.h"
+#include "dwarf2out.h"
 #endif
 
 static FILE *outfile;
@@ -57,6 +59,10 @@ static void print_rtx (const_rtx);
    the assembly output file.  */
 const char *print_rtx_head = "";
 
+#ifdef GENERATOR_FILE
+/* These are defined from the .opt file when not used in generator
+   programs.  */
+
 /* Nonzero means suppress output of instruction numbers
    in debugging dumps.
    This must be defined here so that programs like gencodes can be linked.  */
@@ -66,6 +72,7 @@ int flag_dump_unnumbered = 0;
    and next insns in debugging dumps.
    This must be defined here so that programs like gencodes can be linked.  */
 int flag_dump_unnumbered_links = 0;
+#endif
 
 /* Nonzero means use simplified format without flags, modes, etc.  */
 int flag_simple = 0;
@@ -78,7 +85,7 @@ void
 print_mem_expr (FILE *outfile, const_tree expr)
 {
   fputc (' ', outfile);
-  print_generic_expr (outfile, CONST_CAST_TREE (expr), 0);
+  print_generic_expr (outfile, CONST_CAST_TREE (expr), dump_flags);
 }
 #endif
 
@@ -109,7 +116,8 @@ print_rtx (const_rtx in_rtx)
     }
   else if (GET_CODE (in_rtx) > NUM_RTX_CODE)
     {
-       fprintf (outfile, "(??? bad code %d\n)", GET_CODE (in_rtx));
+       fprintf (outfile, "(??? bad code %d\n%s%*s)", GET_CODE (in_rtx),
+               print_rtx_head, indent * 2, "");
        sawclose = 1;
        return;
     }
@@ -234,13 +242,13 @@ print_rtx (const_rtx in_rtx)
          {
            int flags = SYMBOL_REF_FLAGS (in_rtx);
            if (flags)
-             fprintf (outfile, " [flags 0x%x]", flags);
+             fprintf (outfile, " [flags %#x]", flags);
          }
        else if (i == 2 && GET_CODE (in_rtx) == SYMBOL_REF)
          {
            tree decl = SYMBOL_REF_DECL (in_rtx);
            if (decl)
-             print_node_brief (outfile, "", decl, 0);
+             print_node_brief (outfile, "", decl, dump_flags);
          }
 #endif
        else if (i == 4 && NOTE_P (in_rtx))
@@ -275,6 +283,7 @@ print_rtx (const_rtx in_rtx)
                }
 
              case NOTE_INSN_DELETED_LABEL:
+             case NOTE_INSN_DELETED_DEBUG_LABEL:
                {
                  const char *label = NOTE_DELETED_LABEL_NAME (in_rtx);
                  if (label)
@@ -293,27 +302,44 @@ print_rtx (const_rtx in_rtx)
 #endif
                  break;
                }
-               
+
              case NOTE_INSN_VAR_LOCATION:
+             case NOTE_INSN_CALL_ARG_LOCATION:
 #ifndef GENERATOR_FILE
                fputc (' ', outfile);
                print_rtx (NOTE_VAR_LOCATION (in_rtx));
 #endif
                break;
 
+             case NOTE_INSN_CFI:
+#ifndef GENERATOR_FILE
+               fputc ('\n', outfile);
+               output_cfi_directive (outfile, NOTE_CFI (in_rtx));
+               fputc ('\t', outfile);
+#endif
+               break;
+
              default:
                break;
              }
          }
        else if (i == 8 && JUMP_P (in_rtx) && JUMP_LABEL (in_rtx) != NULL)
-         /* Output the JUMP_LABEL reference.  */
-         fprintf (outfile, "\n -> %d", INSN_UID (JUMP_LABEL (in_rtx)));
+         {
+           /* Output the JUMP_LABEL reference.  */
+           fprintf (outfile, "\n%s%*s -> ", print_rtx_head, indent * 2, "");
+           if (GET_CODE (JUMP_LABEL (in_rtx)) == RETURN)
+             fprintf (outfile, "return");
+           else if (GET_CODE (JUMP_LABEL (in_rtx)) == SIMPLE_RETURN)
+             fprintf (outfile, "simple_return");
+           else
+             fprintf (outfile, "%d", INSN_UID (JUMP_LABEL (in_rtx)));
+         }
        else if (i == 0 && GET_CODE (in_rtx) == VALUE)
          {
 #ifndef GENERATOR_FILE
            cselib_val *val = CSELIB_VAL_PTR (in_rtx);
 
-           fprintf (outfile, " %i", val->value);
+           fprintf (outfile, " %u:%u", val->uid, val->hash);
            dump_addr (outfile, " @", in_rtx);
            dump_addr (outfile, "/", (void*)val);
 #endif
@@ -321,14 +347,27 @@ print_rtx (const_rtx in_rtx)
        else if (i == 0 && GET_CODE (in_rtx) == DEBUG_EXPR)
          {
 #ifndef GENERATOR_FILE
-           fprintf (outfile, " D#%i", DEBUG_TEMP_UID (XTREE (in_rtx, 0)));
+           fprintf (outfile, " D#%i",
+                    DEBUG_TEMP_UID (DEBUG_EXPR_TREE_DECL (in_rtx)));
 #endif
          }
+       else if (i == 0 && GET_CODE (in_rtx) == ENTRY_VALUE)
+         {
+           indent += 2;
+           if (!sawclose)
+             fprintf (outfile, " ");
+           print_rtx (ENTRY_VALUE_EXP (in_rtx));
+           indent -= 2;
+         }
        break;
 
       case 'e':
       do_e:
        indent += 2;
+       if (i == 7 && INSN_P (in_rtx))
+         /* Put REG_NOTES on their own line.  */
+         fprintf (outfile, "\n%s%*s",
+                  print_rtx_head, indent * 2, "");
        if (!sawclose)
          fprintf (outfile, " ");
        print_rtx (XEXP (in_rtx, i));
@@ -374,7 +413,7 @@ print_rtx (const_rtx in_rtx)
        break;
 
       case 'i':
-       if (i == 4 && INSN_P (in_rtx))
+       if (i == 5 && INSN_P (in_rtx))
          {
 #ifndef GENERATOR_FILE
            /*  Pretty-print insn locators.  Ignore scoping as it is mostly
@@ -384,24 +423,55 @@ print_rtx (const_rtx in_rtx)
              fprintf(outfile, " %s:%i", insn_file (in_rtx), insn_line (in_rtx));
 #endif
          }
+       else if (i == 6 && GET_CODE (in_rtx) == ASM_OPERANDS)
+         {
+#ifndef GENERATOR_FILE
+           fprintf (outfile, " %s:%i",
+                    locator_file (ASM_OPERANDS_SOURCE_LOCATION (in_rtx)),
+                    locator_line (ASM_OPERANDS_SOURCE_LOCATION (in_rtx)));
+#endif
+         }
+       else if (i == 1 && GET_CODE (in_rtx) == ASM_INPUT)
+         {
+#ifndef GENERATOR_FILE
+           fprintf (outfile, " %s:%i",
+                    locator_file (ASM_INPUT_SOURCE_LOCATION (in_rtx)),
+                    locator_line (ASM_INPUT_SOURCE_LOCATION (in_rtx)));
+#endif
+         }
        else if (i == 6 && NOTE_P (in_rtx))
          {
            /* This field is only used for NOTE_INSN_DELETED_LABEL, and
               other times often contains garbage from INSN->NOTE death.  */
-           if (NOTE_KIND (in_rtx) == NOTE_INSN_DELETED_LABEL)
+           if (NOTE_KIND (in_rtx) == NOTE_INSN_DELETED_LABEL
+               || NOTE_KIND (in_rtx) == NOTE_INSN_DELETED_DEBUG_LABEL)
              fprintf (outfile, " %d",  XINT (in_rtx, i));
          }
+#if !defined(GENERATOR_FILE) && NUM_UNSPECV_VALUES > 0
+       else if (i == 1
+                && GET_CODE (in_rtx) == UNSPEC_VOLATILE
+                && XINT (in_rtx, 1) >= 0
+                && XINT (in_rtx, 1) < NUM_UNSPECV_VALUES)
+         fprintf (outfile, " %s", unspecv_strings[XINT (in_rtx, 1)]);
+#endif
+#if !defined(GENERATOR_FILE) && NUM_UNSPEC_VALUES > 0
+       else if (i == 1
+                && (GET_CODE (in_rtx) == UNSPEC
+                    || GET_CODE (in_rtx) == UNSPEC_VOLATILE)
+                && XINT (in_rtx, 1) >= 0
+                && XINT (in_rtx, 1) < NUM_UNSPEC_VALUES)
+         fprintf (outfile, " %s", unspec_strings[XINT (in_rtx, 1)]);
+#endif
        else
          {
            int value = XINT (in_rtx, i);
            const char *name;
 
 #ifndef GENERATOR_FILE
-           if (REG_P (in_rtx) && value < FIRST_PSEUDO_REGISTER)
-             fprintf (outfile, " %d %s", REGNO (in_rtx),
-                      reg_names[REGNO (in_rtx)]);
+           if (REG_P (in_rtx) && (unsigned) value < FIRST_PSEUDO_REGISTER)
+             fprintf (outfile, " %d %s", value, reg_names[value]);
            else if (REG_P (in_rtx)
-                    && value <= LAST_VIRTUAL_REGISTER)
+                    && (unsigned) value <= LAST_VIRTUAL_REGISTER)
              {
                if (value == VIRTUAL_INCOMING_ARGS_REGNUM)
                  fprintf (outfile, " %d virtual-incoming-args", value);
@@ -413,6 +483,9 @@ print_rtx (const_rtx in_rtx)
                  fprintf (outfile, " %d virtual-outgoing-args", value);
                else if (value == VIRTUAL_CFA_REGNUM)
                  fprintf (outfile, " %d virtual-cfa", value);
+               else if (value == VIRTUAL_PREFERRED_STACK_BOUNDARY_REGNUM)
+                 fprintf (outfile, " %d virtual-preferred-stack-boundary",
+                          value);
                else
                  fprintf (outfile, " %d virtual-reg-%d", value,
                           value-FIRST_VIRTUAL_REGISTER);
@@ -492,19 +565,14 @@ print_rtx (const_rtx in_rtx)
        sawclose = 0;
        break;
 
-      case 'b':
-#ifndef GENERATOR_FILE
-       if (XBITMAP (in_rtx, i) == NULL)
-         fputs (" {null}", outfile);
-       else
-         bitmap_print (outfile, XBITMAP (in_rtx, i), " {", "}");
-#endif
-       sawclose = 0;
-       break;
-
       case 't':
 #ifndef GENERATOR_FILE
-       dump_addr (outfile, " ", XTREE (in_rtx, i));
+       if (i == 0 && GET_CODE (in_rtx) == DEBUG_IMPLICIT_PTR)
+         print_mem_expr (outfile, DEBUG_IMPLICIT_PTR_DECL (in_rtx));
+       else if (i == 0 && GET_CODE (in_rtx) == DEBUG_PARAMETER_REF)
+         print_mem_expr (outfile, DEBUG_PARAMETER_REF_DECL (in_rtx));
+       else
+         dump_addr (outfile, " ", XTREE (in_rtx, i));
 #endif
        break;
 
@@ -528,23 +596,27 @@ print_rtx (const_rtx in_rtx)
     {
 #ifndef GENERATOR_FILE
     case MEM:
-      fprintf (outfile, " [" HOST_WIDE_INT_PRINT_DEC,
-              (HOST_WIDE_INT) MEM_ALIAS_SET (in_rtx));
+      if (__builtin_expect (final_insns_dump_p, false))
+       fprintf (outfile, " [");
+      else
+       fprintf (outfile, " [" HOST_WIDE_INT_PRINT_DEC,
+                (HOST_WIDE_INT) MEM_ALIAS_SET (in_rtx));
 
       if (MEM_EXPR (in_rtx))
        print_mem_expr (outfile, MEM_EXPR (in_rtx));
 
-      if (MEM_OFFSET (in_rtx))
-       fprintf (outfile, "+" HOST_WIDE_INT_PRINT_DEC,
-                INTVAL (MEM_OFFSET (in_rtx)));
+      if (MEM_OFFSET_KNOWN_P (in_rtx))
+       fprintf (outfile, "+" HOST_WIDE_INT_PRINT_DEC, MEM_OFFSET (in_rtx));
 
-      if (MEM_SIZE (in_rtx))
-       fprintf (outfile, " S" HOST_WIDE_INT_PRINT_DEC,
-                INTVAL (MEM_SIZE (in_rtx)));
+      if (MEM_SIZE_KNOWN_P (in_rtx))
+       fprintf (outfile, " S" HOST_WIDE_INT_PRINT_DEC, MEM_SIZE (in_rtx));
 
       if (MEM_ALIGN (in_rtx) != 1)
        fprintf (outfile, " A%u", MEM_ALIGN (in_rtx));
 
+      if (!ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (in_rtx)))
+       fprintf (outfile, " AS%u", MEM_ADDR_SPACE (in_rtx));
+
       fputc (']', outfile);
       break;
 
@@ -610,7 +682,7 @@ print_inline_rtx (FILE *outf, const_rtx x, int ind)
 
 /* Call this function from the debugger to see what X looks like.  */
 
-void
+DEBUG_FUNCTION void
 debug_rtx (const_rtx x)
 {
   outfile = stderr;
@@ -622,7 +694,7 @@ debug_rtx (const_rtx x)
 /* Count of rtx's to print with debug_rtx_list.
    This global exists because gdb user defined commands have no arguments.  */
 
-int debug_rtx_count = 0;       /* 0 is treated as equivalent to 1 */
+DEBUG_VARIABLE int debug_rtx_count = 0;        /* 0 is treated as equivalent to 1 */
 
 /* Call this function to print list from X on.
 
@@ -630,7 +702,7 @@ int debug_rtx_count = 0;    /* 0 is treated as equivalent to 1 */
    rtx on.  Negative values print a window around the rtx.
    EG: -5 prints 2 rtx's on either side (in addition to the specified rtx).  */
 
-void
+DEBUG_FUNCTION void
 debug_rtx_list (const_rtx x, int n)
 {
   int i,count;
@@ -657,7 +729,7 @@ debug_rtx_list (const_rtx x, int n)
 
 /* Call this function to print an rtx list from START to END inclusive.  */
 
-void
+DEBUG_FUNCTION void
 debug_rtx_range (const_rtx start, const_rtx end)
 {
   while (1)
@@ -674,7 +746,7 @@ debug_rtx_range (const_rtx start, const_rtx end)
    and then call debug_rtx_list to print it, using DEBUG_RTX_COUNT.
    The found insn is returned to enable further debugging analysis.  */
 
-const_rtx
+DEBUG_FUNCTION const_rtx
 debug_rtx_find (const_rtx x, int uid)
 {
   while (x != 0 && INSN_UID (x) != uid)