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