]>
Commit | Line | Data |
---|---|---|
8d08fdba | 1 | /* Prints out trees in human readable form. |
d6a8bdff | 2 | Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, |
43c6a96a | 3 | 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. |
8d08fdba MS |
4 | Hacked by Michael Tiemann (tiemann@cygnus.com) |
5 | ||
f5adbb8d | 6 | This file is part of GCC. |
8d08fdba | 7 | |
f5adbb8d | 8 | GCC is free software; you can redistribute it and/or modify |
8d08fdba MS |
9 | it under the terms of the GNU General Public License as published by |
10 | the Free Software Foundation; either version 2, or (at your option) | |
11 | any later version. | |
12 | ||
f5adbb8d | 13 | GCC is distributed in the hope that it will be useful, |
8d08fdba MS |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | GNU General Public License for more details. | |
17 | ||
18 | You should have received a copy of the GNU General Public License | |
f5adbb8d | 19 | along with GCC; see the file COPYING. If not, write to |
e9fa0c7c RK |
20 | the Free Software Foundation, 59 Temple Place - Suite 330, |
21 | Boston, MA 02111-1307, USA. */ | |
8d08fdba MS |
22 | |
23 | ||
24 | #include "config.h" | |
8d052bc7 | 25 | #include "system.h" |
4977bab6 ZW |
26 | #include "coretypes.h" |
27 | #include "tm.h" | |
e7a587ef | 28 | #include "tree.h" |
8d08fdba MS |
29 | #include "cp-tree.h" |
30 | ||
31 | void | |
848eed92 | 32 | cxx_print_decl (FILE *file, tree node, int indent) |
8d08fdba | 33 | { |
721c3b42 | 34 | if (TREE_CODE (node) == FIELD_DECL) |
8d08fdba | 35 | { |
721c3b42 MM |
36 | if (DECL_MUTABLE_P (node)) |
37 | { | |
38 | indent_to (file, indent + 3); | |
39 | fprintf (file, " mutable "); | |
40 | } | |
41 | return; | |
8d08fdba | 42 | } |
721c3b42 MM |
43 | |
44 | if (!DECL_LANG_SPECIFIC (node)) | |
8d08fdba MS |
45 | return; |
46 | indent_to (file, indent + 3); | |
f90cdf34 MT |
47 | if (TREE_CODE (node) == FUNCTION_DECL |
48 | && DECL_PENDING_INLINE_INFO (node)) | |
8d08fdba MS |
49 | { |
50 | fprintf (file, " pending-inline-info "); | |
de94b46c | 51 | fprintf (file, HOST_PTR_PRINTF, (void *) DECL_PENDING_INLINE_INFO (node)); |
8d08fdba | 52 | } |
f90cdf34 MT |
53 | if (TREE_CODE (node) == TYPE_DECL |
54 | && DECL_SORTED_FIELDS (node)) | |
55 | { | |
56 | fprintf (file, " sorted-fields "); | |
de94b46c | 57 | fprintf (file, HOST_PTR_PRINTF, (void *) DECL_SORTED_FIELDS (node)); |
f90cdf34 | 58 | } |
da8a66fc ML |
59 | if ((TREE_CODE (node) == FUNCTION_DECL || TREE_CODE (node) == VAR_DECL) |
60 | && DECL_TEMPLATE_INFO (node)) | |
8d08fdba MS |
61 | { |
62 | fprintf (file, " template-info "); | |
de94b46c | 63 | fprintf (file, HOST_PTR_PRINTF, (void *) DECL_TEMPLATE_INFO (node)); |
8d08fdba MS |
64 | } |
65 | } | |
66 | ||
67 | void | |
848eed92 | 68 | cxx_print_type (FILE *file, tree node, int indent) |
8d08fdba | 69 | { |
f3e4d63c | 70 | switch (TREE_CODE (node)) |
8d08fdba | 71 | { |
f3e4d63c JM |
72 | case TEMPLATE_TYPE_PARM: |
73 | case TEMPLATE_TEMPLATE_PARM: | |
a1281f45 | 74 | case BOUND_TEMPLATE_TEMPLATE_PARM: |
f84b4be9 | 75 | indent_to (file, indent + 3); |
90ff44cf KG |
76 | fprintf (file, "index " HOST_WIDE_INT_PRINT_DEC " level " |
77 | HOST_WIDE_INT_PRINT_DEC " orig_level " HOST_WIDE_INT_PRINT_DEC, | |
78 | TEMPLATE_TYPE_IDX (node), TEMPLATE_TYPE_LEVEL (node), | |
79 | TEMPLATE_TYPE_ORIG_LEVEL (node)); | |
8d08fdba | 80 | return; |
f3e4d63c JM |
81 | |
82 | case FUNCTION_TYPE: | |
83 | case METHOD_TYPE: | |
84 | if (TYPE_RAISES_EXCEPTIONS (node)) | |
85 | print_node (file, "throws", TYPE_RAISES_EXCEPTIONS (node), indent + 4); | |
86 | return; | |
87 | ||
88 | case RECORD_TYPE: | |
89 | case UNION_TYPE: | |
90 | break; | |
91 | ||
92 | default: | |
93 | return; | |
8d08fdba MS |
94 | } |
95 | ||
f3e4d63c JM |
96 | if (TYPE_PTRMEMFUNC_P (node)) |
97 | print_node (file, "ptrmemfunc fn type", TYPE_PTRMEMFUNC_FN_TYPE (node), | |
98 | indent + 4); | |
99 | ||
829fd7e0 | 100 | if (! CLASS_TYPE_P (node)) |
8d08fdba MS |
101 | return; |
102 | ||
103 | indent_to (file, indent + 3); | |
104 | ||
105 | if (TYPE_NEEDS_CONSTRUCTING (node)) | |
106 | fputs ( "needs-constructor", file); | |
834c6dff | 107 | if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (node)) |
8d08fdba MS |
108 | fputs (" needs-destructor", file); |
109 | if (TYPE_HAS_DESTRUCTOR (node)) | |
110 | fputs (" ~X()", file); | |
111 | if (TYPE_HAS_DEFAULT_CONSTRUCTOR (node)) | |
112 | fputs (" X()", file); | |
113 | if (TYPE_HAS_CONVERSION (node)) | |
114 | fputs (" has-type-conversion", file); | |
8d08fdba MS |
115 | if (TYPE_HAS_INIT_REF (node)) |
116 | { | |
117 | if (TYPE_HAS_CONST_INIT_REF (node)) | |
118 | fputs (" X(constX&)", file); | |
119 | else | |
120 | fputs (" X(X&)", file); | |
121 | } | |
834c6dff | 122 | if (TYPE_HAS_NEW_OPERATOR (node)) |
a28e3c7f | 123 | fputs (" new", file); |
834c6dff | 124 | if (TYPE_HAS_ARRAY_NEW_OPERATOR (node)) |
a28e3c7f MS |
125 | fputs (" new[]", file); |
126 | if (TYPE_GETS_DELETE (node) & 1) | |
127 | fputs (" delete", file); | |
128 | if (TYPE_GETS_DELETE (node) & 2) | |
129 | fputs (" delete[]", file); | |
8d08fdba MS |
130 | if (TYPE_HAS_ASSIGN_REF (node)) |
131 | fputs (" this=(X&)", file); | |
8d08fdba MS |
132 | if (TYPE_OVERLOADS_CALL_EXPR (node)) |
133 | fputs (" op()", file); | |
134 | if (TYPE_OVERLOADS_ARRAY_REF (node)) | |
135 | fputs (" op[]", file); | |
136 | if (TYPE_OVERLOADS_ARROW (node)) | |
137 | fputs (" op->", file); | |
138 | if (TYPE_USES_MULTIPLE_INHERITANCE (node)) | |
139 | fputs (" uses-multiple-inheritance", file); | |
140 | ||
141 | if (TREE_CODE (node) == RECORD_TYPE) | |
142 | { | |
9e0781b5 | 143 | fprintf (file, " n_parents %d", CLASSTYPE_N_BASECLASSES (node)); |
8d08fdba MS |
144 | fprintf (file, " use_template=%d", CLASSTYPE_USE_TEMPLATE (node)); |
145 | if (CLASSTYPE_INTERFACE_ONLY (node)) | |
146 | fprintf (file, " interface-only"); | |
147 | if (CLASSTYPE_INTERFACE_UNKNOWN (node)) | |
148 | fprintf (file, " interface-unknown"); | |
149 | print_node (file, "member-functions", CLASSTYPE_METHOD_VEC (node), | |
150 | indent + 4); | |
8d08fdba MS |
151 | } |
152 | } | |
153 | ||
af6fd53f GDR |
154 | |
155 | static void | |
156 | cxx_print_binding (FILE *stream, cxx_binding *binding, const char *prefix) | |
157 | { | |
158 | fprintf (stream, "%s <", prefix); | |
159 | fprintf (stream, HOST_PTR_PRINTF, (char *) binding); | |
160 | fprintf (stream, ">"); | |
161 | } | |
162 | ||
8d08fdba | 163 | void |
848eed92 | 164 | cxx_print_identifier (FILE *file, tree node, int indent) |
8d08fdba | 165 | { |
af6fd53f | 166 | cxx_print_binding (file, IDENTIFIER_NAMESPACE_BINDINGS (node), "bindings"); |
8d08fdba | 167 | print_node (file, "class", IDENTIFIER_CLASS_VALUE (node), indent + 4); |
af6fd53f | 168 | cxx_print_binding (file, IDENTIFIER_BINDING (node), "local bindings"); |
8d08fdba MS |
169 | print_node (file, "label", IDENTIFIER_LABEL_VALUE (node), indent + 4); |
170 | print_node (file, "template", IDENTIFIER_TEMPLATE (node), indent + 4); | |
171 | print_node (file, "implicit", IDENTIFIER_IMPLICIT_DECL (node), indent + 4); | |
172 | print_node (file, "error locus", IDENTIFIER_ERROR_LOCUS (node), indent + 4); | |
173 | } | |
30394414 JM |
174 | |
175 | void | |
848eed92 | 176 | cxx_print_xnode (FILE *file, tree node, int indent) |
30394414 JM |
177 | { |
178 | switch (TREE_CODE (node)) | |
179 | { | |
2c73f9f5 ML |
180 | case OVERLOAD: |
181 | print_node (file, "function", OVL_FUNCTION (node), indent+4); | |
182 | print_node (file, "chain", TREE_CHAIN (node), indent+4); | |
08362e16 | 183 | break; |
f94ae2f5 JM |
184 | case TEMPLATE_PARM_INDEX: |
185 | indent_to (file, indent + 3); | |
90ff44cf KG |
186 | fprintf (file, "index " HOST_WIDE_INT_PRINT_DEC " level " |
187 | HOST_WIDE_INT_PRINT_DEC " orig_level " HOST_WIDE_INT_PRINT_DEC, | |
188 | TEMPLATE_PARM_IDX (node), TEMPLATE_PARM_LEVEL (node), | |
189 | TEMPLATE_PARM_ORIG_LEVEL (node)); | |
f94ae2f5 | 190 | break; |
30394414 JM |
191 | default: |
192 | break; | |
193 | } | |
194 | } |