1/* Prints out trees in human readable form. 2 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 3 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. 4 Hacked by Michael Tiemann (tiemann@cygnus.com) 5 6This file is part of GCC. 7 8GCC is free software; you can redistribute it and/or modify 9it under the terms of the GNU General Public License as published by 10the Free Software Foundation; either version 2, or (at your option) 11any later version. 12 13GCC is distributed in the hope that it will be useful, 14but WITHOUT ANY WARRANTY; without even the implied warranty of 15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16GNU General Public License for more details. 17 18You should have received a copy of the GNU General Public License 19along with GCC; see the file COPYING. If not, write to 20the Free Software Foundation, 51 Franklin Street, Fifth Floor, 21Boston, MA 02110-1301, USA. */ 22 23 24#include "config.h" 25#include "system.h" 26#include "coretypes.h" 27#include "tm.h" 28#include "tree.h" 29#include "cp-tree.h" 30 31void 32cxx_print_decl (FILE *file, tree node, int indent) 33{ 34 if (TREE_CODE (node) == FIELD_DECL) 35 { 36 if (DECL_MUTABLE_P (node)) 37 { 38 indent_to (file, indent + 3); 39 fprintf (file, " mutable "); 40 } 41 return; 42 } 43 44 if (!DECL_LANG_SPECIFIC (node)) 45 return; 46 indent_to (file, indent + 3); 47 if (TREE_CODE (node) == FUNCTION_DECL 48 && DECL_PENDING_INLINE_INFO (node)) 49 fprintf (file, " pending-inline-info %p", 50 (void *) DECL_PENDING_INLINE_INFO (node)); 51 if (TREE_CODE (node) == TYPE_DECL 52 && DECL_SORTED_FIELDS (node)) 53 fprintf (file, " sorted-fields %p", 54 (void *) DECL_SORTED_FIELDS (node)); 55 if ((TREE_CODE (node) == FUNCTION_DECL || TREE_CODE (node) == VAR_DECL) 56 && DECL_TEMPLATE_INFO (node)) 57 fprintf (file, " template-info %p", 58 (void *) DECL_TEMPLATE_INFO (node)); 59} 60 61void 62cxx_print_type (FILE *file, tree node, int indent) 63{ 64 switch (TREE_CODE (node)) 65 { 66 case TEMPLATE_TYPE_PARM: 67 case TEMPLATE_TEMPLATE_PARM: 68 case BOUND_TEMPLATE_TEMPLATE_PARM: 69 indent_to (file, indent + 3); 70 fprintf (file, "index " HOST_WIDE_INT_PRINT_DEC " level " 71 HOST_WIDE_INT_PRINT_DEC " orig_level " HOST_WIDE_INT_PRINT_DEC, 72 TEMPLATE_TYPE_IDX (node), TEMPLATE_TYPE_LEVEL (node), 73 TEMPLATE_TYPE_ORIG_LEVEL (node)); 74 return; 75 76 case FUNCTION_TYPE: 77 case METHOD_TYPE: 78 if (TYPE_RAISES_EXCEPTIONS (node)) 79 print_node (file, "throws", TYPE_RAISES_EXCEPTIONS (node), indent + 4); 80 return; 81 82 case RECORD_TYPE: 83 case UNION_TYPE: 84 break; 85 86 default: 87 return; 88 } 89 90 if (TYPE_PTRMEMFUNC_P (node)) 91 print_node (file, "ptrmemfunc fn type", TYPE_PTRMEMFUNC_FN_TYPE (node), 92 indent + 4); 93 94 if (! CLASS_TYPE_P (node)) 95 return; 96 97 indent_to (file, indent + 3); 98 99 if (TYPE_NEEDS_CONSTRUCTING (node)) 100 fputs ( "needs-constructor", file); 101 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (node)) 102 fputs (" needs-destructor", file); 103 if (TYPE_HAS_DEFAULT_CONSTRUCTOR (node)) 104 fputs (" X()", file); 105 if (TYPE_HAS_CONVERSION (node)) 106 fputs (" has-type-conversion", file); 107 if (TYPE_HAS_INIT_REF (node)) 108 { 109 if (TYPE_HAS_CONST_INIT_REF (node)) 110 fputs (" X(constX&)", file); 111 else 112 fputs (" X(X&)", file); 113 } 114 if (TYPE_HAS_NEW_OPERATOR (node)) 115 fputs (" new", file); 116 if (TYPE_HAS_ARRAY_NEW_OPERATOR (node)) 117 fputs (" new[]", file); 118 if (TYPE_GETS_DELETE (node) & 1) 119 fputs (" delete", file); 120 if (TYPE_GETS_DELETE (node) & 2) 121 fputs (" delete[]", file); 122 if (TYPE_HAS_ASSIGN_REF (node)) 123 fputs (" this=(X&)", file); 124 125 if (TREE_CODE (node) == RECORD_TYPE) 126 { 127 if (TYPE_BINFO (node)) 128 fprintf (file, " n_parents=%d", 129 BINFO_N_BASE_BINFOS (TYPE_BINFO (node))); 130 else 131 fprintf (file, " no-binfo"); 132 133 fprintf (file, " use_template=%d", CLASSTYPE_USE_TEMPLATE (node)); 134 if (CLASSTYPE_INTERFACE_ONLY (node)) 135 fprintf (file, " interface-only"); 136 if (CLASSTYPE_INTERFACE_UNKNOWN (node)) 137 fprintf (file, " interface-unknown"); 138 } 139} 140 141 142static void 143cxx_print_binding (FILE *stream, cxx_binding *binding, const char *prefix) 144{ 145 fprintf (stream, "%s <%p>", 146 prefix, (void *) binding); 147} 148 149void 150cxx_print_identifier (FILE *file, tree node, int indent) 151{ 152 if (indent == 0) 153 fprintf (file, " "); 154 else 155 indent_to (file, indent); 156 cxx_print_binding (file, IDENTIFIER_NAMESPACE_BINDINGS (node), "bindings"); 157 if (indent == 0) 158 fprintf (file, " "); 159 else 160 indent_to (file, indent); 161 cxx_print_binding (file, IDENTIFIER_BINDING (node), "local bindings"); 162 print_node (file, "label", IDENTIFIER_LABEL_VALUE (node), indent + 4); 163 print_node (file, "template", IDENTIFIER_TEMPLATE (node), indent + 4); 164} 165 166void 167cxx_print_xnode (FILE *file, tree node, int indent) 168{ 169 switch (TREE_CODE (node)) 170 { 171 case BASELINK: 172 print_node (file, "functions", BASELINK_FUNCTIONS (node), indent + 4); 173 print_node (file, "binfo", BASELINK_BINFO (node), indent + 4); 174 print_node (file, "access_binfo", BASELINK_ACCESS_BINFO (node), 175 indent + 4); 176 break; 177 case OVERLOAD: 178 print_node (file, "function", OVL_FUNCTION (node), indent+4); 179 print_node (file, "chain", TREE_CHAIN (node), indent+4); 180 break; 181 case TEMPLATE_PARM_INDEX: 182 indent_to (file, indent + 3); 183 fprintf (file, "index " HOST_WIDE_INT_PRINT_DEC " level " 184 HOST_WIDE_INT_PRINT_DEC " orig_level " HOST_WIDE_INT_PRINT_DEC, 185 TEMPLATE_PARM_IDX (node), TEMPLATE_PARM_LEVEL (node), 186 TEMPLATE_PARM_ORIG_LEVEL (node)); 187 break; 188 default: 189 break; 190 } 191} 192