dump.c 12.1 KB
Newer Older
1
/* Tree-dumping functionality for intermediate representation.
2
   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2010
3
   Free Software Foundation, Inc.
4 5
   Written by Mark Mitchell <mark@codesourcery.com>

6
This file is part of GCC.
7

8
GCC 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 3, or (at your option)
11 12
any later version.

13
GCC is distributed in the hope that it will be useful,
14 15 16 17 18
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
19 20
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
21 22 23

#include "config.h"
#include "system.h"
24 25
#include "coretypes.h"
#include "tm.h"
26 27
#include "tree.h"
#include "cp-tree.h"
28
#include "tree-dump.h"
29

30
static void dump_access (dump_info_p, tree);
31

32
static void dump_op (dump_info_p, tree);
33

34 35 36 37
/* Dump a representation of the accessibility information associated
   with T.  */

static void
38
dump_access (dump_info_p di, tree t)
39 40
{
  if (TREE_PROTECTED(t))
41
    dump_string_field (di, "accs", "prot");
42
  else if (TREE_PRIVATE(t))
43
    dump_string_field (di, "accs", "priv");
44
  else
45
    dump_string_field (di, "accs", "pub");
46 47
}

48
/* Dump a representation of the specific operator for an overloaded
Jason Merrill committed
49
   operator associated with node t.  */
50 51

static void
52
dump_op (dump_info_p di, tree t)
53 54 55 56 57 58 59 60 61 62 63 64 65 66
{
  switch (DECL_OVERLOADED_OPERATOR_P (t)) {
    case NEW_EXPR:
      dump_string (di, "new");
      break;
    case VEC_NEW_EXPR:
      dump_string (di, "vecnew");
      break;
    case DELETE_EXPR:
      dump_string (di, "delete");
      break;
    case VEC_DELETE_EXPR:
      dump_string (di, "vecdelete");
      break;
67
    case UNARY_PLUS_EXPR:
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
      dump_string (di, "pos");
      break;
    case NEGATE_EXPR:
      dump_string (di, "neg");
      break;
    case ADDR_EXPR:
      dump_string (di, "addr");
      break;
    case INDIRECT_REF:
      dump_string(di, "deref");
      break;
    case BIT_NOT_EXPR:
      dump_string(di, "not");
      break;
    case TRUTH_NOT_EXPR:
      dump_string(di, "lnot");
      break;
    case PREINCREMENT_EXPR:
      dump_string(di, "preinc");
      break;
    case PREDECREMENT_EXPR:
      dump_string(di, "predec");
      break;
    case PLUS_EXPR:
      if (DECL_ASSIGNMENT_OPERATOR_P (t))
Mike Stump committed
93
	dump_string (di, "plusassign");
94
      else
Mike Stump committed
95
	dump_string(di, "plus");
96 97 98
      break;
    case MINUS_EXPR:
      if (DECL_ASSIGNMENT_OPERATOR_P (t))
Mike Stump committed
99
	dump_string (di, "minusassign");
100
      else
Mike Stump committed
101
	dump_string(di, "minus");
102 103 104
      break;
    case MULT_EXPR:
      if (DECL_ASSIGNMENT_OPERATOR_P (t))
Mike Stump committed
105
	dump_string (di, "multassign");
106
      else
Mike Stump committed
107
	dump_string (di, "mult");
108 109 110
      break;
    case TRUNC_DIV_EXPR:
      if (DECL_ASSIGNMENT_OPERATOR_P (t))
Mike Stump committed
111
	dump_string (di, "divassign");
112
      else
Mike Stump committed
113
	dump_string (di, "div");
114 115 116
      break;
    case TRUNC_MOD_EXPR:
      if (DECL_ASSIGNMENT_OPERATOR_P (t))
Mike Stump committed
117
	 dump_string (di, "modassign");
118
      else
Mike Stump committed
119
	dump_string (di, "mod");
120 121 122
      break;
    case BIT_AND_EXPR:
      if (DECL_ASSIGNMENT_OPERATOR_P (t))
Mike Stump committed
123
	dump_string (di, "andassign");
124
      else
Mike Stump committed
125
	dump_string (di, "and");
126 127 128
      break;
    case BIT_IOR_EXPR:
      if (DECL_ASSIGNMENT_OPERATOR_P (t))
Mike Stump committed
129
	dump_string (di, "orassign");
130
      else
Mike Stump committed
131
	dump_string (di, "or");
132 133 134
      break;
    case BIT_XOR_EXPR:
      if (DECL_ASSIGNMENT_OPERATOR_P (t))
Mike Stump committed
135
	dump_string (di, "xorassign");
136
      else
Mike Stump committed
137
	dump_string (di, "xor");
138 139 140
      break;
    case LSHIFT_EXPR:
      if (DECL_ASSIGNMENT_OPERATOR_P (t))
Mike Stump committed
141
	dump_string (di, "lshiftassign");
142
      else
Mike Stump committed
143
	dump_string (di, "lshift");
144 145 146
      break;
    case RSHIFT_EXPR:
      if (DECL_ASSIGNMENT_OPERATOR_P (t))
Mike Stump committed
147
	dump_string (di, "rshiftassign");
148
      else
Mike Stump committed
149
	dump_string (di, "rshift");
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
      break;
    case EQ_EXPR:
      dump_string (di, "eq");
      break;
    case NE_EXPR:
      dump_string (di, "ne");
      break;
    case LT_EXPR:
      dump_string (di, "lt");
      break;
    case GT_EXPR:
      dump_string (di, "gt");
      break;
    case LE_EXPR:
      dump_string (di, "le");
      break;
    case GE_EXPR:
      dump_string (di, "ge");
      break;
    case TRUTH_ANDIF_EXPR:
      dump_string (di, "land");
      break;
    case TRUTH_ORIF_EXPR:
      dump_string (di, "lor");
      break;
    case COMPOUND_EXPR:
      dump_string (di, "compound");
      break;
    case MEMBER_REF:
      dump_string (di, "memref");
      break;
    case COMPONENT_REF:
      dump_string (di, "ref");
      break;
    case ARRAY_REF:
      dump_string (di, "subs");
      break;
    case POSTINCREMENT_EXPR:
188
      dump_string (di, "postinc");
189 190 191 192 193 194 195 196 197
      break;
    case POSTDECREMENT_EXPR:
      dump_string (di, "postdec");
      break;
    case CALL_EXPR:
      dump_string (di, "call");
      break;
    case NOP_EXPR:
      if (DECL_ASSIGNMENT_OPERATOR_P (t))
Mike Stump committed
198
	dump_string (di, "assign");
199 200 201 202 203 204
      break;
    default:
      break;
  }
}

205
bool
206
cp_dump_tree (void* dump_info, tree t)
207 208
{
  enum tree_code code;
209
  dump_info_p di = (dump_info_p) dump_info;
210 211 212 213

  /* Figure out what kind of node this is.  */
  code = TREE_CODE (t);

214
  if (DECL_P (t))
215
    {
216
      if (DECL_LANG_SPECIFIC (t) && DECL_LANGUAGE (t) != lang_cplusplus)
217
	dump_string_field (di, "lang", language_to_string (DECL_LANGUAGE (t)));
218 219 220 221 222 223
    }

  switch (code)
    {
    case IDENTIFIER_NODE:
      if (IDENTIFIER_OPNAME_P (t))
224
	{
225
	  dump_string_field (di, "note", "operator");
226
	  return true;
227
	}
228 229
      else if (IDENTIFIER_TYPENAME_P (t))
	{
230
	  dump_child ("tynm", TREE_TYPE (t));
231
	  return true;
232 233 234
	}
      break;

235
    case OFFSET_TYPE:
236
      dump_string_field (di, "note", "ptrmem");
237 238 239
      dump_child ("ptd", TYPE_PTRMEM_POINTED_TO_TYPE (t));
      dump_child ("cls", TYPE_PTRMEM_CLASS_TYPE (t));
      return true;
240 241 242 243

    case RECORD_TYPE:
      if (TYPE_PTRMEMFUNC_P (t))
	{
244
	  dump_string_field (di, "note", "ptrmem");
245 246
	  dump_child ("ptd", TYPE_PTRMEM_POINTED_TO_TYPE (t));
	  dump_child ("cls", TYPE_PTRMEM_CLASS_TYPE (t));
247
	  return true;
248
	}
249
      /* Fall through.  */
250

251
    case UNION_TYPE:
252 253 254 255 256
      /* Is it a type used as a base? */
      if (TYPE_CONTEXT (t) && TREE_CODE (TYPE_CONTEXT (t)) == TREE_CODE (t)
	  && CLASSTYPE_AS_BASE (TYPE_CONTEXT (t)) == t)
	{
	  dump_child ("bfld", TYPE_CONTEXT (t));
257
	  return true;
258
	}
259

260
      if (! MAYBE_CLASS_TYPE_P (t))
261 262
	break;

263
      dump_child ("vfld", TYPE_VFIELD (t));
264
      if (CLASSTYPE_TEMPLATE_SPECIALIZATION(t))
Mike Stump committed
265
	dump_string(di, "spec");
266

267
      if (!dump_flag (di, TDF_SLIM, t) && TYPE_BINFO (t))
268 269
	{
	  int i;
Nathan Sidwell committed
270 271
	  tree binfo;
	  tree base_binfo;
272

Nathan Sidwell committed
273 274
	  for (binfo = TYPE_BINFO (t), i = 0;
	       BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i)
275 276
	    {
	      dump_child ("base", BINFO_TYPE (base_binfo));
277
	      if (BINFO_VIRTUAL_P (base_binfo))
278
		dump_string_field (di, "spec", "virt");
279 280 281
	      dump_access (di, base_binfo);
	    }
	}
282 283 284 285
      break;

    case FIELD_DECL:
      dump_access (di, t);
286
      if (DECL_MUTABLE_P (t))
287
	dump_string_field (di, "spec", "mutable");
288 289
      break;

290 291
    case VAR_DECL:
      if (TREE_CODE (CP_DECL_CONTEXT (t)) == RECORD_TYPE)
Mike Stump committed
292
	dump_access (di, t);
293
      if (TREE_STATIC (t) && !TREE_PUBLIC (t))
294
	dump_string_field (di, "link", "static");
295
      break;
296

297
    case FUNCTION_DECL:
298
      if (!DECL_THUNK_P (t))
299
	{
Mike Stump committed
300
	  if (DECL_OVERLOADED_OPERATOR_P (t)) {
301
	    dump_string_field (di, "note", "operator");
Mike Stump committed
302 303
	    dump_op (di, t);
	  }
304
	  if (DECL_FUNCTION_MEMBER_P (t))
305
	    {
306
	      dump_string_field (di, "note", "member");
307 308
	      dump_access (di, t);
	    }
Mike Stump committed
309
	  if (DECL_PURE_VIRTUAL_P (t))
310
	    dump_string_field (di, "spec", "pure");
Mike Stump committed
311
	  if (DECL_VIRTUAL_P (t))
312
	    dump_string_field (di, "spec", "virt");
313
	  if (DECL_CONSTRUCTOR_P (t))
314
	    dump_string_field (di, "note", "constructor");
315
	  if (DECL_DESTRUCTOR_P (t))
316
	    dump_string_field (di, "note", "destructor");
317
	  if (DECL_CONV_FN_P (t))
318
	    dump_string_field (di, "note", "conversion");
319
	  if (DECL_GLOBAL_CTOR_P (t))
320
	    dump_string_field (di, "note", "global init");
321
	  if (DECL_GLOBAL_DTOR_P (t))
322
	    dump_string_field (di, "note", "global fini");
323
	  if (DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t))
324
	    dump_string_field (di, "note", "pseudo tmpl");
325 326 327
	}
      else
	{
328
	  tree virt = THUNK_VIRTUAL_OFFSET (t);
329

330
	  dump_string_field (di, "note", "thunk");
331
	  if (DECL_THIS_THUNK_P (t))
332
	    dump_string_field (di, "note", "this adjusting");
333
	  else
334
	    {
335
	      dump_string_field (di, "note", "result adjusting");
336 337 338
	      if (virt)
		virt = BINFO_VPTR_FIELD (virt);
	    }
339
	  dump_int (di, "fixd", THUNK_FIXED_OFFSET (t));
340 341
	  if (virt)
	    dump_int (di, "virt", tree_low_cst (virt, 0));
342
	  dump_child ("fn", DECL_INITIAL (t));
343
	}
344 345 346
      break;

    case NAMESPACE_DECL:
347 348
      if (DECL_NAMESPACE_ALIAS (t))
	dump_child ("alis", DECL_NAMESPACE_ALIAS (t));
349
      else if (!dump_flag (di, TDF_SLIM, t))
350
	dump_child ("dcls", cp_namespace_decls (t));
351 352
      break;

353
    case TEMPLATE_DECL:
354
      dump_child ("rslt", DECL_TEMPLATE_RESULT (t));
355
      dump_child ("inst", DECL_TEMPLATE_INSTANTIATIONS (t));
356
      dump_child ("spcs", DECL_TEMPLATE_SPECIALIZATIONS (t));
357
      dump_child ("prms", DECL_TEMPLATE_PARMS (t));
358 359
      break;

360
    case OVERLOAD:
361 362
      dump_child ("crnt", OVL_CURRENT (t));
      dump_child ("chan", OVL_CHAIN (t));
363 364
      break;

365
    case TRY_BLOCK:
366
      dump_stmt (di, t);
367
      if (CLEANUP_P (t))
368
	dump_string_field (di, "note", "cleanup");
369 370
      dump_child ("body", TRY_STMTS (t));
      dump_child ("hdlr", TRY_HANDLERS (t));
371 372
      break;

373 374 375 376 377 378
    case EH_SPEC_BLOCK:
      dump_stmt (di, t);
      dump_child ("body", EH_SPEC_STMTS (t));
      dump_child ("raises", EH_SPEC_RAISES (t));
      break;

379 380 381
    case PTRMEM_CST:
      dump_child ("clas", PTRMEM_CST_CLASS (t));
      dump_child ("mbr", PTRMEM_CST_MEMBER (t));
382 383
      break;

384 385 386
    case THROW_EXPR:
      /* These nodes are unary, but do not have code class `1'.  */
      dump_child ("op 0", TREE_OPERAND (t, 0));
387 388
      break;

389
    case AGGR_INIT_EXPR:
390 391 392 393 394 395 396 397 398 399 400 401 402 403 404
      {
	int i = 0;
	tree arg;
	aggr_init_expr_arg_iterator iter;
	dump_int (di, "ctor", AGGR_INIT_VIA_CTOR_P (t));
	dump_child ("fn", AGGR_INIT_EXPR_FN (t));
	FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
	  {
	    char buffer[32];
	    sprintf (buffer, "%u", i);
	    dump_child (buffer, arg);
	    i++;
	  }
	dump_child ("decl", AGGR_INIT_EXPR_SLOT (t));
      }
405
      break;
406

407 408
    case HANDLER:
      dump_stmt (di, t);
409
      dump_child ("parm", HANDLER_PARMS (t));
410 411 412
      dump_child ("body", HANDLER_BODY (t));
      break;

413 414 415 416 417
    case MUST_NOT_THROW_EXPR:
      dump_stmt (di, t);
      dump_child ("body", TREE_OPERAND (t, 0));
      break;

418 419 420 421
    case USING_STMT:
      dump_stmt (di, t);
      dump_child ("nmsp", USING_STMT_NAMESPACE (t));
      break;
422 423 424 425 426 427 428 429 430 431 432 433 434 435 436

    case CLEANUP_STMT:
      dump_stmt (di, t);
      dump_child ("decl", CLEANUP_DECL (t));
      dump_child ("expr", CLEANUP_EXPR (t));
      dump_child ("body", CLEANUP_BODY (t));
      break;

    case IF_STMT:
      dump_stmt (di, t);
      dump_child ("cond", IF_COND (t));
      dump_child ("then", THEN_CLAUSE (t));
      dump_child ("else", ELSE_CLAUSE (t));
      break;

437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455
    case BREAK_STMT:
    case CONTINUE_STMT:
      dump_stmt (di, t);
      break;

    case DO_STMT:
      dump_stmt (di, t);
      dump_child ("body", DO_BODY (t));
      dump_child ("cond", DO_COND (t));
      break;

    case FOR_STMT:
      dump_stmt (di, t);
      dump_child ("init", FOR_INIT_STMT (t));
      dump_child ("cond", FOR_COND (t));
      dump_child ("expr", FOR_EXPR (t));
      dump_child ("body", FOR_BODY (t));
      break;

456 457 458 459 460 461 462
    case RANGE_FOR_STMT:
      dump_stmt (di, t);
      dump_child ("decl", RANGE_FOR_DECL (t));
      dump_child ("expr", RANGE_FOR_EXPR (t));
      dump_child ("body", RANGE_FOR_BODY (t));
      break;

463 464 465 466 467 468 469 470 471 472 473 474
    case SWITCH_STMT:
      dump_stmt (di, t);
      dump_child ("cond", SWITCH_STMT_COND (t));
      dump_child ("body", SWITCH_STMT_BODY (t));
      break;

    case WHILE_STMT:
      dump_stmt (di, t);
      dump_child ("cond", WHILE_COND (t));
      dump_child ("body", WHILE_BODY (t));
      break;

475 476 477 478
    case STMT_EXPR:
      dump_child ("stmt", STMT_EXPR_STMT (t));
      break;

479 480 481 482 483
    case EXPR_STMT:
      dump_stmt (di, t);
      dump_child ("expr", EXPR_STMT_EXPR (t));
      break;

484 485 486 487
    default:
      break;
    }

Jason Merrill committed
488
  return c_dump_tree (di, t);
489
}