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