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, 2007 4 Free Software Foundation, Inc. 5 Hacked by Michael Tiemann (tiemann@cygnus.com) 6 7 This file is part of GCC. 8 9 GCC is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 3, or (at your option) 12 any later version. 13 14 GCC is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with GCC; see the file COPYING3. If not see 21 <http://www.gnu.org/licenses/>. */ 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 31 void 32 cxx_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 (!CODE_CONTAINS_STRUCT (TREE_CODE (node), TS_DECL_COMMON) 45 || !DECL_LANG_SPECIFIC (node)) 46 return; 47 if (TREE_CODE (node) == FUNCTION_DECL) 48 { 49 int flags = TFF_DECL_SPECIFIERS|TFF_RETURN_TYPE 50 |TFF_FUNCTION_DEFAULT_ARGUMENTS|TFF_EXCEPTION_SPECIFICATION ; 51 indent_to (file, indent + 3); 52 fprintf (file, " full-name \"%s\"", decl_as_string (node, flags)); 53 } 54 else if (TREE_CODE (node) == TEMPLATE_DECL) 55 { 56 indent_to (file, indent + 3); 57 fprintf (file, " full-name \"%s\"", 58 decl_as_string (node, TFF_TEMPLATE_HEADER)); 59 } 60 61 indent_to (file, indent + 3); 62 if (DECL_EXTERNAL (node) && DECL_NOT_REALLY_EXTERN (node)) 63 fprintf (file, " not-really-extern"); 64 if (TREE_CODE (node) == FUNCTION_DECL 65 && DECL_PENDING_INLINE_INFO (node)) 66 fprintf (file, " pending-inline-info %p", 67 (void *) DECL_PENDING_INLINE_INFO (node)); 68 if ((TREE_CODE (node) == FUNCTION_DECL || TREE_CODE (node) == VAR_DECL) 69 && DECL_TEMPLATE_INFO (node)) 70 fprintf (file, " template-info %p", 71 (void *) DECL_TEMPLATE_INFO (node)); 72 } 73 74 void 75 cxx_print_type (FILE *file, tree node, int indent) 76 { 77 switch (TREE_CODE (node)) 78 { 79 case TEMPLATE_TYPE_PARM: 80 case TEMPLATE_TEMPLATE_PARM: 81 case BOUND_TEMPLATE_TEMPLATE_PARM: 82 indent_to (file, indent + 3); 83 fprintf (file, "index %d level %d orig_level %d", 84 TEMPLATE_TYPE_IDX (node), TEMPLATE_TYPE_LEVEL (node), 85 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 case DECLTYPE_TYPE: 99 print_node (file, "expr", DECLTYPE_TYPE_EXPR (node), indent + 4); 100 return; 101 102 default: 103 return; 104 } 105 106 if (TYPE_PTRMEMFUNC_P (node)) 107 print_node (file, "ptrmemfunc fn type", TYPE_PTRMEMFUNC_FN_TYPE (node), 108 indent + 4); 109 110 if (! CLASS_TYPE_P (node)) 111 return; 112 113 indent_to (file, indent + 4); 114 fprintf (file, "full-name \"%s\"", 115 type_as_string (node, TFF_CLASS_KEY_OR_ENUM)); 116 117 indent_to (file, indent + 3); 118 119 if (TYPE_NEEDS_CONSTRUCTING (node)) 120 fputs ( " needs-constructor", file); 121 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (node)) 122 fputs (" needs-destructor", file); 123 if (TYPE_HAS_DEFAULT_CONSTRUCTOR (node)) 124 fputs (" X()", file); 125 if (TYPE_HAS_CONVERSION (node)) 126 fputs (" has-type-conversion", file); 127 if (TYPE_HAS_INIT_REF (node)) 128 { 129 if (TYPE_HAS_CONST_INIT_REF (node)) 130 fputs (" X(constX&)", file); 131 else 132 fputs (" X(X&)", file); 133 } 134 if (TYPE_HAS_NEW_OPERATOR (node)) 135 fputs (" new", file); 136 if (TYPE_HAS_ARRAY_NEW_OPERATOR (node)) 137 fputs (" new[]", file); 138 if (TYPE_GETS_DELETE (node) & 1) 139 fputs (" delete", file); 140 if (TYPE_GETS_DELETE (node) & 2) 141 fputs (" delete[]", file); 142 if (TYPE_HAS_ASSIGN_REF (node)) 143 fputs (" this=(X&)", file); 144 if (CLASSTYPE_SORTED_FIELDS (node)) 145 fprintf (file, " sorted-fields %p", 146 (void *) CLASSTYPE_SORTED_FIELDS (node)); 147 148 if (TREE_CODE (node) == RECORD_TYPE) 149 { 150 if (TYPE_BINFO (node)) 151 fprintf (file, " n_parents=%d", 152 BINFO_N_BASE_BINFOS (TYPE_BINFO (node))); 153 else 154 fprintf (file, " no-binfo"); 155 156 fprintf (file, " use_template=%d", CLASSTYPE_USE_TEMPLATE (node)); 157 if (CLASSTYPE_INTERFACE_ONLY (node)) 158 fprintf (file, " interface-only"); 159 if (CLASSTYPE_INTERFACE_UNKNOWN (node)) 160 fprintf (file, " interface-unknown"); 161 } 162 } 163 164 165 static void 166 cxx_print_binding (FILE *stream, cxx_binding *binding, const char *prefix) 167 { 168 fprintf (stream, "%s <%p>", 169 prefix, (void *) binding); 170 } 171 172 void 173 cxx_print_identifier (FILE *file, tree node, int indent) 174 { 175 if (indent == 0) 176 fprintf (file, " "); 177 else 178 indent_to (file, indent); 179 cxx_print_binding (file, IDENTIFIER_NAMESPACE_BINDINGS (node), "bindings"); 180 if (indent == 0) 181 fprintf (file, " "); 182 else 183 indent_to (file, indent); 184 cxx_print_binding (file, IDENTIFIER_BINDING (node), "local bindings"); 185 print_node (file, "label", IDENTIFIER_LABEL_VALUE (node), indent + 4); 186 print_node (file, "template", IDENTIFIER_TEMPLATE (node), indent + 4); 187 } 188 189 void 190 cxx_print_xnode (FILE *file, tree node, int indent) 191 { 192 switch (TREE_CODE (node)) 193 { 194 case BASELINK: 195 print_node (file, "functions", BASELINK_FUNCTIONS (node), indent + 4); 196 print_node (file, "binfo", BASELINK_BINFO (node), indent + 4); 197 print_node (file, "access_binfo", BASELINK_ACCESS_BINFO (node), 198 indent + 4); 199 break; 200 case OVERLOAD: 201 print_node (file, "function", OVL_FUNCTION (node), indent+4); 202 print_node (file, "chain", TREE_CHAIN (node), indent+4); 203 break; 204 case TEMPLATE_PARM_INDEX: 205 indent_to (file, indent + 3); 206 fprintf (file, "index %d level %d orig_level %d", 207 TEMPLATE_PARM_IDX (node), TEMPLATE_PARM_LEVEL (node), 208 TEMPLATE_PARM_ORIG_LEVEL (node)); 209 break; 210 default: 211 break; 212 } 213 } 214