dump.c revision 117395
1169695Skan/* Tree-dumping functionality for intermediate representation.
2169695Skan   Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
3169695Skan   Written by Mark Mitchell <mark@codesourcery.com>
4169695Skan
5169695SkanThis file is part of GNU CC.
6169695Skan
7169695SkanGNU CC is free software; you can redistribute it and/or modify
8169695Skanit under the terms of the GNU General Public License as published by
9169695Skanthe Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12GNU CC is distributed in the hope that it will be useful,
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
18along with GNU CC; see the file COPYING.  If not, write to
19the Free Software Foundation, 59 Temple Place - Suite 330,
20Boston, MA 02111-1307, USA.  */
21
22#include "config.h"
23#include "system.h"
24#include "tree.h"
25#include "cp-tree.h"
26#include "tree-dump.h"
27
28static void dump_access
29  PARAMS ((dump_info_p, tree));
30
31static void dump_op
32  PARAMS ((dump_info_p, tree));
33
34/* Dump a representation of the accessibility information associated
35   with T.  */
36
37static void
38dump_access (di, t)
39     dump_info_p di;
40     tree t;
41{
42  if (TREE_PROTECTED(t))
43    dump_string (di, "protected");
44  else if (TREE_PRIVATE(t))
45    dump_string (di, "private");
46  else
47    dump_string (di, "public");
48}
49
50/* Dump a representation of the specific operator for an overloaded
51   operator associated with node t.  */
52
53static void
54dump_op (di, t)
55     dump_info_p di;
56     tree t;
57{
58  switch (DECL_OVERLOADED_OPERATOR_P (t)) {
59    case NEW_EXPR:
60      dump_string (di, "new");
61      break;
62    case VEC_NEW_EXPR:
63      dump_string (di, "vecnew");
64      break;
65    case DELETE_EXPR:
66      dump_string (di, "delete");
67      break;
68    case VEC_DELETE_EXPR:
69      dump_string (di, "vecdelete");
70      break;
71    case CONVERT_EXPR:
72      dump_string (di, "pos");
73      break;
74    case NEGATE_EXPR:
75      dump_string (di, "neg");
76      break;
77    case ADDR_EXPR:
78      dump_string (di, "addr");
79      break;
80    case INDIRECT_REF:
81      dump_string(di, "deref");
82      break;
83    case BIT_NOT_EXPR:
84      dump_string(di, "not");
85      break;
86    case TRUTH_NOT_EXPR:
87      dump_string(di, "lnot");
88      break;
89    case PREINCREMENT_EXPR:
90      dump_string(di, "preinc");
91      break;
92    case PREDECREMENT_EXPR:
93      dump_string(di, "predec");
94      break;
95    case PLUS_EXPR:
96      if (DECL_ASSIGNMENT_OPERATOR_P (t))
97        dump_string (di, "plusassign");
98      else
99        dump_string(di, "plus");
100      break;
101    case MINUS_EXPR:
102      if (DECL_ASSIGNMENT_OPERATOR_P (t))
103        dump_string (di, "minusassign");
104      else
105        dump_string(di, "minus");
106      break;
107    case MULT_EXPR:
108      if (DECL_ASSIGNMENT_OPERATOR_P (t))
109        dump_string (di, "multassign");
110      else
111        dump_string (di, "mult");
112      break;
113    case TRUNC_DIV_EXPR:
114      if (DECL_ASSIGNMENT_OPERATOR_P (t))
115        dump_string (di, "divassign");
116      else
117        dump_string (di, "div");
118      break;
119    case TRUNC_MOD_EXPR:
120      if (DECL_ASSIGNMENT_OPERATOR_P (t))
121         dump_string (di, "modassign");
122      else
123        dump_string (di, "mod");
124      break;
125    case BIT_AND_EXPR:
126      if (DECL_ASSIGNMENT_OPERATOR_P (t))
127        dump_string (di, "andassign");
128      else
129        dump_string (di, "and");
130      break;
131    case BIT_IOR_EXPR:
132      if (DECL_ASSIGNMENT_OPERATOR_P (t))
133        dump_string (di, "orassign");
134      else
135        dump_string (di, "or");
136      break;
137    case BIT_XOR_EXPR:
138      if (DECL_ASSIGNMENT_OPERATOR_P (t))
139        dump_string (di, "xorassign");
140      else
141        dump_string (di, "xor");
142      break;
143    case LSHIFT_EXPR:
144      if (DECL_ASSIGNMENT_OPERATOR_P (t))
145        dump_string (di, "lshiftassign");
146      else
147        dump_string (di, "lshift");
148      break;
149    case RSHIFT_EXPR:
150      if (DECL_ASSIGNMENT_OPERATOR_P (t))
151        dump_string (di, "rshiftassign");
152      else
153        dump_string (di, "rshift");
154      break;
155    case EQ_EXPR:
156      dump_string (di, "eq");
157      break;
158    case NE_EXPR:
159      dump_string (di, "ne");
160      break;
161    case LT_EXPR:
162      dump_string (di, "lt");
163      break;
164    case GT_EXPR:
165      dump_string (di, "gt");
166      break;
167    case LE_EXPR:
168      dump_string (di, "le");
169      break;
170    case GE_EXPR:
171      dump_string (di, "ge");
172      break;
173    case TRUTH_ANDIF_EXPR:
174      dump_string (di, "land");
175      break;
176    case TRUTH_ORIF_EXPR:
177      dump_string (di, "lor");
178      break;
179    case COMPOUND_EXPR:
180      dump_string (di, "compound");
181      break;
182    case MEMBER_REF:
183      dump_string (di, "memref");
184      break;
185    case COMPONENT_REF:
186      dump_string (di, "ref");
187      break;
188    case ARRAY_REF:
189      dump_string (di, "subs");
190      break;
191    case POSTINCREMENT_EXPR:
192      dump_string (di, "postinc");
193      break;
194    case POSTDECREMENT_EXPR:
195      dump_string (di, "postdec");
196      break;
197    case CALL_EXPR:
198      dump_string (di, "call");
199      break;
200    case NOP_EXPR:
201      if (DECL_ASSIGNMENT_OPERATOR_P (t))
202        dump_string (di, "assign");
203      break;
204    default:
205      break;
206  }
207}
208
209int
210cp_dump_tree (dump_info, t)
211     void *dump_info;
212     tree t;
213{
214  enum tree_code code;
215  dump_info_p di = (dump_info_p) dump_info;
216
217  /* Figure out what kind of node this is.  */
218  code = TREE_CODE (t);
219
220  if (DECL_P (t))
221    {
222      if (DECL_LANG_SPECIFIC (t) && DECL_LANGUAGE (t) != lang_cplusplus)
223	dump_string (di, language_to_string (DECL_LANGUAGE (t), 0));
224    }
225
226  switch (code)
227    {
228    case IDENTIFIER_NODE:
229      if (IDENTIFIER_OPNAME_P (t))
230	{
231	  dump_string (di, "operator");
232	  return 1;
233	}
234      else if (IDENTIFIER_TYPENAME_P (t))
235	{
236	  dump_child ("tynm", TREE_TYPE (t));
237	  return 1;
238	}
239      else if (t == anonymous_namespace_name)
240	{
241	  dump_string (di, "unnamed");
242	  return 1;
243	}
244      break;
245
246    case POINTER_TYPE:
247      if (TYPE_PTRMEM_P (t))
248	{
249	  dump_string (di, "ptrmem");
250	  dump_child ("ptd", TYPE_PTRMEM_POINTED_TO_TYPE (t));
251	  dump_child ("cls", TYPE_PTRMEM_CLASS_TYPE (t));
252	  return 1;
253	}
254      break;
255
256    case RECORD_TYPE:
257    case UNION_TYPE:
258      if (TYPE_PTRMEMFUNC_P (t))
259	{
260	  dump_string (di, "ptrmem");
261	  dump_child ("ptd", TYPE_PTRMEM_POINTED_TO_TYPE (t));
262	  dump_child ("cls", TYPE_PTRMEM_CLASS_TYPE (t));
263	  return 1;
264	}
265
266      /* Is it a type used as a base? */
267      if (TYPE_CONTEXT (t) && TREE_CODE (TYPE_CONTEXT (t)) == TREE_CODE (t)
268	  && CLASSTYPE_AS_BASE (TYPE_CONTEXT (t)) == t)
269	{
270	  dump_child ("bfld", TYPE_CONTEXT (t));
271	  return 1;
272	}
273
274      dump_child ("vfld", TYPE_VFIELD (t));
275      if (CLASSTYPE_TEMPLATE_SPECIALIZATION(t))
276        dump_string(di, "spec");
277
278      if (!dump_flag (di, TDF_SLIM, t))
279	{
280	  int i;
281
282	  for (i = 0; i < CLASSTYPE_N_BASECLASSES (t); ++i)
283	    {
284	      tree base_binfo = BINFO_BASETYPE (TYPE_BINFO (t), i);
285	      dump_child ("base", BINFO_TYPE (base_binfo));
286	      if (TREE_VIA_VIRTUAL (base_binfo))
287		dump_string (di, "virtual");
288	      dump_access (di, base_binfo);
289	    }
290	}
291      break;
292
293    case FIELD_DECL:
294      dump_access (di, t);
295      if (DECL_MUTABLE_P (t))
296        dump_string(di, "mutable");
297      break;
298
299    case VAR_DECL:
300      if (TREE_CODE (CP_DECL_CONTEXT (t)) == RECORD_TYPE)
301        dump_access (di, t);
302      if (TREE_STATIC (t) && !TREE_PUBLIC (t))
303        dump_string (di, "static");
304      break;
305
306    case FUNCTION_DECL:
307      if (!DECL_THUNK_P (t))
308	{
309          if (DECL_OVERLOADED_OPERATOR_P (t)) {
310	    dump_string (di, "operator");
311            dump_op (di, t);
312          }
313	  if (DECL_FUNCTION_MEMBER_P (t))
314	    {
315	      dump_string (di, "member");
316	      dump_access (di, t);
317	    }
318          if (DECL_PURE_VIRTUAL_P (t))
319            dump_string (di, "pure");
320          if (DECL_VIRTUAL_P (t))
321            dump_string (di, "virtual");
322	  if (DECL_CONSTRUCTOR_P (t))
323	    dump_string (di, "constructor");
324	  if (DECL_DESTRUCTOR_P (t))
325	    dump_string (di, "destructor");
326	  if (DECL_CONV_FN_P (t))
327	    dump_string (di, "conversion");
328	  if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
329	    {
330	      if (DECL_GLOBAL_CTOR_P (t))
331		dump_string (di, "global init");
332	      if (DECL_GLOBAL_DTOR_P (t))
333		dump_string (di, "global fini");
334	    }
335	  if (DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t))
336	    dump_string (di, "pseudo tmpl");
337	}
338      else
339	{
340	  dump_string (di, "thunk");
341	  dump_int (di, "dlta", THUNK_DELTA (t));
342	  dump_child ("vcll", THUNK_VCALL_OFFSET (t));
343	  dump_child ("fn", DECL_INITIAL (t));
344	}
345      break;
346
347    case NAMESPACE_DECL:
348      if (DECL_NAMESPACE_ALIAS (t))
349	dump_child ("alis", DECL_NAMESPACE_ALIAS (t));
350      else if (!dump_flag (di, TDF_SLIM, t))
351	dump_child ("dcls", cp_namespace_decls (t));
352      break;
353
354    case TEMPLATE_DECL:
355      dump_child ("rslt", DECL_TEMPLATE_RESULT (t));
356      dump_child ("inst", DECL_TEMPLATE_INSTANTIATIONS (t));
357      dump_child ("spcs", DECL_TEMPLATE_SPECIALIZATIONS (t));
358      dump_child ("prms", DECL_TEMPLATE_PARMS (t));
359      break;
360
361    case OVERLOAD:
362      dump_child ("crnt", OVL_CURRENT (t));
363      dump_child ("chan", OVL_CHAIN (t));
364      break;
365
366    case TRY_BLOCK:
367      dump_stmt (di, t);
368      if (CLEANUP_P (t))
369	dump_string (di, "cleanup");
370      dump_child ("body", TRY_STMTS (t));
371      dump_child ("hdlr", TRY_HANDLERS (t));
372      dump_next_stmt (di, t);
373      break;
374
375    case EH_SPEC_BLOCK:
376      dump_stmt (di, t);
377      dump_child ("body", EH_SPEC_STMTS (t));
378      dump_child ("raises", EH_SPEC_RAISES (t));
379      dump_next_stmt (di, t);
380      break;
381
382    case PTRMEM_CST:
383      dump_child ("clas", PTRMEM_CST_CLASS (t));
384      dump_child ("mbr", PTRMEM_CST_MEMBER (t));
385      break;
386
387    case THROW_EXPR:
388      /* These nodes are unary, but do not have code class `1'.  */
389      dump_child ("op 0", TREE_OPERAND (t, 0));
390      break;
391
392    case AGGR_INIT_EXPR:
393      dump_int (di, "ctor", AGGR_INIT_VIA_CTOR_P (t));
394      dump_child ("fn", TREE_OPERAND (t, 0));
395      dump_child ("args", TREE_OPERAND (t, 1));
396      dump_child ("decl", TREE_OPERAND (t, 2));
397      break;
398
399    case HANDLER:
400      dump_stmt (di, t);
401      dump_child ("parm", HANDLER_PARMS (t));
402      dump_child ("body", HANDLER_BODY (t));
403      dump_next_stmt (di, t);
404      break;
405
406    case MUST_NOT_THROW_EXPR:
407      dump_stmt (di, t);
408      dump_child ("body", TREE_OPERAND (t, 0));
409      dump_next_stmt (di, t);
410      break;
411
412    case USING_STMT:
413      dump_stmt (di, t);
414      dump_child ("nmsp", USING_STMT_NAMESPACE (t));
415      dump_next_stmt (di, t);
416      break;
417
418    default:
419      break;
420    }
421
422  return c_dump_tree (di, t);
423}
424