118334Speter/* Prints out trees in human readable form.
290290Sobrien   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998,
3169699Skan   1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
418334Speter   Hacked by Michael Tiemann (tiemann@cygnus.com)
518334Speter
6132748SkanThis file is part of GCC.
718334Speter
8132748SkanGCC is free software; you can redistribute it and/or modify
918334Speterit under the terms of the GNU General Public License as published by
1018334Speterthe Free Software Foundation; either version 2, or (at your option)
1118334Speterany later version.
1218334Speter
13132748SkanGCC is distributed in the hope that it will be useful,
1418334Speterbut WITHOUT ANY WARRANTY; without even the implied warranty of
1518334SpeterMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1618334SpeterGNU General Public License for more details.
1718334Speter
1818334SpeterYou should have received a copy of the GNU General Public License
19132748Skanalong with GCC; see the file COPYING.  If not, write to
20169699Skanthe Free Software Foundation, 51 Franklin Street, Fifth Floor,
21169699SkanBoston, MA 02110-1301, USA.  */
2218334Speter
2351412Sobrien/* $FreeBSD$ */
2418334Speter
2518334Speter#include "config.h"
2651412Sobrien#include "system.h"
27132748Skan#include "coretypes.h"
28132748Skan#include "tm.h"
2918334Speter#include "tree.h"
3018334Speter#include "cp-tree.h"
3118334Speter
3218334Spetervoid
33132748Skancxx_print_decl (FILE *file, tree node, int indent)
3418334Speter{
3590290Sobrien  if (TREE_CODE (node) == FIELD_DECL)
3618334Speter    {
3790290Sobrien      if (DECL_MUTABLE_P (node))
3890290Sobrien	{
3990290Sobrien	  indent_to (file, indent + 3);
4090290Sobrien	  fprintf (file, " mutable ");
4190290Sobrien	}
4290290Sobrien      return;
4318334Speter    }
4490290Sobrien
45169699Skan  if (!CODE_CONTAINS_STRUCT (TREE_CODE (node), TS_DECL_COMMON)
46169699Skan      || !DECL_LANG_SPECIFIC (node))
4718334Speter    return;
4818334Speter  indent_to (file, indent + 3);
4990290Sobrien  if (TREE_CODE (node) == FUNCTION_DECL
5090290Sobrien      && DECL_PENDING_INLINE_INFO (node))
51169699Skan    fprintf (file, " pending-inline-info %p",
52169699Skan	     (void *) DECL_PENDING_INLINE_INFO (node));
5390290Sobrien  if (TREE_CODE (node) == TYPE_DECL
5490290Sobrien      && DECL_SORTED_FIELDS (node))
55169699Skan    fprintf (file, " sorted-fields %p",
56169699Skan	     (void *) DECL_SORTED_FIELDS (node));
5790290Sobrien  if ((TREE_CODE (node) == FUNCTION_DECL || TREE_CODE (node) == VAR_DECL)
5890290Sobrien      && DECL_TEMPLATE_INFO (node))
59169699Skan    fprintf (file, " template-info %p",
60169699Skan	     (void *) DECL_TEMPLATE_INFO (node));
6118334Speter}
6218334Speter
6318334Spetervoid
64132748Skancxx_print_type (FILE *file, tree node, int indent)
6518334Speter{
6690290Sobrien  switch (TREE_CODE (node))
6718334Speter    {
6890290Sobrien    case TEMPLATE_TYPE_PARM:
6990290Sobrien    case TEMPLATE_TEMPLATE_PARM:
7090290Sobrien    case BOUND_TEMPLATE_TEMPLATE_PARM:
7151412Sobrien      indent_to (file, indent + 3);
72132748Skan      fprintf (file, "index " HOST_WIDE_INT_PRINT_DEC " level "
73132748Skan	       HOST_WIDE_INT_PRINT_DEC " orig_level " HOST_WIDE_INT_PRINT_DEC,
74132748Skan	       TEMPLATE_TYPE_IDX (node), TEMPLATE_TYPE_LEVEL (node),
75132748Skan	       TEMPLATE_TYPE_ORIG_LEVEL (node));
7618334Speter      return;
7790290Sobrien
7890290Sobrien    case FUNCTION_TYPE:
7990290Sobrien    case METHOD_TYPE:
8090290Sobrien      if (TYPE_RAISES_EXCEPTIONS (node))
8190290Sobrien	print_node (file, "throws", TYPE_RAISES_EXCEPTIONS (node), indent + 4);
8290290Sobrien      return;
8390290Sobrien
8490290Sobrien    case RECORD_TYPE:
8590290Sobrien    case UNION_TYPE:
8690290Sobrien      break;
8790290Sobrien
8890290Sobrien    default:
8990290Sobrien      return;
9018334Speter    }
9118334Speter
9290290Sobrien  if (TYPE_PTRMEMFUNC_P (node))
9390290Sobrien    print_node (file, "ptrmemfunc fn type", TYPE_PTRMEMFUNC_FN_TYPE (node),
9490290Sobrien		indent + 4);
9518334Speter
9690290Sobrien  if (! CLASS_TYPE_P (node))
9718334Speter    return;
9818334Speter
9918334Speter  indent_to (file, indent + 3);
10018334Speter
10118334Speter  if (TYPE_NEEDS_CONSTRUCTING (node))
10218334Speter    fputs ( "needs-constructor", file);
10390290Sobrien  if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (node))
10418334Speter    fputs (" needs-destructor", file);
10518334Speter  if (TYPE_HAS_DEFAULT_CONSTRUCTOR (node))
10618334Speter    fputs (" X()", file);
10718334Speter  if (TYPE_HAS_CONVERSION (node))
10818334Speter    fputs (" has-type-conversion", file);
10918334Speter  if (TYPE_HAS_INIT_REF (node))
11018334Speter    {
11118334Speter      if (TYPE_HAS_CONST_INIT_REF (node))
11218334Speter	fputs (" X(constX&)", file);
11318334Speter      else
11418334Speter	fputs (" X(X&)", file);
11518334Speter    }
11690290Sobrien  if (TYPE_HAS_NEW_OPERATOR (node))
11718334Speter    fputs (" new", file);
11890290Sobrien  if (TYPE_HAS_ARRAY_NEW_OPERATOR (node))
11918334Speter    fputs (" new[]", file);
12018334Speter  if (TYPE_GETS_DELETE (node) & 1)
12118334Speter    fputs (" delete", file);
12218334Speter  if (TYPE_GETS_DELETE (node) & 2)
12318334Speter    fputs (" delete[]", file);
12418334Speter  if (TYPE_HAS_ASSIGN_REF (node))
12518334Speter    fputs (" this=(X&)", file);
12618334Speter
12718334Speter  if (TREE_CODE (node) == RECORD_TYPE)
12818334Speter    {
129169699Skan      if (TYPE_BINFO (node))
130169699Skan	fprintf (file, " n_parents=%d",
131169699Skan		 BINFO_N_BASE_BINFOS (TYPE_BINFO (node)));
132169699Skan      else
133169699Skan	fprintf (file, " no-binfo");
134169699Skan
13518334Speter      fprintf (file, " use_template=%d", CLASSTYPE_USE_TEMPLATE (node));
13618334Speter      if (CLASSTYPE_INTERFACE_ONLY (node))
13718334Speter	fprintf (file, " interface-only");
13818334Speter      if (CLASSTYPE_INTERFACE_UNKNOWN (node))
13918334Speter	fprintf (file, " interface-unknown");
14018334Speter    }
14118334Speter}
14218334Speter
143132748Skan
144117409Skanstatic void
145117409Skancxx_print_binding (FILE *stream, cxx_binding *binding, const char *prefix)
146117409Skan{
147169699Skan  fprintf (stream, "%s <%p>",
148169699Skan	   prefix, (void *) binding);
149117409Skan}
150117409Skan
15118334Spetervoid
152132748Skancxx_print_identifier (FILE *file, tree node, int indent)
15318334Speter{
154169699Skan  if (indent == 0)
155169699Skan    fprintf (file, " ");
156169699Skan  else
157169699Skan    indent_to (file, indent);
158117409Skan  cxx_print_binding (file, IDENTIFIER_NAMESPACE_BINDINGS (node), "bindings");
159169699Skan  if (indent == 0)
160169699Skan    fprintf (file, " ");
161169699Skan  else
162169699Skan    indent_to (file, indent);
163117409Skan  cxx_print_binding (file, IDENTIFIER_BINDING (node), "local bindings");
16418334Speter  print_node (file, "label", IDENTIFIER_LABEL_VALUE (node), indent + 4);
16518334Speter  print_node (file, "template", IDENTIFIER_TEMPLATE (node), indent + 4);
16618334Speter}
16751412Sobrien
16851412Sobrienvoid
169132748Skancxx_print_xnode (FILE *file, tree node, int indent)
17051412Sobrien{
17151412Sobrien  switch (TREE_CODE (node))
17251412Sobrien    {
173169699Skan    case BASELINK:
174169699Skan      print_node (file, "functions", BASELINK_FUNCTIONS (node), indent + 4);
175169699Skan      print_node (file, "binfo", BASELINK_BINFO (node), indent + 4);
176169699Skan      print_node (file, "access_binfo", BASELINK_ACCESS_BINFO (node),
177169699Skan		  indent + 4);
178169699Skan      break;
17951412Sobrien    case OVERLOAD:
18051412Sobrien      print_node (file, "function", OVL_FUNCTION (node), indent+4);
18151412Sobrien      print_node (file, "chain", TREE_CHAIN (node), indent+4);
18251412Sobrien      break;
18351412Sobrien    case TEMPLATE_PARM_INDEX:
18451412Sobrien      indent_to (file, indent + 3);
185132748Skan      fprintf (file, "index " HOST_WIDE_INT_PRINT_DEC " level "
186132748Skan	       HOST_WIDE_INT_PRINT_DEC " orig_level " HOST_WIDE_INT_PRINT_DEC,
187132748Skan	       TEMPLATE_PARM_IDX (node), TEMPLATE_PARM_LEVEL (node),
188132748Skan	       TEMPLATE_PARM_ORIG_LEVEL (node));
18951412Sobrien      break;
19051412Sobrien    default:
19151412Sobrien      break;
19251412Sobrien    }
19351412Sobrien}
194