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, 2010 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 case TYPENAME_TYPE: 103 print_node (file, "fullname", TYPENAME_TYPE_FULLNAME (node), 104 indent + 4); 105 return; 106 107 case TYPE_PACK_EXPANSION: 108 print_node (file, "args", PACK_EXPANSION_EXTRA_ARGS (node), indent + 4); 109 return; 110 111 default: 112 return; 113 } 114 115 if (TYPE_PTRMEMFUNC_P (node)) 116 print_node (file, "ptrmemfunc fn type", TYPE_PTRMEMFUNC_FN_TYPE (node), 117 indent + 4); 118 119 if (! CLASS_TYPE_P (node)) 120 return; 121 122 indent_to (file, indent + 4); 123 fprintf (file, "full-name \"%s\"", 124 type_as_string (node, TFF_CLASS_KEY_OR_ENUM)); 125 126 indent_to (file, indent + 3); 127 128 if (TYPE_NEEDS_CONSTRUCTING (node)) 129 fputs ( " needs-constructor", file); 130 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (node)) 131 fputs (" needs-destructor", file); 132 if (TYPE_HAS_DEFAULT_CONSTRUCTOR (node)) 133 fputs (" X()", file); 134 if (TYPE_HAS_CONVERSION (node)) 135 fputs (" has-type-conversion", file); 136 if (TYPE_HAS_COPY_CTOR (node)) 137 { 138 if (TYPE_HAS_CONST_COPY_CTOR (node)) 139 fputs (" X(constX&)", file); 140 else 141 fputs (" X(X&)", file); 142 } 143 if (TYPE_HAS_NEW_OPERATOR (node)) 144 fputs (" new", file); 145 if (TYPE_HAS_ARRAY_NEW_OPERATOR (node)) 146 fputs (" new[]", file); 147 if (TYPE_GETS_DELETE (node) & 1) 148 fputs (" delete", file); 149 if (TYPE_GETS_DELETE (node) & 2) 150 fputs (" delete[]", file); 151 if (TYPE_HAS_COPY_ASSIGN (node)) 152 fputs (" this=(X&)", file); 153 if (CLASSTYPE_SORTED_FIELDS (node)) 154 fprintf (file, " sorted-fields %p", 155 (void *) CLASSTYPE_SORTED_FIELDS (node)); 156 157 if (TREE_CODE (node) == RECORD_TYPE) 158 { 159 if (TYPE_BINFO (node)) 160 fprintf (file, " n_parents=%d", 161 BINFO_N_BASE_BINFOS (TYPE_BINFO (node))); 162 else 163 fprintf (file, " no-binfo"); 164 165 fprintf (file, " use_template=%d", CLASSTYPE_USE_TEMPLATE (node)); 166 if (CLASSTYPE_INTERFACE_ONLY (node)) 167 fprintf (file, " interface-only"); 168 if (CLASSTYPE_INTERFACE_UNKNOWN (node)) 169 fprintf (file, " interface-unknown"); 170 } 171 } 172 173 174 static void 175 cxx_print_binding (FILE *stream, cxx_binding *binding, const char *prefix) 176 { 177 fprintf (stream, "%s <%p>", 178 prefix, (void *) binding); 179 } 180 181 void 182 cxx_print_identifier (FILE *file, tree node, int indent) 183 { 184 if (indent == 0) 185 fprintf (file, " "); 186 else 187 indent_to (file, indent + 4); 188 cxx_print_binding (file, IDENTIFIER_NAMESPACE_BINDINGS (node), "bindings"); 189 if (indent == 0) 190 fprintf (file, " "); 191 else 192 indent_to (file, indent + 4); 193 cxx_print_binding (file, IDENTIFIER_BINDING (node), "local bindings"); 194 print_node (file, "label", IDENTIFIER_LABEL_VALUE (node), indent + 4); 195 print_node (file, "template", IDENTIFIER_TEMPLATE (node), indent + 4); 196 } 197 198 void 199 cxx_print_xnode (FILE *file, tree node, int indent) 200 { 201 switch (TREE_CODE (node)) 202 { 203 case BASELINK: 204 print_node (file, "functions", BASELINK_FUNCTIONS (node), indent + 4); 205 print_node (file, "binfo", BASELINK_BINFO (node), indent + 4); 206 print_node (file, "access_binfo", BASELINK_ACCESS_BINFO (node), 207 indent + 4); 208 break; 209 case OVERLOAD: 210 print_node (file, "function", OVL_FUNCTION (node), indent+4); 211 print_node (file, "chain", TREE_CHAIN (node), indent+4); 212 break; 213 case TEMPLATE_PARM_INDEX: 214 indent_to (file, indent + 3); 215 fprintf (file, "index %d level %d orig_level %d", 216 TEMPLATE_PARM_IDX (node), TEMPLATE_PARM_LEVEL (node), 217 TEMPLATE_PARM_ORIG_LEVEL (node)); 218 break; 219 case TEMPLATE_INFO: 220 print_node (file, "template", TI_TEMPLATE (node), indent+4); 221 print_node (file, "args", TI_ARGS (node), indent+4); 222 if (TI_PENDING_TEMPLATE_FLAG (node)) 223 { 224 indent_to (file, indent + 3); 225 fprintf (file, "pending_template"); 226 } 227 break; 228 case ARGUMENT_PACK_SELECT: 229 print_node (file, "pack", ARGUMENT_PACK_SELECT_FROM_PACK (node), 230 indent+4); 231 indent_to (file, indent + 3); 232 fprintf (file, "index %d", ARGUMENT_PACK_SELECT_INDEX (node)); 233 break; 234 case DEFERRED_NOEXCEPT: 235 print_node (file, "pattern", DEFERRED_NOEXCEPT_PATTERN (node), indent+4); 236 print_node (file, "args", DEFERRED_NOEXCEPT_ARGS (node), indent+4); 237 break; 238 default: 239 break; 240 } 241 } 242