OSDN Git Service

* config/m68k/m68k-protos.h: Convert to ISO C90.
[pf3gnuchains/gcc-fork.git] / gcc / print-rtl.c
index 1553805..b46d1c6 100644 (file)
@@ -1,5 +1,5 @@
-/* Print RTL for GNU C Compiler.
-   Copyright (C) 1987, 1988, 1992, 1997, 1998, 1999, 2000
+/* Print RTL for GCC.
+   Copyright (C) 1987, 1988, 1992, 1997, 1998, 1999, 2000, 2002, 2003
    Free Software Foundation, Inc.
 
 This file is part of GCC.
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -22,6 +22,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 
 #include "config.h"
 #include "system.h"
 
 #include "config.h"
 #include "system.h"
+#include "coretypes.h"
+#include "tm.h"
 #include "rtl.h"
 
 /* We don't want the tree code checking code for the access to the
 #include "rtl.h"
 
 /* We don't want the tree code checking code for the access to the
@@ -56,7 +58,7 @@ static int sawclose = 0;
 
 static int indent;
 
 
 static int indent;
 
-static void print_rtx          PARAMS ((rtx));
+static void print_rtx (rtx);
 
 /* String printed at beginning of each RTL when it is dumped.
    This string is set to ASM_COMMENT_START when the RTL is dumped in
 
 /* String printed at beginning of each RTL when it is dumped.
    This string is set to ASM_COMMENT_START when the RTL is dumped in
@@ -78,9 +80,7 @@ int dump_for_graph;
 static int debug_call_placeholder_verbose;
 
 void
 static int debug_call_placeholder_verbose;
 
 void
-print_mem_expr (outfile, expr)
-     FILE *outfile;
-     tree expr;
+print_mem_expr (FILE *outfile, tree expr)
 {
   if (TREE_CODE (expr) == COMPONENT_REF)
     {
 {
   if (TREE_CODE (expr) == COMPONENT_REF)
     {
@@ -92,6 +92,12 @@ print_mem_expr (outfile, expr)
        fprintf (outfile, ".%s",
                 IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND (expr, 1))));
     }
        fprintf (outfile, ".%s",
                 IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND (expr, 1))));
     }
+  else if (TREE_CODE (expr) == INDIRECT_REF)
+    {
+      fputs (" (*", outfile);
+      print_mem_expr (outfile, TREE_OPERAND (expr, 0));
+      fputs (")", outfile);
+    }
   else if (DECL_NAME (expr))
     fprintf (outfile, " %s", IDENTIFIER_POINTER (DECL_NAME (expr)));
   else if (TREE_CODE (expr) == RESULT_DECL)
   else if (DECL_NAME (expr))
     fprintf (outfile, " %s", IDENTIFIER_POINTER (DECL_NAME (expr)));
   else if (TREE_CODE (expr) == RESULT_DECL)
@@ -103,8 +109,7 @@ print_mem_expr (outfile, expr)
 /* Print IN_RTX onto OUTFILE.  This is the recursive part of printing.  */
 
 static void
 /* Print IN_RTX onto OUTFILE.  This is the recursive part of printing.  */
 
 static void
-print_rtx (in_rtx)
-     rtx in_rtx;
+print_rtx (rtx in_rtx)
 {
   int i = 0;
   int j;
 {
   int i = 0;
   int j;
@@ -189,6 +194,11 @@ print_rtx (in_rtx)
        }
     }
 
        }
     }
 
+#ifndef GENERATOR_FILE
+  if (GET_CODE (in_rtx) == CONST_DOUBLE && FLOAT_MODE_P (GET_MODE (in_rtx)))
+    i = 5;
+#endif
+
   /* Get the format string and skip the first elements if we have handled
      them already.  */
   format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx)) + i;
   /* Get the format string and skip the first elements if we have handled
      them already.  */
   format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx)) + i;
@@ -226,9 +236,22 @@ print_rtx (in_rtx)
          {
            if (REGNO (in_rtx) != ORIGINAL_REGNO (in_rtx))
              fprintf (outfile, " [%d]", ORIGINAL_REGNO (in_rtx));
          {
            if (REGNO (in_rtx) != ORIGINAL_REGNO (in_rtx))
              fprintf (outfile, " [%d]", ORIGINAL_REGNO (in_rtx));
-           break;
          }
          }
-       if (i == 4 && GET_CODE (in_rtx) == NOTE)
+#ifndef GENERATOR_FILE
+       else if (i == 1 && GET_CODE (in_rtx) == SYMBOL_REF)
+         {
+           int flags = SYMBOL_REF_FLAGS (in_rtx);
+           if (flags)
+             fprintf (outfile, " [flags 0x%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);
+         }
+#endif
+       else if (i == 4 && GET_CODE (in_rtx) == NOTE)
          {
            switch (NOTE_LINE_NUMBER (in_rtx))
              {
          {
            switch (NOTE_LINE_NUMBER (in_rtx))
              {
@@ -348,15 +371,22 @@ print_rtx (in_rtx)
          fprintf (outfile, " ");
        fprintf (outfile, HOST_WIDE_INT_PRINT_DEC, XWINT (in_rtx, i));
        if (! flag_simple)
          fprintf (outfile, " ");
        fprintf (outfile, HOST_WIDE_INT_PRINT_DEC, XWINT (in_rtx, i));
        if (! flag_simple)
-         {
-           fprintf (outfile, " [");
-           fprintf (outfile, HOST_WIDE_INT_PRINT_HEX, XWINT (in_rtx, i));
-           fprintf (outfile, "]");
-         }
+         fprintf (outfile, " [" HOST_WIDE_INT_PRINT_HEX "]",
+                  XWINT (in_rtx, i));
        break;
 
       case 'i':
        break;
 
       case 'i':
-       if (i == 6 && GET_CODE (in_rtx) == NOTE)
+       if (i == 4 && INSN_P (in_rtx))
+         {
+#ifndef GENERATOR_FILE
+           /*  Pretty-print insn locators.  Ignore scoping as it is mostly
+               redundant with line number information and do not print anything
+               when there is no location information available.  */
+           if (INSN_LOCATOR (in_rtx) && insn_file (in_rtx))
+             fprintf(outfile, " %s:%i", insn_file (in_rtx), insn_line (in_rtx));
+#endif
+         }
+       else if (i == 6 && GET_CODE (in_rtx) == NOTE)
          {
            /* This field is only used for NOTE_INSN_DELETED_LABEL, and
               other times often contains garbage from INSN->NOTE death.  */
          {
            /* This field is only used for NOTE_INSN_DELETED_LABEL, and
               other times often contains garbage from INSN->NOTE death.  */
@@ -396,6 +426,20 @@ print_rtx (in_rtx)
            else
              fprintf (outfile, " %d", value);
 
            else
              fprintf (outfile, " %d", value);
 
+           if (GET_CODE (in_rtx) == REG && REG_ATTRS (in_rtx))
+             {
+               fputs (" [", outfile);
+               if (ORIGINAL_REGNO (in_rtx) != REGNO (in_rtx))
+                 fprintf (outfile, "orig:%i", ORIGINAL_REGNO (in_rtx));
+               if (REG_EXPR (in_rtx))
+                 print_mem_expr (outfile, REG_EXPR (in_rtx));
+
+               if (REG_OFFSET (in_rtx))
+                 fprintf (outfile, "+" HOST_WIDE_INT_PRINT_DEC,
+                          REG_OFFSET (in_rtx));
+               fputs (" ]", outfile);
+             }
+
            if (is_insn && &INSN_CODE (in_rtx) == &XINT (in_rtx, i)
                && XINT (in_rtx, i) >= 0
                && (name = get_insn_name (XINT (in_rtx, i))) != NULL)
            if (is_insn && &INSN_CODE (in_rtx) == &XINT (in_rtx, i)
                && XINT (in_rtx, i) >= 0
                && (name = get_insn_name (XINT (in_rtx, i))) != NULL)
@@ -457,8 +501,7 @@ print_rtx (in_rtx)
        break;
 
       case 't':
        break;
 
       case 't':
-       putc (' ', outfile);
-       fprintf (outfile, HOST_PTR_PRINTF, (char *) XTREE (in_rtx, i));
+       fprintf (outfile, " " HOST_PTR_PRINTF, (void *) XTREE (in_rtx, i));
        break;
 
       case '*':
        break;
 
       case '*':
@@ -480,26 +523,20 @@ print_rtx (in_rtx)
 
   switch (GET_CODE (in_rtx))
     {
 
   switch (GET_CODE (in_rtx))
     {
+#ifndef GENERATOR_FILE
     case MEM:
     case MEM:
-      fputs (" [", outfile);
-      fprintf (outfile, HOST_WIDE_INT_PRINT_DEC, MEM_ALIAS_SET (in_rtx));
+      fprintf (outfile, " [" HOST_WIDE_INT_PRINT_DEC, MEM_ALIAS_SET (in_rtx));
 
       if (MEM_EXPR (in_rtx))
        print_mem_expr (outfile, MEM_EXPR (in_rtx));
 
       if (MEM_OFFSET (in_rtx))
 
       if (MEM_EXPR (in_rtx))
        print_mem_expr (outfile, MEM_EXPR (in_rtx));
 
       if (MEM_OFFSET (in_rtx))
-       {
-         fputc ('+', outfile);
-         fprintf (outfile, HOST_WIDE_INT_PRINT_DEC,
-                  INTVAL (MEM_OFFSET (in_rtx)));
-       }
+       fprintf (outfile, "+" HOST_WIDE_INT_PRINT_DEC,
+                INTVAL (MEM_OFFSET (in_rtx)));
 
       if (MEM_SIZE (in_rtx))
 
       if (MEM_SIZE (in_rtx))
-       {
-         fputs (" S", outfile);
-         fprintf (outfile, HOST_WIDE_INT_PRINT_DEC,
-                  INTVAL (MEM_SIZE (in_rtx)));
-       }
+       fprintf (outfile, " S" HOST_WIDE_INT_PRINT_DEC,
+                INTVAL (MEM_SIZE (in_rtx)));
 
       if (MEM_ALIGN (in_rtx) != 1)
        fprintf (outfile, " A%u", MEM_ALIGN (in_rtx));
 
       if (MEM_ALIGN (in_rtx) != 1)
        fprintf (outfile, " A%u", MEM_ALIGN (in_rtx));
@@ -507,18 +544,17 @@ print_rtx (in_rtx)
       fputc (']', outfile);
       break;
 
       fputc (']', outfile);
       break;
 
-#if 0
-    /* It would be nice to do this, but it would require real.o to
-       be linked into the MD-generator programs.  Maybe we should
-       do that.  -zw 2002-03-03  */
     case CONST_DOUBLE:
       if (FLOAT_MODE_P (GET_MODE (in_rtx)))
        {
     case CONST_DOUBLE:
       if (FLOAT_MODE_P (GET_MODE (in_rtx)))
        {
-         REAL_VALUE_TYPE val;
-         char s[30];
+         char s[60];
+
+         real_to_decimal (s, CONST_DOUBLE_REAL_VALUE (in_rtx),
+                          sizeof (s), 0, 1);
+         fprintf (outfile, " %s", s);
 
 
-         REAL_VALUE_FROM_CONST_DOUBLE (val, in_rtx);
-         REAL_VALUE_TO_DECIMAL (val, "%.16g", s);
+         real_to_hexadecimal (s, CONST_DOUBLE_REAL_VALUE (in_rtx),
+                              sizeof (s), 0, 1);
          fprintf (outfile, " [%s]", s);
        }
       break;
          fprintf (outfile, " [%s]", s);
        }
       break;
@@ -598,10 +634,7 @@ print_rtx (in_rtx)
    characters.  */
 
 void
    characters.  */
 
 void
-print_inline_rtx (outf, x, ind)
-     FILE *outf;
-     rtx x;
-     int ind;
+print_inline_rtx (FILE *outf, rtx x, int ind)
 {
   int oldsaw = sawclose;
   int oldindent = indent;
 {
   int oldsaw = sawclose;
   int oldindent = indent;
@@ -617,8 +650,7 @@ print_inline_rtx (outf, x, ind)
 /* Call this function from the debugger to see what X looks like.  */
 
 void
 /* Call this function from the debugger to see what X looks like.  */
 
 void
-debug_rtx (x)
-     rtx x;
+debug_rtx (rtx x)
 {
   outfile = stderr;
   sawclose = 0;
 {
   outfile = stderr;
   sawclose = 0;
@@ -638,9 +670,7 @@ int debug_rtx_count = 0;    /* 0 is treated as equivalent to 1 */
    EG: -5 prints 2 rtx's on either side (in addition to the specified rtx).  */
 
 void
    EG: -5 prints 2 rtx's on either side (in addition to the specified rtx).  */
 
 void
-debug_rtx_list (x, n)
-     rtx x;
-     int n;
+debug_rtx_list (rtx x, int n)
 {
   int i,count;
   rtx insn;
 {
   int i,count;
   rtx insn;
@@ -667,8 +697,7 @@ debug_rtx_list (x, n)
 /* Call this function to print an rtx list from START to END inclusive.  */
 
 void
 /* Call this function to print an rtx list from START to END inclusive.  */
 
 void
-debug_rtx_range (start, end)
-     rtx start, end;
+debug_rtx_range (rtx start, rtx end)
 {
   while (1)
     {
 {
   while (1)
     {
@@ -685,9 +714,7 @@ debug_rtx_range (start, end)
    The found insn is returned to enable further debugging analysis.  */
 
 rtx
    The found insn is returned to enable further debugging analysis.  */
 
 rtx
-debug_rtx_find (x, uid)
-     rtx x;
-     int uid;
+debug_rtx_find (rtx x, int uid)
 {
   while (x != 0 && INSN_UID (x) != uid)
     x = NEXT_INSN (x);
 {
   while (x != 0 && INSN_UID (x) != uid)
     x = NEXT_INSN (x);
@@ -710,9 +737,7 @@ debug_rtx_find (x, uid)
    If RTX_FIRST is not an insn, then it alone is printed, with no newline.  */
 
 void
    If RTX_FIRST is not an insn, then it alone is printed, with no newline.  */
 
 void
-print_rtl (outf, rtx_first)
-     FILE *outf;
-     rtx rtx_first;
+print_rtl (FILE *outf, rtx rtx_first)
 {
   rtx tmp_rtx;
 
 {
   rtx tmp_rtx;
 
@@ -753,9 +778,7 @@ print_rtl (outf, rtx_first)
 /* Return nonzero if we actually printed anything.  */
 
 int
 /* Return nonzero if we actually printed anything.  */
 
 int
-print_rtl_single (outf, x)
-     FILE *outf;
-     rtx x;
+print_rtl_single (FILE *outf, rtx x)
 {
   outfile = outf;
   sawclose = 0;
 {
   outfile = outf;
   sawclose = 0;
@@ -775,9 +798,7 @@ print_rtl_single (outf, x)
    if RTX is a CONST_INT then print in decimal format.  */
 
 void
    if RTX is a CONST_INT then print in decimal format.  */
 
 void
-print_simple_rtl (outf, x)
-     FILE *outf;
-     rtx x;
+print_simple_rtl (FILE *outf, rtx x)
 {
   flag_simple = 1;
   print_rtl (outf, x);
 {
   flag_simple = 1;
   print_rtl (outf, x);