]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cp/dump.c
genattrtab.c (write_header): Include hash-set.h...
[thirdparty/gcc.git] / gcc / cp / dump.c
CommitLineData
f71f87f9 1/* Tree-dumping functionality for intermediate representation.
5624e564 2 Copyright (C) 1999-2015 Free Software Foundation, Inc.
f71f87f9
MM
3 Written by Mark Mitchell <mark@codesourcery.com>
4
f5adbb8d 5This file is part of GCC.
f71f87f9 6
f5adbb8d 7GCC is free software; you can redistribute it and/or modify
f71f87f9 8it under the terms of the GNU General Public License as published by
e77f031d 9the Free Software Foundation; either version 3, or (at your option)
f71f87f9
MM
10any later version.
11
f5adbb8d 12GCC is distributed in the hope that it will be useful,
f71f87f9
MM
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
e77f031d
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
f71f87f9 20
f71f87f9
MM
21#include "config.h"
22#include "system.h"
4977bab6
ZW
23#include "coretypes.h"
24#include "tm.h"
40e23961
MC
25#include "hash-set.h"
26#include "machmode.h"
27#include "vec.h"
28#include "double-int.h"
29#include "input.h"
30#include "alias.h"
31#include "symtab.h"
32#include "wide-int.h"
33#include "inchash.h"
f71f87f9
MM
34#include "tree.h"
35#include "cp-tree.h"
89d684bb 36#include "tree-dump.h"
f71f87f9 37
ee42dd9d 38static void dump_access (dump_info_p, tree);
005a5cb0 39
ee42dd9d 40static void dump_op (dump_info_p, tree);
78a40378 41
005a5cb0
MY
42/* Dump a representation of the accessibility information associated
43 with T. */
44
45static void
ee42dd9d 46dump_access (dump_info_p di, tree t)
005a5cb0
MY
47{
48 if (TREE_PROTECTED(t))
1966af04 49 dump_string_field (di, "accs", "prot");
005a5cb0 50 else if (TREE_PRIVATE(t))
1966af04 51 dump_string_field (di, "accs", "priv");
005a5cb0 52 else
1966af04 53 dump_string_field (di, "accs", "pub");
005a5cb0
MY
54}
55
78a40378 56/* Dump a representation of the specific operator for an overloaded
558ee214 57 operator associated with node t. */
78a40378
MM
58
59static void
ee42dd9d 60dump_op (dump_info_p di, tree t)
78a40378
MM
61{
62 switch (DECL_OVERLOADED_OPERATOR_P (t)) {
63 case NEW_EXPR:
64 dump_string (di, "new");
65 break;
66 case VEC_NEW_EXPR:
67 dump_string (di, "vecnew");
68 break;
69 case DELETE_EXPR:
70 dump_string (di, "delete");
71 break;
72 case VEC_DELETE_EXPR:
73 dump_string (di, "vecdelete");
74 break;
392e3d51 75 case UNARY_PLUS_EXPR:
78a40378
MM
76 dump_string (di, "pos");
77 break;
78 case NEGATE_EXPR:
79 dump_string (di, "neg");
80 break;
81 case ADDR_EXPR:
82 dump_string (di, "addr");
83 break;
84 case INDIRECT_REF:
85 dump_string(di, "deref");
86 break;
87 case BIT_NOT_EXPR:
88 dump_string(di, "not");
89 break;
90 case TRUTH_NOT_EXPR:
91 dump_string(di, "lnot");
92 break;
93 case PREINCREMENT_EXPR:
94 dump_string(di, "preinc");
95 break;
96 case PREDECREMENT_EXPR:
97 dump_string(di, "predec");
98 break;
99 case PLUS_EXPR:
100 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 101 dump_string (di, "plusassign");
78a40378 102 else
0cbd7506 103 dump_string(di, "plus");
78a40378
MM
104 break;
105 case MINUS_EXPR:
106 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 107 dump_string (di, "minusassign");
78a40378 108 else
0cbd7506 109 dump_string(di, "minus");
78a40378
MM
110 break;
111 case MULT_EXPR:
112 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 113 dump_string (di, "multassign");
78a40378 114 else
0cbd7506 115 dump_string (di, "mult");
78a40378
MM
116 break;
117 case TRUNC_DIV_EXPR:
118 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 119 dump_string (di, "divassign");
78a40378 120 else
0cbd7506 121 dump_string (di, "div");
78a40378
MM
122 break;
123 case TRUNC_MOD_EXPR:
124 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 125 dump_string (di, "modassign");
78a40378 126 else
0cbd7506 127 dump_string (di, "mod");
78a40378
MM
128 break;
129 case BIT_AND_EXPR:
130 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 131 dump_string (di, "andassign");
78a40378 132 else
0cbd7506 133 dump_string (di, "and");
78a40378
MM
134 break;
135 case BIT_IOR_EXPR:
136 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 137 dump_string (di, "orassign");
78a40378 138 else
0cbd7506 139 dump_string (di, "or");
78a40378
MM
140 break;
141 case BIT_XOR_EXPR:
142 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 143 dump_string (di, "xorassign");
78a40378 144 else
0cbd7506 145 dump_string (di, "xor");
78a40378
MM
146 break;
147 case LSHIFT_EXPR:
148 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 149 dump_string (di, "lshiftassign");
78a40378 150 else
0cbd7506 151 dump_string (di, "lshift");
78a40378
MM
152 break;
153 case RSHIFT_EXPR:
154 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 155 dump_string (di, "rshiftassign");
78a40378 156 else
0cbd7506 157 dump_string (di, "rshift");
78a40378
MM
158 break;
159 case EQ_EXPR:
160 dump_string (di, "eq");
161 break;
162 case NE_EXPR:
163 dump_string (di, "ne");
164 break;
165 case LT_EXPR:
166 dump_string (di, "lt");
167 break;
168 case GT_EXPR:
169 dump_string (di, "gt");
170 break;
171 case LE_EXPR:
172 dump_string (di, "le");
173 break;
174 case GE_EXPR:
175 dump_string (di, "ge");
176 break;
177 case TRUTH_ANDIF_EXPR:
178 dump_string (di, "land");
179 break;
180 case TRUTH_ORIF_EXPR:
181 dump_string (di, "lor");
182 break;
183 case COMPOUND_EXPR:
184 dump_string (di, "compound");
185 break;
186 case MEMBER_REF:
187 dump_string (di, "memref");
188 break;
189 case COMPONENT_REF:
190 dump_string (di, "ref");
191 break;
192 case ARRAY_REF:
193 dump_string (di, "subs");
194 break;
195 case POSTINCREMENT_EXPR:
c8094d83 196 dump_string (di, "postinc");
78a40378
MM
197 break;
198 case POSTDECREMENT_EXPR:
199 dump_string (di, "postdec");
200 break;
201 case CALL_EXPR:
202 dump_string (di, "call");
203 break;
204 case NOP_EXPR:
205 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 206 dump_string (di, "assign");
78a40378
MM
207 break;
208 default:
209 break;
210 }
211}
212
7ee2468b
SB
213/* Dump information common to statements from STMT. */
214
215static void
216dump_stmt (dump_info_p di, const_tree t)
217{
218 if (EXPR_HAS_LOCATION (t))
219 dump_int (di, "line", EXPR_LINENO (t));
220}
221
2bd3ecad 222bool
ee42dd9d 223cp_dump_tree (void* dump_info, tree t)
f71f87f9 224{
f71f87f9 225 enum tree_code code;
89d684bb 226 dump_info_p di = (dump_info_p) dump_info;
f71f87f9
MM
227
228 /* Figure out what kind of node this is. */
229 code = TREE_CODE (t);
f71f87f9 230
0a7394bc 231 if (DECL_P (t))
f71f87f9 232 {
421844e7 233 if (DECL_LANG_SPECIFIC (t) && DECL_LANGUAGE (t) != lang_cplusplus)
1966af04 234 dump_string_field (di, "lang", language_to_string (DECL_LANGUAGE (t)));
f71f87f9 235 }
f71f87f9 236
f71f87f9
MM
237 switch (code)
238 {
f71f87f9
MM
239 case IDENTIFIER_NODE:
240 if (IDENTIFIER_OPNAME_P (t))
0a7394bc 241 {
1966af04 242 dump_string_field (di, "note", "operator");
2bd3ecad 243 return true;
0a7394bc 244 }
f71f87f9 245 else if (IDENTIFIER_TYPENAME_P (t))
f71f87f9 246 {
0a7394bc 247 dump_child ("tynm", TREE_TYPE (t));
2bd3ecad 248 return true;
f71f87f9 249 }
f71f87f9
MM
250 break;
251
a5ac359a 252 case OFFSET_TYPE:
1966af04 253 dump_string_field (di, "note", "ptrmem");
a5ac359a
MM
254 dump_child ("ptd", TYPE_PTRMEM_POINTED_TO_TYPE (t));
255 dump_child ("cls", TYPE_PTRMEM_CLASS_TYPE (t));
256 return true;
f71f87f9
MM
257
258 case RECORD_TYPE:
f71f87f9
MM
259 if (TYPE_PTRMEMFUNC_P (t))
260 {
1966af04 261 dump_string_field (di, "note", "ptrmem");
8badec73
MM
262 dump_child ("ptd", TYPE_PTRMEM_POINTED_TO_TYPE (t));
263 dump_child ("cls", TYPE_PTRMEM_CLASS_TYPE (t));
2bd3ecad 264 return true;
f71f87f9 265 }
a5ac359a 266 /* Fall through. */
f71f87f9 267
a5ac359a 268 case UNION_TYPE:
5a5cccaa
NS
269 /* Is it a type used as a base? */
270 if (TYPE_CONTEXT (t) && TREE_CODE (TYPE_CONTEXT (t)) == TREE_CODE (t)
271 && CLASSTYPE_AS_BASE (TYPE_CONTEXT (t)) == t)
272 {
273 dump_child ("bfld", TYPE_CONTEXT (t));
2bd3ecad 274 return true;
5a5cccaa 275 }
c8094d83 276
9e1e64ec 277 if (! MAYBE_CLASS_TYPE_P (t))
4e8dca1c
JM
278 break;
279
0a7394bc 280 dump_child ("vfld", TYPE_VFIELD (t));
78a40378 281 if (CLASSTYPE_TEMPLATE_SPECIALIZATION(t))
0cbd7506 282 dump_string(di, "spec");
b7442fb5 283
3758425f 284 if (!dump_flag (di, TDF_SLIM, t) && TYPE_BINFO (t))
b7442fb5
NS
285 {
286 int i;
fa743e8c
NS
287 tree binfo;
288 tree base_binfo;
c8094d83 289
fa743e8c
NS
290 for (binfo = TYPE_BINFO (t), i = 0;
291 BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i)
b7442fb5 292 {
b7442fb5 293 dump_child ("base", BINFO_TYPE (base_binfo));
c8094d83 294 if (BINFO_VIRTUAL_P (base_binfo))
1966af04 295 dump_string_field (di, "spec", "virt");
b7442fb5
NS
296 dump_access (di, base_binfo);
297 }
298 }
005a5cb0
MY
299 break;
300
301 case FIELD_DECL:
302 dump_access (di, t);
78a40378 303 if (DECL_MUTABLE_P (t))
1966af04 304 dump_string_field (di, "spec", "mutable");
f71f87f9
MM
305 break;
306
78a40378
MM
307 case VAR_DECL:
308 if (TREE_CODE (CP_DECL_CONTEXT (t)) == RECORD_TYPE)
0cbd7506 309 dump_access (di, t);
78a40378 310 if (TREE_STATIC (t) && !TREE_PUBLIC (t))
1966af04 311 dump_string_field (di, "link", "static");
c8094d83 312 break;
78a40378 313
f71f87f9 314 case FUNCTION_DECL:
31f8e4f3 315 if (!DECL_THUNK_P (t))
e9e7f181 316 {
0cbd7506 317 if (DECL_OVERLOADED_OPERATOR_P (t)) {
1966af04 318 dump_string_field (di, "note", "operator");
0cbd7506
MS
319 dump_op (di, t);
320 }
c8094d83 321 if (DECL_FUNCTION_MEMBER_P (t))
005a5cb0 322 {
1966af04 323 dump_string_field (di, "note", "member");
005a5cb0
MY
324 dump_access (di, t);
325 }
0cbd7506 326 if (DECL_PURE_VIRTUAL_P (t))
1966af04 327 dump_string_field (di, "spec", "pure");
0cbd7506 328 if (DECL_VIRTUAL_P (t))
1966af04 329 dump_string_field (di, "spec", "virt");
e9e7f181 330 if (DECL_CONSTRUCTOR_P (t))
1966af04 331 dump_string_field (di, "note", "constructor");
e9e7f181 332 if (DECL_DESTRUCTOR_P (t))
1966af04 333 dump_string_field (di, "note", "destructor");
e9e7f181 334 if (DECL_CONV_FN_P (t))
1966af04 335 dump_string_field (di, "note", "conversion");
4977bab6 336 if (DECL_GLOBAL_CTOR_P (t))
1966af04 337 dump_string_field (di, "note", "global init");
4977bab6 338 if (DECL_GLOBAL_DTOR_P (t))
1966af04 339 dump_string_field (di, "note", "global fini");
1c227897 340 if (DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t))
1966af04 341 dump_string_field (di, "note", "pseudo tmpl");
e9e7f181
MM
342 }
343 else
344 {
07fa4878 345 tree virt = THUNK_VIRTUAL_OFFSET (t);
c8094d83 346
1966af04 347 dump_string_field (di, "note", "thunk");
4977bab6 348 if (DECL_THIS_THUNK_P (t))
1966af04 349 dump_string_field (di, "note", "this adjusting");
4977bab6 350 else
07fa4878 351 {
1966af04 352 dump_string_field (di, "note", "result adjusting");
07fa4878
NS
353 if (virt)
354 virt = BINFO_VPTR_FIELD (virt);
355 }
4977bab6 356 dump_int (di, "fixd", THUNK_FIXED_OFFSET (t));
07fa4878 357 if (virt)
9439e9a1 358 dump_int (di, "virt", tree_to_shwi (virt));
31f8e4f3 359 dump_child ("fn", DECL_INITIAL (t));
e9e7f181 360 }
f71f87f9
MM
361 break;
362
363 case NAMESPACE_DECL:
89c6e7ac
MM
364 if (DECL_NAMESPACE_ALIAS (t))
365 dump_child ("alis", DECL_NAMESPACE_ALIAS (t));
b7442fb5 366 else if (!dump_flag (di, TDF_SLIM, t))
89c6e7ac 367 dump_child ("dcls", cp_namespace_decls (t));
f71f87f9
MM
368 break;
369
cfe507be 370 case TEMPLATE_DECL:
da8a7456 371 dump_child ("rslt", DECL_TEMPLATE_RESULT (t));
2269eec3 372 dump_child ("inst", DECL_TEMPLATE_INSTANTIATIONS (t));
3454335f 373 dump_child ("spcs", DECL_TEMPLATE_SPECIALIZATIONS (t));
005a5cb0 374 dump_child ("prms", DECL_TEMPLATE_PARMS (t));
cfe507be
MM
375 break;
376
f71f87f9 377 case OVERLOAD:
3454335f
MM
378 dump_child ("crnt", OVL_CURRENT (t));
379 dump_child ("chan", OVL_CHAIN (t));
f71f87f9
MM
380 break;
381
0a7394bc 382 case TRY_BLOCK:
f71f87f9 383 dump_stmt (di, t);
0a7394bc 384 if (CLEANUP_P (t))
1966af04 385 dump_string_field (di, "note", "cleanup");
0a7394bc
MM
386 dump_child ("body", TRY_STMTS (t));
387 dump_child ("hdlr", TRY_HANDLERS (t));
f71f87f9
MM
388 break;
389
52a11cbf
RH
390 case EH_SPEC_BLOCK:
391 dump_stmt (di, t);
392 dump_child ("body", EH_SPEC_STMTS (t));
393 dump_child ("raises", EH_SPEC_RAISES (t));
52a11cbf
RH
394 break;
395
0a7394bc
MM
396 case PTRMEM_CST:
397 dump_child ("clas", PTRMEM_CST_CLASS (t));
398 dump_child ("mbr", PTRMEM_CST_MEMBER (t));
f71f87f9
MM
399 break;
400
0a7394bc
MM
401 case THROW_EXPR:
402 /* These nodes are unary, but do not have code class `1'. */
403 dump_child ("op 0", TREE_OPERAND (t, 0));
f71f87f9
MM
404 break;
405
0a7394bc 406 case AGGR_INIT_EXPR:
5039610b
SL
407 {
408 int i = 0;
409 tree arg;
410 aggr_init_expr_arg_iterator iter;
411 dump_int (di, "ctor", AGGR_INIT_VIA_CTOR_P (t));
412 dump_child ("fn", AGGR_INIT_EXPR_FN (t));
413 FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
414 {
415 char buffer[32];
416 sprintf (buffer, "%u", i);
417 dump_child (buffer, arg);
418 i++;
419 }
420 dump_child ("decl", AGGR_INIT_EXPR_SLOT (t));
421 }
0a7394bc 422 break;
c8094d83 423
a2edce31
MM
424 case HANDLER:
425 dump_stmt (di, t);
1a6025b4 426 dump_child ("parm", HANDLER_PARMS (t));
a2edce31 427 dump_child ("body", HANDLER_BODY (t));
a2edce31
MM
428 break;
429
52a11cbf
RH
430 case MUST_NOT_THROW_EXPR:
431 dump_stmt (di, t);
432 dump_child ("body", TREE_OPERAND (t, 0));
f2162c3d 433 dump_child ("cond", MUST_NOT_THROW_COND (t));
52a11cbf
RH
434 break;
435
5158d7ee
NS
436 case USING_STMT:
437 dump_stmt (di, t);
438 dump_child ("nmsp", USING_STMT_NAMESPACE (t));
5158d7ee 439 break;
5a508662
RH
440
441 case CLEANUP_STMT:
442 dump_stmt (di, t);
443 dump_child ("decl", CLEANUP_DECL (t));
444 dump_child ("expr", CLEANUP_EXPR (t));
445 dump_child ("body", CLEANUP_BODY (t));
5a508662
RH
446 break;
447
448 case IF_STMT:
449 dump_stmt (di, t);
450 dump_child ("cond", IF_COND (t));
451 dump_child ("then", THEN_CLAUSE (t));
452 dump_child ("else", ELSE_CLAUSE (t));
5a508662
RH
453 break;
454
fbc315db
ILT
455 case BREAK_STMT:
456 case CONTINUE_STMT:
457 dump_stmt (di, t);
458 break;
459
460 case DO_STMT:
461 dump_stmt (di, t);
462 dump_child ("body", DO_BODY (t));
463 dump_child ("cond", DO_COND (t));
464 break;
465
466 case FOR_STMT:
467 dump_stmt (di, t);
468 dump_child ("init", FOR_INIT_STMT (t));
469 dump_child ("cond", FOR_COND (t));
470 dump_child ("expr", FOR_EXPR (t));
471 dump_child ("body", FOR_BODY (t));
472 break;
473
f9132eb7
RRC
474 case RANGE_FOR_STMT:
475 dump_stmt (di, t);
476 dump_child ("decl", RANGE_FOR_DECL (t));
477 dump_child ("expr", RANGE_FOR_EXPR (t));
478 dump_child ("body", RANGE_FOR_BODY (t));
479 break;
480
fbc315db
ILT
481 case SWITCH_STMT:
482 dump_stmt (di, t);
483 dump_child ("cond", SWITCH_STMT_COND (t));
484 dump_child ("body", SWITCH_STMT_BODY (t));
485 break;
486
487 case WHILE_STMT:
488 dump_stmt (di, t);
489 dump_child ("cond", WHILE_COND (t));
490 dump_child ("body", WHILE_BODY (t));
491 break;
492
c3e5898b
ILT
493 case STMT_EXPR:
494 dump_child ("stmt", STMT_EXPR_STMT (t));
495 break;
496
934790cc
ILT
497 case EXPR_STMT:
498 dump_stmt (di, t);
499 dump_child ("expr", EXPR_STMT_EXPR (t));
500 break;
501
f71f87f9 502 default:
f71f87f9
MM
503 break;
504 }
505
558ee214 506 return c_dump_tree (di, t);
f71f87f9 507}