dump.c 12 KB

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