1 1.1 mrg /* Prints out tree in human readable form - GCC 2 1.1 mrg Copyright (C) 1990-2022 Free Software Foundation, Inc. 3 1.1 mrg 4 1.1 mrg This file is part of GCC. 5 1.1 mrg 6 1.1 mrg GCC is free software; you can redistribute it and/or modify it under 7 1.1 mrg the terms of the GNU General Public License as published by the Free 8 1.1 mrg Software Foundation; either version 3, or (at your option) any later 9 1.1 mrg version. 10 1.1 mrg 11 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY 12 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 1.1 mrg for more details. 15 1.1 mrg 16 1.1 mrg You should have received a copy of the GNU General Public License 17 1.1 mrg along with GCC; see the file COPYING3. If not see 18 1.1 mrg <http://www.gnu.org/licenses/>. */ 19 1.1 mrg 20 1.1 mrg 21 1.1 mrg #include "config.h" 22 1.1 mrg #include "system.h" 23 1.1 mrg #include "coretypes.h" 24 1.1 mrg #include "tm.h" 25 1.1 mrg #include "tree.h" 26 1.1 mrg #include "cgraph.h" 27 1.1 mrg #include "diagnostic.h" 28 1.1 mrg #include "varasm.h" 29 1.1 mrg #include "print-rtl.h" 30 1.1 mrg #include "stor-layout.h" 31 1.1 mrg #include "langhooks.h" 32 1.1 mrg #include "tree-iterator.h" 33 1.1 mrg #include "gimple-pretty-print.h" /* FIXME */ 34 1.1 mrg #include "tree-cfg.h" 35 1.1 mrg #include "dumpfile.h" 36 1.1 mrg #include "print-tree.h" 37 1.1 mrg 38 1.1 mrg /* Define the hash table of nodes already seen. 39 1.1 mrg Such nodes are not repeated; brief cross-references are used. */ 40 1.1 mrg 41 1.1 mrg #define HASH_SIZE 37 42 1.1 mrg 43 1.1 mrg static hash_set<tree> *table = NULL; 44 1.1 mrg 45 1.1 mrg /* Print PREFIX and ADDR to FILE. */ 46 1.1 mrg void 47 1.1 mrg dump_addr (FILE *file, const char *prefix, const void *addr) 48 1.1 mrg { 49 1.1 mrg if (flag_dump_noaddr || flag_dump_unnumbered) 50 1.1 mrg fprintf (file, "%s#", prefix); 51 1.1 mrg else 52 1.1 mrg fprintf (file, "%s" HOST_PTR_PRINTF, prefix, addr); 53 1.1 mrg } 54 1.1 mrg 55 1.1 mrg /* Print to FILE a NODE representing a REAL_CST constant, including 56 1.1 mrg Infinity and NaN. Be verbose when BFRIEF is false. */ 57 1.1 mrg 58 1.1 mrg static void 59 1.1 mrg print_real_cst (FILE *file, const_tree node, bool brief) 60 1.1 mrg { 61 1.1 mrg if (TREE_OVERFLOW (node)) 62 1.1 mrg fprintf (file, " overflow"); 63 1.1 mrg 64 1.1 mrg REAL_VALUE_TYPE d = TREE_REAL_CST (node); 65 1.1 mrg if (REAL_VALUE_ISINF (d)) 66 1.1 mrg fprintf (file, REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf"); 67 1.1 mrg else if (REAL_VALUE_ISNAN (d)) 68 1.1 mrg { 69 1.1 mrg /* Print a NaN in the format [-][Q]NaN[(significand[exponent])] 70 1.1 mrg where significand is a hexadecimal string that starts with 71 1.1 mrg the 0x prefix followed by 0 if the number is not canonical 72 1.1 mrg and a non-zero digit if it is, and exponent is decimal. */ 73 1.1 mrg unsigned start = 0; 74 1.1 mrg const char *psig = (const char *) d.sig; 75 1.1 mrg for (unsigned i = 0; i != sizeof d.sig; ++i) 76 1.1 mrg if (psig[i]) 77 1.1 mrg { 78 1.1 mrg start = i; 79 1.1 mrg break; 80 1.1 mrg } 81 1.1 mrg 82 1.1 mrg fprintf (file, " %s%sNaN", d.sign ? "-" : "", 83 1.1 mrg d.signalling ? "S" : "Q"); 84 1.1 mrg 85 1.1 mrg if (brief) 86 1.1 mrg return; 87 1.1 mrg 88 1.1 mrg if (start) 89 1.1 mrg fprintf (file, "(0x%s", d.canonical ? "" : "0"); 90 1.1 mrg else if (d.uexp) 91 1.1 mrg fprintf (file, "(%s", d.canonical ? "" : "0"); 92 1.1 mrg else if (!d.canonical) 93 1.1 mrg { 94 1.1 mrg fprintf (file, "(0)"); 95 1.1 mrg return; 96 1.1 mrg } 97 1.1 mrg 98 1.1 mrg if (psig[start]) 99 1.1 mrg { 100 1.1 mrg for (unsigned i = start; i != sizeof d.sig; ++i) 101 1.1 mrg if (i == start) 102 1.1 mrg fprintf (file, "%x", psig[i]); 103 1.1 mrg else 104 1.1 mrg fprintf (file, "%02x", psig[i]); 105 1.1 mrg } 106 1.1 mrg 107 1.1 mrg if (d.uexp) 108 1.1 mrg fprintf (file, "%se%u)", psig[start] ? "," : "", d.uexp); 109 1.1 mrg else if (psig[start]) 110 1.1 mrg fputc (')', file); 111 1.1 mrg } 112 1.1 mrg else 113 1.1 mrg { 114 1.1 mrg char string[64]; 115 1.1 mrg real_to_decimal (string, &d, sizeof (string), 0, 1); 116 1.1 mrg fprintf (file, " %s", string); 117 1.1 mrg } 118 1.1 mrg } 119 1.1 mrg 120 1.1 mrg /* Print a node in brief fashion, with just the code, address and name. */ 121 1.1 mrg 122 1.1 mrg void 123 1.1 mrg print_node_brief (FILE *file, const char *prefix, const_tree node, int indent) 124 1.1 mrg { 125 1.1 mrg enum tree_code_class tclass; 126 1.1 mrg 127 1.1 mrg if (node == 0) 128 1.1 mrg return; 129 1.1 mrg 130 1.1 mrg tclass = TREE_CODE_CLASS (TREE_CODE (node)); 131 1.1 mrg 132 1.1 mrg /* Always print the slot this node is in, and its code, address and 133 1.1 mrg name if any. */ 134 1.1 mrg if (indent > 0) 135 1.1 mrg fprintf (file, " "); 136 1.1 mrg fprintf (file, "%s <%s", prefix, get_tree_code_name (TREE_CODE (node))); 137 1.1 mrg dump_addr (file, " ", node); 138 1.1 mrg 139 1.1 mrg if (tclass == tcc_declaration) 140 1.1 mrg { 141 1.1 mrg if (DECL_NAME (node)) 142 1.1 mrg fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node))); 143 1.1 mrg else if (TREE_CODE (node) == LABEL_DECL 144 1.1 mrg && LABEL_DECL_UID (node) != -1) 145 1.1 mrg { 146 1.1 mrg if (dump_flags & TDF_NOUID) 147 1.1 mrg fprintf (file, " L.xxxx"); 148 1.1 mrg else 149 1.1 mrg fprintf (file, " L.%d", (int) LABEL_DECL_UID (node)); 150 1.1 mrg } 151 1.1 mrg else 152 1.1 mrg { 153 1.1 mrg if (dump_flags & TDF_NOUID) 154 1.1 mrg fprintf (file, " %c.xxxx", 155 1.1 mrg TREE_CODE (node) == CONST_DECL ? 'C' : 'D'); 156 1.1 mrg else 157 1.1 mrg fprintf (file, " %c.%u", 158 1.1 mrg TREE_CODE (node) == CONST_DECL ? 'C' : 'D', 159 1.1 mrg DECL_UID (node)); 160 1.1 mrg } 161 1.1 mrg } 162 1.1 mrg else if (tclass == tcc_type) 163 1.1 mrg { 164 1.1 mrg if (TYPE_NAME (node)) 165 1.1 mrg { 166 1.1 mrg if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE) 167 1.1 mrg fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node))); 168 1.1 mrg else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL 169 1.1 mrg && DECL_NAME (TYPE_NAME (node))) 170 1.1 mrg fprintf (file, " %s", 171 1.1 mrg IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node)))); 172 1.1 mrg } 173 1.1 mrg if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node))) 174 1.1 mrg fprintf (file, " address-space-%d", TYPE_ADDR_SPACE (node)); 175 1.1 mrg } 176 1.1 mrg if (TREE_CODE (node) == IDENTIFIER_NODE) 177 1.1 mrg fprintf (file, " %s", IDENTIFIER_POINTER (node)); 178 1.1 mrg 179 1.1 mrg /* We might as well always print the value of an integer or real. */ 180 1.1 mrg if (TREE_CODE (node) == INTEGER_CST) 181 1.1 mrg { 182 1.1 mrg if (TREE_OVERFLOW (node)) 183 1.1 mrg fprintf (file, " overflow"); 184 1.1 mrg 185 1.1 mrg fprintf (file, " "); 186 1.1 mrg print_dec (wi::to_wide (node), file, TYPE_SIGN (TREE_TYPE (node))); 187 1.1 mrg } 188 1.1 mrg if (TREE_CODE (node) == REAL_CST) 189 1.1 mrg print_real_cst (file, node, true); 190 1.1 mrg if (TREE_CODE (node) == FIXED_CST) 191 1.1 mrg { 192 1.1 mrg FIXED_VALUE_TYPE f; 193 1.1 mrg char string[60]; 194 1.1 mrg 195 1.1 mrg if (TREE_OVERFLOW (node)) 196 1.1 mrg fprintf (file, " overflow"); 197 1.1 mrg 198 1.1 mrg f = TREE_FIXED_CST (node); 199 1.1 mrg fixed_to_decimal (string, &f, sizeof (string)); 200 1.1 mrg fprintf (file, " %s", string); 201 1.1 mrg } 202 1.1 mrg 203 1.1 mrg fprintf (file, ">"); 204 1.1 mrg } 205 1.1 mrg 206 1.1 mrg void 207 1.1 mrg indent_to (FILE *file, int column) 208 1.1 mrg { 209 1.1 mrg int i; 210 1.1 mrg 211 1.1 mrg /* Since this is the long way, indent to desired column. */ 212 1.1 mrg if (column > 0) 213 1.1 mrg fprintf (file, "\n"); 214 1.1 mrg for (i = 0; i < column; i++) 215 1.1 mrg fprintf (file, " "); 216 1.1 mrg } 217 1.1 mrg 218 1.1 mrg /* Print the node NODE in full on file FILE, preceded by PREFIX, 220 1.1 mrg starting in column INDENT. */ 221 1.1 mrg 222 1.1 mrg void 223 1.1 mrg print_node (FILE *file, const char *prefix, tree node, int indent, 224 1.1 mrg bool brief_for_visited) 225 1.1 mrg { 226 1.1 mrg machine_mode mode; 227 1.1 mrg enum tree_code_class tclass; 228 1.1 mrg int len; 229 1.1 mrg int i; 230 1.1 mrg expanded_location xloc; 231 1.1 mrg enum tree_code code; 232 1.1 mrg 233 1.1 mrg if (node == 0) 234 1.1 mrg return; 235 1.1 mrg 236 1.1 mrg code = TREE_CODE (node); 237 1.1 mrg 238 1.1 mrg /* It is unsafe to look at any other fields of a node with ERROR_MARK or 239 1.1 mrg invalid code. */ 240 1.1 mrg if (code == ERROR_MARK || code >= MAX_TREE_CODES) 241 1.1 mrg { 242 1.1 mrg print_node_brief (file, prefix, node, indent); 243 1.1 mrg return; 244 1.1 mrg } 245 1.1 mrg 246 1.1 mrg tclass = TREE_CODE_CLASS (code); 247 1.1 mrg 248 1.1 mrg /* Don't get too deep in nesting. If the user wants to see deeper, 249 1.1 mrg it is easy to use the address of a lowest-level node 250 1.1 mrg as an argument in another call to debug_tree. */ 251 1.1 mrg 252 1.1 mrg if (indent > 24) 253 1.1 mrg { 254 1.1 mrg print_node_brief (file, prefix, node, indent); 255 1.1 mrg return; 256 1.1 mrg } 257 1.1 mrg 258 1.1 mrg if (indent > 8 && (tclass == tcc_type || tclass == tcc_declaration)) 259 1.1 mrg { 260 1.1 mrg print_node_brief (file, prefix, node, indent); 261 1.1 mrg return; 262 1.1 mrg } 263 1.1 mrg 264 1.1 mrg /* Allow this function to be called if the table is not there. */ 265 1.1 mrg if (table) 266 1.1 mrg { 267 1.1 mrg /* If node is in the table, just mention its address. */ 268 1.1 mrg if (table->contains (node) && brief_for_visited) 269 1.1 mrg { 270 1.1 mrg print_node_brief (file, prefix, node, indent); 271 1.1 mrg return; 272 1.1 mrg } 273 1.1 mrg 274 1.1 mrg table->add (node); 275 1.1 mrg } 276 1.1 mrg 277 1.1 mrg /* Indent to the specified column, since this is the long form. */ 278 1.1 mrg indent_to (file, indent); 279 1.1 mrg 280 1.1 mrg /* Print the slot this node is in, and its code, and address. */ 281 1.1 mrg fprintf (file, "%s <%s", prefix, get_tree_code_name (code)); 282 1.1 mrg dump_addr (file, " ", node); 283 1.1 mrg 284 1.1 mrg /* Print the name, if any. */ 285 1.1 mrg if (tclass == tcc_declaration) 286 1.1 mrg { 287 1.1 mrg if (DECL_NAME (node)) 288 1.1 mrg fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node))); 289 1.1 mrg else if (code == LABEL_DECL 290 1.1 mrg && LABEL_DECL_UID (node) != -1) 291 1.1 mrg { 292 1.1 mrg if (dump_flags & TDF_NOUID) 293 1.1 mrg fprintf (file, " L.xxxx"); 294 1.1 mrg else 295 1.1 mrg fprintf (file, " L.%d", (int) LABEL_DECL_UID (node)); 296 1.1 mrg } 297 1.1 mrg else 298 1.1 mrg { 299 1.1 mrg if (dump_flags & TDF_NOUID) 300 1.1 mrg fprintf (file, " %c.xxxx", code == CONST_DECL ? 'C' : 'D'); 301 1.1 mrg else 302 1.1 mrg fprintf (file, " %c.%u", code == CONST_DECL ? 'C' : 'D', 303 1.1 mrg DECL_UID (node)); 304 1.1 mrg } 305 1.1 mrg } 306 1.1 mrg else if (tclass == tcc_type) 307 1.1 mrg { 308 1.1 mrg if (TYPE_NAME (node)) 309 1.1 mrg { 310 1.1 mrg if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE) 311 1.1 mrg fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node))); 312 1.1 mrg else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL 313 1.1 mrg && DECL_NAME (TYPE_NAME (node))) 314 1.1 mrg fprintf (file, " %s", 315 1.1 mrg IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node)))); 316 1.1 mrg } 317 1.1 mrg } 318 1.1 mrg if (code == IDENTIFIER_NODE) 319 1.1 mrg fprintf (file, " %s", IDENTIFIER_POINTER (node)); 320 1.1 mrg 321 1.1 mrg if (code == INTEGER_CST) 322 1.1 mrg { 323 1.1 mrg if (indent <= 4) 324 1.1 mrg print_node_brief (file, "type", TREE_TYPE (node), indent + 4); 325 1.1 mrg } 326 1.1 mrg else if (CODE_CONTAINS_STRUCT (code, TS_TYPED)) 327 1.1 mrg { 328 1.1 mrg print_node (file, "type", TREE_TYPE (node), indent + 4); 329 1.1 mrg if (TREE_TYPE (node)) 330 1.1 mrg indent_to (file, indent + 3); 331 1.1 mrg } 332 1.1 mrg 333 1.1 mrg if (!TYPE_P (node) && TREE_SIDE_EFFECTS (node)) 334 1.1 mrg fputs (" side-effects", file); 335 1.1 mrg 336 1.1 mrg if (TYPE_P (node) ? TYPE_READONLY (node) : TREE_READONLY (node)) 337 1.1 mrg fputs (" readonly", file); 338 1.1 mrg if (TYPE_P (node) && TYPE_ATOMIC (node)) 339 1.1 mrg fputs (" atomic", file); 340 1.1 mrg if (!TYPE_P (node) && TREE_CONSTANT (node)) 341 1.1 mrg fputs (" constant", file); 342 1.1 mrg else if (TYPE_P (node) && TYPE_SIZES_GIMPLIFIED (node)) 343 1.1 mrg fputs (" sizes-gimplified", file); 344 1.1 mrg 345 1.1 mrg if (TYPE_P (node) && !ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node))) 346 1.1 mrg fprintf (file, " address-space-%d", TYPE_ADDR_SPACE (node)); 347 1.1 mrg 348 1.1 mrg if (TREE_ADDRESSABLE (node)) 349 1.1 mrg fputs (" addressable", file); 350 1.1 mrg if (TREE_THIS_VOLATILE (node)) 351 1.1 mrg fputs (" volatile", file); 352 1.1 mrg if (TREE_ASM_WRITTEN (node)) 353 1.1 mrg fputs (" asm_written", file); 354 1.1 mrg if (TREE_USED (node)) 355 1.1 mrg fputs (" used", file); 356 1.1 mrg if (TREE_NOTHROW (node)) 357 1.1 mrg fputs (" nothrow", file); 358 1.1 mrg if (TREE_PUBLIC (node)) 359 1.1 mrg fputs (" public", file); 360 1.1 mrg if (TREE_PRIVATE (node)) 361 1.1 mrg fputs (" private", file); 362 1.1 mrg if (TREE_PROTECTED (node)) 363 1.1 mrg fputs (" protected", file); 364 1.1 mrg if (TREE_STATIC (node)) 365 1.1 mrg fputs (code == CALL_EXPR ? " must-tail-call" : " static", file); 366 1.1 mrg if (TREE_DEPRECATED (node)) 367 1.1 mrg fputs (" deprecated", file); 368 1.1 mrg if (TREE_UNAVAILABLE (node)) 369 1.1 mrg fputs (" unavailable", file); 370 1.1 mrg if (TREE_VISITED (node)) 371 1.1 mrg fputs (" visited", file); 372 1.1 mrg 373 1.1 mrg if (code != TREE_VEC && code != INTEGER_CST && code != SSA_NAME) 374 1.1 mrg { 375 1.1 mrg if (TREE_LANG_FLAG_0 (node)) 376 1.1 mrg fputs (" tree_0", file); 377 1.1 mrg if (TREE_LANG_FLAG_1 (node)) 378 1.1 mrg fputs (" tree_1", file); 379 1.1 mrg if (TREE_LANG_FLAG_2 (node)) 380 1.1 mrg fputs (" tree_2", file); 381 1.1 mrg if (TREE_LANG_FLAG_3 (node)) 382 1.1 mrg fputs (" tree_3", file); 383 1.1 mrg if (TREE_LANG_FLAG_4 (node)) 384 1.1 mrg fputs (" tree_4", file); 385 1.1 mrg if (TREE_LANG_FLAG_5 (node)) 386 1.1 mrg fputs (" tree_5", file); 387 1.1 mrg if (TREE_LANG_FLAG_6 (node)) 388 1.1 mrg fputs (" tree_6", file); 389 1.1 mrg } 390 1.1 mrg 391 1.1 mrg /* DECL_ nodes have additional attributes. */ 392 1.1 mrg 393 1.1 mrg switch (TREE_CODE_CLASS (code)) 394 1.1 mrg { 395 1.1 mrg case tcc_declaration: 396 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) 397 1.1 mrg { 398 1.1 mrg if (DECL_UNSIGNED (node)) 399 1.1 mrg fputs (" unsigned", file); 400 1.1 mrg if (DECL_IGNORED_P (node)) 401 1.1 mrg fputs (" ignored", file); 402 1.1 mrg if (DECL_ABSTRACT_P (node)) 403 1.1 mrg fputs (" abstract", file); 404 1.1 mrg if (DECL_EXTERNAL (node)) 405 1.1 mrg fputs (" external", file); 406 1.1 mrg if (DECL_NONLOCAL (node)) 407 1.1 mrg fputs (" nonlocal", file); 408 1.1 mrg } 409 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS)) 410 1.1 mrg { 411 1.1 mrg if (DECL_WEAK (node)) 412 1.1 mrg fputs (" weak", file); 413 1.1 mrg if (DECL_IN_SYSTEM_HEADER (node)) 414 1.1 mrg fputs (" in_system_header", file); 415 1.1 mrg } 416 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL) 417 1.1 mrg && code != LABEL_DECL 418 1.1 mrg && code != FUNCTION_DECL 419 1.1 mrg && DECL_REGISTER (node)) 420 1.1 mrg fputs (" regdecl", file); 421 1.1 mrg 422 1.1 mrg if (code == TYPE_DECL && TYPE_DECL_SUPPRESS_DEBUG (node)) 423 1.1 mrg fputs (" suppress-debug", file); 424 1.1 mrg 425 1.1 mrg if (code == FUNCTION_DECL 426 1.1 mrg && DECL_FUNCTION_SPECIFIC_TARGET (node)) 427 1.1 mrg fputs (" function-specific-target", file); 428 1.1 mrg if (code == FUNCTION_DECL 429 1.1 mrg && DECL_FUNCTION_SPECIFIC_OPTIMIZATION (node)) 430 1.1 mrg fputs (" function-specific-opt", file); 431 1.1 mrg if (code == FUNCTION_DECL && DECL_DECLARED_INLINE_P (node)) 432 1.1 mrg fputs (" autoinline", file); 433 1.1 mrg if (code == FUNCTION_DECL && DECL_UNINLINABLE (node)) 434 1.1 mrg fputs (" uninlinable", file); 435 1.1 mrg if (code == FUNCTION_DECL && fndecl_built_in_p (node)) 436 1.1 mrg fputs (" built-in", file); 437 1.1 mrg if (code == FUNCTION_DECL && DECL_STATIC_CHAIN (node)) 438 1.1 mrg fputs (" static-chain", file); 439 1.1 mrg if (TREE_CODE (node) == FUNCTION_DECL && decl_is_tm_clone (node)) 440 1.1 mrg fputs (" tm-clone", file); 441 1.1 mrg 442 1.1 mrg if (code == FIELD_DECL && DECL_PACKED (node)) 443 1.1 mrg fputs (" packed", file); 444 1.1 mrg if (code == FIELD_DECL && DECL_BIT_FIELD (node)) 445 1.1 mrg fputs (" bit-field", file); 446 1.1 mrg if (code == FIELD_DECL && DECL_NONADDRESSABLE_P (node)) 447 1.1 mrg fputs (" nonaddressable", file); 448 1.1 mrg 449 1.1 mrg if (code == LABEL_DECL && EH_LANDING_PAD_NR (node)) 450 1.1 mrg fprintf (file, " landing-pad:%d", EH_LANDING_PAD_NR (node)); 451 1.1 mrg 452 1.1 mrg if (code == VAR_DECL && DECL_IN_TEXT_SECTION (node)) 453 1.1 mrg fputs (" in-text-section", file); 454 1.1 mrg if (code == VAR_DECL && DECL_IN_CONSTANT_POOL (node)) 455 1.1 mrg fputs (" in-constant-pool", file); 456 1.1 mrg if (code == VAR_DECL && DECL_COMMON (node)) 457 1.1 mrg fputs (" common", file); 458 1.1 mrg if ((code == VAR_DECL || code == PARM_DECL) && DECL_READ_P (node)) 459 1.1 mrg fputs (" read", file); 460 1.1 mrg if (code == VAR_DECL && DECL_THREAD_LOCAL_P (node)) 461 1.1 mrg { 462 1.1 mrg fputs (" ", file); 463 1.1 mrg fputs (tls_model_names[DECL_TLS_MODEL (node)], file); 464 1.1 mrg } 465 1.1 mrg 466 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) 467 1.1 mrg { 468 1.1 mrg if (DECL_VIRTUAL_P (node)) 469 1.1 mrg fputs (" virtual", file); 470 1.1 mrg if (DECL_PRESERVE_P (node)) 471 1.1 mrg fputs (" preserve", file); 472 1.1 mrg if (DECL_LANG_FLAG_0 (node)) 473 1.1 mrg fputs (" decl_0", file); 474 1.1 mrg if (DECL_LANG_FLAG_1 (node)) 475 1.1 mrg fputs (" decl_1", file); 476 1.1 mrg if (DECL_LANG_FLAG_2 (node)) 477 1.1 mrg fputs (" decl_2", file); 478 1.1 mrg if (DECL_LANG_FLAG_3 (node)) 479 1.1 mrg fputs (" decl_3", file); 480 1.1 mrg if (DECL_LANG_FLAG_4 (node)) 481 1.1 mrg fputs (" decl_4", file); 482 1.1 mrg if (DECL_LANG_FLAG_5 (node)) 483 1.1 mrg fputs (" decl_5", file); 484 1.1 mrg if (DECL_LANG_FLAG_6 (node)) 485 1.1 mrg fputs (" decl_6", file); 486 1.1 mrg if (DECL_LANG_FLAG_7 (node)) 487 1.1 mrg fputs (" decl_7", file); 488 1.1 mrg if (DECL_LANG_FLAG_8 (node)) 489 1.1 mrg fputs (" decl_8", file); 490 1.1 mrg 491 1.1 mrg mode = DECL_MODE (node); 492 1.1 mrg fprintf (file, " %s", GET_MODE_NAME (mode)); 493 1.1 mrg } 494 1.1 mrg 495 1.1 mrg if ((code == VAR_DECL || code == PARM_DECL || code == RESULT_DECL) 496 1.1 mrg && DECL_BY_REFERENCE (node)) 497 1.1 mrg fputs (" passed-by-reference", file); 498 1.1 mrg 499 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS) && DECL_DEFER_OUTPUT (node)) 500 1.1 mrg fputs (" defer-output", file); 501 1.1 mrg 502 1.1 mrg 503 1.1 mrg xloc = expand_location (DECL_SOURCE_LOCATION (node)); 504 1.1 mrg fprintf (file, " %s:%d:%d", xloc.file, xloc.line, 505 1.1 mrg xloc.column); 506 1.1 mrg 507 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) 508 1.1 mrg { 509 1.1 mrg print_node (file, "size", DECL_SIZE (node), indent + 4); 510 1.1 mrg print_node (file, "unit-size", DECL_SIZE_UNIT (node), indent + 4); 511 1.1 mrg 512 1.1 mrg if (code != FUNCTION_DECL || fndecl_built_in_p (node)) 513 1.1 mrg indent_to (file, indent + 3); 514 1.1 mrg 515 1.1 mrg if (DECL_USER_ALIGN (node)) 516 1.1 mrg fprintf (file, " user"); 517 1.1 mrg 518 1.1 mrg fprintf (file, " align:%d warn_if_not_align:%d", 519 1.1 mrg DECL_ALIGN (node), DECL_WARN_IF_NOT_ALIGN (node)); 520 1.1 mrg if (code == FIELD_DECL) 521 1.1 mrg fprintf (file, " offset_align " HOST_WIDE_INT_PRINT_UNSIGNED, 522 1.1 mrg DECL_OFFSET_ALIGN (node)); 523 1.1 mrg 524 1.1 mrg if (code == FUNCTION_DECL && fndecl_built_in_p (node)) 525 1.1 mrg { 526 1.1 mrg if (DECL_BUILT_IN_CLASS (node) == BUILT_IN_MD) 527 1.1 mrg fprintf (file, " built-in: BUILT_IN_MD:%d", 528 1.1 mrg DECL_MD_FUNCTION_CODE (node)); 529 1.1 mrg else if (DECL_BUILT_IN_CLASS (node) == BUILT_IN_FRONTEND) 530 1.1 mrg fprintf (file, " built-in: BUILT_IN_FRONTEND:%d", 531 1.1 mrg DECL_FE_FUNCTION_CODE (node)); 532 1.1 mrg else 533 1.1 mrg fprintf (file, " built-in: %s:%s", 534 1.1 mrg built_in_class_names[(int) DECL_BUILT_IN_CLASS (node)], 535 1.1 mrg built_in_names[(int) DECL_FUNCTION_CODE (node)]); 536 1.1 mrg } 537 1.1 mrg } 538 1.1 mrg if (code == FIELD_DECL) 539 1.1 mrg { 540 1.1 mrg print_node (file, "offset", DECL_FIELD_OFFSET (node), indent + 4); 541 1.1 mrg print_node (file, "bit-offset", DECL_FIELD_BIT_OFFSET (node), 542 1.1 mrg indent + 4); 543 1.1 mrg if (DECL_BIT_FIELD_TYPE (node)) 544 1.1 mrg print_node (file, "bit_field_type", DECL_BIT_FIELD_TYPE (node), 545 1.1 mrg indent + 4); 546 1.1 mrg } 547 1.1 mrg 548 1.1 mrg print_node_brief (file, "context", DECL_CONTEXT (node), indent + 4); 549 1.1 mrg 550 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) 551 1.1 mrg { 552 1.1 mrg print_node (file, "attributes", 553 1.1 mrg DECL_ATTRIBUTES (node), indent + 4); 554 1.1 mrg if (code != PARM_DECL) 555 1.1 mrg print_node_brief (file, "initial", DECL_INITIAL (node), 556 1.1 mrg indent + 4); 557 1.1 mrg } 558 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL)) 559 1.1 mrg { 560 1.1 mrg print_node_brief (file, "abstract_origin", 561 1.1 mrg DECL_ABSTRACT_ORIGIN (node), indent + 4); 562 1.1 mrg } 563 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON)) 564 1.1 mrg { 565 1.1 mrg print_node (file, "result", DECL_RESULT_FLD (node), indent + 4); 566 1.1 mrg } 567 1.1 mrg 568 1.1 mrg lang_hooks.print_decl (file, node, indent); 569 1.1 mrg 570 1.1 mrg if (DECL_RTL_SET_P (node)) 571 1.1 mrg { 572 1.1 mrg indent_to (file, indent + 4); 573 1.1 mrg print_rtl (file, DECL_RTL (node)); 574 1.1 mrg } 575 1.1 mrg 576 1.1 mrg if (code == PARM_DECL) 577 1.1 mrg { 578 1.1 mrg print_node (file, "arg-type", DECL_ARG_TYPE (node), indent + 4); 579 1.1 mrg 580 1.1 mrg if (DECL_INCOMING_RTL (node) != 0) 581 1.1 mrg { 582 1.1 mrg indent_to (file, indent + 4); 583 1.1 mrg fprintf (file, "incoming-rtl "); 584 1.1 mrg print_rtl (file, DECL_INCOMING_RTL (node)); 585 1.1 mrg } 586 1.1 mrg } 587 1.1 mrg else if (code == FUNCTION_DECL 588 1.1 mrg && DECL_STRUCT_FUNCTION (node) != 0) 589 1.1 mrg { 590 1.1 mrg print_node (file, "arguments", DECL_ARGUMENTS (node), indent + 4); 591 1.1 mrg indent_to (file, indent + 4); 592 1.1 mrg dump_addr (file, "struct-function ", DECL_STRUCT_FUNCTION (node)); 593 1.1 mrg } 594 1.1 mrg 595 1.1 mrg if ((code == VAR_DECL || code == PARM_DECL) 596 1.1 mrg && DECL_HAS_VALUE_EXPR_P (node)) 597 1.1 mrg print_node (file, "value-expr", DECL_VALUE_EXPR (node), indent + 4); 598 1.1 mrg 599 1.1 mrg /* Print the decl chain only if decl is at second level. */ 600 1.1 mrg if (indent == 4) 601 1.1 mrg print_node (file, "chain", TREE_CHAIN (node), indent + 4); 602 1.1 mrg else 603 1.1 mrg print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4); 604 1.1 mrg break; 605 1.1 mrg 606 1.1 mrg case tcc_type: 607 1.1 mrg if (TYPE_UNSIGNED (node)) 608 1.1 mrg fputs (" unsigned", file); 609 1.1 mrg 610 1.1 mrg if (TYPE_NO_FORCE_BLK (node)) 611 1.1 mrg fputs (" no-force-blk", file); 612 1.1 mrg 613 1.1 mrg if (code == ARRAY_TYPE && TYPE_STRING_FLAG (node)) 614 1.1 mrg fputs (" string-flag", file); 615 1.1 mrg 616 1.1 mrg if (TYPE_NEEDS_CONSTRUCTING (node)) 617 1.1 mrg fputs (" needs-constructing", file); 618 1.1 mrg 619 1.1 mrg if ((code == RECORD_TYPE 620 1.1 mrg || code == UNION_TYPE 621 1.1 mrg || code == QUAL_UNION_TYPE 622 1.1 mrg || code == ARRAY_TYPE) 623 1.1 mrg && TYPE_REVERSE_STORAGE_ORDER (node)) 624 1.1 mrg fputs (" reverse-storage-order", file); 625 1.1 mrg 626 1.1 mrg if ((code == RECORD_TYPE 627 1.1 mrg || code == UNION_TYPE) 628 1.1 mrg && TYPE_CXX_ODR_P (node)) 629 1.1 mrg fputs (" cxx-odr-p", file); 630 1.1 mrg 631 1.1 mrg /* The transparent-union flag is used for different things in 632 1.1 mrg different nodes. */ 633 1.1 mrg if ((code == UNION_TYPE || code == RECORD_TYPE) 634 1.1 mrg && TYPE_TRANSPARENT_AGGR (node)) 635 1.1 mrg fputs (" transparent-aggr", file); 636 1.1 mrg else if (code == ARRAY_TYPE 637 1.1 mrg && TYPE_NONALIASED_COMPONENT (node)) 638 1.1 mrg fputs (" nonaliased-component", file); 639 1.1 mrg 640 1.1 mrg if (TYPE_PACKED (node)) 641 1.1 mrg fputs (" packed", file); 642 1.1 mrg 643 1.1 mrg if (TYPE_RESTRICT (node)) 644 1.1 mrg fputs (" restrict", file); 645 1.1 mrg 646 1.1 mrg if (TYPE_LANG_FLAG_0 (node)) 647 1.1 mrg fputs (" type_0", file); 648 1.1 mrg if (TYPE_LANG_FLAG_1 (node)) 649 1.1 mrg fputs (" type_1", file); 650 1.1 mrg if (TYPE_LANG_FLAG_2 (node)) 651 1.1 mrg fputs (" type_2", file); 652 1.1 mrg if (TYPE_LANG_FLAG_3 (node)) 653 1.1 mrg fputs (" type_3", file); 654 1.1 mrg if (TYPE_LANG_FLAG_4 (node)) 655 1.1 mrg fputs (" type_4", file); 656 1.1 mrg if (TYPE_LANG_FLAG_5 (node)) 657 1.1 mrg fputs (" type_5", file); 658 1.1 mrg if (TYPE_LANG_FLAG_6 (node)) 659 1.1 mrg fputs (" type_6", file); 660 1.1 mrg if (TYPE_LANG_FLAG_7 (node)) 661 1.1 mrg fputs (" type_7", file); 662 1.1 mrg 663 1.1 mrg mode = TYPE_MODE (node); 664 1.1 mrg fprintf (file, " %s", GET_MODE_NAME (mode)); 665 1.1 mrg 666 1.1 mrg print_node (file, "size", TYPE_SIZE (node), indent + 4); 667 1.1 mrg print_node (file, "unit-size", TYPE_SIZE_UNIT (node), indent + 4); 668 1.1 mrg indent_to (file, indent + 3); 669 1.1 mrg 670 1.1 mrg if (TYPE_USER_ALIGN (node)) 671 1.1 mrg fprintf (file, " user"); 672 1.1 mrg 673 1.1 mrg fprintf (file, " align:%d warn_if_not_align:%d symtab:%d alias-set " 674 1.1 mrg HOST_WIDE_INT_PRINT_DEC, 675 1.1 mrg TYPE_ALIGN (node), TYPE_WARN_IF_NOT_ALIGN (node), 676 1.1 mrg TYPE_SYMTAB_ADDRESS (node), 677 1.1 mrg (HOST_WIDE_INT) TYPE_ALIAS_SET (node)); 678 1.1 mrg 679 1.1 mrg if (TYPE_STRUCTURAL_EQUALITY_P (node)) 680 1.1 mrg fprintf (file, " structural-equality"); 681 1.1 mrg else 682 1.1 mrg dump_addr (file, " canonical-type ", TYPE_CANONICAL (node)); 683 1.1 mrg 684 1.1 mrg print_node (file, "attributes", TYPE_ATTRIBUTES (node), indent + 4); 685 1.1 mrg 686 1.1 mrg if (INTEGRAL_TYPE_P (node) || code == REAL_TYPE 687 1.1 mrg || code == FIXED_POINT_TYPE) 688 1.1 mrg { 689 1.1 mrg fprintf (file, " precision:%d", TYPE_PRECISION (node)); 690 1.1 mrg print_node_brief (file, "min", TYPE_MIN_VALUE (node), indent + 4); 691 1.1 mrg print_node_brief (file, "max", TYPE_MAX_VALUE (node), indent + 4); 692 1.1 mrg } 693 1.1 mrg 694 1.1 mrg if (code == ENUMERAL_TYPE) 695 1.1 mrg print_node (file, "values", TYPE_VALUES (node), indent + 4); 696 1.1 mrg else if (code == ARRAY_TYPE) 697 1.1 mrg print_node (file, "domain", TYPE_DOMAIN (node), indent + 4); 698 1.1 mrg else if (code == VECTOR_TYPE) 699 1.1 mrg { 700 1.1 mrg fprintf (file, " nunits:"); 701 1.1 mrg print_dec (TYPE_VECTOR_SUBPARTS (node), file); 702 1.1 mrg } 703 1.1 mrg else if (code == RECORD_TYPE 704 1.1 mrg || code == UNION_TYPE 705 1.1 mrg || code == QUAL_UNION_TYPE) 706 1.1 mrg print_node (file, "fields", TYPE_FIELDS (node), indent + 4); 707 1.1 mrg else if (code == FUNCTION_TYPE 708 1.1 mrg || code == METHOD_TYPE) 709 1.1 mrg { 710 1.1 mrg if (TYPE_METHOD_BASETYPE (node)) 711 1.1 mrg print_node_brief (file, "method basetype", 712 1.1 mrg TYPE_METHOD_BASETYPE (node), indent + 4); 713 1.1 mrg print_node (file, "arg-types", TYPE_ARG_TYPES (node), indent + 4); 714 1.1 mrg } 715 1.1 mrg else if (code == OFFSET_TYPE) 716 1.1 mrg print_node_brief (file, "basetype", TYPE_OFFSET_BASETYPE (node), 717 1.1 mrg indent + 4); 718 1.1 mrg 719 1.1 mrg if (TYPE_CONTEXT (node)) 720 1.1 mrg print_node_brief (file, "context", TYPE_CONTEXT (node), indent + 4); 721 1.1 mrg 722 1.1 mrg lang_hooks.print_type (file, node, indent); 723 1.1 mrg 724 1.1 mrg if (TYPE_POINTER_TO (node) || TREE_CHAIN (node)) 725 1.1 mrg indent_to (file, indent + 3); 726 1.1 mrg 727 1.1 mrg print_node_brief (file, "pointer_to_this", TYPE_POINTER_TO (node), 728 1.1 mrg indent + 4); 729 1.1 mrg print_node_brief (file, "reference_to_this", TYPE_REFERENCE_TO (node), 730 1.1 mrg indent + 4); 731 1.1 mrg print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4); 732 1.1 mrg break; 733 1.1 mrg 734 1.1 mrg case tcc_expression: 735 1.1 mrg case tcc_comparison: 736 1.1 mrg case tcc_unary: 737 1.1 mrg case tcc_binary: 738 1.1 mrg case tcc_reference: 739 1.1 mrg case tcc_statement: 740 1.1 mrg case tcc_vl_exp: 741 1.1 mrg if (code == BIND_EXPR) 742 1.1 mrg { 743 1.1 mrg print_node (file, "vars", TREE_OPERAND (node, 0), indent + 4); 744 1.1 mrg print_node (file, "body", TREE_OPERAND (node, 1), indent + 4); 745 1.1 mrg print_node (file, "block", TREE_OPERAND (node, 2), indent + 4); 746 1.1 mrg break; 747 1.1 mrg } 748 1.1 mrg if (code == CALL_EXPR) 749 1.1 mrg { 750 1.1 mrg print_node (file, "fn", CALL_EXPR_FN (node), indent + 4); 751 1.1 mrg print_node (file, "static_chain", CALL_EXPR_STATIC_CHAIN (node), 752 1.1 mrg indent + 4); 753 1.1 mrg 754 1.1 mrg call_expr_arg_iterator iter; 755 1.1 mrg init_call_expr_arg_iterator (node, &iter); 756 1.1 mrg while (more_call_expr_args_p (&iter)) 757 1.1 mrg { 758 1.1 mrg /* Buffer big enough to format a 32-bit UINT_MAX into, plus 759 1.1 mrg the text. */ 760 1.1 mrg char temp[15]; 761 1.1 mrg sprintf (temp, "arg:%u", iter.i); 762 1.1 mrg tree arg = next_call_expr_arg (&iter); 763 1.1 mrg if (arg) 764 1.1 mrg print_node (file, temp, arg, indent + 4); 765 1.1 mrg else 766 1.1 mrg { 767 1.1 mrg indent_to (file, indent + 4); 768 1.1 mrg fprintf (file, "%s NULL", temp); 769 1.1 mrg } 770 1.1 mrg } 771 1.1 mrg } 772 1.1 mrg else 773 1.1 mrg { 774 1.1 mrg len = TREE_OPERAND_LENGTH (node); 775 1.1 mrg 776 1.1 mrg for (i = 0; i < len; i++) 777 1.1 mrg { 778 1.1 mrg /* Buffer big enough to format a 32-bit UINT_MAX into, plus 779 1.1 mrg the text. */ 780 1.1 mrg char temp[16]; 781 1.1 mrg 782 1.1 mrg sprintf (temp, "arg:%d", i); 783 1.1 mrg print_node (file, temp, TREE_OPERAND (node, i), indent + 4); 784 1.1 mrg } 785 1.1 mrg } 786 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_COMMON)) 787 1.1 mrg print_node (file, "chain", TREE_CHAIN (node), indent + 4); 788 1.1 mrg break; 789 1.1 mrg 790 1.1 mrg case tcc_constant: 791 1.1 mrg case tcc_exceptional: 792 1.1 mrg switch (code) 793 1.1 mrg { 794 1.1 mrg case INTEGER_CST: 795 1.1 mrg if (TREE_OVERFLOW (node)) 796 1.1 mrg fprintf (file, " overflow"); 797 1.1 mrg 798 1.1 mrg fprintf (file, " "); 799 1.1 mrg print_dec (wi::to_wide (node), file, TYPE_SIGN (TREE_TYPE (node))); 800 1.1 mrg break; 801 1.1 mrg 802 1.1 mrg case REAL_CST: 803 1.1 mrg print_real_cst (file, node, false); 804 1.1 mrg break; 805 1.1 mrg 806 1.1 mrg case FIXED_CST: 807 1.1 mrg { 808 1.1 mrg FIXED_VALUE_TYPE f; 809 1.1 mrg char string[64]; 810 1.1 mrg 811 1.1 mrg if (TREE_OVERFLOW (node)) 812 1.1 mrg fprintf (file, " overflow"); 813 1.1 mrg 814 1.1 mrg f = TREE_FIXED_CST (node); 815 1.1 mrg fixed_to_decimal (string, &f, sizeof (string)); 816 1.1 mrg fprintf (file, " %s", string); 817 1.1 mrg } 818 1.1 mrg break; 819 1.1 mrg 820 1.1 mrg case VECTOR_CST: 821 1.1 mrg { 822 1.1 mrg /* Big enough for UINT_MAX plus the string below. */ 823 1.1 mrg char buf[32]; 824 1.1 mrg 825 1.1 mrg fprintf (file, " npatterns:%u nelts-per-pattern:%u", 826 1.1 mrg VECTOR_CST_NPATTERNS (node), 827 1.1 mrg VECTOR_CST_NELTS_PER_PATTERN (node)); 828 1.1 mrg unsigned int count = vector_cst_encoded_nelts (node); 829 1.1 mrg for (unsigned int i = 0; i < count; ++i) 830 1.1 mrg { 831 1.1 mrg sprintf (buf, "elt:%u: ", i); 832 1.1 mrg print_node (file, buf, VECTOR_CST_ENCODED_ELT (node, i), 833 1.1 mrg indent + 4); 834 1.1 mrg } 835 1.1 mrg } 836 1.1 mrg break; 837 1.1 mrg 838 1.1 mrg case COMPLEX_CST: 839 1.1 mrg print_node (file, "real", TREE_REALPART (node), indent + 4); 840 1.1 mrg print_node (file, "imag", TREE_IMAGPART (node), indent + 4); 841 1.1 mrg break; 842 1.1 mrg 843 1.1 mrg case STRING_CST: 844 1.1 mrg { 845 1.1 mrg const char *p = TREE_STRING_POINTER (node); 846 1.1 mrg int i = TREE_STRING_LENGTH (node); 847 1.1 mrg fputs (" \"", file); 848 1.1 mrg while (--i >= 0) 849 1.1 mrg { 850 1.1 mrg char ch = *p++; 851 1.1 mrg if (ch >= ' ' && ch < 127) 852 1.1 mrg putc (ch, file); 853 1.1 mrg else 854 1.1 mrg fprintf (file, "\\%03o", ch & 0xFF); 855 1.1 mrg } 856 1.1 mrg fputc ('\"', file); 857 1.1 mrg } 858 1.1 mrg break; 859 1.1 mrg 860 1.1 mrg case POLY_INT_CST: 861 1.1 mrg { 862 1.1 mrg char buf[10]; 863 1.1 mrg for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i) 864 1.1 mrg { 865 1.1 mrg snprintf (buf, sizeof (buf), "elt%u:", i); 866 1.1 mrg print_node (file, buf, POLY_INT_CST_COEFF (node, i), 867 1.1 mrg indent + 4); 868 1.1 mrg } 869 1.1 mrg } 870 1.1 mrg break; 871 1.1 mrg 872 1.1 mrg case IDENTIFIER_NODE: 873 1.1 mrg lang_hooks.print_identifier (file, node, indent); 874 1.1 mrg break; 875 1.1 mrg 876 1.1 mrg case TREE_LIST: 877 1.1 mrg print_node (file, "purpose", TREE_PURPOSE (node), indent + 4); 878 1.1 mrg print_node (file, "value", TREE_VALUE (node), indent + 4); 879 1.1 mrg print_node (file, "chain", TREE_CHAIN (node), indent + 4); 880 1.1 mrg break; 881 1.1 mrg 882 1.1 mrg case TREE_VEC: 883 1.1 mrg len = TREE_VEC_LENGTH (node); 884 1.1 mrg fprintf (file, " length:%d", len); 885 1.1 mrg for (i = 0; i < len; i++) 886 1.1 mrg if (TREE_VEC_ELT (node, i)) 887 1.1 mrg { 888 1.1 mrg /* Buffer big enough to format a 32-bit UINT_MAX into, plus 889 1.1 mrg the text. */ 890 1.1 mrg char temp[16]; 891 1.1 mrg sprintf (temp, "elt:%d", i); 892 1.1 mrg print_node (file, temp, TREE_VEC_ELT (node, i), indent + 4); 893 1.1 mrg } 894 1.1 mrg break; 895 1.1 mrg 896 1.1 mrg case CONSTRUCTOR: 897 1.1 mrg { 898 1.1 mrg unsigned HOST_WIDE_INT cnt; 899 1.1 mrg tree index, value; 900 1.1 mrg len = CONSTRUCTOR_NELTS (node); 901 1.1 mrg fprintf (file, " length:%d", len); 902 1.1 mrg FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node), 903 1.1 mrg cnt, index, value) 904 1.1 mrg { 905 1.1 mrg print_node (file, "idx", index, indent + 4, false); 906 1.1 mrg print_node (file, "val", value, indent + 4, false); 907 1.1 mrg } 908 1.1 mrg } 909 1.1 mrg break; 910 1.1 mrg 911 1.1 mrg case STATEMENT_LIST: 912 1.1 mrg dump_addr (file, " head ", node->stmt_list.head); 913 1.1 mrg dump_addr (file, " tail ", node->stmt_list.tail); 914 1.1 mrg fprintf (file, " stmts"); 915 1.1 mrg { 916 1.1 mrg tree_stmt_iterator i; 917 1.1 mrg for (i = tsi_start (node); !tsi_end_p (i); tsi_next (&i)) 918 1.1 mrg { 919 1.1 mrg /* Not printing the addresses of the (not-a-tree) 920 1.1 mrg 'struct tree_stmt_list_node's. */ 921 1.1 mrg dump_addr (file, " ", tsi_stmt (i)); 922 1.1 mrg } 923 1.1 mrg fprintf (file, "\n"); 924 1.1 mrg for (i = tsi_start (node); !tsi_end_p (i); tsi_next (&i)) 925 1.1 mrg { 926 1.1 mrg /* Not printing the addresses of the (not-a-tree) 927 1.1 mrg 'struct tree_stmt_list_node's. */ 928 1.1 mrg print_node (file, "stmt", tsi_stmt (i), indent + 4); 929 1.1 mrg } 930 1.1 mrg } 931 1.1 mrg break; 932 1.1 mrg 933 1.1 mrg case BLOCK: 934 1.1 mrg print_node (file, "vars", BLOCK_VARS (node), indent + 4); 935 1.1 mrg print_node (file, "supercontext", BLOCK_SUPERCONTEXT (node), 936 1.1 mrg indent + 4); 937 1.1 mrg print_node (file, "subblocks", BLOCK_SUBBLOCKS (node), indent + 4); 938 1.1 mrg print_node (file, "chain", BLOCK_CHAIN (node), indent + 4); 939 1.1 mrg print_node (file, "abstract_origin", 940 1.1 mrg BLOCK_ABSTRACT_ORIGIN (node), indent + 4); 941 1.1 mrg break; 942 1.1 mrg 943 1.1 mrg case SSA_NAME: 944 1.1 mrg print_node_brief (file, "var", SSA_NAME_VAR (node), indent + 4); 945 1.1 mrg indent_to (file, indent + 4); 946 1.1 mrg fprintf (file, "def_stmt "); 947 1.1 mrg { 948 1.1 mrg pretty_printer buffer; 949 1.1 mrg buffer.buffer->stream = file; 950 1.1 mrg pp_gimple_stmt_1 (&buffer, SSA_NAME_DEF_STMT (node), indent + 4, 951 1.1 mrg TDF_NONE); 952 1.1 mrg pp_flush (&buffer); 953 1.1 mrg } 954 1.1 mrg 955 1.1 mrg indent_to (file, indent + 4); 956 1.1 mrg fprintf (file, "version:%u", SSA_NAME_VERSION (node)); 957 1.1 mrg if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node)) 958 1.1 mrg fprintf (file, " in-abnormal-phi"); 959 1.1 mrg if (SSA_NAME_IN_FREE_LIST (node)) 960 1.1 mrg fprintf (file, " in-free-list"); 961 1.1 mrg 962 1.1 mrg if (SSA_NAME_PTR_INFO (node)) 963 1.1 mrg { 964 1.1 mrg indent_to (file, indent + 3); 965 1.1 mrg if (SSA_NAME_PTR_INFO (node)) 966 1.1 mrg dump_addr (file, " ptr-info ", SSA_NAME_PTR_INFO (node)); 967 1.1 mrg } 968 1.1 mrg break; 969 1.1 mrg 970 1.1 mrg case OMP_CLAUSE: 971 1.1 mrg { 972 1.1 mrg int i; 973 1.1 mrg fprintf (file, " %s", 974 1.1 mrg omp_clause_code_name[OMP_CLAUSE_CODE (node)]); 975 1.1 mrg for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (node)]; i++) 976 1.1 mrg { 977 1.1 mrg indent_to (file, indent + 4); 978 1.1 mrg fprintf (file, "op-%d:", i); 979 1.1 mrg print_node_brief (file, "", OMP_CLAUSE_OPERAND (node, i), 0); 980 1.1 mrg } 981 1.1 mrg } 982 1.1 mrg break; 983 1.1 mrg 984 1.1 mrg case OPTIMIZATION_NODE: 985 1.1 mrg cl_optimization_print (file, indent + 4, TREE_OPTIMIZATION (node)); 986 1.1 mrg break; 987 1.1 mrg 988 1.1 mrg case TARGET_OPTION_NODE: 989 1.1 mrg cl_target_option_print (file, indent + 4, TREE_TARGET_OPTION (node)); 990 1.1 mrg break; 991 1.1 mrg case IMPORTED_DECL: 992 1.1 mrg fprintf (file, " imported-declaration"); 993 1.1 mrg print_node_brief (file, "associated-declaration", 994 1.1 mrg IMPORTED_DECL_ASSOCIATED_DECL (node), 995 1.1 mrg indent + 4); 996 1.1 mrg break; 997 1.1 mrg 998 1.1 mrg case TREE_BINFO: 999 1.1 mrg fprintf (file, " bases:%d", 1000 1.1 mrg vec_safe_length (BINFO_BASE_BINFOS (node))); 1001 1.1 mrg print_node_brief (file, "offset", BINFO_OFFSET (node), indent + 4); 1002 1.1 mrg print_node_brief (file, "virtuals", BINFO_VIRTUALS (node), 1003 1.1 mrg indent + 4); 1004 1.1 mrg print_node_brief (file, "inheritance-chain", 1005 1.1 mrg BINFO_INHERITANCE_CHAIN (node), 1006 1.1 mrg indent + 4); 1007 1.1 mrg break; 1008 1.1 mrg 1009 1.1 mrg default: 1010 1.1 mrg lang_hooks.print_xnode (file, node, indent); 1011 1.1 mrg break; 1012 1.1 mrg } 1013 1.1 mrg 1014 1.1 mrg break; 1015 1.1 mrg } 1016 1.1 mrg 1017 1.1 mrg if (EXPR_HAS_LOCATION (node)) 1018 1.1 mrg { 1019 1.1 mrg expanded_location xloc = expand_location (EXPR_LOCATION (node)); 1020 1.1 mrg indent_to (file, indent+4); 1021 1.1 mrg fprintf (file, "%s:%d:%d", xloc.file, xloc.line, xloc.column); 1022 1.1 mrg 1023 1.1 mrg /* Print the range, if any */ 1024 1.1 mrg source_range r = EXPR_LOCATION_RANGE (node); 1025 1.1 mrg if (r.m_start) 1026 1.1 mrg { 1027 1.1 mrg xloc = expand_location (r.m_start); 1028 1.1 mrg fprintf (file, " start: %s:%d:%d", xloc.file, xloc.line, xloc.column); 1029 1.1 mrg } 1030 1.1 mrg else 1031 1.1 mrg { 1032 1.1 mrg fprintf (file, " start: unknown"); 1033 1.1 mrg } 1034 1.1 mrg if (r.m_finish) 1035 1.1 mrg { 1036 1.1 mrg xloc = expand_location (r.m_finish); 1037 1.1 mrg fprintf (file, " finish: %s:%d:%d", xloc.file, xloc.line, xloc.column); 1038 1.1 mrg } 1039 1.1 mrg else 1040 1.1 mrg { 1041 1.1 mrg fprintf (file, " finish: unknown"); 1042 1.1 mrg } 1043 1.1 mrg } 1044 1.1 mrg 1045 1.1 mrg fprintf (file, ">"); 1046 1.1 mrg } 1047 1.1 mrg 1048 1.1 mrg /* Print the identifier for DECL according to FLAGS. */ 1049 1.1 mrg 1050 1.1 mrg void 1051 1.1 mrg print_decl_identifier (FILE *file, tree decl, int flags) 1052 1.1 mrg { 1053 1.1 mrg bool needs_colon = false; 1054 1.1 mrg const char *name; 1055 1.1 mrg char c; 1056 1.1 mrg 1057 1.1 mrg if (flags & PRINT_DECL_ORIGIN) 1058 1.1 mrg { 1059 1.1 mrg if (DECL_IS_UNDECLARED_BUILTIN (decl)) 1060 1.1 mrg fputs ("<built-in>", file); 1061 1.1 mrg else 1062 1.1 mrg { 1063 1.1 mrg expanded_location loc 1064 1.1 mrg = expand_location (DECL_SOURCE_LOCATION (decl)); 1065 1.1 mrg fprintf (file, "%s:%d:%d", loc.file, loc.line, loc.column); 1066 1.1 mrg } 1067 1.1 mrg needs_colon = true; 1068 1.1 mrg } 1069 1.1 mrg 1070 1.1 mrg if (flags & PRINT_DECL_UNIQUE_NAME) 1071 1.1 mrg { 1072 1.1 mrg name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); 1073 1.1 mrg if (!TREE_PUBLIC (decl) 1074 1.1 mrg || (DECL_WEAK (decl) && !DECL_EXTERNAL (decl))) 1075 1.1 mrg /* The symbol has internal or weak linkage so its assembler name 1076 1.1 mrg is not necessarily unique among the compilation units of the 1077 1.1 mrg program. We therefore have to further mangle it. But we can't 1078 1.1 mrg simply use DECL_SOURCE_FILE because it contains the name of the 1079 1.1 mrg file the symbol originates from so, e.g. for function templates 1080 1.1 mrg in C++ where the templates are defined in a header file, we can 1081 1.1 mrg have symbols with the same assembler name and DECL_SOURCE_FILE. 1082 1.1 mrg That's why we use the name of the top-level source file of the 1083 1.1 mrg compilation unit. ??? Unnecessary for Ada. */ 1084 1.1 mrg name = ACONCAT ((main_input_filename, ":", name, NULL)); 1085 1.1 mrg } 1086 1.1 mrg else if (flags & PRINT_DECL_NAME) 1087 1.1 mrg { 1088 1.1 mrg /* We don't want to print the full qualified name because it can be long, 1089 1.1 mrg so we strip the scope prefix, but we may need to deal with the suffix 1090 1.1 mrg created by the compiler. */ 1091 1.1 mrg const char *suffix = strchr (IDENTIFIER_POINTER (DECL_NAME (decl)), '.'); 1092 1.1 mrg name = lang_hooks.decl_printable_name (decl, 2); 1093 1.1 mrg if (suffix) 1094 1.1 mrg { 1095 1.1 mrg const char *dot = strchr (name, '.'); 1096 1.1 mrg while (dot && strcasecmp (dot, suffix) != 0) 1097 1.1 mrg { 1098 1.1 mrg name = dot + 1; 1099 1.1 mrg dot = strchr (name, '.'); 1100 1.1 mrg } 1101 1.1 mrg } 1102 1.1 mrg else 1103 1.1 mrg { 1104 1.1 mrg const char *dot = strrchr (name, '.'); 1105 1.1 mrg if (dot) 1106 1.1 mrg name = dot + 1; 1107 1.1 mrg } 1108 1.1 mrg } 1109 1.1 mrg else 1110 1.1 mrg return; 1111 1.1 mrg 1112 1.1 mrg if (needs_colon) 1113 1.1 mrg fputc (':', file); 1114 1.1 mrg 1115 1.1 mrg while ((c = *name++) != '\0') 1116 1.1 mrg { 1117 1.1 mrg /* Strip double-quotes because of VCG. */ 1118 1.1 mrg if (c == '"') 1119 1.1 mrg continue; 1120 1.1 mrg fputc (c, file); 1121 1.1 mrg } 1122 1.1 mrg } 1123 1.1 mrg 1124 1.1 mrg 1125 1.1 mrg /* Print the node NODE on standard error, for debugging. 1126 1.1 mrg Most nodes referred to by this one are printed recursively 1127 1.1 mrg down to a depth of six. */ 1128 1.1 mrg 1129 1.1 mrg DEBUG_FUNCTION void 1130 1.1 mrg debug_tree (tree node) 1131 1.1 mrg { 1132 1.1 mrg table = new hash_set<tree> (HASH_SIZE); 1133 1.1 mrg print_node (stderr, "", node, 0); 1134 1.1 mrg delete table; 1135 1.1 mrg table = NULL; 1136 1.1 mrg putc ('\n', stderr); 1137 1.1 mrg } 1138 1.1 mrg 1139 1.1 mrg DEBUG_FUNCTION void 1140 1.1 mrg debug_raw (const tree_node &ref) 1141 1.1 mrg { 1142 1.1 mrg debug_tree (const_cast <tree> (&ref)); 1143 1.1 mrg } 1144 1.1 mrg 1145 1.1 mrg DEBUG_FUNCTION void 1146 1.1 mrg debug_raw (const tree_node *ptr) 1147 1.1 mrg { 1148 1.1 mrg if (ptr) 1149 1.1 mrg debug_raw (*ptr); 1150 1.1 mrg else 1151 1.1 mrg fprintf (stderr, "<nil>\n"); 1152 1.1 mrg } 1153 1.1 mrg 1154 1.1 mrg static void 1155 1.1 mrg dump_tree_via_hooks (const tree_node *ptr, dump_flags_t options) 1156 1.1 mrg { 1157 1.1 mrg if (DECL_P (ptr)) 1158 1.1 mrg lang_hooks.print_decl (stderr, const_cast <tree_node*> (ptr), 0); 1159 1.1 mrg else if (TYPE_P (ptr)) 1160 1.1 mrg lang_hooks.print_type (stderr, const_cast <tree_node*> (ptr), 0); 1161 1.1 mrg else if (TREE_CODE (ptr) == IDENTIFIER_NODE) 1162 1.1 mrg lang_hooks.print_identifier (stderr, const_cast <tree_node*> (ptr), 0); 1163 1.1 mrg else 1164 1.1 mrg print_generic_expr (stderr, const_cast <tree_node*> (ptr), options); 1165 1.1 mrg fprintf (stderr, "\n"); 1166 1.1 mrg } 1167 1.1 mrg 1168 1.1 mrg DEBUG_FUNCTION void 1169 1.1 mrg debug (const tree_node &ref) 1170 1.1 mrg { 1171 1.1 mrg dump_tree_via_hooks (&ref, TDF_NONE); 1172 1.1 mrg } 1173 1.1 mrg 1174 1.1 mrg DEBUG_FUNCTION void 1175 1.1 mrg debug (const tree_node *ptr) 1176 1.1 mrg { 1177 1.1 mrg if (ptr) 1178 1.1 mrg debug (*ptr); 1179 1.1 mrg else 1180 1.1 mrg fprintf (stderr, "<nil>\n"); 1181 1.1 mrg } 1182 1.1 mrg 1183 1.1 mrg DEBUG_FUNCTION void 1184 1.1 mrg debug_head (const tree_node &ref) 1185 1.1 mrg { 1186 1.1 mrg debug (ref); 1187 1.1 mrg } 1188 1.1 mrg 1189 1.1 mrg DEBUG_FUNCTION void 1190 1.1 mrg debug_head (const tree_node *ptr) 1191 1.1 mrg { 1192 1.1 mrg if (ptr) 1193 1.1 mrg debug_head (*ptr); 1194 1.1 mrg else 1195 1.1 mrg fprintf (stderr, "<nil>\n"); 1196 1.1 mrg } 1197 1.1 mrg 1198 1.1 mrg DEBUG_FUNCTION void 1199 1.1 mrg debug_body (const tree_node &ref) 1200 1.1 mrg { 1201 1.1 mrg if (TREE_CODE (&ref) == FUNCTION_DECL) 1202 1.1 mrg dump_function_to_file (const_cast <tree_node*> (&ref), stderr, TDF_NONE); 1203 1.1 mrg else 1204 1.1 mrg debug (ref); 1205 1.1 mrg } 1206 1.1 mrg 1207 1.1 mrg DEBUG_FUNCTION void 1208 1.1 mrg debug_body (const tree_node *ptr) 1209 1.1 mrg { 1210 1.1 mrg if (ptr) 1211 1.1 mrg debug_body (*ptr); 1212 1.1 mrg else 1213 1.1 mrg fprintf (stderr, "<nil>\n"); 1214 1.1 mrg } 1215 1.1 mrg 1216 1.1 mrg /* Print the vector of trees VEC on standard error, for debugging. 1217 1.1 mrg Most nodes referred to by this one are printed recursively 1218 1.1 mrg down to a depth of six. */ 1219 1.1 mrg 1220 1.1 mrg DEBUG_FUNCTION void 1221 1.1 mrg debug_raw (vec<tree, va_gc> &ref) 1222 1.1 mrg { 1223 1.1 mrg tree elt; 1224 1.1 mrg unsigned ix; 1225 1.1 mrg 1226 1.1 mrg /* Print the slot this node is in, and its code, and address. */ 1227 1.1 mrg fprintf (stderr, "<VEC"); 1228 1.1 mrg dump_addr (stderr, " ", ref.address ()); 1229 1.1 mrg 1230 1.1 mrg FOR_EACH_VEC_ELT (ref, ix, elt) 1231 1.1 mrg { 1232 1.1 mrg fprintf (stderr, "elt:%d ", ix); 1233 1.1 mrg debug_raw (elt); 1234 1.1 mrg } 1235 1.1 mrg } 1236 1.1 mrg 1237 1.1 mrg DEBUG_FUNCTION void 1238 1.1 mrg debug_raw (vec<tree, va_gc> *ptr) 1239 1.1 mrg { 1240 1.1 mrg if (ptr) 1241 1.1 mrg debug_raw (*ptr); 1242 1.1 mrg else 1243 1.1 mrg fprintf (stderr, "<nil>\n"); 1244 1.1 mrg } 1245 1.1 mrg 1246 1.1 mrg static void 1247 1.1 mrg debug_slim (tree t) 1248 1.1 mrg { 1249 1.1 mrg print_node_brief (stderr, "", t, 0); 1250 1.1 mrg } 1251 1.1 mrg 1252 1.1 mrg DEFINE_DEBUG_VEC (tree) 1253 DEFINE_DEBUG_HASH_SET (tree) 1254