1 | /* Prints out trees in human readable form. |
2 | Copyright (C) 1992-2017 Free Software Foundation, Inc. |
3 | Hacked by Michael Tiemann (tiemann@cygnus.com) |
4 | |
5 | This file is part of GCC. |
6 | |
7 | GCC is free software; you can redistribute it and/or modify |
8 | it under the terms of the GNU General Public License as published by |
9 | the Free Software Foundation; either version 3, or (at your option) |
10 | any later version. |
11 | |
12 | GCC is distributed in the hope that it will be useful, |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | GNU General Public License for more details. |
16 | |
17 | You should have received a copy of the GNU General Public License |
18 | along with GCC; see the file COPYING3. If not see |
19 | <http://www.gnu.org/licenses/>. */ |
20 | |
21 | |
22 | #include "config.h" |
23 | #include "system.h" |
24 | #include "coretypes.h" |
25 | #include "cp-tree.h" |
26 | #include "print-tree.h" |
27 | |
28 | void |
29 | cxx_print_decl (FILE *file, tree node, int indent) |
30 | { |
31 | if (TREE_CODE (node) == FIELD_DECL) |
32 | { |
33 | if (DECL_MUTABLE_P (node)) |
34 | { |
35 | indent_to (file, indent + 3); |
36 | fprintf (file, " mutable " ); |
37 | } |
38 | return; |
39 | } |
40 | |
41 | if (!CODE_CONTAINS_STRUCT (TREE_CODE (node), TS_DECL_COMMON) |
42 | || !DECL_LANG_SPECIFIC (node)) |
43 | return; |
44 | if (TREE_CODE (node) == FUNCTION_DECL) |
45 | { |
46 | int flags = TFF_DECL_SPECIFIERS|TFF_RETURN_TYPE |
47 | |TFF_FUNCTION_DEFAULT_ARGUMENTS|TFF_EXCEPTION_SPECIFICATION ; |
48 | indent_to (file, indent + 3); |
49 | fprintf (file, " full-name \"%s\"" , decl_as_string (node, flags)); |
50 | } |
51 | else if (TREE_CODE (node) == TEMPLATE_DECL) |
52 | { |
53 | print_node (file, "parms" , DECL_TEMPLATE_PARMS (node), indent + 4); |
54 | indent_to (file, indent + 3); |
55 | fprintf (file, " full-name \"%s\"" , |
56 | decl_as_string (node, TFF_TEMPLATE_HEADER)); |
57 | } |
58 | |
59 | indent_to (file, indent + 3); |
60 | if (DECL_EXTERNAL (node) && DECL_NOT_REALLY_EXTERN (node)) |
61 | fprintf (file, " not-really-extern" ); |
62 | if (TREE_CODE (node) == FUNCTION_DECL |
63 | && DECL_PENDING_INLINE_INFO (node)) |
64 | fprintf (file, " pending-inline-info %p" , |
65 | (void *) DECL_PENDING_INLINE_INFO (node)); |
66 | if (VAR_OR_FUNCTION_DECL_P (node) |
67 | && DECL_TEMPLATE_INFO (node)) |
68 | fprintf (file, " template-info %p" , |
69 | (void *) DECL_TEMPLATE_INFO (node)); |
70 | } |
71 | |
72 | void |
73 | cxx_print_type (FILE *file, tree node, int indent) |
74 | { |
75 | switch (TREE_CODE (node)) |
76 | { |
77 | case BOUND_TEMPLATE_TEMPLATE_PARM: |
78 | print_node (file, "args" , TYPE_TI_ARGS (node), indent + 4); |
79 | gcc_fallthrough (); |
80 | |
81 | case TEMPLATE_TYPE_PARM: |
82 | case TEMPLATE_TEMPLATE_PARM: |
83 | indent_to (file, indent + 3); |
84 | fprintf (file, "index %d level %d orig_level %d" , |
85 | TEMPLATE_TYPE_IDX (node), TEMPLATE_TYPE_LEVEL (node), |
86 | TEMPLATE_TYPE_ORIG_LEVEL (node)); |
87 | return; |
88 | |
89 | case FUNCTION_TYPE: |
90 | case METHOD_TYPE: |
91 | if (TYPE_RAISES_EXCEPTIONS (node)) |
92 | print_node (file, "throws" , TYPE_RAISES_EXCEPTIONS (node), indent + 4); |
93 | return; |
94 | |
95 | case RECORD_TYPE: |
96 | case UNION_TYPE: |
97 | break; |
98 | |
99 | case DECLTYPE_TYPE: |
100 | print_node (file, "expr" , DECLTYPE_TYPE_EXPR (node), indent + 4); |
101 | return; |
102 | |
103 | case TYPENAME_TYPE: |
104 | print_node (file, "fullname" , TYPENAME_TYPE_FULLNAME (node), |
105 | indent + 4); |
106 | return; |
107 | |
108 | case TYPE_PACK_EXPANSION: |
109 | print_node (file, "args" , PACK_EXPANSION_EXTRA_ARGS (node), indent + 4); |
110 | return; |
111 | |
112 | default: |
113 | return; |
114 | } |
115 | |
116 | if (TYPE_PTRMEMFUNC_P (node)) |
117 | print_node (file, "ptrmemfunc fn type" , TYPE_PTRMEMFUNC_FN_TYPE (node), |
118 | indent + 4); |
119 | |
120 | if (! CLASS_TYPE_P (node)) |
121 | return; |
122 | |
123 | indent_to (file, indent + 4); |
124 | fprintf (file, "full-name \"%s\"" , |
125 | type_as_string (node, TFF_CLASS_KEY_OR_ENUM)); |
126 | |
127 | indent_to (file, indent + 3); |
128 | |
129 | if (TYPE_NEEDS_CONSTRUCTING (node)) |
130 | fputs ( " needs-constructor" , file); |
131 | if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (node)) |
132 | fputs (" needs-destructor" , file); |
133 | if (TYPE_HAS_DEFAULT_CONSTRUCTOR (node)) |
134 | fputs (" X()" , file); |
135 | if (TYPE_HAS_CONVERSION (node)) |
136 | fputs (" has-type-conversion" , file); |
137 | if (TYPE_HAS_COPY_CTOR (node)) |
138 | { |
139 | if (TYPE_HAS_CONST_COPY_CTOR (node)) |
140 | fputs (" X(constX&)" , file); |
141 | else |
142 | fputs (" X(X&)" , file); |
143 | } |
144 | if (TYPE_HAS_NEW_OPERATOR (node)) |
145 | fputs (" new" , file); |
146 | if (TYPE_HAS_ARRAY_NEW_OPERATOR (node)) |
147 | fputs (" new[]" , file); |
148 | if (TYPE_GETS_DELETE (node) & 1) |
149 | fputs (" delete" , file); |
150 | if (TYPE_GETS_DELETE (node) & 2) |
151 | fputs (" delete[]" , file); |
152 | if (TYPE_HAS_COPY_ASSIGN (node)) |
153 | fputs (" this=(X&)" , file); |
154 | |
155 | if (TREE_CODE (node) == RECORD_TYPE) |
156 | { |
157 | if (TYPE_BINFO (node)) |
158 | fprintf (file, " n_parents=%d" , |
159 | BINFO_N_BASE_BINFOS (TYPE_BINFO (node))); |
160 | else |
161 | fprintf (file, " no-binfo" ); |
162 | |
163 | fprintf (file, " use_template=%d" , CLASSTYPE_USE_TEMPLATE (node)); |
164 | if (CLASSTYPE_INTERFACE_ONLY (node)) |
165 | fprintf (file, " interface-only" ); |
166 | if (CLASSTYPE_INTERFACE_UNKNOWN (node)) |
167 | fprintf (file, " interface-unknown" ); |
168 | } |
169 | } |
170 | |
171 | void |
172 | cxx_print_identifier (FILE *file, tree node, int indent) |
173 | { |
174 | if (indent == 0) |
175 | fprintf (file, " " ); |
176 | else |
177 | indent_to (file, indent + 4); |
178 | fprintf (file, "%s local bindings <%p>" , get_identifier_kind_name (node), |
179 | (void *) IDENTIFIER_BINDING (node)); |
180 | } |
181 | |
182 | void |
183 | cxx_print_lambda_node (FILE *file, tree node, int indent) |
184 | { |
185 | if (LAMBDA_EXPR_MUTABLE_P (node)) |
186 | fprintf (file, " /mutable" ); |
187 | fprintf (file, " default_capture_mode=[" ); |
188 | switch (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (node)) |
189 | { |
190 | case CPLD_NONE: |
191 | fprintf (file, "NONE" ); |
192 | break; |
193 | case CPLD_COPY: |
194 | fprintf (file, "COPY" ); |
195 | break; |
196 | case CPLD_REFERENCE: |
197 | fprintf (file, "CPLD_REFERENCE" ); |
198 | break; |
199 | default: |
200 | fprintf (file, "??" ); |
201 | break; |
202 | } |
203 | fprintf (file, "] " ); |
204 | print_node (file, "capture_list" , LAMBDA_EXPR_CAPTURE_LIST (node), indent + 4); |
205 | print_node (file, "this_capture" , LAMBDA_EXPR_THIS_CAPTURE (node), indent + 4); |
206 | } |
207 | |
208 | void |
209 | cxx_print_xnode (FILE *file, tree node, int indent) |
210 | { |
211 | switch (TREE_CODE (node)) |
212 | { |
213 | case BASELINK: |
214 | print_node (file, "functions" , BASELINK_FUNCTIONS (node), indent + 4); |
215 | print_node (file, "binfo" , BASELINK_BINFO (node), indent + 4); |
216 | print_node (file, "access_binfo" , BASELINK_ACCESS_BINFO (node), |
217 | indent + 4); |
218 | break; |
219 | case OVERLOAD: |
220 | print_node (file, "function" , OVL_FUNCTION (node), indent+4); |
221 | print_node (file, "next" , OVL_CHAIN (node), indent+4); |
222 | break; |
223 | case TEMPLATE_PARM_INDEX: |
224 | print_node (file, "decl" , TEMPLATE_PARM_DECL (node), indent+4); |
225 | indent_to (file, indent + 3); |
226 | fprintf (file, "index %d level %d orig_level %d" , |
227 | TEMPLATE_PARM_IDX (node), TEMPLATE_PARM_LEVEL (node), |
228 | TEMPLATE_PARM_ORIG_LEVEL (node)); |
229 | break; |
230 | case TEMPLATE_INFO: |
231 | print_node (file, "template" , TI_TEMPLATE (node), indent+4); |
232 | print_node (file, "args" , TI_ARGS (node), indent+4); |
233 | if (TI_PENDING_TEMPLATE_FLAG (node)) |
234 | { |
235 | indent_to (file, indent + 3); |
236 | fprintf (file, "pending_template" ); |
237 | } |
238 | break; |
239 | case CONSTRAINT_INFO: |
240 | { |
241 | tree_constraint_info *cinfo = (tree_constraint_info *)node; |
242 | if (cinfo->template_reqs) |
243 | print_node (file, "template_reqs" , cinfo->template_reqs, indent+4); |
244 | if (cinfo->declarator_reqs) |
245 | print_node (file, "declarator_reqs" , cinfo->declarator_reqs, |
246 | indent+4); |
247 | print_node (file, "associated_constr" , |
248 | cinfo->associated_constr, indent+4); |
249 | break; |
250 | } |
251 | case ARGUMENT_PACK_SELECT: |
252 | print_node (file, "pack" , ARGUMENT_PACK_SELECT_FROM_PACK (node), |
253 | indent+4); |
254 | indent_to (file, indent + 3); |
255 | fprintf (file, "index %d" , ARGUMENT_PACK_SELECT_INDEX (node)); |
256 | break; |
257 | case DEFERRED_NOEXCEPT: |
258 | print_node (file, "pattern" , DEFERRED_NOEXCEPT_PATTERN (node), indent+4); |
259 | print_node (file, "args" , DEFERRED_NOEXCEPT_ARGS (node), indent+4); |
260 | break; |
261 | case TRAIT_EXPR: |
262 | indent_to (file, indent+4); |
263 | fprintf (file, "kind %d" , TRAIT_EXPR_KIND (node)); |
264 | print_node (file, "type 1" , TRAIT_EXPR_TYPE1 (node), indent+4); |
265 | if (TRAIT_EXPR_TYPE2 (node)) |
266 | print_node (file, "type 2" , TRAIT_EXPR_TYPE2 (node), indent+4); |
267 | break; |
268 | case LAMBDA_EXPR: |
269 | cxx_print_lambda_node (file, node, indent); |
270 | break; |
271 | default: |
272 | break; |
273 | } |
274 | } |
275 | |
276 | /* Print the node NODE on standard error, for debugging. */ |
277 | |
278 | DEBUG_FUNCTION void |
279 | debug_tree (cp_expr node) |
280 | { |
281 | debug_tree (node.get_value()); |
282 | } |
283 | |