]>
Commit | Line | Data |
---|---|---|
471086d6 | 1 | /* Prints out trees in human readable form. |
fbd26352 | 2 | Copyright (C) 1992-2019 Free Software Foundation, Inc. |
471086d6 | 3 | Hacked by Michael Tiemann (tiemann@cygnus.com) |
4 | ||
6f0d25a6 | 5 | This file is part of GCC. |
471086d6 | 6 | |
6f0d25a6 | 7 | GCC is free software; you can redistribute it and/or modify |
471086d6 | 8 | it under the terms of the GNU General Public License as published by |
aa139c3f | 9 | the Free Software Foundation; either version 3, or (at your option) |
471086d6 | 10 | any later version. |
11 | ||
6f0d25a6 | 12 | GCC is distributed in the hope that it will be useful, |
471086d6 | 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 | |
aa139c3f | 18 | along with GCC; see the file COPYING3. If not see |
19 | <http://www.gnu.org/licenses/>. */ | |
471086d6 | 20 | |
21 | ||
22 | #include "config.h" | |
b3ef7553 | 23 | #include "system.h" |
805e22b2 | 24 | #include "coretypes.h" |
471086d6 | 25 | #include "cp-tree.h" |
4cba6f60 | 26 | #include "print-tree.h" |
471086d6 | 27 | |
28 | void | |
26ac6687 | 29 | cxx_print_decl (FILE *file, tree node, int indent) |
471086d6 | 30 | { |
a484e8db | 31 | if (TREE_CODE (node) == FIELD_DECL) |
471086d6 | 32 | { |
a484e8db | 33 | if (DECL_MUTABLE_P (node)) |
34 | { | |
35 | indent_to (file, indent + 3); | |
36 | fprintf (file, " mutable "); | |
37 | } | |
38 | return; | |
471086d6 | 39 | } |
a484e8db | 40 | |
437f5d6b | 41 | if (!CODE_CONTAINS_STRUCT (TREE_CODE (node), TS_DECL_COMMON) |
42 | || !DECL_LANG_SPECIFIC (node)) | |
471086d6 | 43 | return; |
9ff1ba0a | 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 | { | |
21fbfcf0 | 53 | print_node (file, "parms", DECL_TEMPLATE_PARMS (node), indent + 4); |
9ff1ba0a | 54 | indent_to (file, indent + 3); |
55 | fprintf (file, " full-name \"%s\"", | |
56 | decl_as_string (node, TFF_TEMPLATE_HEADER)); | |
57 | } | |
58 | ||
471086d6 | 59 | indent_to (file, indent + 3); |
9ff1ba0a | 60 | if (DECL_EXTERNAL (node) && DECL_NOT_REALLY_EXTERN (node)) |
61 | fprintf (file, " not-really-extern"); | |
15eb8b2d | 62 | if (TREE_CODE (node) == FUNCTION_DECL |
63 | && DECL_PENDING_INLINE_INFO (node)) | |
ca0205ee | 64 | fprintf (file, " pending-inline-info %p", |
6f817829 | 65 | (void *) DECL_PENDING_INLINE_INFO (node)); |
4cace8cb | 66 | if (VAR_OR_FUNCTION_DECL_P (node) |
ad46fc6a | 67 | && DECL_TEMPLATE_INFO (node)) |
ca0205ee | 68 | fprintf (file, " template-info %p", |
6f817829 | 69 | (void *) DECL_TEMPLATE_INFO (node)); |
471086d6 | 70 | } |
71 | ||
72 | void | |
26ac6687 | 73 | cxx_print_type (FILE *file, tree node, int indent) |
471086d6 | 74 | { |
fb16f46a | 75 | switch (TREE_CODE (node)) |
471086d6 | 76 | { |
21fbfcf0 | 77 | case BOUND_TEMPLATE_TEMPLATE_PARM: |
78 | print_node (file, "args", TYPE_TI_ARGS (node), indent + 4); | |
79 | gcc_fallthrough (); | |
80 | ||
fb16f46a | 81 | case TEMPLATE_TYPE_PARM: |
82 | case TEMPLATE_TEMPLATE_PARM: | |
f3110581 | 83 | indent_to (file, indent + 3); |
855ed7a1 | 84 | fprintf (file, "index %d level %d orig_level %d", |
85aa12f7 | 85 | TEMPLATE_TYPE_IDX (node), TEMPLATE_TYPE_LEVEL (node), |
86 | TEMPLATE_TYPE_ORIG_LEVEL (node)); | |
471086d6 | 87 | return; |
fb16f46a | 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 | ||
782086f8 | 95 | case RECORD_TYPE: |
96 | case UNION_TYPE: | |
97 | break; | |
98 | ||
0e843db7 | 99 | case DECLTYPE_TYPE: |
100 | print_node (file, "expr", DECLTYPE_TYPE_EXPR (node), indent + 4); | |
101 | return; | |
102 | ||
a818df05 | 103 | case TYPENAME_TYPE: |
104 | print_node (file, "fullname", TYPENAME_TYPE_FULLNAME (node), | |
105 | indent + 4); | |
106 | return; | |
107 | ||
2b6ed700 | 108 | case TYPE_PACK_EXPANSION: |
109 | print_node (file, "args", PACK_EXPANSION_EXTRA_ARGS (node), indent + 4); | |
110 | return; | |
111 | ||
fb16f46a | 112 | default: |
113 | return; | |
471086d6 | 114 | } |
115 | ||
fb16f46a | 116 | if (TYPE_PTRMEMFUNC_P (node)) |
117 | print_node (file, "ptrmemfunc fn type", TYPE_PTRMEMFUNC_FN_TYPE (node), | |
118 | indent + 4); | |
119 | ||
2e91a2c4 | 120 | if (! CLASS_TYPE_P (node)) |
471086d6 | 121 | return; |
122 | ||
39e70cbf | 123 | indent_to (file, indent + 4); |
124 | fprintf (file, "full-name \"%s\"", | |
125 | type_as_string (node, TFF_CLASS_KEY_OR_ENUM)); | |
126 | ||
471086d6 | 127 | indent_to (file, indent + 3); |
128 | ||
129 | if (TYPE_NEEDS_CONSTRUCTING (node)) | |
9ff1ba0a | 130 | fputs ( " needs-constructor", file); |
89e923d8 | 131 | if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (node)) |
471086d6 | 132 | fputs (" needs-destructor", file); |
471086d6 | 133 | if (TYPE_HAS_DEFAULT_CONSTRUCTOR (node)) |
134 | fputs (" X()", file); | |
135 | if (TYPE_HAS_CONVERSION (node)) | |
136 | fputs (" has-type-conversion", file); | |
ab8002de | 137 | if (TYPE_HAS_COPY_CTOR (node)) |
471086d6 | 138 | { |
ab8002de | 139 | if (TYPE_HAS_CONST_COPY_CTOR (node)) |
471086d6 | 140 | fputs (" X(constX&)", file); |
141 | else | |
142 | fputs (" X(X&)", file); | |
143 | } | |
89e923d8 | 144 | if (TYPE_HAS_NEW_OPERATOR (node)) |
e581f478 | 145 | fputs (" new", file); |
89e923d8 | 146 | if (TYPE_HAS_ARRAY_NEW_OPERATOR (node)) |
e581f478 | 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); | |
ab8002de | 152 | if (TYPE_HAS_COPY_ASSIGN (node)) |
471086d6 | 153 | fputs (" this=(X&)", file); |
471086d6 | 154 | |
155 | if (TREE_CODE (node) == RECORD_TYPE) | |
156 | { | |
a6460bf1 | 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"); | |
9031d10b | 162 | |
471086d6 | 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"); | |
471086d6 | 168 | } |
169 | } | |
170 | ||
171 | void | |
26ac6687 | 172 | cxx_print_identifier (FILE *file, tree node, int indent) |
471086d6 | 173 | { |
d9a13090 | 174 | if (indent == 0) |
175 | fprintf (file, " "); | |
176 | else | |
a818df05 | 177 | indent_to (file, indent + 4); |
991449b2 | 178 | fprintf (file, "%s local bindings <%p>", get_identifier_kind_name (node), |
179 | (void *) IDENTIFIER_BINDING (node)); | |
471086d6 | 180 | } |
18e99d00 | 181 | |
21270e68 | 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); | |
21270e68 | 206 | } |
207 | ||
18e99d00 | 208 | void |
26ac6687 | 209 | cxx_print_xnode (FILE *file, tree node, int indent) |
18e99d00 | 210 | { |
211 | switch (TREE_CODE (node)) | |
212 | { | |
2366ed31 | 213 | case BASELINK: |
214 | print_node (file, "functions", BASELINK_FUNCTIONS (node), indent + 4); | |
215 | print_node (file, "binfo", BASELINK_BINFO (node), indent + 4); | |
074ab442 | 216 | print_node (file, "access_binfo", BASELINK_ACCESS_BINFO (node), |
2366ed31 | 217 | indent + 4); |
0ecceb4d | 218 | print_node (file, "optype", BASELINK_OPTYPE (node), indent + 4); |
2366ed31 | 219 | break; |
8417823c | 220 | case OVERLOAD: |
87229d1e | 221 | print_node (file, "function", OVL_FUNCTION (node), indent+4); |
222 | print_node (file, "next", OVL_CHAIN (node), indent+4); | |
f8c5c88a | 223 | break; |
f97854e3 | 224 | case TEMPLATE_PARM_INDEX: |
bd30f083 | 225 | print_node (file, "decl", TEMPLATE_PARM_DECL (node), indent+4); |
f97854e3 | 226 | indent_to (file, indent + 3); |
855ed7a1 | 227 | fprintf (file, "index %d level %d orig_level %d", |
85aa12f7 | 228 | TEMPLATE_PARM_IDX (node), TEMPLATE_PARM_LEVEL (node), |
229 | TEMPLATE_PARM_ORIG_LEVEL (node)); | |
f97854e3 | 230 | break; |
b183b770 | 231 | case TEMPLATE_INFO: |
232 | print_node (file, "template", TI_TEMPLATE (node), indent+4); | |
233 | print_node (file, "args", TI_ARGS (node), indent+4); | |
234 | if (TI_PENDING_TEMPLATE_FLAG (node)) | |
235 | { | |
236 | indent_to (file, indent + 3); | |
237 | fprintf (file, "pending_template"); | |
238 | } | |
239 | break; | |
56c12fd4 | 240 | case CONSTRAINT_INFO: |
241 | { | |
242 | tree_constraint_info *cinfo = (tree_constraint_info *)node; | |
243 | if (cinfo->template_reqs) | |
244 | print_node (file, "template_reqs", cinfo->template_reqs, indent+4); | |
245 | if (cinfo->declarator_reqs) | |
246 | print_node (file, "declarator_reqs", cinfo->declarator_reqs, | |
247 | indent+4); | |
248 | print_node (file, "associated_constr", | |
249 | cinfo->associated_constr, indent+4); | |
56c12fd4 | 250 | break; |
251 | } | |
58ee5a30 | 252 | case ARGUMENT_PACK_SELECT: |
253 | print_node (file, "pack", ARGUMENT_PACK_SELECT_FROM_PACK (node), | |
254 | indent+4); | |
255 | indent_to (file, indent + 3); | |
256 | fprintf (file, "index %d", ARGUMENT_PACK_SELECT_INDEX (node)); | |
257 | break; | |
6bb4902d | 258 | case DEFERRED_NOEXCEPT: |
259 | print_node (file, "pattern", DEFERRED_NOEXCEPT_PATTERN (node), indent+4); | |
260 | print_node (file, "args", DEFERRED_NOEXCEPT_ARGS (node), indent+4); | |
261 | break; | |
0ea783a8 | 262 | case TRAIT_EXPR: |
263 | indent_to (file, indent+4); | |
264 | fprintf (file, "kind %d", TRAIT_EXPR_KIND (node)); | |
265 | print_node (file, "type 1", TRAIT_EXPR_TYPE1 (node), indent+4); | |
266 | if (TRAIT_EXPR_TYPE2 (node)) | |
267 | print_node (file, "type 2", TRAIT_EXPR_TYPE2 (node), indent+4); | |
268 | break; | |
21270e68 | 269 | case LAMBDA_EXPR: |
270 | cxx_print_lambda_node (file, node, indent); | |
271 | break; | |
18e99d00 | 272 | default: |
273 | break; | |
274 | } | |
275 | } | |
268df867 | 276 | |
277 | /* Print the node NODE on standard error, for debugging. */ | |
278 | ||
279 | DEBUG_FUNCTION void | |
280 | debug_tree (cp_expr node) | |
281 | { | |
282 | debug_tree (node.get_value()); | |
283 | } |