OSDN Git Service

Add TLS checks to ObjC
[pf3gnuchains/gcc-fork.git] / gcc / print-tree.c
index 3104f1b..f1a2455 100644 (file)
@@ -1,12 +1,13 @@
-/* Prints out tree in human readable form - GNU C-compiler
+/* Prints out tree in human readable form - GCC
    Copyright (C) 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
    Copyright (C) 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002 Free Software Foundation, Inc.
+   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+   Free Software Foundation, Inc.
 
 This file is part of GCC.
 
 GCC is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
 
 This file is part of GCC.
 
 GCC is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
+Software Foundation; either version 3, or (at your option) any later
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
@@ -15,17 +16,22 @@ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 for more details.
 
 You should have received a copy of the GNU General Public License
 for more details.
 
 You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.  */
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
 
 
 #include "config.h"
 #include "system.h"
 
 
 #include "config.h"
 #include "system.h"
+#include "coretypes.h"
+#include "tm.h"
 #include "tree.h"
 #include "tree.h"
-#include "real.h"
 #include "ggc.h"
 #include "langhooks.h"
 #include "ggc.h"
 #include "langhooks.h"
+#include "tree-iterator.h"
+#include "diagnostic.h"
+#include "gimple-pretty-print.h"
+#include "tree-flow.h"
+#include "tree-pass.h"
 
 /* Define the hash table of nodes already seen.
    Such nodes are not repeated; brief cross-references are used.  */
 
 /* Define the hash table of nodes already seen.
    Such nodes are not repeated; brief cross-references are used.  */
@@ -45,44 +51,68 @@ static struct bucket **table;
    down to a depth of six.  */
 
 void
    down to a depth of six.  */
 
 void
-debug_tree (node)
-     tree node;
+debug_tree (tree node)
 {
 {
-  table = (struct bucket **) xcalloc (HASH_SIZE, sizeof (struct bucket *));
+  table = XCNEWVEC (struct bucket *, HASH_SIZE);
   print_node (stderr, "", node, 0);
   print_node (stderr, "", node, 0);
+  free (table);
   table = 0;
   table = 0;
-  fprintf (stderr, "\n");
+  putc ('\n', stderr);
+}
+
+/* Print PREFIX and ADDR to FILE.  */
+void
+dump_addr (FILE *file, const char *prefix, const void *addr)
+{
+  if (flag_dump_noaddr || flag_dump_unnumbered)
+    fprintf (file, "%s#", prefix);
+  else
+    fprintf (file, "%s" HOST_PTR_PRINTF, prefix, addr);
 }
 
 /* Print a node in brief fashion, with just the code, address and name.  */
 
 void
 }
 
 /* Print a node in brief fashion, with just the code, address and name.  */
 
 void
-print_node_brief (file, prefix, node, indent)
-     FILE *file;
-     const char *prefix;
-     tree node;
-     int indent;
+print_node_brief (FILE *file, const char *prefix, const_tree node, int indent)
 {
 {
-  char class;
+  enum tree_code_class tclass;
 
   if (node == 0)
     return;
 
 
   if (node == 0)
     return;
 
-  class = TREE_CODE_CLASS (TREE_CODE (node));
+  tclass = TREE_CODE_CLASS (TREE_CODE (node));
 
   /* Always print the slot this node is in, and its code, address and
      name if any.  */
   if (indent > 0)
     fprintf (file, " ");
 
   /* Always print the slot this node is in, and its code, address and
      name if any.  */
   if (indent > 0)
     fprintf (file, " ");
-  fprintf (file, "%s <%s ", prefix, tree_code_name[(int) TREE_CODE (node)]);
-  fprintf (file, HOST_PTR_PRINTF, (char *) node);
+  fprintf (file, "%s <%s", prefix, tree_code_name[(int) TREE_CODE (node)]);
+  dump_addr (file, " ", node);
 
 
-  if (class == 'd')
+  if (tclass == tcc_declaration)
     {
       if (DECL_NAME (node))
        fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
     {
       if (DECL_NAME (node))
        fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
+      else if (TREE_CODE (node) == LABEL_DECL
+              && LABEL_DECL_UID (node) != -1)
+       {
+         if (dump_flags & TDF_NOUID)
+           fprintf (file, " L.xxxx");
+         else
+           fprintf (file, " L.%d", (int) LABEL_DECL_UID (node));
+       }
+      else
+       {
+         if (dump_flags & TDF_NOUID)
+           fprintf (file, " %c.xxxx",
+                    TREE_CODE (node) == CONST_DECL ? 'C' : 'D');
+         else
+           fprintf (file, " %c.%u",
+                    TREE_CODE (node) == CONST_DECL ? 'C' : 'D',
+                    DECL_UID (node));
+       }
     }
     }
-  else if (class == 't')
+  else if (tclass == tcc_type)
     {
       if (TYPE_NAME (node))
        {
     {
       if (TYPE_NAME (node))
        {
@@ -93,6 +123,8 @@ print_node_brief (file, prefix, node, indent)
            fprintf (file, " %s",
                     IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
        }
            fprintf (file, " %s",
                     IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
        }
+      if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
+       fprintf (file, " address-space-%d", TYPE_ADDR_SPACE (node));
     }
   if (TREE_CODE (node) == IDENTIFIER_NODE)
     fprintf (file, " %s", IDENTIFIER_POINTER (node));
     }
   if (TREE_CODE (node) == IDENTIFIER_NODE)
     fprintf (file, " %s", IDENTIFIER_POINTER (node));
@@ -100,7 +132,7 @@ print_node_brief (file, prefix, node, indent)
   /* We might as well always print the value of an integer or real.  */
   if (TREE_CODE (node) == INTEGER_CST)
     {
   /* We might as well always print the value of an integer or real.  */
   if (TREE_CODE (node) == INTEGER_CST)
     {
-      if (TREE_CONSTANT_OVERFLOW (node))
+      if (TREE_OVERFLOW (node))
        fprintf (file, " overflow");
 
       fprintf (file, " ");
        fprintf (file, " overflow");
 
       fprintf (file, " ");
@@ -108,14 +140,12 @@ print_node_brief (file, prefix, node, indent)
        fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED, TREE_INT_CST_LOW (node));
       else if (TREE_INT_CST_HIGH (node) == -1
               && TREE_INT_CST_LOW (node) != 0)
        fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED, TREE_INT_CST_LOW (node));
       else if (TREE_INT_CST_HIGH (node) == -1
               && TREE_INT_CST_LOW (node) != 0)
-       {
-         fprintf (file, "-");
-         fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED,
-                  -TREE_INT_CST_LOW (node));
-       }
+       fprintf (file, "-" HOST_WIDE_INT_PRINT_UNSIGNED,
+                -TREE_INT_CST_LOW (node));
       else
        fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
       else
        fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
-                TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
+                (unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (node),
+                (unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (node));
     }
   if (TREE_CODE (node) == REAL_CST)
     {
     }
   if (TREE_CODE (node) == REAL_CST)
     {
@@ -126,25 +156,34 @@ print_node_brief (file, prefix, node, indent)
 
       d = TREE_REAL_CST (node);
       if (REAL_VALUE_ISINF (d))
 
       d = TREE_REAL_CST (node);
       if (REAL_VALUE_ISINF (d))
-       fprintf (file, " Inf");
+       fprintf (file,  REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
       else if (REAL_VALUE_ISNAN (d))
        fprintf (file, " Nan");
       else
        {
       else if (REAL_VALUE_ISNAN (d))
        fprintf (file, " Nan");
       else
        {
-         char string[100];
-
-         REAL_VALUE_TO_DECIMAL (d, "%e", string);
+         char string[60];
+         real_to_decimal (string, &d, sizeof (string), 0, 1);
          fprintf (file, " %s", string);
        }
     }
          fprintf (file, " %s", string);
        }
     }
+  if (TREE_CODE (node) == FIXED_CST)
+    {
+      FIXED_VALUE_TYPE f;
+      char string[60];
+
+      if (TREE_OVERFLOW (node))
+       fprintf (file, " overflow");
+
+      f = TREE_FIXED_CST (node);
+      fixed_to_decimal (string, &f, sizeof (string));
+      fprintf (file, " %s", string);
+    }
 
   fprintf (file, ">");
 }
 
 void
 
   fprintf (file, ">");
 }
 
 void
-indent_to (file, column)
-     FILE *file;
-     int column;
+indent_to (FILE *file, int column)
 {
   int i;
 
 {
   int i;
 
@@ -159,24 +198,22 @@ indent_to (file, column)
    starting in column INDENT.  */
 
 void
    starting in column INDENT.  */
 
 void
-print_node (file, prefix, node, indent)
-     FILE *file;
-     const char *prefix;
-     tree node;
-     int indent;
+print_node (FILE *file, const char *prefix, tree node, int indent)
 {
   int hash;
   struct bucket *b;
   enum machine_mode mode;
 {
   int hash;
   struct bucket *b;
   enum machine_mode mode;
-  char class;
+  enum tree_code_class tclass;
   int len;
   int len;
-  int first_rtl;
   int i;
   int i;
+  expanded_location xloc;
+  enum tree_code code;
 
   if (node == 0)
     return;
 
 
   if (node == 0)
     return;
 
-  class = TREE_CODE_CLASS (TREE_CODE (node));
+  code = TREE_CODE (node);
+  tclass = TREE_CODE_CLASS (code);
 
   /* Don't get too deep in nesting.  If the user wants to see deeper,
      it is easy to use the address of a lowest-level node
 
   /* Don't get too deep in nesting.  If the user wants to see deeper,
      it is easy to use the address of a lowest-level node
@@ -188,49 +225,69 @@ print_node (file, prefix, node, indent)
       return;
     }
 
       return;
     }
 
-  if (indent > 8 && (class == 't' || class == 'd'))
+  if (indent > 8 && (tclass == tcc_type || tclass == tcc_declaration))
     {
       print_node_brief (file, prefix, node, indent);
       return;
     }
 
     {
       print_node_brief (file, prefix, node, indent);
       return;
     }
 
-  /* It is unsafe to look at any other filds of an ERROR_MARK node.  */
-  if (TREE_CODE (node) == ERROR_MARK)
+  /* It is unsafe to look at any other fields of an ERROR_MARK node.  */
+  if (code == ERROR_MARK)
     {
       print_node_brief (file, prefix, node, indent);
       return;
     }
 
     {
       print_node_brief (file, prefix, node, indent);
       return;
     }
 
-  hash = ((unsigned long) node) % HASH_SIZE;
+  /* Allow this function to be called if the table is not there.  */
+  if (table)
+    {
+      hash = ((unsigned long) node) % HASH_SIZE;
 
 
-  /* If node is in the table, just mention its address.  */
-  for (b = table[hash]; b; b = b->next)
-    if (b->node == node)
-      {
-       print_node_brief (file, prefix, node, indent);
-       return;
-      }
+      /* If node is in the table, just mention its address.  */
+      for (b = table[hash]; b; b = b->next)
+       if (b->node == node)
+         {
+           print_node_brief (file, prefix, node, indent);
+           return;
+         }
 
 
-  /* Add this node to the table.  */
-  b = (struct bucket *) xmalloc (sizeof (struct bucket));
-  b->node = node;
-  b->next = table[hash];
-  table[hash] = b;
+      /* Add this node to the table.  */
+      b = XNEW (struct bucket);
+      b->node = node;
+      b->next = table[hash];
+      table[hash] = b;
+    }
 
   /* Indent to the specified column, since this is the long form.  */
   indent_to (file, indent);
 
   /* Print the slot this node is in, and its code, and address.  */
 
   /* Indent to the specified column, since this is the long form.  */
   indent_to (file, indent);
 
   /* Print the slot this node is in, and its code, and address.  */
-  fprintf (file, "%s <%s ", prefix, tree_code_name[(int) TREE_CODE (node)]);
-  fprintf (file, HOST_PTR_PRINTF, (char *) node);
+  fprintf (file, "%s <%s", prefix, tree_code_name[(int) code]);
+  dump_addr (file, " ", node);
 
   /* Print the name, if any.  */
 
   /* Print the name, if any.  */
-  if (class == 'd')
+  if (tclass == tcc_declaration)
     {
       if (DECL_NAME (node))
        fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
     {
       if (DECL_NAME (node))
        fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
+      else if (code == LABEL_DECL
+              && LABEL_DECL_UID (node) != -1)
+       {
+         if (dump_flags & TDF_NOUID)
+           fprintf (file, " L.xxxx");
+         else
+           fprintf (file, " L.%d", (int) LABEL_DECL_UID (node));
+       }
+      else
+       {
+         if (dump_flags & TDF_NOUID)
+           fprintf (file, " %c.xxxx", code == CONST_DECL ? 'C' : 'D');
+         else
+           fprintf (file, " %c.%u", code == CONST_DECL ? 'C' : 'D',
+                    DECL_UID (node));
+       }
     }
     }
-  else if (class == 't')
+  else if (tclass == tcc_type)
     {
       if (TYPE_NAME (node))
        {
     {
       if (TYPE_NAME (node))
        {
@@ -242,10 +299,10 @@ print_node (file, prefix, node, indent)
                     IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
        }
     }
                     IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
        }
     }
-  if (TREE_CODE (node) == IDENTIFIER_NODE)
+  if (code == IDENTIFIER_NODE)
     fprintf (file, " %s", IDENTIFIER_POINTER (node));
 
     fprintf (file, " %s", IDENTIFIER_POINTER (node));
 
-  if (TREE_CODE (node) == INTEGER_CST)
+  if (code == INTEGER_CST)
     {
       if (indent <= 4)
        print_node_brief (file, "type", TREE_TYPE (node), indent + 4);
     {
       if (indent <= 4)
        print_node_brief (file, "type", TREE_TYPE (node), indent + 4);
@@ -257,24 +314,29 @@ print_node (file, prefix, node, indent)
        indent_to (file, indent + 3);
     }
 
        indent_to (file, indent + 3);
     }
 
-  if (TREE_SIDE_EFFECTS (node))
+  if (!TYPE_P (node) && TREE_SIDE_EFFECTS (node))
     fputs (" side-effects", file);
     fputs (" side-effects", file);
-  if (TREE_READONLY (node))
+
+  if (TYPE_P (node) ? TYPE_READONLY (node) : TREE_READONLY (node))
     fputs (" readonly", file);
     fputs (" readonly", file);
-  if (TREE_CONSTANT (node))
+  if (!TYPE_P (node) && TREE_CONSTANT (node))
     fputs (" constant", file);
     fputs (" constant", file);
+  else if (TYPE_P (node) && TYPE_SIZES_GIMPLIFIED (node))
+    fputs (" sizes-gimplified", file);
+
+  if (TYPE_P (node) && !ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
+    fprintf (file, " address-space-%d", TYPE_ADDR_SPACE (node));
+
   if (TREE_ADDRESSABLE (node))
     fputs (" addressable", file);
   if (TREE_THIS_VOLATILE (node))
     fputs (" volatile", file);
   if (TREE_ADDRESSABLE (node))
     fputs (" addressable", file);
   if (TREE_THIS_VOLATILE (node))
     fputs (" volatile", file);
-  if (TREE_UNSIGNED (node))
-    fputs (" unsigned", file);
   if (TREE_ASM_WRITTEN (node))
     fputs (" asm_written", file);
   if (TREE_USED (node))
     fputs (" used", file);
   if (TREE_NOTHROW (node))
   if (TREE_ASM_WRITTEN (node))
     fputs (" asm_written", file);
   if (TREE_USED (node))
     fputs (" used", file);
   if (TREE_NOTHROW (node))
-    fputs (" nothrow", file);
+    fputs (TYPE_P (node) ? " align-ok" : " nothrow", file);
   if (TREE_PUBLIC (node))
     fputs (" public", file);
   if (TREE_PRIVATE (node))
   if (TREE_PUBLIC (node))
     fputs (" public", file);
   if (TREE_PRIVATE (node))
@@ -285,6 +347,8 @@ print_node (file, prefix, node, indent)
     fputs (" static", file);
   if (TREE_DEPRECATED (node))
     fputs (" deprecated", file);
     fputs (" static", file);
   if (TREE_DEPRECATED (node))
     fputs (" deprecated", file);
+  if (TREE_VISITED (node))
+    fputs (" visited", file);
   if (TREE_LANG_FLAG_0 (node))
     fputs (" tree_0", file);
   if (TREE_LANG_FLAG_1 (node))
   if (TREE_LANG_FLAG_0 (node))
     fputs (" tree_0", file);
   if (TREE_LANG_FLAG_1 (node))
@@ -302,143 +366,186 @@ print_node (file, prefix, node, indent)
 
   /* DECL_ nodes have additional attributes.  */
 
 
   /* DECL_ nodes have additional attributes.  */
 
-  switch (TREE_CODE_CLASS (TREE_CODE (node)))
+  switch (TREE_CODE_CLASS (code))
     {
     {
-    case 'd':
-      mode = DECL_MODE (node);
-
-      if (DECL_IGNORED_P (node))
-       fputs (" ignored", file);
-      if (DECL_ABSTRACT (node))
-       fputs (" abstract", file);
-      if (DECL_IN_SYSTEM_HEADER (node))
-       fputs (" in_system_header", file);
-      if (DECL_COMMON (node))
-       fputs (" common", file);
-      if (DECL_EXTERNAL (node))
-       fputs (" external", file);
-      if (DECL_WEAK (node))
-       fputs (" weak", file);
-      if (DECL_REGISTER (node) && TREE_CODE (node) != FIELD_DECL
-         && TREE_CODE (node) != FUNCTION_DECL
-         && TREE_CODE (node) != LABEL_DECL)
+    case tcc_declaration:
+      if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
+       {
+         if (DECL_UNSIGNED (node))
+           fputs (" unsigned", file);
+         if (DECL_IGNORED_P (node))
+           fputs (" ignored", file);
+         if (DECL_ABSTRACT (node))
+           fputs (" abstract", file);
+         if (DECL_EXTERNAL (node))
+           fputs (" external", file);
+         if (DECL_NONLOCAL (node))
+           fputs (" nonlocal", file);
+       }
+      if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
+       {
+         if (DECL_WEAK (node))
+           fputs (" weak", file);
+         if (DECL_IN_SYSTEM_HEADER (node))
+           fputs (" in_system_header", file);
+       }
+      if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL)
+         && code != LABEL_DECL
+         && code != FUNCTION_DECL
+         && DECL_REGISTER (node))
        fputs (" regdecl", file);
        fputs (" regdecl", file);
-      if (DECL_NONLOCAL (node))
-       fputs (" nonlocal", file);
 
 
-      if (TREE_CODE (node) == TYPE_DECL && TYPE_DECL_SUPPRESS_DEBUG (node))
+      if (code == TYPE_DECL && TYPE_DECL_SUPPRESS_DEBUG (node))
        fputs (" suppress-debug", file);
 
        fputs (" suppress-debug", file);
 
-      if (TREE_CODE (node) == FUNCTION_DECL && DECL_INLINE (node))
-       fputs (" inline", file);
-      if (TREE_CODE (node) == FUNCTION_DECL && DECL_BUILT_IN (node))
+      if (code == FUNCTION_DECL
+         && DECL_FUNCTION_SPECIFIC_TARGET (node))
+       fputs (" function-specific-target", file);
+      if (code == FUNCTION_DECL
+         && DECL_FUNCTION_SPECIFIC_OPTIMIZATION (node))
+       fputs (" function-specific-opt", file);
+      if (code == FUNCTION_DECL && DECL_DECLARED_INLINE_P (node))
+       fputs (" autoinline", file);
+      if (code == FUNCTION_DECL && DECL_BUILT_IN (node))
        fputs (" built-in", file);
        fputs (" built-in", file);
-      if (TREE_CODE (node) == FUNCTION_DECL && DECL_BUILT_IN_NONANSI (node))
-       fputs (" built-in-nonansi", file);
-      if (TREE_CODE (node) == FUNCTION_DECL && DECL_NO_STATIC_CHAIN (node))
-       fputs (" no-static-chain", file);
+      if (code == FUNCTION_DECL && DECL_STATIC_CHAIN (node))
+       fputs (" static-chain", file);
 
 
-      if (TREE_CODE (node) == FIELD_DECL && DECL_PACKED (node))
+      if (code == FIELD_DECL && DECL_PACKED (node))
        fputs (" packed", file);
        fputs (" packed", file);
-      if (TREE_CODE (node) == FIELD_DECL && DECL_BIT_FIELD (node))
+      if (code == FIELD_DECL && DECL_BIT_FIELD (node))
        fputs (" bit-field", file);
        fputs (" bit-field", file);
-      if (TREE_CODE (node) == FIELD_DECL && DECL_NONADDRESSABLE_P (node))
+      if (code == FIELD_DECL && DECL_NONADDRESSABLE_P (node))
        fputs (" nonaddressable", file);
 
        fputs (" nonaddressable", file);
 
-      if (TREE_CODE (node) == LABEL_DECL && DECL_TOO_LATE (node))
-       fputs (" too-late", file);
-      if (TREE_CODE (node) == LABEL_DECL && DECL_ERROR_ISSUED (node))
+      if (code == LABEL_DECL && DECL_ERROR_ISSUED (node))
        fputs (" error-issued", file);
        fputs (" error-issued", file);
+      if (code == LABEL_DECL && EH_LANDING_PAD_NR (node))
+       fprintf (file, " landing-pad:%d", EH_LANDING_PAD_NR (node));
 
 
-      if (TREE_CODE (node) == VAR_DECL && DECL_IN_TEXT_SECTION (node))
+      if (code == VAR_DECL && DECL_IN_TEXT_SECTION (node))
        fputs (" in-text-section", file);
        fputs (" in-text-section", file);
-      if (TREE_CODE (node) == VAR_DECL && DECL_THREAD_LOCAL (node))
-       fputs (" thread-local", file);
+      if (code == VAR_DECL && DECL_COMMON (node))
+       fputs (" common", file);
+      if (code == VAR_DECL && DECL_THREAD_LOCAL_P (node))
+       {
+         enum tls_model kind = DECL_TLS_MODEL (node);
+         switch (kind)
+           {
+             case TLS_MODEL_GLOBAL_DYNAMIC:
+               fputs (" tls-global-dynamic", file);
+               break;
+             case TLS_MODEL_LOCAL_DYNAMIC:
+               fputs (" tls-local-dynamic", file);
+               break;
+             case TLS_MODEL_INITIAL_EXEC:
+               fputs (" tls-initial-exec", file);
+               break;
+             case TLS_MODEL_LOCAL_EXEC:
+               fputs (" tls-local-exec", file);
+               break;
+             default:
+               gcc_unreachable ();
+           }
+       }
 
 
-      if (TREE_CODE (node) == PARM_DECL && DECL_TRANSPARENT_UNION (node))
-       fputs (" transparent-union", file);
+      if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
+       {
+         if (DECL_VIRTUAL_P (node))
+           fputs (" virtual", file);
+         if (DECL_PRESERVE_P (node))
+           fputs (" preserve", file);
+         if (DECL_LANG_FLAG_0 (node))
+           fputs (" decl_0", file);
+         if (DECL_LANG_FLAG_1 (node))
+           fputs (" decl_1", file);
+         if (DECL_LANG_FLAG_2 (node))
+           fputs (" decl_2", file);
+         if (DECL_LANG_FLAG_3 (node))
+           fputs (" decl_3", file);
+         if (DECL_LANG_FLAG_4 (node))
+           fputs (" decl_4", file);
+         if (DECL_LANG_FLAG_5 (node))
+           fputs (" decl_5", file);
+         if (DECL_LANG_FLAG_6 (node))
+           fputs (" decl_6", file);
+         if (DECL_LANG_FLAG_7 (node))
+           fputs (" decl_7", file);
+
+         mode = DECL_MODE (node);
+         fprintf (file, " %s", GET_MODE_NAME (mode));
+       }
 
 
-      if (DECL_VIRTUAL_P (node))
-       fputs (" virtual", file);
-      if (DECL_DEFER_OUTPUT (node))
+      if ((code == VAR_DECL || code == PARM_DECL || code == RESULT_DECL)
+         && DECL_BY_REFERENCE (node))
+       fputs (" passed-by-reference", file);
+
+      if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS)  && DECL_DEFER_OUTPUT (node))
        fputs (" defer-output", file);
 
        fputs (" defer-output", file);
 
-      if (DECL_LANG_FLAG_0 (node))
-       fputs (" decl_0", file);
-      if (DECL_LANG_FLAG_1 (node))
-       fputs (" decl_1", file);
-      if (DECL_LANG_FLAG_2 (node))
-       fputs (" decl_2", file);
-      if (DECL_LANG_FLAG_3 (node))
-       fputs (" decl_3", file);
-      if (DECL_LANG_FLAG_4 (node))
-       fputs (" decl_4", file);
-      if (DECL_LANG_FLAG_5 (node))
-       fputs (" decl_5", file);
-      if (DECL_LANG_FLAG_6 (node))
-       fputs (" decl_6", file);
-      if (DECL_LANG_FLAG_7 (node))
-       fputs (" decl_7", file);
 
 
-      fprintf (file, " %s", GET_MODE_NAME (mode));
-      fprintf (file, " file %s line %d",
-              DECL_SOURCE_FILE (node), DECL_SOURCE_LINE (node));
+      xloc = expand_location (DECL_SOURCE_LOCATION (node));
+      fprintf (file, " file %s line %d col %d", xloc.file, xloc.line,
+              xloc.column);
 
 
-      print_node (file, "size", DECL_SIZE (node), indent + 4);
-      print_node (file, "unit size", DECL_SIZE_UNIT (node), indent + 4);
+      if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
+       {
+         print_node (file, "size", DECL_SIZE (node), indent + 4);
+         print_node (file, "unit size", DECL_SIZE_UNIT (node), indent + 4);
 
 
-      if (TREE_CODE (node) != FUNCTION_DECL
-         || DECL_INLINE (node) || DECL_BUILT_IN (node))
-       indent_to (file, indent + 3);
+         if (code != FUNCTION_DECL || DECL_BUILT_IN (node))
+           indent_to (file, indent + 3);
 
 
-      if (TREE_CODE (node) != FUNCTION_DECL)
-       {
          if (DECL_USER_ALIGN (node))
            fprintf (file, " user");
 
          fprintf (file, " align %d", DECL_ALIGN (node));
          if (DECL_USER_ALIGN (node))
            fprintf (file, " user");
 
          fprintf (file, " align %d", DECL_ALIGN (node));
-         if (TREE_CODE (node) == FIELD_DECL)
+         if (code == FIELD_DECL)
+           fprintf (file, " offset_align " HOST_WIDE_INT_PRINT_UNSIGNED,
+                    DECL_OFFSET_ALIGN (node));
+
+         if (code == FUNCTION_DECL && DECL_BUILT_IN (node))
            {
            {
-             fprintf (file, " offset_align ");
-             fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED,
-                      DECL_OFFSET_ALIGN (node));
+             if (DECL_BUILT_IN_CLASS (node) == BUILT_IN_MD)
+               fprintf (file, " built-in BUILT_IN_MD %d", DECL_FUNCTION_CODE (node));
+             else
+               fprintf (file, " built-in %s:%s",
+                        built_in_class_names[(int) DECL_BUILT_IN_CLASS (node)],
+                        built_in_names[(int) DECL_FUNCTION_CODE (node)]);
            }
        }
            }
        }
-      else if (DECL_BUILT_IN (node))
-       {
-         if (DECL_BUILT_IN_CLASS (node) == BUILT_IN_MD)
-           fprintf (file, " built-in BUILT_IN_MD %d", DECL_FUNCTION_CODE (node));
-         else
-           fprintf (file, " built-in %s:%s",
-                    built_in_class_names[(int) DECL_BUILT_IN_CLASS (node)],
-                    built_in_names[(int) DECL_FUNCTION_CODE (node)]);
-       }
-
-      if (DECL_POINTER_ALIAS_SET_KNOWN_P (node))
-       {
-         fprintf (file, " alias set ");
-         fprintf (file, HOST_WIDE_INT_PRINT_DEC,
-                  DECL_POINTER_ALIAS_SET (node));
-       }
-
-      if (TREE_CODE (node) == FIELD_DECL)
+      if (code == FIELD_DECL)
        {
          print_node (file, "offset", DECL_FIELD_OFFSET (node), indent + 4);
          print_node (file, "bit offset", DECL_FIELD_BIT_OFFSET (node),
                      indent + 4);
        {
          print_node (file, "offset", DECL_FIELD_OFFSET (node), indent + 4);
          print_node (file, "bit offset", DECL_FIELD_BIT_OFFSET (node),
                      indent + 4);
+         if (DECL_BIT_FIELD_TYPE (node))
+           print_node (file, "bit_field_type", DECL_BIT_FIELD_TYPE (node),
+                       indent + 4);
        }
 
       print_node_brief (file, "context", DECL_CONTEXT (node), indent + 4);
        }
 
       print_node_brief (file, "context", DECL_CONTEXT (node), indent + 4);
-      print_node_brief (file, "attributes",
-                       DECL_ATTRIBUTES (node), indent + 4);
-      print_node_brief (file, "abstract_origin",
-                       DECL_ABSTRACT_ORIGIN (node), indent + 4);
 
 
-      print_node (file, "arguments", DECL_ARGUMENTS (node), indent + 4);
-      print_node (file, "result", DECL_RESULT_FLD (node), indent + 4);
-      print_node_brief (file, "initial", DECL_INITIAL (node), indent + 4);
+      if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
+       {
+         print_node_brief (file, "attributes",
+                           DECL_ATTRIBUTES (node), indent + 4);
+         if (code != PARM_DECL)
+           print_node_brief (file, "initial", DECL_INITIAL (node),
+                             indent + 4);
+       }
+      if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
+       {
+         print_node_brief (file, "abstract_origin",
+                           DECL_ABSTRACT_ORIGIN (node), indent + 4);
+       }
+      if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
+       {
+         print_node (file, "arguments", DECL_ARGUMENT_FLD (node), indent + 4);
+         print_node (file, "result", DECL_RESULT_FLD (node), indent + 4);
+       }
 
 
-      (*lang_hooks.print_decl) (file, node, indent);
+      lang_hooks.print_decl (file, node, indent);
 
       if (DECL_RTL_SET_P (node))
        {
 
       if (DECL_RTL_SET_P (node))
        {
@@ -446,11 +553,9 @@ print_node (file, prefix, node, indent)
          print_rtl (file, DECL_RTL (node));
        }
 
          print_rtl (file, DECL_RTL (node));
        }
 
-      if (TREE_CODE (node) == PARM_DECL)
+      if (code == PARM_DECL)
        {
          print_node (file, "arg-type", DECL_ARG_TYPE (node), indent + 4);
        {
          print_node (file, "arg-type", DECL_ARG_TYPE (node), indent + 4);
-         print_node (file, "arg-type-as-written",
-                     DECL_ARG_TYPE_AS_WRITTEN (node), indent + 4);
 
          if (DECL_INCOMING_RTL (node) != 0)
            {
 
          if (DECL_INCOMING_RTL (node) != 0)
            {
@@ -459,14 +564,17 @@ print_node (file, prefix, node, indent)
              print_rtl (file, DECL_INCOMING_RTL (node));
            }
        }
              print_rtl (file, DECL_INCOMING_RTL (node));
            }
        }
-      else if (TREE_CODE (node) == FUNCTION_DECL
-              && DECL_SAVED_INSNS (node) != 0)
+      else if (code == FUNCTION_DECL
+              && DECL_STRUCT_FUNCTION (node) != 0)
        {
          indent_to (file, indent + 4);
        {
          indent_to (file, indent + 4);
-         fprintf (file, "saved-insns ");
-         fprintf (file, HOST_PTR_PRINTF, (char *) DECL_SAVED_INSNS (node));
+         dump_addr (file, "struct-function ", DECL_STRUCT_FUNCTION (node));
        }
 
        }
 
+      if ((code == VAR_DECL || code == PARM_DECL)
+         && DECL_HAS_VALUE_EXPR_P (node))
+       print_node (file, "value-expr", DECL_VALUE_EXPR (node), indent + 4);
+
       /* Print the decl chain only if decl is at second level.  */
       if (indent == 4)
        print_node (file, "chain", TREE_CHAIN (node), indent + 4);
       /* Print the decl chain only if decl is at second level.  */
       if (indent == 4)
        print_node (file, "chain", TREE_CHAIN (node), indent + 4);
@@ -474,20 +582,20 @@ print_node (file, prefix, node, indent)
        print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
       break;
 
        print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
       break;
 
-    case 't':
+    case tcc_type:
+      if (TYPE_UNSIGNED (node))
+       fputs (" unsigned", file);
+
       /* The no-force-blk flag is used for different things in
         different types.  */
       /* The no-force-blk flag is used for different things in
         different types.  */
-      if ((TREE_CODE (node) == RECORD_TYPE
-          || TREE_CODE (node) == UNION_TYPE
-          || TREE_CODE (node) == QUAL_UNION_TYPE)
+      if ((code == RECORD_TYPE
+          || code == UNION_TYPE
+          || code == QUAL_UNION_TYPE)
          && TYPE_NO_FORCE_BLK (node))
        fputs (" no-force-blk", file);
          && TYPE_NO_FORCE_BLK (node))
        fputs (" no-force-blk", file);
-      else if (TREE_CODE (node) == INTEGER_TYPE
+      else if (code == INTEGER_TYPE
               && TYPE_IS_SIZETYPE (node))
        fputs (" sizetype", file);
               && TYPE_IS_SIZETYPE (node))
        fputs (" sizetype", file);
-      else if (TREE_CODE (node) == FUNCTION_TYPE
-              && TYPE_RETURNS_STACK_DEPRESSED (node))
-       fputs (" returns-stack-depressed", file);
 
       if (TYPE_STRING_FLAG (node))
        fputs (" string-flag", file);
 
       if (TYPE_STRING_FLAG (node))
        fputs (" string-flag", file);
@@ -496,18 +604,19 @@ print_node (file, prefix, node, indent)
 
       /* The transparent-union flag is used for different things in
         different nodes.  */
 
       /* The transparent-union flag is used for different things in
         different nodes.  */
-      if (TREE_CODE (node) == UNION_TYPE && TYPE_TRANSPARENT_UNION (node))
-       fputs (" transparent-union", file);
-      else if (TREE_CODE (node) == ARRAY_TYPE
+      if ((code == UNION_TYPE || code == RECORD_TYPE)
+         && TYPE_TRANSPARENT_AGGR (node))
+       fputs (" transparent-aggr", file);
+      else if (code == ARRAY_TYPE
               && TYPE_NONALIASED_COMPONENT (node))
        fputs (" nonaliased-component", file);
               && TYPE_NONALIASED_COMPONENT (node))
        fputs (" nonaliased-component", file);
-      else if (TREE_CODE (node) == FUNCTION_TYPE
-              && TYPE_AMBIENT_BOUNDEDNESS (node))
-       fputs (" ambient-boundedness", file);
 
       if (TYPE_PACKED (node))
        fputs (" packed", file);
 
 
       if (TYPE_PACKED (node))
        fputs (" packed", file);
 
+      if (TYPE_RESTRICT (node))
+       fputs (" restrict", file);
+
       if (TYPE_LANG_FLAG_0 (node))
        fputs (" type_0", file);
       if (TYPE_LANG_FLAG_1 (node))
       if (TYPE_LANG_FLAG_0 (node))
        fputs (" type_0", file);
       if (TYPE_LANG_FLAG_1 (node))
@@ -533,44 +642,51 @@ print_node (file, prefix, node, indent)
       if (TYPE_USER_ALIGN (node))
        fprintf (file, " user");
 
       if (TYPE_USER_ALIGN (node))
        fprintf (file, " user");
 
-      fprintf (file, " align %d", TYPE_ALIGN (node));
-      fprintf (file, " symtab %d", TYPE_SYMTAB_ADDRESS (node));
-      fprintf (file, " alias set ");
-      fprintf (file, HOST_WIDE_INT_PRINT_DEC, TYPE_ALIAS_SET (node));
+      fprintf (file, " align %d symtab %d alias set " HOST_WIDE_INT_PRINT_DEC,
+              TYPE_ALIGN (node), TYPE_SYMTAB_ADDRESS (node),
+              (HOST_WIDE_INT) TYPE_ALIAS_SET (node));
+
+      if (TYPE_STRUCTURAL_EQUALITY_P (node))
+       fprintf (file, " structural equality");
+      else
+       dump_addr (file, " canonical type ", TYPE_CANONICAL (node));
 
       print_node (file, "attributes", TYPE_ATTRIBUTES (node), indent + 4);
 
 
       print_node (file, "attributes", TYPE_ATTRIBUTES (node), indent + 4);
 
-      if (INTEGRAL_TYPE_P (node) || TREE_CODE (node) == REAL_TYPE)
+      if (INTEGRAL_TYPE_P (node) || code == REAL_TYPE
+         || code == FIXED_POINT_TYPE)
        {
          fprintf (file, " precision %d", TYPE_PRECISION (node));
          print_node_brief (file, "min", TYPE_MIN_VALUE (node), indent + 4);
          print_node_brief (file, "max", TYPE_MAX_VALUE (node), indent + 4);
        }
 
        {
          fprintf (file, " precision %d", TYPE_PRECISION (node));
          print_node_brief (file, "min", TYPE_MIN_VALUE (node), indent + 4);
          print_node_brief (file, "max", TYPE_MAX_VALUE (node), indent + 4);
        }
 
-      if (TREE_CODE (node) == ENUMERAL_TYPE)
+      if (code == ENUMERAL_TYPE)
        print_node (file, "values", TYPE_VALUES (node), indent + 4);
        print_node (file, "values", TYPE_VALUES (node), indent + 4);
-      else if (TREE_CODE (node) == ARRAY_TYPE || TREE_CODE (node) == SET_TYPE)
+      else if (code == ARRAY_TYPE)
        print_node (file, "domain", TYPE_DOMAIN (node), indent + 4);
        print_node (file, "domain", TYPE_DOMAIN (node), indent + 4);
-      else if (TREE_CODE (node) == RECORD_TYPE
-              || TREE_CODE (node) == UNION_TYPE
-              || TREE_CODE (node) == QUAL_UNION_TYPE)
+      else if (code == VECTOR_TYPE)
+       fprintf (file, " nunits %d", (int) TYPE_VECTOR_SUBPARTS (node));
+      else if (code == RECORD_TYPE
+              || code == UNION_TYPE
+              || code == QUAL_UNION_TYPE)
        print_node (file, "fields", TYPE_FIELDS (node), indent + 4);
        print_node (file, "fields", TYPE_FIELDS (node), indent + 4);
-      else if (TREE_CODE (node) == FUNCTION_TYPE
-              || TREE_CODE (node) == METHOD_TYPE)
+      else if (code == FUNCTION_TYPE
+              || code == METHOD_TYPE)
        {
          if (TYPE_METHOD_BASETYPE (node))
            print_node_brief (file, "method basetype",
                              TYPE_METHOD_BASETYPE (node), indent + 4);
          print_node (file, "arg-types", TYPE_ARG_TYPES (node), indent + 4);
        }
        {
          if (TYPE_METHOD_BASETYPE (node))
            print_node_brief (file, "method basetype",
                              TYPE_METHOD_BASETYPE (node), indent + 4);
          print_node (file, "arg-types", TYPE_ARG_TYPES (node), indent + 4);
        }
-      else if (TREE_CODE (node) == OFFSET_TYPE)
+      else if (code == OFFSET_TYPE)
        print_node_brief (file, "basetype", TYPE_OFFSET_BASETYPE (node),
                          indent + 4);
 
       if (TYPE_CONTEXT (node))
        print_node_brief (file, "context", TYPE_CONTEXT (node), indent + 4);
 
        print_node_brief (file, "basetype", TYPE_OFFSET_BASETYPE (node),
                          indent + 4);
 
       if (TYPE_CONTEXT (node))
        print_node_brief (file, "context", TYPE_CONTEXT (node), indent + 4);
 
-      (*lang_hooks.print_type) (file, node, indent);
+      lang_hooks.print_type (file, node, indent);
 
       if (TYPE_POINTER_TO (node) || TREE_CHAIN (node))
        indent_to (file, indent + 3);
 
       if (TYPE_POINTER_TO (node) || TREE_CHAIN (node))
        indent_to (file, indent + 3);
@@ -582,48 +698,41 @@ print_node (file, prefix, node, indent)
       print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
       break;
 
       print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
       break;
 
-    case 'b':
-      print_node (file, "vars", BLOCK_VARS (node), indent + 4);
-      print_node (file, "supercontext", BLOCK_SUPERCONTEXT (node), indent + 4);
-      print_node (file, "subblocks", BLOCK_SUBBLOCKS (node), indent + 4);
-      print_node (file, "chain", BLOCK_CHAIN (node), indent + 4);
-      print_node (file, "abstract_origin",
-                 BLOCK_ABSTRACT_ORIGIN (node), indent + 4);
-      break;
-
-    case 'e':
-    case '<':
-    case '1':
-    case '2':
-    case 'r':
-    case 's':
-      if (TREE_CODE (node) == BIND_EXPR)
+    case tcc_expression:
+    case tcc_comparison:
+    case tcc_unary:
+    case tcc_binary:
+    case tcc_reference:
+    case tcc_statement:
+    case tcc_vl_exp:
+      if (code == BIND_EXPR)
        {
          print_node (file, "vars", TREE_OPERAND (node, 0), indent + 4);
          print_node (file, "body", TREE_OPERAND (node, 1), indent + 4);
          print_node (file, "block", TREE_OPERAND (node, 2), indent + 4);
          break;
        }
        {
          print_node (file, "vars", TREE_OPERAND (node, 0), indent + 4);
          print_node (file, "body", TREE_OPERAND (node, 1), indent + 4);
          print_node (file, "block", TREE_OPERAND (node, 2), indent + 4);
          break;
        }
-
-      len = TREE_CODE_LENGTH (TREE_CODE (node));
-
-      /* Some nodes contain rtx's, not trees,
-        after a certain point.  Print the rtx's as rtx's.  */
-      first_rtl = first_rtl_op (TREE_CODE (node));
-
-      for (i = 0; i < len; i++)
+      if (code == CALL_EXPR)
        {
        {
-         if (i >= first_rtl)
+         call_expr_arg_iterator iter;
+         tree arg;
+         print_node (file, "fn", CALL_EXPR_FN (node), indent + 4);
+         print_node (file, "static_chain", CALL_EXPR_STATIC_CHAIN (node),
+                     indent + 4);
+         i = 0;
+         FOR_EACH_CALL_EXPR_ARG (arg, iter, node)
            {
            {
-             indent_to (file, indent + 4);
-             fprintf (file, "rtl %d ", i);
-             if (TREE_OPERAND (node, i))
-               print_rtl (file, (struct rtx_def *) TREE_OPERAND (node, i));
-             else
-               fprintf (file, "(nil)");
-             fprintf (file, "\n");
+             char temp[10];
+             sprintf (temp, "arg %d", i);
+             print_node (file, temp, arg, indent + 4);
+             i++;
            }
            }
-         else
+       }
+      else
+       {
+         len = TREE_OPERAND_LENGTH (node);
+
+         for (i = 0; i < len; i++)
            {
              char temp[10];
 
            {
              char temp[10];
 
@@ -631,24 +740,15 @@ print_node (file, prefix, node, indent)
              print_node (file, temp, TREE_OPERAND (node, i), indent + 4);
            }
        }
              print_node (file, temp, TREE_OPERAND (node, i), indent + 4);
            }
        }
-
-      if (TREE_CODE (node) == EXPR_WITH_FILE_LOCATION)
-       {
-         indent_to (file, indent+4);
-         fprintf (file, "%s:%d:%d",
-                  (EXPR_WFL_FILENAME_NODE (node ) ?
-                   EXPR_WFL_FILENAME (node) : "(no file info)"),
-                  EXPR_WFL_LINENO (node), EXPR_WFL_COLNO (node));
-       }
       print_node (file, "chain", TREE_CHAIN (node), indent + 4);
       break;
 
       print_node (file, "chain", TREE_CHAIN (node), indent + 4);
       break;
 
-    case 'c':
-    case 'x':
-      switch (TREE_CODE (node))
+    case tcc_constant:
+    case tcc_exceptional:
+      switch (code)
        {
        case INTEGER_CST:
        {
        case INTEGER_CST:
-         if (TREE_CONSTANT_OVERFLOW (node))
+         if (TREE_OVERFLOW (node))
            fprintf (file, " overflow");
 
          fprintf (file, " ");
            fprintf (file, " overflow");
 
          fprintf (file, " ");
@@ -657,14 +757,12 @@ print_node (file, prefix, node, indent)
                     TREE_INT_CST_LOW (node));
          else if (TREE_INT_CST_HIGH (node) == -1
                   && TREE_INT_CST_LOW (node) != 0)
                     TREE_INT_CST_LOW (node));
          else if (TREE_INT_CST_HIGH (node) == -1
                   && TREE_INT_CST_LOW (node) != 0)
-           {
-             fprintf (file, "-");
-             fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED,
-                      -TREE_INT_CST_LOW (node));
-           }
+           fprintf (file, "-" HOST_WIDE_INT_PRINT_UNSIGNED,
+                    -TREE_INT_CST_LOW (node));
          else
            fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
          else
            fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
-                    TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
+                    (unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (node),
+                    (unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (node));
          break;
 
        case REAL_CST:
          break;
 
        case REAL_CST:
@@ -676,19 +774,32 @@ print_node (file, prefix, node, indent)
 
            d = TREE_REAL_CST (node);
            if (REAL_VALUE_ISINF (d))
 
            d = TREE_REAL_CST (node);
            if (REAL_VALUE_ISINF (d))
-             fprintf (file, " Inf");
+             fprintf (file,  REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
            else if (REAL_VALUE_ISNAN (d))
              fprintf (file, " Nan");
            else
              {
            else if (REAL_VALUE_ISNAN (d))
              fprintf (file, " Nan");
            else
              {
-               char string[100];
-
-               REAL_VALUE_TO_DECIMAL (d, "%e", string);
+               char string[64];
+               real_to_decimal (string, &d, sizeof (string), 0, 1);
                fprintf (file, " %s", string);
              }
          }
          break;
 
                fprintf (file, " %s", string);
              }
          }
          break;
 
+       case FIXED_CST:
+         {
+           FIXED_VALUE_TYPE f;
+           char string[64];
+
+           if (TREE_OVERFLOW (node))
+             fprintf (file, " overflow");
+
+           f = TREE_FIXED_CST (node);
+           fixed_to_decimal (string, &f, sizeof (string));
+           fprintf (file, " %s", string);
+         }
+         break;
+
        case VECTOR_CST:
          {
            tree vals = TREE_VECTOR_CST_ELTS (node);
        case VECTOR_CST:
          {
            tree vals = TREE_VECTOR_CST_ELTS (node);
@@ -711,7 +822,20 @@ print_node (file, prefix, node, indent)
          break;
 
        case STRING_CST:
          break;
 
        case STRING_CST:
-         fprintf (file, " \"%s\"", TREE_STRING_POINTER (node));
+         {
+           const char *p = TREE_STRING_POINTER (node);
+           int i = TREE_STRING_LENGTH (node);
+           fputs (" \"", file);
+           while (--i >= 0)
+             {
+               char ch = *p++;
+               if (ch >= ' ' && ch < 127)
+                 putc (ch, file);
+               else
+                 fprintf(file, "\\%03o", ch & 0xFF);
+             }
+           fputc ('\"', file);
+         }
          /* Print the chain at second level.  */
          if (indent == 4)
            print_node (file, "chain", TREE_CHAIN (node), indent + 4);
          /* Print the chain at second level.  */
          if (indent == 4)
            print_node (file, "chain", TREE_CHAIN (node), indent + 4);
@@ -720,7 +844,7 @@ print_node (file, prefix, node, indent)
          break;
 
        case IDENTIFIER_NODE:
          break;
 
        case IDENTIFIER_NODE:
-         (*lang_hooks.print_identifier) (file, node, indent);
+         lang_hooks.print_identifier (file, node, indent);
          break;
 
        case TREE_LIST:
          break;
 
        case TREE_LIST:
@@ -741,14 +865,117 @@ print_node (file, prefix, node, indent)
              }
          break;
 
              }
          break;
 
+       case CONSTRUCTOR:
+         {
+           unsigned HOST_WIDE_INT cnt;
+           tree index, value;
+           len = VEC_length (constructor_elt, CONSTRUCTOR_ELTS (node));
+           fprintf (file, " lngt %d", len);
+           FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node),
+                                     cnt, index, value)
+             {
+               print_node (file, "idx", index, indent + 4);
+               print_node (file, "val", value, indent + 4);
+             }
+         }
+         break;
+
+       case STATEMENT_LIST:
+         dump_addr (file, " head ", node->stmt_list.head);
+         dump_addr (file, " tail ", node->stmt_list.tail);
+         fprintf (file, " stmts");
+         {
+           tree_stmt_iterator i;
+           for (i = tsi_start (node); !tsi_end_p (i); tsi_next (&i))
+             {
+               /* Not printing the addresses of the (not-a-tree)
+                  'struct tree_stmt_list_node's.  */
+               dump_addr (file, " ", tsi_stmt (i));
+             }
+           fprintf (file, "\n");
+           for (i = tsi_start (node); !tsi_end_p (i); tsi_next (&i))
+             {
+               /* Not printing the addresses of the (not-a-tree)
+                  'struct tree_stmt_list_node's.  */
+               print_node (file, "stmt", tsi_stmt (i), indent + 4);
+             }
+         }
+         print_node (file, "chain", TREE_CHAIN (node), indent + 4);
+         break;
+
+       case BLOCK:
+         print_node (file, "vars", BLOCK_VARS (node), indent + 4);
+         print_node (file, "supercontext", BLOCK_SUPERCONTEXT (node),
+                     indent + 4);
+         print_node (file, "subblocks", BLOCK_SUBBLOCKS (node), indent + 4);
+         print_node (file, "chain", BLOCK_CHAIN (node), indent + 4);
+         print_node (file, "abstract_origin",
+                     BLOCK_ABSTRACT_ORIGIN (node), indent + 4);
+         break;
+
+       case SSA_NAME:
+         print_node_brief (file, "var", SSA_NAME_VAR (node), indent + 4);
+         fprintf (file, "def_stmt ");
+         print_gimple_stmt (file, SSA_NAME_DEF_STMT (node), indent + 4, 0);
+
+         indent_to (file, indent + 4);
+         fprintf (file, "version %u", SSA_NAME_VERSION (node));
+         if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
+           fprintf (file, " in-abnormal-phi");
+         if (SSA_NAME_IN_FREE_LIST (node))
+           fprintf (file, " in-free-list");
+
+         if (SSA_NAME_PTR_INFO (node))
+           {
+             indent_to (file, indent + 3);
+             if (SSA_NAME_PTR_INFO (node))
+               dump_addr (file, " ptr-info ", SSA_NAME_PTR_INFO (node));
+           }
+         break;
+
+       case OMP_CLAUSE:
+           {
+             int i;
+             fprintf (file, " %s",
+                      omp_clause_code_name[OMP_CLAUSE_CODE (node)]);
+             for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (node)]; i++)
+               {
+                 indent_to (file, indent + 4);
+                 fprintf (file, "op %d:", i);
+                 print_node_brief (file, "", OMP_CLAUSE_OPERAND (node, i), 0);
+               }
+           }
+         break;
+
+       case OPTIMIZATION_NODE:
+         cl_optimization_print (file, indent + 4, TREE_OPTIMIZATION (node));
+         break;
+
+       case TARGET_OPTION_NODE:
+         cl_target_option_print (file, indent + 4, TREE_TARGET_OPTION (node));
+         break;
+       case IMPORTED_DECL:
+         fprintf (file, " imported declaration");
+         print_node_brief (file, "associated declaration",
+                           IMPORTED_DECL_ASSOCIATED_DECL (node),
+                           indent + 4);
+         break;
+
        default:
        default:
-         if (TREE_CODE_CLASS (TREE_CODE (node)) == 'x')
-           (*lang_hooks.print_xnode) (file, node, indent);
+         if (EXCEPTIONAL_CLASS_P (node))
+           lang_hooks.print_xnode (file, node, indent);
          break;
        }
 
       break;
     }
 
          break;
        }
 
       break;
     }
 
+  if (EXPR_HAS_LOCATION (node))
+    {
+      expanded_location xloc = expand_location (EXPR_LOCATION (node));
+      indent_to (file, indent+4);
+      fprintf (file, "%s:%d:%d", xloc.file, xloc.line, xloc.column);
+    }
+
   fprintf (file, ">");
 }
   fprintf (file, ">");
 }