]>
Commit | Line | Data |
---|---|---|
471086d6 | 1 | /* Prints out trees in human readable form. |
d353bf18 | 2 | Copyright (C) 1992-2015 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" |
25 | #include "tm.h" | |
b20a8bb4 | 26 | #include "alias.h" |
27 | #include "symtab.h" | |
ec7d870d | 28 | #include "tree.h" |
9ed99284 | 29 | #include "print-tree.h" |
471086d6 | 30 | #include "cp-tree.h" |
31 | ||
32 | void | |
26ac6687 | 33 | cxx_print_decl (FILE *file, tree node, int indent) |
471086d6 | 34 | { |
a484e8db | 35 | if (TREE_CODE (node) == FIELD_DECL) |
471086d6 | 36 | { |
a484e8db | 37 | if (DECL_MUTABLE_P (node)) |
38 | { | |
39 | indent_to (file, indent + 3); | |
40 | fprintf (file, " mutable "); | |
41 | } | |
42 | return; | |
471086d6 | 43 | } |
a484e8db | 44 | |
437f5d6b | 45 | if (!CODE_CONTAINS_STRUCT (TREE_CODE (node), TS_DECL_COMMON) |
46 | || !DECL_LANG_SPECIFIC (node)) | |
471086d6 | 47 | return; |
9ff1ba0a | 48 | if (TREE_CODE (node) == FUNCTION_DECL) |
49 | { | |
50 | int flags = TFF_DECL_SPECIFIERS|TFF_RETURN_TYPE | |
51 | |TFF_FUNCTION_DEFAULT_ARGUMENTS|TFF_EXCEPTION_SPECIFICATION ; | |
52 | indent_to (file, indent + 3); | |
53 | fprintf (file, " full-name \"%s\"", decl_as_string (node, flags)); | |
54 | } | |
55 | else if (TREE_CODE (node) == TEMPLATE_DECL) | |
56 | { | |
57 | indent_to (file, indent + 3); | |
58 | fprintf (file, " full-name \"%s\"", | |
59 | decl_as_string (node, TFF_TEMPLATE_HEADER)); | |
60 | } | |
61 | ||
471086d6 | 62 | indent_to (file, indent + 3); |
9ff1ba0a | 63 | if (DECL_EXTERNAL (node) && DECL_NOT_REALLY_EXTERN (node)) |
64 | fprintf (file, " not-really-extern"); | |
15eb8b2d | 65 | if (TREE_CODE (node) == FUNCTION_DECL |
66 | && DECL_PENDING_INLINE_INFO (node)) | |
ca0205ee | 67 | fprintf (file, " pending-inline-info %p", |
6f817829 | 68 | (void *) DECL_PENDING_INLINE_INFO (node)); |
4cace8cb | 69 | if (VAR_OR_FUNCTION_DECL_P (node) |
ad46fc6a | 70 | && DECL_TEMPLATE_INFO (node)) |
ca0205ee | 71 | fprintf (file, " template-info %p", |
6f817829 | 72 | (void *) DECL_TEMPLATE_INFO (node)); |
471086d6 | 73 | } |
74 | ||
75 | void | |
26ac6687 | 76 | cxx_print_type (FILE *file, tree node, int indent) |
471086d6 | 77 | { |
fb16f46a | 78 | switch (TREE_CODE (node)) |
471086d6 | 79 | { |
fb16f46a | 80 | case TEMPLATE_TYPE_PARM: |
81 | case TEMPLATE_TEMPLATE_PARM: | |
1e93ca27 | 82 | case BOUND_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); |
39e70cbf | 154 | if (CLASSTYPE_SORTED_FIELDS (node)) |
155 | fprintf (file, " sorted-fields %p", | |
156 | (void *) CLASSTYPE_SORTED_FIELDS (node)); | |
471086d6 | 157 | |
158 | if (TREE_CODE (node) == RECORD_TYPE) | |
159 | { | |
a6460bf1 | 160 | if (TYPE_BINFO (node)) |
161 | fprintf (file, " n_parents=%d", | |
162 | BINFO_N_BASE_BINFOS (TYPE_BINFO (node))); | |
163 | else | |
164 | fprintf (file, " no-binfo"); | |
9031d10b | 165 | |
471086d6 | 166 | fprintf (file, " use_template=%d", CLASSTYPE_USE_TEMPLATE (node)); |
167 | if (CLASSTYPE_INTERFACE_ONLY (node)) | |
168 | fprintf (file, " interface-only"); | |
169 | if (CLASSTYPE_INTERFACE_UNKNOWN (node)) | |
170 | fprintf (file, " interface-unknown"); | |
471086d6 | 171 | } |
172 | } | |
173 | ||
771cf831 | 174 | |
175 | static void | |
176 | cxx_print_binding (FILE *stream, cxx_binding *binding, const char *prefix) | |
177 | { | |
ca0205ee | 178 | fprintf (stream, "%s <%p>", |
6f817829 | 179 | prefix, (void *) binding); |
771cf831 | 180 | } |
181 | ||
471086d6 | 182 | void |
26ac6687 | 183 | cxx_print_identifier (FILE *file, tree node, int indent) |
471086d6 | 184 | { |
d9a13090 | 185 | if (indent == 0) |
186 | fprintf (file, " "); | |
187 | else | |
a818df05 | 188 | indent_to (file, indent + 4); |
771cf831 | 189 | cxx_print_binding (file, IDENTIFIER_NAMESPACE_BINDINGS (node), "bindings"); |
d9a13090 | 190 | if (indent == 0) |
191 | fprintf (file, " "); | |
192 | else | |
a818df05 | 193 | indent_to (file, indent + 4); |
771cf831 | 194 | cxx_print_binding (file, IDENTIFIER_BINDING (node), "local bindings"); |
471086d6 | 195 | print_node (file, "label", IDENTIFIER_LABEL_VALUE (node), indent + 4); |
196 | print_node (file, "template", IDENTIFIER_TEMPLATE (node), indent + 4); | |
471086d6 | 197 | } |
18e99d00 | 198 | |
21270e68 | 199 | void |
200 | cxx_print_lambda_node (FILE *file, tree node, int indent) | |
201 | { | |
202 | if (LAMBDA_EXPR_MUTABLE_P (node)) | |
203 | fprintf (file, " /mutable"); | |
204 | fprintf (file, " default_capture_mode=["); | |
205 | switch (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (node)) | |
206 | { | |
207 | case CPLD_NONE: | |
208 | fprintf (file, "NONE"); | |
209 | break; | |
210 | case CPLD_COPY: | |
211 | fprintf (file, "COPY"); | |
212 | break; | |
213 | case CPLD_REFERENCE: | |
214 | fprintf (file, "CPLD_REFERENCE"); | |
215 | break; | |
216 | default: | |
217 | fprintf (file, "??"); | |
218 | break; | |
219 | } | |
220 | fprintf (file, "] "); | |
221 | print_node (file, "capture_list", LAMBDA_EXPR_CAPTURE_LIST (node), indent + 4); | |
222 | print_node (file, "this_capture", LAMBDA_EXPR_THIS_CAPTURE (node), indent + 4); | |
223 | print_node (file, "return_type", LAMBDA_EXPR_RETURN_TYPE (node), indent + 4); | |
224 | print_node (file, "closure", LAMBDA_EXPR_CLOSURE (node), indent + 4); | |
225 | } | |
226 | ||
18e99d00 | 227 | void |
26ac6687 | 228 | cxx_print_xnode (FILE *file, tree node, int indent) |
18e99d00 | 229 | { |
230 | switch (TREE_CODE (node)) | |
231 | { | |
2366ed31 | 232 | case BASELINK: |
233 | print_node (file, "functions", BASELINK_FUNCTIONS (node), indent + 4); | |
234 | print_node (file, "binfo", BASELINK_BINFO (node), indent + 4); | |
074ab442 | 235 | print_node (file, "access_binfo", BASELINK_ACCESS_BINFO (node), |
2366ed31 | 236 | indent + 4); |
237 | break; | |
8417823c | 238 | case OVERLOAD: |
239 | print_node (file, "function", OVL_FUNCTION (node), indent+4); | |
240 | print_node (file, "chain", TREE_CHAIN (node), indent+4); | |
f8c5c88a | 241 | break; |
f97854e3 | 242 | case TEMPLATE_PARM_INDEX: |
243 | indent_to (file, indent + 3); | |
855ed7a1 | 244 | fprintf (file, "index %d level %d orig_level %d", |
85aa12f7 | 245 | TEMPLATE_PARM_IDX (node), TEMPLATE_PARM_LEVEL (node), |
246 | TEMPLATE_PARM_ORIG_LEVEL (node)); | |
f97854e3 | 247 | break; |
b183b770 | 248 | case TEMPLATE_INFO: |
249 | print_node (file, "template", TI_TEMPLATE (node), indent+4); | |
250 | print_node (file, "args", TI_ARGS (node), indent+4); | |
251 | if (TI_PENDING_TEMPLATE_FLAG (node)) | |
252 | { | |
253 | indent_to (file, indent + 3); | |
254 | fprintf (file, "pending_template"); | |
255 | } | |
256 | break; | |
58ee5a30 | 257 | case ARGUMENT_PACK_SELECT: |
258 | print_node (file, "pack", ARGUMENT_PACK_SELECT_FROM_PACK (node), | |
259 | indent+4); | |
260 | indent_to (file, indent + 3); | |
261 | fprintf (file, "index %d", ARGUMENT_PACK_SELECT_INDEX (node)); | |
262 | break; | |
6bb4902d | 263 | case DEFERRED_NOEXCEPT: |
264 | print_node (file, "pattern", DEFERRED_NOEXCEPT_PATTERN (node), indent+4); | |
265 | print_node (file, "args", DEFERRED_NOEXCEPT_ARGS (node), indent+4); | |
266 | break; | |
0ea783a8 | 267 | case TRAIT_EXPR: |
268 | indent_to (file, indent+4); | |
269 | fprintf (file, "kind %d", TRAIT_EXPR_KIND (node)); | |
270 | print_node (file, "type 1", TRAIT_EXPR_TYPE1 (node), indent+4); | |
271 | if (TRAIT_EXPR_TYPE2 (node)) | |
272 | print_node (file, "type 2", TRAIT_EXPR_TYPE2 (node), indent+4); | |
273 | break; | |
21270e68 | 274 | case LAMBDA_EXPR: |
275 | cxx_print_lambda_node (file, node, indent); | |
276 | break; | |
18e99d00 | 277 | default: |
278 | break; | |
279 | } | |
280 | } |