annotate gcc/cp/ptree.c @ 131:84e7813d76e9

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