annotate gcc/cp/ptree.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
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.
kono
parents:
diff changeset
2 Copyright (C) 1992-2017 Free Software Foundation, Inc.
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);
kono
parents:
diff changeset
218 break;
kono
parents:
diff changeset
219 case OVERLOAD:
kono
parents:
diff changeset
220 print_node (file, "function", OVL_FUNCTION (node), indent+4);
kono
parents:
diff changeset
221 print_node (file, "next", OVL_CHAIN (node), indent+4);
kono
parents:
diff changeset
222 break;
kono
parents:
diff changeset
223 case TEMPLATE_PARM_INDEX:
kono
parents:
diff changeset
224 print_node (file, "decl", TEMPLATE_PARM_DECL (node), indent+4);
kono
parents:
diff changeset
225 indent_to (file, indent + 3);
kono
parents:
diff changeset
226 fprintf (file, "index %d level %d orig_level %d",
kono
parents:
diff changeset
227 TEMPLATE_PARM_IDX (node), TEMPLATE_PARM_LEVEL (node),
kono
parents:
diff changeset
228 TEMPLATE_PARM_ORIG_LEVEL (node));
kono
parents:
diff changeset
229 break;
kono
parents:
diff changeset
230 case TEMPLATE_INFO:
kono
parents:
diff changeset
231 print_node (file, "template", TI_TEMPLATE (node), indent+4);
kono
parents:
diff changeset
232 print_node (file, "args", TI_ARGS (node), indent+4);
kono
parents:
diff changeset
233 if (TI_PENDING_TEMPLATE_FLAG (node))
kono
parents:
diff changeset
234 {
kono
parents:
diff changeset
235 indent_to (file, indent + 3);
kono
parents:
diff changeset
236 fprintf (file, "pending_template");
kono
parents:
diff changeset
237 }
kono
parents:
diff changeset
238 break;
kono
parents:
diff changeset
239 case CONSTRAINT_INFO:
kono
parents:
diff changeset
240 {
kono
parents:
diff changeset
241 tree_constraint_info *cinfo = (tree_constraint_info *)node;
kono
parents:
diff changeset
242 if (cinfo->template_reqs)
kono
parents:
diff changeset
243 print_node (file, "template_reqs", cinfo->template_reqs, indent+4);
kono
parents:
diff changeset
244 if (cinfo->declarator_reqs)
kono
parents:
diff changeset
245 print_node (file, "declarator_reqs", cinfo->declarator_reqs,
kono
parents:
diff changeset
246 indent+4);
kono
parents:
diff changeset
247 print_node (file, "associated_constr",
kono
parents:
diff changeset
248 cinfo->associated_constr, indent+4);
kono
parents:
diff changeset
249 break;
kono
parents:
diff changeset
250 }
kono
parents:
diff changeset
251 case ARGUMENT_PACK_SELECT:
kono
parents:
diff changeset
252 print_node (file, "pack", ARGUMENT_PACK_SELECT_FROM_PACK (node),
kono
parents:
diff changeset
253 indent+4);
kono
parents:
diff changeset
254 indent_to (file, indent + 3);
kono
parents:
diff changeset
255 fprintf (file, "index %d", ARGUMENT_PACK_SELECT_INDEX (node));
kono
parents:
diff changeset
256 break;
kono
parents:
diff changeset
257 case DEFERRED_NOEXCEPT:
kono
parents:
diff changeset
258 print_node (file, "pattern", DEFERRED_NOEXCEPT_PATTERN (node), indent+4);
kono
parents:
diff changeset
259 print_node (file, "args", DEFERRED_NOEXCEPT_ARGS (node), indent+4);
kono
parents:
diff changeset
260 break;
kono
parents:
diff changeset
261 case TRAIT_EXPR:
kono
parents:
diff changeset
262 indent_to (file, indent+4);
kono
parents:
diff changeset
263 fprintf (file, "kind %d", TRAIT_EXPR_KIND (node));
kono
parents:
diff changeset
264 print_node (file, "type 1", TRAIT_EXPR_TYPE1 (node), indent+4);
kono
parents:
diff changeset
265 if (TRAIT_EXPR_TYPE2 (node))
kono
parents:
diff changeset
266 print_node (file, "type 2", TRAIT_EXPR_TYPE2 (node), indent+4);
kono
parents:
diff changeset
267 break;
kono
parents:
diff changeset
268 case LAMBDA_EXPR:
kono
parents:
diff changeset
269 cxx_print_lambda_node (file, node, indent);
kono
parents:
diff changeset
270 break;
kono
parents:
diff changeset
271 default:
kono
parents:
diff changeset
272 break;
kono
parents:
diff changeset
273 }
kono
parents:
diff changeset
274 }
kono
parents:
diff changeset
275
kono
parents:
diff changeset
276 /* Print the node NODE on standard error, for debugging. */
kono
parents:
diff changeset
277
kono
parents:
diff changeset
278 DEBUG_FUNCTION void
kono
parents:
diff changeset
279 debug_tree (cp_expr node)
kono
parents:
diff changeset
280 {
kono
parents:
diff changeset
281 debug_tree (node.get_value());
kono
parents:
diff changeset
282 }