cp-demangle.c revision 1.9 1 1.1 christos /* Demangler for g++ V3 ABI.
2 1.9 christos Copyright (C) 2003-2024 Free Software Foundation, Inc.
3 1.1 christos Written by Ian Lance Taylor <ian (at) wasabisystems.com>.
4 1.1 christos
5 1.1 christos This file is part of the libiberty library, which is part of GCC.
6 1.1 christos
7 1.1 christos This file is free software; you can redistribute it and/or modify
8 1.1 christos it under the terms of the GNU General Public License as published by
9 1.1 christos the Free Software Foundation; either version 2 of the License, or
10 1.1 christos (at your option) any later version.
11 1.1 christos
12 1.1 christos In addition to the permissions in the GNU General Public License, the
13 1.1 christos Free Software Foundation gives you unlimited permission to link the
14 1.1 christos compiled version of this file into combinations with other programs,
15 1.1 christos and to distribute those combinations without any restriction coming
16 1.1 christos from the use of this file. (The General Public License restrictions
17 1.1 christos do apply in other respects; for example, they cover modification of
18 1.1 christos the file, and distribution when not linked into a combined
19 1.1 christos executable.)
20 1.1 christos
21 1.1 christos This program is distributed in the hope that it will be useful,
22 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
23 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 1.1 christos GNU General Public License for more details.
25 1.1 christos
26 1.1 christos You should have received a copy of the GNU General Public License
27 1.1 christos along with this program; if not, write to the Free Software
28 1.1 christos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
29 1.1 christos */
30 1.1 christos
31 1.1 christos /* This code implements a demangler for the g++ V3 ABI. The ABI is
32 1.1 christos described on this web page:
33 1.6 christos https://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling
34 1.1 christos
35 1.1 christos This code was written while looking at the demangler written by
36 1.1 christos Alex Samuel <samuel (at) codesourcery.com>.
37 1.1 christos
38 1.1 christos This code first pulls the mangled name apart into a list of
39 1.1 christos components, and then walks the list generating the demangled
40 1.1 christos name.
41 1.1 christos
42 1.1 christos This file will normally define the following functions, q.v.:
43 1.1 christos char *cplus_demangle_v3(const char *mangled, int options)
44 1.1 christos char *java_demangle_v3(const char *mangled)
45 1.1 christos int cplus_demangle_v3_callback(const char *mangled, int options,
46 1.1 christos demangle_callbackref callback)
47 1.1 christos int java_demangle_v3_callback(const char *mangled,
48 1.1 christos demangle_callbackref callback)
49 1.1 christos enum gnu_v3_ctor_kinds is_gnu_v3_mangled_ctor (const char *name)
50 1.1 christos enum gnu_v3_dtor_kinds is_gnu_v3_mangled_dtor (const char *name)
51 1.1 christos
52 1.1 christos Also, the interface to the component list is public, and defined in
53 1.1 christos demangle.h. The interface consists of these types, which are
54 1.1 christos defined in demangle.h:
55 1.1 christos enum demangle_component_type
56 1.1 christos struct demangle_component
57 1.1 christos demangle_callbackref
58 1.1 christos and these functions defined in this file:
59 1.1 christos cplus_demangle_fill_name
60 1.1 christos cplus_demangle_fill_extended_operator
61 1.1 christos cplus_demangle_fill_ctor
62 1.1 christos cplus_demangle_fill_dtor
63 1.1 christos cplus_demangle_print
64 1.1 christos cplus_demangle_print_callback
65 1.1 christos and other functions defined in the file cp-demint.c.
66 1.1 christos
67 1.1 christos This file also defines some other functions and variables which are
68 1.1 christos only to be used by the file cp-demint.c.
69 1.1 christos
70 1.1 christos Preprocessor macros you can define while compiling this file:
71 1.1 christos
72 1.1 christos IN_LIBGCC2
73 1.1 christos If defined, this file defines the following functions, q.v.:
74 1.1 christos char *__cxa_demangle (const char *mangled, char *buf, size_t *len,
75 1.1 christos int *status)
76 1.1 christos int __gcclibcxx_demangle_callback (const char *,
77 1.1 christos void (*)
78 1.1 christos (const char *, size_t, void *),
79 1.1 christos void *)
80 1.1 christos instead of cplus_demangle_v3[_callback]() and
81 1.1 christos java_demangle_v3[_callback]().
82 1.1 christos
83 1.1 christos IN_GLIBCPP_V3
84 1.1 christos If defined, this file defines only __cxa_demangle() and
85 1.1 christos __gcclibcxx_demangle_callback(), and no other publically visible
86 1.1 christos functions or variables.
87 1.1 christos
88 1.1 christos STANDALONE_DEMANGLER
89 1.1 christos If defined, this file defines a main() function which demangles
90 1.1 christos any arguments, or, if none, demangles stdin.
91 1.1 christos
92 1.1 christos CP_DEMANGLE_DEBUG
93 1.1 christos If defined, turns on debugging mode, which prints information on
94 1.1 christos stdout about the mangled string. This is not generally useful.
95 1.5 christos
96 1.5 christos CHECK_DEMANGLER
97 1.5 christos If defined, additional sanity checks will be performed. It will
98 1.5 christos cause some slowdown, but will allow to catch out-of-bound access
99 1.5 christos errors earlier. This macro is intended for testing and debugging. */
100 1.1 christos
101 1.1 christos #if defined (_AIX) && !defined (__GNUC__)
102 1.1 christos #pragma alloca
103 1.1 christos #endif
104 1.1 christos
105 1.1 christos #ifdef HAVE_CONFIG_H
106 1.1 christos #include "config.h"
107 1.1 christos #endif
108 1.1 christos
109 1.1 christos #include <stdio.h>
110 1.1 christos
111 1.1 christos #ifdef HAVE_STDLIB_H
112 1.1 christos #include <stdlib.h>
113 1.1 christos #endif
114 1.1 christos #ifdef HAVE_STRING_H
115 1.1 christos #include <string.h>
116 1.1 christos #endif
117 1.1 christos
118 1.1 christos #ifdef HAVE_ALLOCA_H
119 1.1 christos # include <alloca.h>
120 1.1 christos #else
121 1.1 christos # ifndef alloca
122 1.1 christos # ifdef __GNUC__
123 1.1 christos # define alloca __builtin_alloca
124 1.1 christos # else
125 1.1 christos extern char *alloca ();
126 1.1 christos # endif /* __GNUC__ */
127 1.1 christos # endif /* alloca */
128 1.1 christos #endif /* HAVE_ALLOCA_H */
129 1.1 christos
130 1.6 christos #ifdef HAVE_LIMITS_H
131 1.6 christos #include <limits.h>
132 1.6 christos #endif
133 1.6 christos #ifndef INT_MAX
134 1.6 christos # define INT_MAX (int)(((unsigned int) ~0) >> 1) /* 0x7FFFFFFF */
135 1.6 christos #endif
136 1.6 christos
137 1.1 christos #include "ansidecl.h"
138 1.1 christos #include "libiberty.h"
139 1.1 christos #include "demangle.h"
140 1.1 christos #include "cp-demangle.h"
141 1.1 christos
142 1.1 christos /* If IN_GLIBCPP_V3 is defined, some functions are made static. We
143 1.1 christos also rename them via #define to avoid compiler errors when the
144 1.1 christos static definition conflicts with the extern declaration in a header
145 1.1 christos file. */
146 1.1 christos #ifdef IN_GLIBCPP_V3
147 1.1 christos
148 1.1 christos #define CP_STATIC_IF_GLIBCPP_V3 static
149 1.1 christos
150 1.1 christos #define cplus_demangle_fill_name d_fill_name
151 1.1 christos static int d_fill_name (struct demangle_component *, const char *, int);
152 1.1 christos
153 1.1 christos #define cplus_demangle_fill_extended_operator d_fill_extended_operator
154 1.1 christos static int
155 1.1 christos d_fill_extended_operator (struct demangle_component *, int,
156 1.1 christos struct demangle_component *);
157 1.1 christos
158 1.1 christos #define cplus_demangle_fill_ctor d_fill_ctor
159 1.1 christos static int
160 1.1 christos d_fill_ctor (struct demangle_component *, enum gnu_v3_ctor_kinds,
161 1.1 christos struct demangle_component *);
162 1.1 christos
163 1.1 christos #define cplus_demangle_fill_dtor d_fill_dtor
164 1.1 christos static int
165 1.1 christos d_fill_dtor (struct demangle_component *, enum gnu_v3_dtor_kinds,
166 1.1 christos struct demangle_component *);
167 1.1 christos
168 1.1 christos #define cplus_demangle_mangled_name d_mangled_name
169 1.1 christos static struct demangle_component *d_mangled_name (struct d_info *, int);
170 1.1 christos
171 1.1 christos #define cplus_demangle_type d_type
172 1.1 christos static struct demangle_component *d_type (struct d_info *);
173 1.1 christos
174 1.1 christos #define cplus_demangle_print d_print
175 1.6 christos static char *d_print (int, struct demangle_component *, int, size_t *);
176 1.1 christos
177 1.1 christos #define cplus_demangle_print_callback d_print_callback
178 1.6 christos static int d_print_callback (int, struct demangle_component *,
179 1.1 christos demangle_callbackref, void *);
180 1.1 christos
181 1.1 christos #define cplus_demangle_init_info d_init_info
182 1.1 christos static void d_init_info (const char *, int, size_t, struct d_info *);
183 1.1 christos
184 1.1 christos #else /* ! defined(IN_GLIBCPP_V3) */
185 1.1 christos #define CP_STATIC_IF_GLIBCPP_V3
186 1.1 christos #endif /* ! defined(IN_GLIBCPP_V3) */
187 1.1 christos
188 1.1 christos /* See if the compiler supports dynamic arrays. */
189 1.1 christos
190 1.1 christos #ifdef __GNUC__
191 1.1 christos #define CP_DYNAMIC_ARRAYS
192 1.1 christos #else
193 1.1 christos #ifdef __STDC__
194 1.1 christos #ifdef __STDC_VERSION__
195 1.7 christos #if __STDC_VERSION__ >= 199901L && !__STDC_NO_VLA__
196 1.1 christos #define CP_DYNAMIC_ARRAYS
197 1.7 christos #endif /* __STDC_VERSION__ >= 199901L && !__STDC_NO_VLA__ */
198 1.1 christos #endif /* defined (__STDC_VERSION__) */
199 1.1 christos #endif /* defined (__STDC__) */
200 1.1 christos #endif /* ! defined (__GNUC__) */
201 1.1 christos
202 1.1 christos /* We avoid pulling in the ctype tables, to prevent pulling in
203 1.1 christos additional unresolved symbols when this code is used in a library.
204 1.1 christos FIXME: Is this really a valid reason? This comes from the original
205 1.1 christos V3 demangler code.
206 1.1 christos
207 1.1 christos As of this writing this file has the following undefined references
208 1.1 christos when compiled with -DIN_GLIBCPP_V3: realloc, free, memcpy, strcpy,
209 1.1 christos strcat, strlen. */
210 1.1 christos
211 1.1 christos #define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
212 1.1 christos #define IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z')
213 1.1 christos #define IS_LOWER(c) ((c) >= 'a' && (c) <= 'z')
214 1.1 christos
215 1.1 christos /* The prefix prepended by GCC to an identifier represnting the
216 1.1 christos anonymous namespace. */
217 1.1 christos #define ANONYMOUS_NAMESPACE_PREFIX "_GLOBAL_"
218 1.1 christos #define ANONYMOUS_NAMESPACE_PREFIX_LEN \
219 1.1 christos (sizeof (ANONYMOUS_NAMESPACE_PREFIX) - 1)
220 1.1 christos
221 1.1 christos /* Information we keep for the standard substitutions. */
222 1.1 christos
223 1.1 christos struct d_standard_sub_info
224 1.1 christos {
225 1.1 christos /* The code for this substitution. */
226 1.1 christos char code;
227 1.1 christos /* The simple string it expands to. */
228 1.1 christos const char *simple_expansion;
229 1.1 christos /* The length of the simple expansion. */
230 1.1 christos int simple_len;
231 1.1 christos /* The results of a full, verbose, expansion. This is used when
232 1.1 christos qualifying a constructor/destructor, or when in verbose mode. */
233 1.1 christos const char *full_expansion;
234 1.1 christos /* The length of the full expansion. */
235 1.1 christos int full_len;
236 1.1 christos /* What to set the last_name field of d_info to; NULL if we should
237 1.1 christos not set it. This is only relevant when qualifying a
238 1.1 christos constructor/destructor. */
239 1.1 christos const char *set_last_name;
240 1.1 christos /* The length of set_last_name. */
241 1.1 christos int set_last_name_len;
242 1.1 christos };
243 1.1 christos
244 1.1 christos /* Accessors for subtrees of struct demangle_component. */
245 1.1 christos
246 1.1 christos #define d_left(dc) ((dc)->u.s_binary.left)
247 1.1 christos #define d_right(dc) ((dc)->u.s_binary.right)
248 1.1 christos
249 1.1 christos /* A list of templates. This is used while printing. */
250 1.1 christos
251 1.1 christos struct d_print_template
252 1.1 christos {
253 1.1 christos /* Next template on the list. */
254 1.1 christos struct d_print_template *next;
255 1.1 christos /* This template. */
256 1.1 christos const struct demangle_component *template_decl;
257 1.1 christos };
258 1.1 christos
259 1.1 christos /* A list of type modifiers. This is used while printing. */
260 1.1 christos
261 1.1 christos struct d_print_mod
262 1.1 christos {
263 1.1 christos /* Next modifier on the list. These are in the reverse of the order
264 1.1 christos in which they appeared in the mangled string. */
265 1.1 christos struct d_print_mod *next;
266 1.1 christos /* The modifier. */
267 1.6 christos struct demangle_component *mod;
268 1.1 christos /* Whether this modifier was printed. */
269 1.1 christos int printed;
270 1.1 christos /* The list of templates which applies to this modifier. */
271 1.1 christos struct d_print_template *templates;
272 1.1 christos };
273 1.1 christos
274 1.1 christos /* We use these structures to hold information during printing. */
275 1.1 christos
276 1.1 christos struct d_growable_string
277 1.1 christos {
278 1.1 christos /* Buffer holding the result. */
279 1.1 christos char *buf;
280 1.1 christos /* Current length of data in buffer. */
281 1.1 christos size_t len;
282 1.1 christos /* Allocated size of buffer. */
283 1.1 christos size_t alc;
284 1.1 christos /* Set to 1 if we had a memory allocation failure. */
285 1.1 christos int allocation_failure;
286 1.1 christos };
287 1.1 christos
288 1.3 christos /* Stack of components, innermost first, used to avoid loops. */
289 1.3 christos
290 1.3 christos struct d_component_stack
291 1.3 christos {
292 1.3 christos /* This component. */
293 1.3 christos const struct demangle_component *dc;
294 1.3 christos /* This component's parent. */
295 1.3 christos const struct d_component_stack *parent;
296 1.3 christos };
297 1.3 christos
298 1.3 christos /* A demangle component and some scope captured when it was first
299 1.3 christos traversed. */
300 1.3 christos
301 1.3 christos struct d_saved_scope
302 1.3 christos {
303 1.3 christos /* The component whose scope this is. */
304 1.3 christos const struct demangle_component *container;
305 1.3 christos /* The list of templates, if any, that was current when this
306 1.3 christos scope was captured. */
307 1.3 christos struct d_print_template *templates;
308 1.3 christos };
309 1.3 christos
310 1.3 christos /* Checkpoint structure to allow backtracking. This holds copies
311 1.3 christos of the fields of struct d_info that need to be restored
312 1.3 christos if a trial parse needs to be backtracked over. */
313 1.3 christos
314 1.3 christos struct d_info_checkpoint
315 1.3 christos {
316 1.3 christos const char *n;
317 1.3 christos int next_comp;
318 1.3 christos int next_sub;
319 1.3 christos int expansion;
320 1.3 christos };
321 1.3 christos
322 1.6 christos /* Maximum number of times d_print_comp may be called recursively. */
323 1.6 christos #define MAX_RECURSION_COUNT 1024
324 1.6 christos
325 1.1 christos enum { D_PRINT_BUFFER_LENGTH = 256 };
326 1.1 christos struct d_print_info
327 1.1 christos {
328 1.1 christos /* Fixed-length allocated buffer for demangled data, flushed to the
329 1.1 christos callback with a NUL termination once full. */
330 1.1 christos char buf[D_PRINT_BUFFER_LENGTH];
331 1.1 christos /* Current length of data in buffer. */
332 1.1 christos size_t len;
333 1.1 christos /* The last character printed, saved individually so that it survives
334 1.1 christos any buffer flush. */
335 1.1 christos char last_char;
336 1.1 christos /* Callback function to handle demangled buffer flush. */
337 1.1 christos demangle_callbackref callback;
338 1.1 christos /* Opaque callback argument. */
339 1.1 christos void *opaque;
340 1.1 christos /* The current list of templates, if any. */
341 1.1 christos struct d_print_template *templates;
342 1.1 christos /* The current list of modifiers (e.g., pointer, reference, etc.),
343 1.1 christos if any. */
344 1.1 christos struct d_print_mod *modifiers;
345 1.1 christos /* Set to 1 if we saw a demangling error. */
346 1.1 christos int demangle_failure;
347 1.6 christos /* Number of times d_print_comp was recursively called. Should not
348 1.6 christos be bigger than MAX_RECURSION_COUNT. */
349 1.6 christos int recursion;
350 1.9 christos /* 1 more than the number of explicit template parms of a lambda. Template
351 1.9 christos parm references >= are actually 'auto'. */
352 1.9 christos int lambda_tpl_parms;
353 1.1 christos /* The current index into any template argument packs we are using
354 1.6 christos for printing, or -1 to print the whole pack. */
355 1.1 christos int pack_index;
356 1.1 christos /* Number of d_print_flush calls so far. */
357 1.1 christos unsigned long int flush_count;
358 1.3 christos /* Stack of components, innermost first, used to avoid loops. */
359 1.3 christos const struct d_component_stack *component_stack;
360 1.3 christos /* Array of saved scopes for evaluating substitutions. */
361 1.3 christos struct d_saved_scope *saved_scopes;
362 1.3 christos /* Index of the next unused saved scope in the above array. */
363 1.3 christos int next_saved_scope;
364 1.3 christos /* Number of saved scopes in the above array. */
365 1.3 christos int num_saved_scopes;
366 1.3 christos /* Array of templates for saving into scopes. */
367 1.3 christos struct d_print_template *copy_templates;
368 1.3 christos /* Index of the next unused copy template in the above array. */
369 1.3 christos int next_copy_template;
370 1.3 christos /* Number of copy templates in the above array. */
371 1.3 christos int num_copy_templates;
372 1.3 christos /* The nearest enclosing template, if any. */
373 1.3 christos const struct demangle_component *current_template;
374 1.1 christos };
375 1.1 christos
376 1.1 christos #ifdef CP_DEMANGLE_DEBUG
377 1.1 christos static void d_dump (struct demangle_component *, int);
378 1.1 christos #endif
379 1.1 christos
380 1.1 christos static struct demangle_component *
381 1.1 christos d_make_empty (struct d_info *);
382 1.1 christos
383 1.1 christos static struct demangle_component *
384 1.1 christos d_make_comp (struct d_info *, enum demangle_component_type,
385 1.1 christos struct demangle_component *,
386 1.1 christos struct demangle_component *);
387 1.1 christos
388 1.1 christos static struct demangle_component *
389 1.1 christos d_make_name (struct d_info *, const char *, int);
390 1.1 christos
391 1.1 christos static struct demangle_component *
392 1.1 christos d_make_demangle_mangled_name (struct d_info *, const char *);
393 1.1 christos
394 1.1 christos static struct demangle_component *
395 1.1 christos d_make_builtin_type (struct d_info *,
396 1.1 christos const struct demangle_builtin_type_info *);
397 1.1 christos
398 1.1 christos static struct demangle_component *
399 1.1 christos d_make_operator (struct d_info *,
400 1.1 christos const struct demangle_operator_info *);
401 1.1 christos
402 1.1 christos static struct demangle_component *
403 1.1 christos d_make_extended_operator (struct d_info *, int,
404 1.1 christos struct demangle_component *);
405 1.1 christos
406 1.1 christos static struct demangle_component *
407 1.1 christos d_make_ctor (struct d_info *, enum gnu_v3_ctor_kinds,
408 1.1 christos struct demangle_component *);
409 1.1 christos
410 1.1 christos static struct demangle_component *
411 1.1 christos d_make_dtor (struct d_info *, enum gnu_v3_dtor_kinds,
412 1.1 christos struct demangle_component *);
413 1.1 christos
414 1.1 christos static struct demangle_component *
415 1.6 christos d_make_template_param (struct d_info *, int);
416 1.1 christos
417 1.1 christos static struct demangle_component *
418 1.1 christos d_make_sub (struct d_info *, const char *, int);
419 1.1 christos
420 1.1 christos static int
421 1.1 christos has_return_type (struct demangle_component *);
422 1.1 christos
423 1.1 christos static int
424 1.1 christos is_ctor_dtor_or_conversion (struct demangle_component *);
425 1.1 christos
426 1.1 christos static struct demangle_component *d_encoding (struct d_info *, int);
427 1.1 christos
428 1.8 christos static struct demangle_component *d_name (struct d_info *, int substable);
429 1.1 christos
430 1.1 christos static struct demangle_component *d_nested_name (struct d_info *);
431 1.1 christos
432 1.8 christos static int d_maybe_module_name (struct d_info *, struct demangle_component **);
433 1.1 christos
434 1.8 christos static struct demangle_component *d_prefix (struct d_info *, int);
435 1.8 christos
436 1.8 christos static struct demangle_component *d_unqualified_name (struct d_info *,
437 1.8 christos struct demangle_component *scope, struct demangle_component *module);
438 1.1 christos
439 1.1 christos static struct demangle_component *d_source_name (struct d_info *);
440 1.1 christos
441 1.6 christos static int d_number (struct d_info *);
442 1.1 christos
443 1.6 christos static struct demangle_component *d_identifier (struct d_info *, int);
444 1.1 christos
445 1.1 christos static struct demangle_component *d_operator_name (struct d_info *);
446 1.1 christos
447 1.1 christos static struct demangle_component *d_special_name (struct d_info *);
448 1.1 christos
449 1.6 christos static struct demangle_component *d_parmlist (struct d_info *);
450 1.6 christos
451 1.1 christos static int d_call_offset (struct d_info *, int);
452 1.1 christos
453 1.1 christos static struct demangle_component *d_ctor_dtor_name (struct d_info *);
454 1.1 christos
455 1.1 christos static struct demangle_component **
456 1.1 christos d_cv_qualifiers (struct d_info *, struct demangle_component **, int);
457 1.1 christos
458 1.1 christos static struct demangle_component *
459 1.3 christos d_ref_qualifier (struct d_info *, struct demangle_component *);
460 1.3 christos
461 1.3 christos static struct demangle_component *
462 1.1 christos d_function_type (struct d_info *);
463 1.1 christos
464 1.1 christos static struct demangle_component *
465 1.1 christos d_bare_function_type (struct d_info *, int);
466 1.1 christos
467 1.1 christos static struct demangle_component *
468 1.8 christos d_class_enum_type (struct d_info *, int);
469 1.1 christos
470 1.1 christos static struct demangle_component *d_array_type (struct d_info *);
471 1.1 christos
472 1.1 christos static struct demangle_component *d_vector_type (struct d_info *);
473 1.1 christos
474 1.1 christos static struct demangle_component *
475 1.1 christos d_pointer_to_member_type (struct d_info *);
476 1.1 christos
477 1.1 christos static struct demangle_component *
478 1.1 christos d_template_param (struct d_info *);
479 1.1 christos
480 1.1 christos static struct demangle_component *d_template_args (struct d_info *);
481 1.6 christos static struct demangle_component *d_template_args_1 (struct d_info *);
482 1.1 christos
483 1.1 christos static struct demangle_component *
484 1.1 christos d_template_arg (struct d_info *);
485 1.1 christos
486 1.1 christos static struct demangle_component *d_expression (struct d_info *);
487 1.1 christos
488 1.1 christos static struct demangle_component *d_expr_primary (struct d_info *);
489 1.1 christos
490 1.1 christos static struct demangle_component *d_local_name (struct d_info *);
491 1.1 christos
492 1.1 christos static int d_discriminator (struct d_info *);
493 1.1 christos
494 1.9 christos static struct demangle_component *d_template_parm (struct d_info *, int *bad);
495 1.9 christos
496 1.9 christos static struct demangle_component *d_template_head (struct d_info *, int *bad);
497 1.9 christos
498 1.1 christos static struct demangle_component *d_lambda (struct d_info *);
499 1.1 christos
500 1.1 christos static struct demangle_component *d_unnamed_type (struct d_info *);
501 1.1 christos
502 1.1 christos static struct demangle_component *
503 1.1 christos d_clone_suffix (struct d_info *, struct demangle_component *);
504 1.1 christos
505 1.1 christos static int
506 1.1 christos d_add_substitution (struct d_info *, struct demangle_component *);
507 1.1 christos
508 1.1 christos static struct demangle_component *d_substitution (struct d_info *, int);
509 1.1 christos
510 1.3 christos static void d_checkpoint (struct d_info *, struct d_info_checkpoint *);
511 1.3 christos
512 1.3 christos static void d_backtrack (struct d_info *, struct d_info_checkpoint *);
513 1.3 christos
514 1.1 christos static void d_growable_string_init (struct d_growable_string *, size_t);
515 1.1 christos
516 1.1 christos static inline void
517 1.1 christos d_growable_string_resize (struct d_growable_string *, size_t);
518 1.1 christos
519 1.1 christos static inline void
520 1.1 christos d_growable_string_append_buffer (struct d_growable_string *,
521 1.1 christos const char *, size_t);
522 1.1 christos static void
523 1.1 christos d_growable_string_callback_adapter (const char *, size_t, void *);
524 1.1 christos
525 1.1 christos static void
526 1.3 christos d_print_init (struct d_print_info *, demangle_callbackref, void *,
527 1.7 christos struct demangle_component *);
528 1.1 christos
529 1.1 christos static inline void d_print_error (struct d_print_info *);
530 1.1 christos
531 1.1 christos static inline int d_print_saw_error (struct d_print_info *);
532 1.1 christos
533 1.1 christos static inline void d_print_flush (struct d_print_info *);
534 1.1 christos
535 1.1 christos static inline void d_append_char (struct d_print_info *, char);
536 1.1 christos
537 1.1 christos static inline void d_append_buffer (struct d_print_info *,
538 1.1 christos const char *, size_t);
539 1.1 christos
540 1.1 christos static inline void d_append_string (struct d_print_info *, const char *);
541 1.1 christos
542 1.1 christos static inline char d_last_char (struct d_print_info *);
543 1.1 christos
544 1.1 christos static void
545 1.6 christos d_print_comp (struct d_print_info *, int, struct demangle_component *);
546 1.1 christos
547 1.1 christos static void
548 1.1 christos d_print_java_identifier (struct d_print_info *, const char *, int);
549 1.1 christos
550 1.1 christos static void
551 1.1 christos d_print_mod_list (struct d_print_info *, int, struct d_print_mod *, int);
552 1.1 christos
553 1.1 christos static void
554 1.6 christos d_print_mod (struct d_print_info *, int, struct demangle_component *);
555 1.1 christos
556 1.1 christos static void
557 1.1 christos d_print_function_type (struct d_print_info *, int,
558 1.6 christos struct demangle_component *,
559 1.1 christos struct d_print_mod *);
560 1.1 christos
561 1.1 christos static void
562 1.1 christos d_print_array_type (struct d_print_info *, int,
563 1.6 christos struct demangle_component *,
564 1.1 christos struct d_print_mod *);
565 1.1 christos
566 1.1 christos static void
567 1.6 christos d_print_expr_op (struct d_print_info *, int, struct demangle_component *);
568 1.1 christos
569 1.5 christos static void d_print_cast (struct d_print_info *, int,
570 1.6 christos struct demangle_component *);
571 1.5 christos static void d_print_conversion (struct d_print_info *, int,
572 1.6 christos struct demangle_component *);
573 1.1 christos
574 1.1 christos static int d_demangle_callback (const char *, int,
575 1.1 christos demangle_callbackref, void *);
576 1.1 christos static char *d_demangle (const char *, int, size_t *);
577 1.1 christos
578 1.6 christos #define FNQUAL_COMPONENT_CASE \
579 1.6 christos case DEMANGLE_COMPONENT_RESTRICT_THIS: \
580 1.6 christos case DEMANGLE_COMPONENT_VOLATILE_THIS: \
581 1.6 christos case DEMANGLE_COMPONENT_CONST_THIS: \
582 1.6 christos case DEMANGLE_COMPONENT_REFERENCE_THIS: \
583 1.6 christos case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS: \
584 1.9 christos case DEMANGLE_COMPONENT_XOBJ_MEMBER_FUNCTION: \
585 1.6 christos case DEMANGLE_COMPONENT_TRANSACTION_SAFE: \
586 1.6 christos case DEMANGLE_COMPONENT_NOEXCEPT: \
587 1.6 christos case DEMANGLE_COMPONENT_THROW_SPEC
588 1.6 christos
589 1.6 christos /* True iff TYPE is a demangling component representing a
590 1.6 christos function-type-qualifier. */
591 1.6 christos
592 1.6 christos static int
593 1.6 christos is_fnqual_component_type (enum demangle_component_type type)
594 1.6 christos {
595 1.6 christos switch (type)
596 1.6 christos {
597 1.6 christos FNQUAL_COMPONENT_CASE:
598 1.6 christos return 1;
599 1.6 christos default:
600 1.6 christos break;
601 1.6 christos }
602 1.6 christos return 0;
603 1.6 christos }
604 1.6 christos
605 1.6 christos
606 1.1 christos #ifdef CP_DEMANGLE_DEBUG
607 1.1 christos
608 1.1 christos static void
609 1.1 christos d_dump (struct demangle_component *dc, int indent)
610 1.1 christos {
611 1.1 christos int i;
612 1.1 christos
613 1.1 christos if (dc == NULL)
614 1.1 christos {
615 1.1 christos if (indent == 0)
616 1.1 christos printf ("failed demangling\n");
617 1.1 christos return;
618 1.1 christos }
619 1.1 christos
620 1.1 christos for (i = 0; i < indent; ++i)
621 1.1 christos putchar (' ');
622 1.1 christos
623 1.1 christos switch (dc->type)
624 1.1 christos {
625 1.1 christos case DEMANGLE_COMPONENT_NAME:
626 1.1 christos printf ("name '%.*s'\n", dc->u.s_name.len, dc->u.s_name.s);
627 1.1 christos return;
628 1.3 christos case DEMANGLE_COMPONENT_TAGGED_NAME:
629 1.3 christos printf ("tagged name\n");
630 1.3 christos d_dump (dc->u.s_binary.left, indent + 2);
631 1.3 christos d_dump (dc->u.s_binary.right, indent + 2);
632 1.3 christos return;
633 1.1 christos case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
634 1.1 christos printf ("template parameter %ld\n", dc->u.s_number.number);
635 1.1 christos return;
636 1.7 christos case DEMANGLE_COMPONENT_TPARM_OBJ:
637 1.7 christos printf ("template parameter object\n");
638 1.7 christos break;
639 1.3 christos case DEMANGLE_COMPONENT_FUNCTION_PARAM:
640 1.3 christos printf ("function parameter %ld\n", dc->u.s_number.number);
641 1.3 christos return;
642 1.1 christos case DEMANGLE_COMPONENT_CTOR:
643 1.1 christos printf ("constructor %d\n", (int) dc->u.s_ctor.kind);
644 1.1 christos d_dump (dc->u.s_ctor.name, indent + 2);
645 1.1 christos return;
646 1.1 christos case DEMANGLE_COMPONENT_DTOR:
647 1.1 christos printf ("destructor %d\n", (int) dc->u.s_dtor.kind);
648 1.1 christos d_dump (dc->u.s_dtor.name, indent + 2);
649 1.1 christos return;
650 1.1 christos case DEMANGLE_COMPONENT_SUB_STD:
651 1.1 christos printf ("standard substitution %s\n", dc->u.s_string.string);
652 1.1 christos return;
653 1.1 christos case DEMANGLE_COMPONENT_BUILTIN_TYPE:
654 1.1 christos printf ("builtin type %s\n", dc->u.s_builtin.type->name);
655 1.1 christos return;
656 1.9 christos case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE:
657 1.9 christos {
658 1.9 christos char suffix[2] = { dc->u.s_extended_builtin.type->suffix, 0 };
659 1.9 christos printf ("builtin type %s%d%s\n", dc->u.s_extended_builtin.type->name,
660 1.9 christos dc->u.s_extended_builtin.type->arg, suffix);
661 1.9 christos }
662 1.9 christos return;
663 1.1 christos case DEMANGLE_COMPONENT_OPERATOR:
664 1.1 christos printf ("operator %s\n", dc->u.s_operator.op->name);
665 1.1 christos return;
666 1.1 christos case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
667 1.1 christos printf ("extended operator with %d args\n",
668 1.1 christos dc->u.s_extended_operator.args);
669 1.1 christos d_dump (dc->u.s_extended_operator.name, indent + 2);
670 1.1 christos return;
671 1.1 christos
672 1.1 christos case DEMANGLE_COMPONENT_QUAL_NAME:
673 1.1 christos printf ("qualified name\n");
674 1.1 christos break;
675 1.1 christos case DEMANGLE_COMPONENT_LOCAL_NAME:
676 1.1 christos printf ("local name\n");
677 1.1 christos break;
678 1.1 christos case DEMANGLE_COMPONENT_TYPED_NAME:
679 1.1 christos printf ("typed name\n");
680 1.1 christos break;
681 1.1 christos case DEMANGLE_COMPONENT_TEMPLATE:
682 1.1 christos printf ("template\n");
683 1.1 christos break;
684 1.1 christos case DEMANGLE_COMPONENT_VTABLE:
685 1.1 christos printf ("vtable\n");
686 1.1 christos break;
687 1.1 christos case DEMANGLE_COMPONENT_VTT:
688 1.1 christos printf ("VTT\n");
689 1.1 christos break;
690 1.1 christos case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
691 1.1 christos printf ("construction vtable\n");
692 1.1 christos break;
693 1.1 christos case DEMANGLE_COMPONENT_TYPEINFO:
694 1.1 christos printf ("typeinfo\n");
695 1.1 christos break;
696 1.1 christos case DEMANGLE_COMPONENT_TYPEINFO_NAME:
697 1.1 christos printf ("typeinfo name\n");
698 1.1 christos break;
699 1.1 christos case DEMANGLE_COMPONENT_TYPEINFO_FN:
700 1.1 christos printf ("typeinfo function\n");
701 1.1 christos break;
702 1.1 christos case DEMANGLE_COMPONENT_THUNK:
703 1.1 christos printf ("thunk\n");
704 1.1 christos break;
705 1.1 christos case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
706 1.1 christos printf ("virtual thunk\n");
707 1.1 christos break;
708 1.1 christos case DEMANGLE_COMPONENT_COVARIANT_THUNK:
709 1.1 christos printf ("covariant thunk\n");
710 1.1 christos break;
711 1.1 christos case DEMANGLE_COMPONENT_JAVA_CLASS:
712 1.1 christos printf ("java class\n");
713 1.1 christos break;
714 1.1 christos case DEMANGLE_COMPONENT_GUARD:
715 1.1 christos printf ("guard\n");
716 1.1 christos break;
717 1.1 christos case DEMANGLE_COMPONENT_REFTEMP:
718 1.1 christos printf ("reference temporary\n");
719 1.1 christos break;
720 1.1 christos case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
721 1.1 christos printf ("hidden alias\n");
722 1.1 christos break;
723 1.1 christos case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
724 1.1 christos printf ("transaction clone\n");
725 1.1 christos break;
726 1.1 christos case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
727 1.1 christos printf ("non-transaction clone\n");
728 1.1 christos break;
729 1.1 christos case DEMANGLE_COMPONENT_RESTRICT:
730 1.1 christos printf ("restrict\n");
731 1.1 christos break;
732 1.1 christos case DEMANGLE_COMPONENT_VOLATILE:
733 1.1 christos printf ("volatile\n");
734 1.1 christos break;
735 1.1 christos case DEMANGLE_COMPONENT_CONST:
736 1.1 christos printf ("const\n");
737 1.1 christos break;
738 1.1 christos case DEMANGLE_COMPONENT_RESTRICT_THIS:
739 1.1 christos printf ("restrict this\n");
740 1.1 christos break;
741 1.1 christos case DEMANGLE_COMPONENT_VOLATILE_THIS:
742 1.1 christos printf ("volatile this\n");
743 1.1 christos break;
744 1.1 christos case DEMANGLE_COMPONENT_CONST_THIS:
745 1.1 christos printf ("const this\n");
746 1.1 christos break;
747 1.3 christos case DEMANGLE_COMPONENT_REFERENCE_THIS:
748 1.3 christos printf ("reference this\n");
749 1.3 christos break;
750 1.3 christos case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
751 1.3 christos printf ("rvalue reference this\n");
752 1.3 christos break;
753 1.9 christos case DEMANGLE_COMPONENT_XOBJ_MEMBER_FUNCTION:
754 1.9 christos printf ("explicit object parameter\n");
755 1.9 christos break;
756 1.5 christos case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
757 1.5 christos printf ("transaction_safe this\n");
758 1.5 christos break;
759 1.1 christos case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
760 1.1 christos printf ("vendor type qualifier\n");
761 1.1 christos break;
762 1.1 christos case DEMANGLE_COMPONENT_POINTER:
763 1.1 christos printf ("pointer\n");
764 1.1 christos break;
765 1.1 christos case DEMANGLE_COMPONENT_REFERENCE:
766 1.1 christos printf ("reference\n");
767 1.1 christos break;
768 1.1 christos case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
769 1.1 christos printf ("rvalue reference\n");
770 1.1 christos break;
771 1.1 christos case DEMANGLE_COMPONENT_COMPLEX:
772 1.1 christos printf ("complex\n");
773 1.1 christos break;
774 1.1 christos case DEMANGLE_COMPONENT_IMAGINARY:
775 1.1 christos printf ("imaginary\n");
776 1.1 christos break;
777 1.1 christos case DEMANGLE_COMPONENT_VENDOR_TYPE:
778 1.1 christos printf ("vendor type\n");
779 1.1 christos break;
780 1.1 christos case DEMANGLE_COMPONENT_FUNCTION_TYPE:
781 1.1 christos printf ("function type\n");
782 1.1 christos break;
783 1.1 christos case DEMANGLE_COMPONENT_ARRAY_TYPE:
784 1.1 christos printf ("array type\n");
785 1.1 christos break;
786 1.1 christos case DEMANGLE_COMPONENT_PTRMEM_TYPE:
787 1.1 christos printf ("pointer to member type\n");
788 1.1 christos break;
789 1.1 christos case DEMANGLE_COMPONENT_ARGLIST:
790 1.1 christos printf ("argument list\n");
791 1.1 christos break;
792 1.1 christos case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
793 1.1 christos printf ("template argument list\n");
794 1.1 christos break;
795 1.1 christos case DEMANGLE_COMPONENT_INITIALIZER_LIST:
796 1.1 christos printf ("initializer list\n");
797 1.1 christos break;
798 1.1 christos case DEMANGLE_COMPONENT_CAST:
799 1.1 christos printf ("cast\n");
800 1.1 christos break;
801 1.5 christos case DEMANGLE_COMPONENT_CONVERSION:
802 1.5 christos printf ("conversion operator\n");
803 1.5 christos break;
804 1.1 christos case DEMANGLE_COMPONENT_NULLARY:
805 1.1 christos printf ("nullary operator\n");
806 1.1 christos break;
807 1.1 christos case DEMANGLE_COMPONENT_UNARY:
808 1.1 christos printf ("unary operator\n");
809 1.1 christos break;
810 1.1 christos case DEMANGLE_COMPONENT_BINARY:
811 1.1 christos printf ("binary operator\n");
812 1.1 christos break;
813 1.1 christos case DEMANGLE_COMPONENT_BINARY_ARGS:
814 1.1 christos printf ("binary operator arguments\n");
815 1.1 christos break;
816 1.1 christos case DEMANGLE_COMPONENT_TRINARY:
817 1.1 christos printf ("trinary operator\n");
818 1.1 christos break;
819 1.1 christos case DEMANGLE_COMPONENT_TRINARY_ARG1:
820 1.1 christos printf ("trinary operator arguments 1\n");
821 1.1 christos break;
822 1.1 christos case DEMANGLE_COMPONENT_TRINARY_ARG2:
823 1.1 christos printf ("trinary operator arguments 1\n");
824 1.1 christos break;
825 1.1 christos case DEMANGLE_COMPONENT_LITERAL:
826 1.1 christos printf ("literal\n");
827 1.1 christos break;
828 1.1 christos case DEMANGLE_COMPONENT_LITERAL_NEG:
829 1.1 christos printf ("negative literal\n");
830 1.1 christos break;
831 1.8 christos case DEMANGLE_COMPONENT_VENDOR_EXPR:
832 1.8 christos printf ("vendor expression\n");
833 1.8 christos break;
834 1.1 christos case DEMANGLE_COMPONENT_JAVA_RESOURCE:
835 1.1 christos printf ("java resource\n");
836 1.1 christos break;
837 1.1 christos case DEMANGLE_COMPONENT_COMPOUND_NAME:
838 1.1 christos printf ("compound name\n");
839 1.1 christos break;
840 1.1 christos case DEMANGLE_COMPONENT_CHARACTER:
841 1.1 christos printf ("character '%c'\n", dc->u.s_character.character);
842 1.1 christos return;
843 1.3 christos case DEMANGLE_COMPONENT_NUMBER:
844 1.3 christos printf ("number %ld\n", dc->u.s_number.number);
845 1.3 christos return;
846 1.1 christos case DEMANGLE_COMPONENT_DECLTYPE:
847 1.1 christos printf ("decltype\n");
848 1.1 christos break;
849 1.1 christos case DEMANGLE_COMPONENT_PACK_EXPANSION:
850 1.1 christos printf ("pack expansion\n");
851 1.1 christos break;
852 1.3 christos case DEMANGLE_COMPONENT_TLS_INIT:
853 1.3 christos printf ("tls init function\n");
854 1.3 christos break;
855 1.3 christos case DEMANGLE_COMPONENT_TLS_WRAPPER:
856 1.3 christos printf ("tls wrapper function\n");
857 1.3 christos break;
858 1.3 christos case DEMANGLE_COMPONENT_DEFAULT_ARG:
859 1.3 christos printf ("default argument %d\n", dc->u.s_unary_num.num);
860 1.3 christos d_dump (dc->u.s_unary_num.sub, indent+2);
861 1.3 christos return;
862 1.3 christos case DEMANGLE_COMPONENT_LAMBDA:
863 1.3 christos printf ("lambda %d\n", dc->u.s_unary_num.num);
864 1.3 christos d_dump (dc->u.s_unary_num.sub, indent+2);
865 1.3 christos return;
866 1.1 christos }
867 1.1 christos
868 1.1 christos d_dump (d_left (dc), indent + 2);
869 1.1 christos d_dump (d_right (dc), indent + 2);
870 1.1 christos }
871 1.1 christos
872 1.1 christos #endif /* CP_DEMANGLE_DEBUG */
873 1.1 christos
874 1.1 christos /* Fill in a DEMANGLE_COMPONENT_NAME. */
875 1.1 christos
876 1.1 christos CP_STATIC_IF_GLIBCPP_V3
877 1.1 christos int
878 1.1 christos cplus_demangle_fill_name (struct demangle_component *p, const char *s, int len)
879 1.1 christos {
880 1.7 christos if (p == NULL || s == NULL || len <= 0)
881 1.1 christos return 0;
882 1.6 christos p->d_printing = 0;
883 1.7 christos p->d_counting = 0;
884 1.1 christos p->type = DEMANGLE_COMPONENT_NAME;
885 1.1 christos p->u.s_name.s = s;
886 1.1 christos p->u.s_name.len = len;
887 1.1 christos return 1;
888 1.1 christos }
889 1.1 christos
890 1.1 christos /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
891 1.1 christos
892 1.1 christos CP_STATIC_IF_GLIBCPP_V3
893 1.1 christos int
894 1.1 christos cplus_demangle_fill_extended_operator (struct demangle_component *p, int args,
895 1.1 christos struct demangle_component *name)
896 1.1 christos {
897 1.1 christos if (p == NULL || args < 0 || name == NULL)
898 1.1 christos return 0;
899 1.6 christos p->d_printing = 0;
900 1.7 christos p->d_counting = 0;
901 1.1 christos p->type = DEMANGLE_COMPONENT_EXTENDED_OPERATOR;
902 1.1 christos p->u.s_extended_operator.args = args;
903 1.1 christos p->u.s_extended_operator.name = name;
904 1.1 christos return 1;
905 1.1 christos }
906 1.1 christos
907 1.1 christos /* Fill in a DEMANGLE_COMPONENT_CTOR. */
908 1.1 christos
909 1.1 christos CP_STATIC_IF_GLIBCPP_V3
910 1.1 christos int
911 1.1 christos cplus_demangle_fill_ctor (struct demangle_component *p,
912 1.1 christos enum gnu_v3_ctor_kinds kind,
913 1.1 christos struct demangle_component *name)
914 1.1 christos {
915 1.1 christos if (p == NULL
916 1.1 christos || name == NULL
917 1.1 christos || (int) kind < gnu_v3_complete_object_ctor
918 1.1 christos || (int) kind > gnu_v3_object_ctor_group)
919 1.1 christos return 0;
920 1.6 christos p->d_printing = 0;
921 1.7 christos p->d_counting = 0;
922 1.1 christos p->type = DEMANGLE_COMPONENT_CTOR;
923 1.1 christos p->u.s_ctor.kind = kind;
924 1.1 christos p->u.s_ctor.name = name;
925 1.1 christos return 1;
926 1.1 christos }
927 1.1 christos
928 1.1 christos /* Fill in a DEMANGLE_COMPONENT_DTOR. */
929 1.1 christos
930 1.1 christos CP_STATIC_IF_GLIBCPP_V3
931 1.1 christos int
932 1.1 christos cplus_demangle_fill_dtor (struct demangle_component *p,
933 1.1 christos enum gnu_v3_dtor_kinds kind,
934 1.1 christos struct demangle_component *name)
935 1.1 christos {
936 1.1 christos if (p == NULL
937 1.1 christos || name == NULL
938 1.1 christos || (int) kind < gnu_v3_deleting_dtor
939 1.1 christos || (int) kind > gnu_v3_object_dtor_group)
940 1.1 christos return 0;
941 1.6 christos p->d_printing = 0;
942 1.7 christos p->d_counting = 0;
943 1.1 christos p->type = DEMANGLE_COMPONENT_DTOR;
944 1.1 christos p->u.s_dtor.kind = kind;
945 1.1 christos p->u.s_dtor.name = name;
946 1.1 christos return 1;
947 1.1 christos }
948 1.1 christos
949 1.1 christos /* Add a new component. */
950 1.1 christos
951 1.1 christos static struct demangle_component *
952 1.1 christos d_make_empty (struct d_info *di)
953 1.1 christos {
954 1.1 christos struct demangle_component *p;
955 1.1 christos
956 1.1 christos if (di->next_comp >= di->num_comps)
957 1.1 christos return NULL;
958 1.1 christos p = &di->comps[di->next_comp];
959 1.6 christos p->d_printing = 0;
960 1.7 christos p->d_counting = 0;
961 1.1 christos ++di->next_comp;
962 1.1 christos return p;
963 1.1 christos }
964 1.1 christos
965 1.1 christos /* Add a new generic component. */
966 1.1 christos
967 1.1 christos static struct demangle_component *
968 1.1 christos d_make_comp (struct d_info *di, enum demangle_component_type type,
969 1.1 christos struct demangle_component *left,
970 1.1 christos struct demangle_component *right)
971 1.1 christos {
972 1.1 christos struct demangle_component *p;
973 1.1 christos
974 1.1 christos /* We check for errors here. A typical error would be a NULL return
975 1.1 christos from a subroutine. We catch those here, and return NULL
976 1.1 christos upward. */
977 1.1 christos switch (type)
978 1.1 christos {
979 1.1 christos /* These types require two parameters. */
980 1.1 christos case DEMANGLE_COMPONENT_QUAL_NAME:
981 1.1 christos case DEMANGLE_COMPONENT_LOCAL_NAME:
982 1.1 christos case DEMANGLE_COMPONENT_TYPED_NAME:
983 1.3 christos case DEMANGLE_COMPONENT_TAGGED_NAME:
984 1.1 christos case DEMANGLE_COMPONENT_TEMPLATE:
985 1.1 christos case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
986 1.1 christos case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
987 1.1 christos case DEMANGLE_COMPONENT_PTRMEM_TYPE:
988 1.1 christos case DEMANGLE_COMPONENT_UNARY:
989 1.1 christos case DEMANGLE_COMPONENT_BINARY:
990 1.1 christos case DEMANGLE_COMPONENT_BINARY_ARGS:
991 1.1 christos case DEMANGLE_COMPONENT_TRINARY:
992 1.1 christos case DEMANGLE_COMPONENT_TRINARY_ARG1:
993 1.1 christos case DEMANGLE_COMPONENT_LITERAL:
994 1.1 christos case DEMANGLE_COMPONENT_LITERAL_NEG:
995 1.8 christos case DEMANGLE_COMPONENT_VENDOR_EXPR:
996 1.1 christos case DEMANGLE_COMPONENT_COMPOUND_NAME:
997 1.1 christos case DEMANGLE_COMPONENT_VECTOR_TYPE:
998 1.1 christos case DEMANGLE_COMPONENT_CLONE:
999 1.8 christos case DEMANGLE_COMPONENT_MODULE_ENTITY:
1000 1.9 christos case DEMANGLE_COMPONENT_CONSTRAINTS:
1001 1.1 christos if (left == NULL || right == NULL)
1002 1.1 christos return NULL;
1003 1.1 christos break;
1004 1.1 christos
1005 1.1 christos /* These types only require one parameter. */
1006 1.1 christos case DEMANGLE_COMPONENT_VTABLE:
1007 1.1 christos case DEMANGLE_COMPONENT_VTT:
1008 1.1 christos case DEMANGLE_COMPONENT_TYPEINFO:
1009 1.1 christos case DEMANGLE_COMPONENT_TYPEINFO_NAME:
1010 1.1 christos case DEMANGLE_COMPONENT_TYPEINFO_FN:
1011 1.1 christos case DEMANGLE_COMPONENT_THUNK:
1012 1.1 christos case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
1013 1.1 christos case DEMANGLE_COMPONENT_COVARIANT_THUNK:
1014 1.1 christos case DEMANGLE_COMPONENT_JAVA_CLASS:
1015 1.1 christos case DEMANGLE_COMPONENT_GUARD:
1016 1.3 christos case DEMANGLE_COMPONENT_TLS_INIT:
1017 1.3 christos case DEMANGLE_COMPONENT_TLS_WRAPPER:
1018 1.1 christos case DEMANGLE_COMPONENT_REFTEMP:
1019 1.1 christos case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
1020 1.1 christos case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
1021 1.1 christos case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
1022 1.1 christos case DEMANGLE_COMPONENT_POINTER:
1023 1.1 christos case DEMANGLE_COMPONENT_REFERENCE:
1024 1.1 christos case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
1025 1.1 christos case DEMANGLE_COMPONENT_COMPLEX:
1026 1.1 christos case DEMANGLE_COMPONENT_IMAGINARY:
1027 1.1 christos case DEMANGLE_COMPONENT_VENDOR_TYPE:
1028 1.1 christos case DEMANGLE_COMPONENT_CAST:
1029 1.5 christos case DEMANGLE_COMPONENT_CONVERSION:
1030 1.1 christos case DEMANGLE_COMPONENT_JAVA_RESOURCE:
1031 1.1 christos case DEMANGLE_COMPONENT_DECLTYPE:
1032 1.1 christos case DEMANGLE_COMPONENT_PACK_EXPANSION:
1033 1.1 christos case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
1034 1.1 christos case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
1035 1.1 christos case DEMANGLE_COMPONENT_NULLARY:
1036 1.1 christos case DEMANGLE_COMPONENT_TRINARY_ARG2:
1037 1.7 christos case DEMANGLE_COMPONENT_TPARM_OBJ:
1038 1.8 christos case DEMANGLE_COMPONENT_STRUCTURED_BINDING:
1039 1.8 christos case DEMANGLE_COMPONENT_MODULE_INIT:
1040 1.9 christos case DEMANGLE_COMPONENT_TEMPLATE_HEAD:
1041 1.9 christos case DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM:
1042 1.9 christos case DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM:
1043 1.9 christos case DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM:
1044 1.9 christos case DEMANGLE_COMPONENT_FRIEND:
1045 1.1 christos if (left == NULL)
1046 1.1 christos return NULL;
1047 1.1 christos break;
1048 1.1 christos
1049 1.1 christos /* This needs a right parameter, but the left parameter can be
1050 1.1 christos empty. */
1051 1.1 christos case DEMANGLE_COMPONENT_ARRAY_TYPE:
1052 1.1 christos case DEMANGLE_COMPONENT_INITIALIZER_LIST:
1053 1.8 christos case DEMANGLE_COMPONENT_MODULE_NAME:
1054 1.8 christos case DEMANGLE_COMPONENT_MODULE_PARTITION:
1055 1.1 christos if (right == NULL)
1056 1.1 christos return NULL;
1057 1.1 christos break;
1058 1.1 christos
1059 1.1 christos /* These are allowed to have no parameters--in some cases they
1060 1.1 christos will be filled in later. */
1061 1.1 christos case DEMANGLE_COMPONENT_FUNCTION_TYPE:
1062 1.1 christos case DEMANGLE_COMPONENT_RESTRICT:
1063 1.1 christos case DEMANGLE_COMPONENT_VOLATILE:
1064 1.1 christos case DEMANGLE_COMPONENT_CONST:
1065 1.1 christos case DEMANGLE_COMPONENT_ARGLIST:
1066 1.1 christos case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
1067 1.9 christos case DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM:
1068 1.6 christos FNQUAL_COMPONENT_CASE:
1069 1.1 christos break;
1070 1.1 christos
1071 1.1 christos /* Other types should not be seen here. */
1072 1.1 christos default:
1073 1.1 christos return NULL;
1074 1.1 christos }
1075 1.1 christos
1076 1.1 christos p = d_make_empty (di);
1077 1.1 christos if (p != NULL)
1078 1.1 christos {
1079 1.1 christos p->type = type;
1080 1.1 christos p->u.s_binary.left = left;
1081 1.1 christos p->u.s_binary.right = right;
1082 1.1 christos }
1083 1.1 christos return p;
1084 1.1 christos }
1085 1.1 christos
1086 1.1 christos /* Add a new demangle mangled name component. */
1087 1.1 christos
1088 1.1 christos static struct demangle_component *
1089 1.1 christos d_make_demangle_mangled_name (struct d_info *di, const char *s)
1090 1.1 christos {
1091 1.1 christos if (d_peek_char (di) != '_' || d_peek_next_char (di) != 'Z')
1092 1.1 christos return d_make_name (di, s, strlen (s));
1093 1.1 christos d_advance (di, 2);
1094 1.1 christos return d_encoding (di, 0);
1095 1.1 christos }
1096 1.1 christos
1097 1.1 christos /* Add a new name component. */
1098 1.1 christos
1099 1.1 christos static struct demangle_component *
1100 1.1 christos d_make_name (struct d_info *di, const char *s, int len)
1101 1.1 christos {
1102 1.1 christos struct demangle_component *p;
1103 1.1 christos
1104 1.1 christos p = d_make_empty (di);
1105 1.1 christos if (! cplus_demangle_fill_name (p, s, len))
1106 1.1 christos return NULL;
1107 1.1 christos return p;
1108 1.1 christos }
1109 1.1 christos
1110 1.1 christos /* Add a new builtin type component. */
1111 1.1 christos
1112 1.1 christos static struct demangle_component *
1113 1.1 christos d_make_builtin_type (struct d_info *di,
1114 1.1 christos const struct demangle_builtin_type_info *type)
1115 1.1 christos {
1116 1.1 christos struct demangle_component *p;
1117 1.1 christos
1118 1.1 christos if (type == NULL)
1119 1.1 christos return NULL;
1120 1.1 christos p = d_make_empty (di);
1121 1.1 christos if (p != NULL)
1122 1.1 christos {
1123 1.1 christos p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE;
1124 1.1 christos p->u.s_builtin.type = type;
1125 1.1 christos }
1126 1.1 christos return p;
1127 1.1 christos }
1128 1.1 christos
1129 1.9 christos /* Add a new extended builtin type component. */
1130 1.9 christos
1131 1.9 christos static struct demangle_component *
1132 1.9 christos d_make_extended_builtin_type (struct d_info *di,
1133 1.9 christos const struct demangle_builtin_type_info *type,
1134 1.9 christos short arg, char suffix)
1135 1.9 christos {
1136 1.9 christos struct demangle_component *p;
1137 1.9 christos
1138 1.9 christos if (type == NULL)
1139 1.9 christos return NULL;
1140 1.9 christos p = d_make_empty (di);
1141 1.9 christos if (p != NULL)
1142 1.9 christos {
1143 1.9 christos p->type = DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE;
1144 1.9 christos p->u.s_extended_builtin.type = type;
1145 1.9 christos p->u.s_extended_builtin.arg = arg;
1146 1.9 christos p->u.s_extended_builtin.suffix = suffix;
1147 1.9 christos }
1148 1.9 christos return p;
1149 1.9 christos }
1150 1.9 christos
1151 1.1 christos /* Add a new operator component. */
1152 1.1 christos
1153 1.1 christos static struct demangle_component *
1154 1.1 christos d_make_operator (struct d_info *di, const struct demangle_operator_info *op)
1155 1.1 christos {
1156 1.1 christos struct demangle_component *p;
1157 1.1 christos
1158 1.1 christos p = d_make_empty (di);
1159 1.1 christos if (p != NULL)
1160 1.1 christos {
1161 1.1 christos p->type = DEMANGLE_COMPONENT_OPERATOR;
1162 1.1 christos p->u.s_operator.op = op;
1163 1.1 christos }
1164 1.1 christos return p;
1165 1.1 christos }
1166 1.1 christos
1167 1.1 christos /* Add a new extended operator component. */
1168 1.1 christos
1169 1.1 christos static struct demangle_component *
1170 1.1 christos d_make_extended_operator (struct d_info *di, int args,
1171 1.1 christos struct demangle_component *name)
1172 1.1 christos {
1173 1.1 christos struct demangle_component *p;
1174 1.1 christos
1175 1.1 christos p = d_make_empty (di);
1176 1.1 christos if (! cplus_demangle_fill_extended_operator (p, args, name))
1177 1.1 christos return NULL;
1178 1.1 christos return p;
1179 1.1 christos }
1180 1.1 christos
1181 1.1 christos static struct demangle_component *
1182 1.1 christos d_make_default_arg (struct d_info *di, int num,
1183 1.1 christos struct demangle_component *sub)
1184 1.1 christos {
1185 1.1 christos struct demangle_component *p = d_make_empty (di);
1186 1.1 christos if (p)
1187 1.1 christos {
1188 1.1 christos p->type = DEMANGLE_COMPONENT_DEFAULT_ARG;
1189 1.1 christos p->u.s_unary_num.num = num;
1190 1.1 christos p->u.s_unary_num.sub = sub;
1191 1.1 christos }
1192 1.1 christos return p;
1193 1.1 christos }
1194 1.1 christos
1195 1.1 christos /* Add a new constructor component. */
1196 1.1 christos
1197 1.1 christos static struct demangle_component *
1198 1.1 christos d_make_ctor (struct d_info *di, enum gnu_v3_ctor_kinds kind,
1199 1.1 christos struct demangle_component *name)
1200 1.1 christos {
1201 1.1 christos struct demangle_component *p;
1202 1.1 christos
1203 1.1 christos p = d_make_empty (di);
1204 1.1 christos if (! cplus_demangle_fill_ctor (p, kind, name))
1205 1.1 christos return NULL;
1206 1.1 christos return p;
1207 1.1 christos }
1208 1.1 christos
1209 1.1 christos /* Add a new destructor component. */
1210 1.1 christos
1211 1.1 christos static struct demangle_component *
1212 1.1 christos d_make_dtor (struct d_info *di, enum gnu_v3_dtor_kinds kind,
1213 1.1 christos struct demangle_component *name)
1214 1.1 christos {
1215 1.1 christos struct demangle_component *p;
1216 1.1 christos
1217 1.1 christos p = d_make_empty (di);
1218 1.1 christos if (! cplus_demangle_fill_dtor (p, kind, name))
1219 1.1 christos return NULL;
1220 1.1 christos return p;
1221 1.1 christos }
1222 1.1 christos
1223 1.1 christos /* Add a new template parameter. */
1224 1.1 christos
1225 1.1 christos static struct demangle_component *
1226 1.6 christos d_make_template_param (struct d_info *di, int i)
1227 1.1 christos {
1228 1.1 christos struct demangle_component *p;
1229 1.1 christos
1230 1.1 christos p = d_make_empty (di);
1231 1.1 christos if (p != NULL)
1232 1.1 christos {
1233 1.1 christos p->type = DEMANGLE_COMPONENT_TEMPLATE_PARAM;
1234 1.1 christos p->u.s_number.number = i;
1235 1.1 christos }
1236 1.1 christos return p;
1237 1.1 christos }
1238 1.1 christos
1239 1.1 christos /* Add a new function parameter. */
1240 1.1 christos
1241 1.1 christos static struct demangle_component *
1242 1.6 christos d_make_function_param (struct d_info *di, int i)
1243 1.1 christos {
1244 1.1 christos struct demangle_component *p;
1245 1.1 christos
1246 1.1 christos p = d_make_empty (di);
1247 1.1 christos if (p != NULL)
1248 1.1 christos {
1249 1.1 christos p->type = DEMANGLE_COMPONENT_FUNCTION_PARAM;
1250 1.1 christos p->u.s_number.number = i;
1251 1.1 christos }
1252 1.1 christos return p;
1253 1.1 christos }
1254 1.1 christos
1255 1.1 christos /* Add a new standard substitution component. */
1256 1.1 christos
1257 1.1 christos static struct demangle_component *
1258 1.1 christos d_make_sub (struct d_info *di, const char *name, int len)
1259 1.1 christos {
1260 1.1 christos struct demangle_component *p;
1261 1.1 christos
1262 1.1 christos p = d_make_empty (di);
1263 1.1 christos if (p != NULL)
1264 1.1 christos {
1265 1.1 christos p->type = DEMANGLE_COMPONENT_SUB_STD;
1266 1.1 christos p->u.s_string.string = name;
1267 1.1 christos p->u.s_string.len = len;
1268 1.1 christos }
1269 1.1 christos return p;
1270 1.1 christos }
1271 1.1 christos
1272 1.1 christos /* <mangled-name> ::= _Z <encoding> [<clone-suffix>]*
1273 1.1 christos
1274 1.1 christos TOP_LEVEL is non-zero when called at the top level. */
1275 1.1 christos
1276 1.1 christos CP_STATIC_IF_GLIBCPP_V3
1277 1.1 christos struct demangle_component *
1278 1.1 christos cplus_demangle_mangled_name (struct d_info *di, int top_level)
1279 1.1 christos {
1280 1.1 christos struct demangle_component *p;
1281 1.1 christos
1282 1.1 christos if (! d_check_char (di, '_')
1283 1.1 christos /* Allow missing _ if not at toplevel to work around a
1284 1.1 christos bug in G++ abi-version=2 mangling; see the comment in
1285 1.1 christos write_template_arg. */
1286 1.1 christos && top_level)
1287 1.1 christos return NULL;
1288 1.1 christos if (! d_check_char (di, 'Z'))
1289 1.1 christos return NULL;
1290 1.1 christos p = d_encoding (di, top_level);
1291 1.1 christos
1292 1.1 christos /* If at top level and parsing parameters, check for a clone
1293 1.1 christos suffix. */
1294 1.1 christos if (top_level && (di->options & DMGL_PARAMS) != 0)
1295 1.1 christos while (d_peek_char (di) == '.'
1296 1.1 christos && (IS_LOWER (d_peek_next_char (di))
1297 1.1 christos || d_peek_next_char (di) == '_'
1298 1.1 christos || IS_DIGIT (d_peek_next_char (di))))
1299 1.1 christos p = d_clone_suffix (di, p);
1300 1.1 christos
1301 1.1 christos return p;
1302 1.1 christos }
1303 1.1 christos
1304 1.1 christos /* Return whether a function should have a return type. The argument
1305 1.1 christos is the function name, which may be qualified in various ways. The
1306 1.1 christos rules are that template functions have return types with some
1307 1.1 christos exceptions, function types which are not part of a function name
1308 1.1 christos mangling have return types with some exceptions, and non-template
1309 1.1 christos function names do not have return types. The exceptions are that
1310 1.1 christos constructors, destructors, and conversion operators do not have
1311 1.1 christos return types. */
1312 1.1 christos
1313 1.1 christos static int
1314 1.1 christos has_return_type (struct demangle_component *dc)
1315 1.1 christos {
1316 1.1 christos if (dc == NULL)
1317 1.1 christos return 0;
1318 1.1 christos switch (dc->type)
1319 1.1 christos {
1320 1.1 christos default:
1321 1.1 christos return 0;
1322 1.6 christos case DEMANGLE_COMPONENT_LOCAL_NAME:
1323 1.6 christos return has_return_type (d_right (dc));
1324 1.1 christos case DEMANGLE_COMPONENT_TEMPLATE:
1325 1.1 christos return ! is_ctor_dtor_or_conversion (d_left (dc));
1326 1.6 christos FNQUAL_COMPONENT_CASE:
1327 1.1 christos return has_return_type (d_left (dc));
1328 1.1 christos }
1329 1.1 christos }
1330 1.1 christos
1331 1.1 christos /* Return whether a name is a constructor, a destructor, or a
1332 1.1 christos conversion operator. */
1333 1.1 christos
1334 1.1 christos static int
1335 1.1 christos is_ctor_dtor_or_conversion (struct demangle_component *dc)
1336 1.1 christos {
1337 1.1 christos if (dc == NULL)
1338 1.1 christos return 0;
1339 1.1 christos switch (dc->type)
1340 1.1 christos {
1341 1.1 christos default:
1342 1.1 christos return 0;
1343 1.1 christos case DEMANGLE_COMPONENT_QUAL_NAME:
1344 1.1 christos case DEMANGLE_COMPONENT_LOCAL_NAME:
1345 1.1 christos return is_ctor_dtor_or_conversion (d_right (dc));
1346 1.1 christos case DEMANGLE_COMPONENT_CTOR:
1347 1.1 christos case DEMANGLE_COMPONENT_DTOR:
1348 1.5 christos case DEMANGLE_COMPONENT_CONVERSION:
1349 1.1 christos return 1;
1350 1.1 christos }
1351 1.1 christos }
1352 1.1 christos
1353 1.9 christos /* [ Q <constraint-expression> ] */
1354 1.9 christos
1355 1.9 christos static struct demangle_component *
1356 1.9 christos d_maybe_constraints (struct d_info *di, struct demangle_component *dc)
1357 1.9 christos {
1358 1.9 christos if (d_peek_char (di) == 'Q')
1359 1.9 christos {
1360 1.9 christos d_advance (di, 1);
1361 1.9 christos struct demangle_component *expr = d_expression (di);
1362 1.9 christos if (expr == NULL)
1363 1.9 christos return NULL;
1364 1.9 christos dc = d_make_comp (di, DEMANGLE_COMPONENT_CONSTRAINTS, dc, expr);
1365 1.9 christos }
1366 1.9 christos return dc;
1367 1.9 christos }
1368 1.9 christos
1369 1.1 christos /* <encoding> ::= <(function) name> <bare-function-type>
1370 1.1 christos ::= <(data) name>
1371 1.1 christos ::= <special-name>
1372 1.1 christos
1373 1.1 christos TOP_LEVEL is non-zero when called at the top level, in which case
1374 1.1 christos if DMGL_PARAMS is not set we do not demangle the function
1375 1.1 christos parameters. We only set this at the top level, because otherwise
1376 1.1 christos we would not correctly demangle names in local scopes. */
1377 1.1 christos
1378 1.1 christos static struct demangle_component *
1379 1.1 christos d_encoding (struct d_info *di, int top_level)
1380 1.1 christos {
1381 1.1 christos char peek = d_peek_char (di);
1382 1.6 christos struct demangle_component *dc;
1383 1.1 christos
1384 1.1 christos if (peek == 'G' || peek == 'T')
1385 1.6 christos dc = d_special_name (di);
1386 1.1 christos else
1387 1.1 christos {
1388 1.8 christos dc = d_name (di, 0);
1389 1.1 christos
1390 1.6 christos if (!dc)
1391 1.6 christos /* Failed already. */;
1392 1.6 christos else if (top_level && (di->options & DMGL_PARAMS) == 0)
1393 1.1 christos {
1394 1.1 christos /* Strip off any initial CV-qualifiers, as they really apply
1395 1.1 christos to the `this' parameter, and they were not output by the
1396 1.1 christos v2 demangler without DMGL_PARAMS. */
1397 1.6 christos while (is_fnqual_component_type (dc->type))
1398 1.1 christos dc = d_left (dc);
1399 1.1 christos
1400 1.1 christos /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1401 1.6 christos there may be function-qualifiers on its right argument which
1402 1.1 christos really apply here; this happens when parsing a class
1403 1.1 christos which is local to a function. */
1404 1.1 christos if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME)
1405 1.7 christos {
1406 1.7 christos while (d_right (dc) != NULL
1407 1.7 christos && is_fnqual_component_type (d_right (dc)->type))
1408 1.7 christos d_right (dc) = d_left (d_right (dc));
1409 1.7 christos
1410 1.7 christos if (d_right (dc) == NULL)
1411 1.7 christos dc = NULL;
1412 1.7 christos }
1413 1.6 christos }
1414 1.6 christos else
1415 1.6 christos {
1416 1.6 christos peek = d_peek_char (di);
1417 1.6 christos if (peek != '\0' && peek != 'E')
1418 1.1 christos {
1419 1.6 christos struct demangle_component *ftype;
1420 1.6 christos
1421 1.6 christos ftype = d_bare_function_type (di, has_return_type (dc));
1422 1.9 christos if (!ftype)
1423 1.9 christos return NULL;
1424 1.9 christos
1425 1.9 christos /* If this is a non-top-level local-name, clear the
1426 1.9 christos return type, so it doesn't confuse the user by
1427 1.9 christos being confused with the return type of whaever
1428 1.9 christos this is nested within. */
1429 1.9 christos if (!top_level && dc->type == DEMANGLE_COMPONENT_LOCAL_NAME
1430 1.9 christos && ftype->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
1431 1.9 christos d_left (ftype) = NULL;
1432 1.9 christos
1433 1.9 christos ftype = d_maybe_constraints (di, ftype);
1434 1.1 christos
1435 1.9 christos dc = d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME,
1436 1.9 christos dc, ftype);
1437 1.1 christos }
1438 1.1 christos }
1439 1.6 christos }
1440 1.1 christos
1441 1.6 christos return dc;
1442 1.1 christos }
1443 1.1 christos
1444 1.3 christos /* <tagged-name> ::= <name> B <source-name> */
1445 1.3 christos
1446 1.3 christos static struct demangle_component *
1447 1.3 christos d_abi_tags (struct d_info *di, struct demangle_component *dc)
1448 1.3 christos {
1449 1.3 christos struct demangle_component *hold_last_name;
1450 1.3 christos char peek;
1451 1.3 christos
1452 1.3 christos /* Preserve the last name, so the ABI tag doesn't clobber it. */
1453 1.3 christos hold_last_name = di->last_name;
1454 1.3 christos
1455 1.3 christos while (peek = d_peek_char (di),
1456 1.3 christos peek == 'B')
1457 1.3 christos {
1458 1.3 christos struct demangle_component *tag;
1459 1.3 christos d_advance (di, 1);
1460 1.3 christos tag = d_source_name (di);
1461 1.3 christos dc = d_make_comp (di, DEMANGLE_COMPONENT_TAGGED_NAME, dc, tag);
1462 1.3 christos }
1463 1.3 christos
1464 1.3 christos di->last_name = hold_last_name;
1465 1.3 christos
1466 1.3 christos return dc;
1467 1.3 christos }
1468 1.3 christos
1469 1.1 christos /* <name> ::= <nested-name>
1470 1.1 christos ::= <unscoped-name>
1471 1.1 christos ::= <unscoped-template-name> <template-args>
1472 1.1 christos ::= <local-name>
1473 1.1 christos
1474 1.1 christos <unscoped-name> ::= <unqualified-name>
1475 1.1 christos ::= St <unqualified-name>
1476 1.1 christos
1477 1.1 christos <unscoped-template-name> ::= <unscoped-name>
1478 1.1 christos ::= <substitution>
1479 1.1 christos */
1480 1.1 christos
1481 1.1 christos static struct demangle_component *
1482 1.8 christos d_name (struct d_info *di, int substable)
1483 1.1 christos {
1484 1.1 christos char peek = d_peek_char (di);
1485 1.8 christos struct demangle_component *dc = NULL;
1486 1.8 christos struct demangle_component *module = NULL;
1487 1.8 christos int subst = 0;
1488 1.1 christos
1489 1.1 christos switch (peek)
1490 1.1 christos {
1491 1.1 christos case 'N':
1492 1.8 christos dc = d_nested_name (di);
1493 1.8 christos break;
1494 1.1 christos
1495 1.1 christos case 'Z':
1496 1.8 christos dc = d_local_name (di);
1497 1.8 christos break;
1498 1.1 christos
1499 1.1 christos case 'U':
1500 1.8 christos dc = d_unqualified_name (di, NULL, NULL);
1501 1.8 christos break;
1502 1.1 christos
1503 1.1 christos case 'S':
1504 1.1 christos {
1505 1.8 christos if (d_peek_next_char (di) == 't')
1506 1.1 christos {
1507 1.1 christos d_advance (di, 2);
1508 1.8 christos dc = d_make_name (di, "std", 3);
1509 1.1 christos di->expansion += 3;
1510 1.1 christos }
1511 1.1 christos
1512 1.8 christos if (d_peek_char (di) == 'S')
1513 1.1 christos {
1514 1.8 christos module = d_substitution (di, 0);
1515 1.8 christos if (!module)
1516 1.8 christos return NULL;
1517 1.8 christos if (!(module->type == DEMANGLE_COMPONENT_MODULE_NAME
1518 1.8 christos || module->type == DEMANGLE_COMPONENT_MODULE_PARTITION))
1519 1.1 christos {
1520 1.8 christos if (dc)
1521 1.1 christos return NULL;
1522 1.8 christos subst = 1;
1523 1.8 christos dc = module;
1524 1.8 christos module = NULL;
1525 1.1 christos }
1526 1.1 christos }
1527 1.1 christos }
1528 1.8 christos /* FALLTHROUGH */
1529 1.1 christos
1530 1.3 christos case 'L':
1531 1.1 christos default:
1532 1.8 christos if (!subst)
1533 1.8 christos dc = d_unqualified_name (di, dc, module);
1534 1.1 christos if (d_peek_char (di) == 'I')
1535 1.1 christos {
1536 1.1 christos /* This is <template-args>, which means that we just saw
1537 1.1 christos <unscoped-template-name>, which is a substitution
1538 1.1 christos candidate. */
1539 1.8 christos if (!subst && !d_add_substitution (di, dc))
1540 1.1 christos return NULL;
1541 1.1 christos dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1542 1.1 christos d_template_args (di));
1543 1.8 christos subst = 0;
1544 1.1 christos }
1545 1.8 christos break;
1546 1.1 christos }
1547 1.8 christos if (substable && !subst && !d_add_substitution (di, dc))
1548 1.8 christos return NULL;
1549 1.8 christos return dc;
1550 1.1 christos }
1551 1.1 christos
1552 1.3 christos /* <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
1553 1.3 christos ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
1554 1.9 christos ::= N H <prefix> <unqualified-name> E
1555 1.9 christos ::= N H <template-prefix> <template-args> E
1556 1.1 christos */
1557 1.1 christos
1558 1.1 christos static struct demangle_component *
1559 1.1 christos d_nested_name (struct d_info *di)
1560 1.1 christos {
1561 1.1 christos struct demangle_component *ret;
1562 1.1 christos struct demangle_component **pret;
1563 1.3 christos struct demangle_component *rqual;
1564 1.1 christos
1565 1.1 christos if (! d_check_char (di, 'N'))
1566 1.1 christos return NULL;
1567 1.1 christos
1568 1.9 christos if (d_peek_char (di) == 'H')
1569 1.9 christos {
1570 1.9 christos d_advance (di, 1);
1571 1.9 christos di->expansion += sizeof "this";
1572 1.9 christos pret = &ret;
1573 1.9 christos rqual = d_make_comp (di, DEMANGLE_COMPONENT_XOBJ_MEMBER_FUNCTION,
1574 1.9 christos NULL, NULL);
1575 1.9 christos }
1576 1.9 christos else
1577 1.9 christos {
1578 1.9 christos pret = d_cv_qualifiers (di, &ret, 1);
1579 1.9 christos if (pret == NULL)
1580 1.9 christos return NULL;
1581 1.1 christos
1582 1.9 christos /* Parse the ref-qualifier now and then attach it
1583 1.9 christos once we have something to attach it to. */
1584 1.9 christos rqual = d_ref_qualifier (di, NULL);
1585 1.9 christos }
1586 1.3 christos
1587 1.8 christos *pret = d_prefix (di, 1);
1588 1.1 christos if (*pret == NULL)
1589 1.1 christos return NULL;
1590 1.1 christos
1591 1.3 christos if (rqual)
1592 1.3 christos {
1593 1.3 christos d_left (rqual) = ret;
1594 1.3 christos ret = rqual;
1595 1.3 christos }
1596 1.3 christos
1597 1.1 christos if (! d_check_char (di, 'E'))
1598 1.1 christos return NULL;
1599 1.1 christos
1600 1.1 christos return ret;
1601 1.1 christos }
1602 1.1 christos
1603 1.1 christos /* <prefix> ::= <prefix> <unqualified-name>
1604 1.1 christos ::= <template-prefix> <template-args>
1605 1.1 christos ::= <template-param>
1606 1.1 christos ::= <decltype>
1607 1.1 christos ::=
1608 1.1 christos ::= <substitution>
1609 1.1 christos
1610 1.1 christos <template-prefix> ::= <prefix> <(template) unqualified-name>
1611 1.1 christos ::= <template-param>
1612 1.1 christos ::= <substitution>
1613 1.8 christos
1614 1.8 christos SUBST is true if we should add substitutions (as normal), false
1615 1.8 christos if not (in an unresolved-name). */
1616 1.1 christos
1617 1.1 christos static struct demangle_component *
1618 1.8 christos d_prefix (struct d_info *di, int substable)
1619 1.1 christos {
1620 1.1 christos struct demangle_component *ret = NULL;
1621 1.1 christos
1622 1.8 christos for (;;)
1623 1.1 christos {
1624 1.8 christos char peek = d_peek_char (di);
1625 1.1 christos
1626 1.1 christos /* The older code accepts a <local-name> here, but I don't see
1627 1.1 christos that in the grammar. The older code does not accept a
1628 1.1 christos <template-param> here. */
1629 1.1 christos
1630 1.8 christos if (peek == 'D'
1631 1.8 christos && (d_peek_next_char (di) == 'T'
1632 1.8 christos || d_peek_next_char (di) == 't'))
1633 1.1 christos {
1634 1.8 christos /* Decltype. */
1635 1.8 christos if (ret)
1636 1.8 christos return NULL;
1637 1.8 christos ret = cplus_demangle_type (di);
1638 1.1 christos }
1639 1.1 christos else if (peek == 'I')
1640 1.1 christos {
1641 1.1 christos if (ret == NULL)
1642 1.1 christos return NULL;
1643 1.8 christos struct demangle_component *dc = d_template_args (di);
1644 1.8 christos if (!dc)
1645 1.8 christos return NULL;
1646 1.8 christos ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret, dc);
1647 1.1 christos }
1648 1.1 christos else if (peek == 'T')
1649 1.8 christos {
1650 1.8 christos if (ret)
1651 1.8 christos return NULL;
1652 1.8 christos ret = d_template_param (di);
1653 1.8 christos }
1654 1.1 christos else if (peek == 'M')
1655 1.1 christos {
1656 1.9 christos /* Initializer scope for a lambda. We already added it as a
1657 1.9 christos substitution candidate, don't do that again. */
1658 1.1 christos d_advance (di, 1);
1659 1.9 christos continue;
1660 1.1 christos }
1661 1.1 christos else
1662 1.8 christos {
1663 1.8 christos struct demangle_component *module = NULL;
1664 1.8 christos if (peek == 'S')
1665 1.8 christos {
1666 1.8 christos module = d_substitution (di, 1);
1667 1.8 christos if (!module)
1668 1.8 christos return NULL;
1669 1.8 christos if (!(module->type == DEMANGLE_COMPONENT_MODULE_NAME
1670 1.8 christos || module->type == DEMANGLE_COMPONENT_MODULE_PARTITION))
1671 1.8 christos {
1672 1.8 christos if (ret)
1673 1.8 christos return NULL;
1674 1.8 christos ret = module;
1675 1.8 christos continue;
1676 1.8 christos }
1677 1.8 christos }
1678 1.8 christos ret = d_unqualified_name (di, ret, module);
1679 1.8 christos }
1680 1.8 christos
1681 1.8 christos if (!ret)
1682 1.8 christos break;
1683 1.8 christos
1684 1.8 christos if (d_peek_char (di) == 'E')
1685 1.8 christos break;
1686 1.8 christos
1687 1.8 christos if (substable && !d_add_substitution (di, ret))
1688 1.1 christos return NULL;
1689 1.8 christos }
1690 1.1 christos
1691 1.8 christos return ret;
1692 1.8 christos }
1693 1.1 christos
1694 1.8 christos static int
1695 1.8 christos d_maybe_module_name (struct d_info *di, struct demangle_component **name)
1696 1.8 christos {
1697 1.8 christos while (d_peek_char (di) == 'W')
1698 1.8 christos {
1699 1.8 christos d_advance (di, 1);
1700 1.8 christos enum demangle_component_type code = DEMANGLE_COMPONENT_MODULE_NAME;
1701 1.8 christos if (d_peek_char (di) == 'P')
1702 1.1 christos {
1703 1.8 christos code = DEMANGLE_COMPONENT_MODULE_PARTITION;
1704 1.8 christos d_advance (di, 1);
1705 1.1 christos }
1706 1.8 christos
1707 1.8 christos *name = d_make_comp (di, code, *name, d_source_name (di));
1708 1.8 christos if (!*name)
1709 1.8 christos return 0;
1710 1.8 christos if (!d_add_substitution (di, *name))
1711 1.8 christos return 0;
1712 1.1 christos }
1713 1.8 christos return 1;
1714 1.1 christos }
1715 1.1 christos
1716 1.8 christos /* <unqualified-name> ::= [<module-name>] <operator-name> [<abi-tags>]
1717 1.8 christos ::= [<module-name>] <ctor-dtor-name> [<abi-tags>]
1718 1.8 christos ::= [<module-name>] <source-name> [<abi-tags>]
1719 1.9 christos ::= [<module-name>] F <source-name> [<abi-tags>]
1720 1.8 christos ::= [<module-name>] <local-source-name> [<abi-tags>]
1721 1.8 christos ::= [<module-name>] DC <source-name>+ E [<abi-tags>]
1722 1.8 christos <local-source-name> ::= L <source-name> <discriminator> [<abi-tags>]
1723 1.1 christos */
1724 1.1 christos
1725 1.1 christos static struct demangle_component *
1726 1.8 christos d_unqualified_name (struct d_info *di, struct demangle_component *scope,
1727 1.8 christos struct demangle_component *module)
1728 1.1 christos {
1729 1.3 christos struct demangle_component *ret;
1730 1.1 christos char peek;
1731 1.9 christos int member_like_friend = 0;
1732 1.1 christos
1733 1.8 christos if (!d_maybe_module_name (di, &module))
1734 1.8 christos return NULL;
1735 1.8 christos
1736 1.1 christos peek = d_peek_char (di);
1737 1.9 christos if (peek == 'F')
1738 1.9 christos {
1739 1.9 christos member_like_friend = 1;
1740 1.9 christos d_advance (di, 1);
1741 1.9 christos peek = d_peek_char (di);
1742 1.9 christos }
1743 1.1 christos if (IS_DIGIT (peek))
1744 1.3 christos ret = d_source_name (di);
1745 1.1 christos else if (IS_LOWER (peek))
1746 1.1 christos {
1747 1.8 christos int was_expr = di->is_expression;
1748 1.6 christos if (peek == 'o' && d_peek_next_char (di) == 'n')
1749 1.8 christos {
1750 1.8 christos d_advance (di, 2);
1751 1.8 christos /* Treat cv as naming a conversion operator. */
1752 1.8 christos di->is_expression = 0;
1753 1.8 christos }
1754 1.1 christos ret = d_operator_name (di);
1755 1.8 christos di->is_expression = was_expr;
1756 1.1 christos if (ret != NULL && ret->type == DEMANGLE_COMPONENT_OPERATOR)
1757 1.1 christos {
1758 1.1 christos di->expansion += sizeof "operator" + ret->u.s_operator.op->len - 2;
1759 1.1 christos if (!strcmp (ret->u.s_operator.op->code, "li"))
1760 1.1 christos ret = d_make_comp (di, DEMANGLE_COMPONENT_UNARY, ret,
1761 1.1 christos d_source_name (di));
1762 1.1 christos }
1763 1.1 christos }
1764 1.8 christos else if (peek == 'D' && d_peek_next_char (di) == 'C')
1765 1.8 christos {
1766 1.8 christos // structured binding
1767 1.8 christos d_advance (di, 2);
1768 1.8 christos struct demangle_component *prev = NULL;
1769 1.8 christos do
1770 1.8 christos {
1771 1.8 christos struct demangle_component *next =
1772 1.8 christos d_make_comp (di, DEMANGLE_COMPONENT_STRUCTURED_BINDING,
1773 1.8 christos d_source_name (di), NULL);
1774 1.8 christos if (prev)
1775 1.8 christos d_right (prev) = next;
1776 1.8 christos else
1777 1.8 christos ret = next;
1778 1.8 christos prev = next;
1779 1.8 christos }
1780 1.8 christos while (prev && d_peek_char (di) != 'E');
1781 1.8 christos if (prev)
1782 1.8 christos d_advance (di, 1);
1783 1.8 christos else
1784 1.8 christos ret = NULL;
1785 1.8 christos }
1786 1.1 christos else if (peek == 'C' || peek == 'D')
1787 1.3 christos ret = d_ctor_dtor_name (di);
1788 1.1 christos else if (peek == 'L')
1789 1.1 christos {
1790 1.1 christos d_advance (di, 1);
1791 1.1 christos
1792 1.1 christos ret = d_source_name (di);
1793 1.1 christos if (ret == NULL)
1794 1.1 christos return NULL;
1795 1.1 christos if (! d_discriminator (di))
1796 1.1 christos return NULL;
1797 1.1 christos }
1798 1.1 christos else if (peek == 'U')
1799 1.1 christos {
1800 1.1 christos switch (d_peek_next_char (di))
1801 1.1 christos {
1802 1.1 christos case 'l':
1803 1.3 christos ret = d_lambda (di);
1804 1.3 christos break;
1805 1.1 christos case 't':
1806 1.3 christos ret = d_unnamed_type (di);
1807 1.3 christos break;
1808 1.1 christos default:
1809 1.1 christos return NULL;
1810 1.1 christos }
1811 1.1 christos }
1812 1.1 christos else
1813 1.1 christos return NULL;
1814 1.3 christos
1815 1.8 christos if (module)
1816 1.8 christos ret = d_make_comp (di, DEMANGLE_COMPONENT_MODULE_ENTITY, ret, module);
1817 1.3 christos if (d_peek_char (di) == 'B')
1818 1.3 christos ret = d_abi_tags (di, ret);
1819 1.9 christos if (member_like_friend)
1820 1.9 christos ret = d_make_comp (di, DEMANGLE_COMPONENT_FRIEND, ret, NULL);
1821 1.8 christos if (scope)
1822 1.8 christos ret = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, scope, ret);
1823 1.8 christos
1824 1.3 christos return ret;
1825 1.1 christos }
1826 1.1 christos
1827 1.1 christos /* <source-name> ::= <(positive length) number> <identifier> */
1828 1.1 christos
1829 1.1 christos static struct demangle_component *
1830 1.1 christos d_source_name (struct d_info *di)
1831 1.1 christos {
1832 1.6 christos int len;
1833 1.1 christos struct demangle_component *ret;
1834 1.1 christos
1835 1.1 christos len = d_number (di);
1836 1.1 christos if (len <= 0)
1837 1.1 christos return NULL;
1838 1.1 christos ret = d_identifier (di, len);
1839 1.1 christos di->last_name = ret;
1840 1.1 christos return ret;
1841 1.1 christos }
1842 1.1 christos
1843 1.1 christos /* number ::= [n] <(non-negative decimal integer)> */
1844 1.1 christos
1845 1.6 christos static int
1846 1.1 christos d_number (struct d_info *di)
1847 1.1 christos {
1848 1.1 christos int negative;
1849 1.1 christos char peek;
1850 1.6 christos int ret;
1851 1.1 christos
1852 1.1 christos negative = 0;
1853 1.1 christos peek = d_peek_char (di);
1854 1.1 christos if (peek == 'n')
1855 1.1 christos {
1856 1.1 christos negative = 1;
1857 1.1 christos d_advance (di, 1);
1858 1.1 christos peek = d_peek_char (di);
1859 1.1 christos }
1860 1.1 christos
1861 1.1 christos ret = 0;
1862 1.1 christos while (1)
1863 1.1 christos {
1864 1.1 christos if (! IS_DIGIT (peek))
1865 1.1 christos {
1866 1.1 christos if (negative)
1867 1.1 christos ret = - ret;
1868 1.1 christos return ret;
1869 1.1 christos }
1870 1.6 christos if (ret > ((INT_MAX - (peek - '0')) / 10))
1871 1.6 christos return -1;
1872 1.7 christos ret = ret * 10 + (peek - '0');
1873 1.1 christos d_advance (di, 1);
1874 1.1 christos peek = d_peek_char (di);
1875 1.1 christos }
1876 1.1 christos }
1877 1.1 christos
1878 1.1 christos /* Like d_number, but returns a demangle_component. */
1879 1.1 christos
1880 1.1 christos static struct demangle_component *
1881 1.1 christos d_number_component (struct d_info *di)
1882 1.1 christos {
1883 1.1 christos struct demangle_component *ret = d_make_empty (di);
1884 1.1 christos if (ret)
1885 1.1 christos {
1886 1.1 christos ret->type = DEMANGLE_COMPONENT_NUMBER;
1887 1.1 christos ret->u.s_number.number = d_number (di);
1888 1.1 christos }
1889 1.1 christos return ret;
1890 1.1 christos }
1891 1.1 christos
1892 1.1 christos /* identifier ::= <(unqualified source code identifier)> */
1893 1.1 christos
1894 1.1 christos static struct demangle_component *
1895 1.6 christos d_identifier (struct d_info *di, int len)
1896 1.1 christos {
1897 1.1 christos const char *name;
1898 1.1 christos
1899 1.1 christos name = d_str (di);
1900 1.1 christos
1901 1.1 christos if (di->send - name < len)
1902 1.1 christos return NULL;
1903 1.1 christos
1904 1.1 christos d_advance (di, len);
1905 1.1 christos
1906 1.1 christos /* A Java mangled name may have a trailing '$' if it is a C++
1907 1.1 christos keyword. This '$' is not included in the length count. We just
1908 1.1 christos ignore the '$'. */
1909 1.1 christos if ((di->options & DMGL_JAVA) != 0
1910 1.1 christos && d_peek_char (di) == '$')
1911 1.1 christos d_advance (di, 1);
1912 1.1 christos
1913 1.1 christos /* Look for something which looks like a gcc encoding of an
1914 1.1 christos anonymous namespace, and replace it with a more user friendly
1915 1.1 christos name. */
1916 1.6 christos if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
1917 1.1 christos && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX,
1918 1.1 christos ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0)
1919 1.1 christos {
1920 1.1 christos const char *s;
1921 1.1 christos
1922 1.1 christos s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN;
1923 1.1 christos if ((*s == '.' || *s == '_' || *s == '$')
1924 1.1 christos && s[1] == 'N')
1925 1.1 christos {
1926 1.1 christos di->expansion -= len - sizeof "(anonymous namespace)";
1927 1.1 christos return d_make_name (di, "(anonymous namespace)",
1928 1.1 christos sizeof "(anonymous namespace)" - 1);
1929 1.1 christos }
1930 1.1 christos }
1931 1.1 christos
1932 1.1 christos return d_make_name (di, name, len);
1933 1.1 christos }
1934 1.1 christos
1935 1.1 christos /* operator_name ::= many different two character encodings.
1936 1.1 christos ::= cv <type>
1937 1.1 christos ::= v <digit> <source-name>
1938 1.1 christos
1939 1.1 christos This list is sorted for binary search. */
1940 1.1 christos
1941 1.1 christos #define NL(s) s, (sizeof s) - 1
1942 1.1 christos
1943 1.1 christos CP_STATIC_IF_GLIBCPP_V3
1944 1.1 christos const struct demangle_operator_info cplus_demangle_operators[] =
1945 1.1 christos {
1946 1.1 christos { "aN", NL ("&="), 2 },
1947 1.1 christos { "aS", NL ("="), 2 },
1948 1.1 christos { "aa", NL ("&&"), 2 },
1949 1.1 christos { "ad", NL ("&"), 1 },
1950 1.1 christos { "an", NL ("&"), 2 },
1951 1.1 christos { "at", NL ("alignof "), 1 },
1952 1.8 christos { "aw", NL ("co_await "), 1 },
1953 1.1 christos { "az", NL ("alignof "), 1 },
1954 1.1 christos { "cc", NL ("const_cast"), 2 },
1955 1.1 christos { "cl", NL ("()"), 2 },
1956 1.1 christos { "cm", NL (","), 2 },
1957 1.1 christos { "co", NL ("~"), 1 },
1958 1.1 christos { "dV", NL ("/="), 2 },
1959 1.8 christos { "dX", NL ("[...]="), 3 }, /* [expr...expr] = expr */
1960 1.1 christos { "da", NL ("delete[] "), 1 },
1961 1.1 christos { "dc", NL ("dynamic_cast"), 2 },
1962 1.1 christos { "de", NL ("*"), 1 },
1963 1.8 christos { "di", NL ("="), 2 }, /* .name = expr */
1964 1.1 christos { "dl", NL ("delete "), 1 },
1965 1.1 christos { "ds", NL (".*"), 2 },
1966 1.1 christos { "dt", NL ("."), 2 },
1967 1.1 christos { "dv", NL ("/"), 2 },
1968 1.8 christos { "dx", NL ("]="), 2 }, /* [expr] = expr */
1969 1.1 christos { "eO", NL ("^="), 2 },
1970 1.1 christos { "eo", NL ("^"), 2 },
1971 1.1 christos { "eq", NL ("=="), 2 },
1972 1.6 christos { "fL", NL ("..."), 3 },
1973 1.6 christos { "fR", NL ("..."), 3 },
1974 1.6 christos { "fl", NL ("..."), 2 },
1975 1.6 christos { "fr", NL ("..."), 2 },
1976 1.1 christos { "ge", NL (">="), 2 },
1977 1.1 christos { "gs", NL ("::"), 1 },
1978 1.1 christos { "gt", NL (">"), 2 },
1979 1.1 christos { "ix", NL ("[]"), 2 },
1980 1.1 christos { "lS", NL ("<<="), 2 },
1981 1.1 christos { "le", NL ("<="), 2 },
1982 1.1 christos { "li", NL ("operator\"\" "), 1 },
1983 1.1 christos { "ls", NL ("<<"), 2 },
1984 1.1 christos { "lt", NL ("<"), 2 },
1985 1.1 christos { "mI", NL ("-="), 2 },
1986 1.1 christos { "mL", NL ("*="), 2 },
1987 1.1 christos { "mi", NL ("-"), 2 },
1988 1.1 christos { "ml", NL ("*"), 2 },
1989 1.1 christos { "mm", NL ("--"), 1 },
1990 1.1 christos { "na", NL ("new[]"), 3 },
1991 1.1 christos { "ne", NL ("!="), 2 },
1992 1.1 christos { "ng", NL ("-"), 1 },
1993 1.1 christos { "nt", NL ("!"), 1 },
1994 1.1 christos { "nw", NL ("new"), 3 },
1995 1.9 christos { "nx", NL ("noexcept"), 1 },
1996 1.1 christos { "oR", NL ("|="), 2 },
1997 1.1 christos { "oo", NL ("||"), 2 },
1998 1.1 christos { "or", NL ("|"), 2 },
1999 1.1 christos { "pL", NL ("+="), 2 },
2000 1.1 christos { "pl", NL ("+"), 2 },
2001 1.1 christos { "pm", NL ("->*"), 2 },
2002 1.1 christos { "pp", NL ("++"), 1 },
2003 1.1 christos { "ps", NL ("+"), 1 },
2004 1.1 christos { "pt", NL ("->"), 2 },
2005 1.1 christos { "qu", NL ("?"), 3 },
2006 1.1 christos { "rM", NL ("%="), 2 },
2007 1.1 christos { "rS", NL (">>="), 2 },
2008 1.1 christos { "rc", NL ("reinterpret_cast"), 2 },
2009 1.1 christos { "rm", NL ("%"), 2 },
2010 1.1 christos { "rs", NL (">>"), 2 },
2011 1.6 christos { "sP", NL ("sizeof..."), 1 },
2012 1.6 christos { "sZ", NL ("sizeof..."), 1 },
2013 1.1 christos { "sc", NL ("static_cast"), 2 },
2014 1.8 christos { "ss", NL ("<=>"), 2 },
2015 1.1 christos { "st", NL ("sizeof "), 1 },
2016 1.1 christos { "sz", NL ("sizeof "), 1 },
2017 1.1 christos { "tr", NL ("throw"), 0 },
2018 1.1 christos { "tw", NL ("throw "), 1 },
2019 1.1 christos { NULL, NULL, 0, 0 }
2020 1.1 christos };
2021 1.1 christos
2022 1.1 christos static struct demangle_component *
2023 1.1 christos d_operator_name (struct d_info *di)
2024 1.1 christos {
2025 1.1 christos char c1;
2026 1.1 christos char c2;
2027 1.1 christos
2028 1.1 christos c1 = d_next_char (di);
2029 1.1 christos c2 = d_next_char (di);
2030 1.1 christos if (c1 == 'v' && IS_DIGIT (c2))
2031 1.1 christos return d_make_extended_operator (di, c2 - '0', d_source_name (di));
2032 1.1 christos else if (c1 == 'c' && c2 == 'v')
2033 1.3 christos {
2034 1.3 christos struct demangle_component *type;
2035 1.3 christos int was_conversion = di->is_conversion;
2036 1.5 christos struct demangle_component *res;
2037 1.3 christos
2038 1.3 christos di->is_conversion = ! di->is_expression;
2039 1.3 christos type = cplus_demangle_type (di);
2040 1.5 christos if (di->is_conversion)
2041 1.5 christos res = d_make_comp (di, DEMANGLE_COMPONENT_CONVERSION, type, NULL);
2042 1.5 christos else
2043 1.5 christos res = d_make_comp (di, DEMANGLE_COMPONENT_CAST, type, NULL);
2044 1.3 christos di->is_conversion = was_conversion;
2045 1.5 christos return res;
2046 1.3 christos }
2047 1.1 christos else
2048 1.1 christos {
2049 1.1 christos /* LOW is the inclusive lower bound. */
2050 1.1 christos int low = 0;
2051 1.1 christos /* HIGH is the exclusive upper bound. We subtract one to ignore
2052 1.1 christos the sentinel at the end of the array. */
2053 1.1 christos int high = ((sizeof (cplus_demangle_operators)
2054 1.1 christos / sizeof (cplus_demangle_operators[0]))
2055 1.1 christos - 1);
2056 1.1 christos
2057 1.1 christos while (1)
2058 1.1 christos {
2059 1.1 christos int i;
2060 1.1 christos const struct demangle_operator_info *p;
2061 1.1 christos
2062 1.1 christos i = low + (high - low) / 2;
2063 1.1 christos p = cplus_demangle_operators + i;
2064 1.1 christos
2065 1.1 christos if (c1 == p->code[0] && c2 == p->code[1])
2066 1.1 christos return d_make_operator (di, p);
2067 1.1 christos
2068 1.1 christos if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1]))
2069 1.1 christos high = i;
2070 1.1 christos else
2071 1.1 christos low = i + 1;
2072 1.1 christos if (low == high)
2073 1.1 christos return NULL;
2074 1.1 christos }
2075 1.1 christos }
2076 1.1 christos }
2077 1.1 christos
2078 1.1 christos static struct demangle_component *
2079 1.1 christos d_make_character (struct d_info *di, int c)
2080 1.1 christos {
2081 1.1 christos struct demangle_component *p;
2082 1.1 christos p = d_make_empty (di);
2083 1.1 christos if (p != NULL)
2084 1.1 christos {
2085 1.1 christos p->type = DEMANGLE_COMPONENT_CHARACTER;
2086 1.1 christos p->u.s_character.character = c;
2087 1.1 christos }
2088 1.1 christos return p;
2089 1.1 christos }
2090 1.1 christos
2091 1.1 christos static struct demangle_component *
2092 1.1 christos d_java_resource (struct d_info *di)
2093 1.1 christos {
2094 1.1 christos struct demangle_component *p = NULL;
2095 1.1 christos struct demangle_component *next = NULL;
2096 1.6 christos int len, i;
2097 1.1 christos char c;
2098 1.1 christos const char *str;
2099 1.1 christos
2100 1.1 christos len = d_number (di);
2101 1.1 christos if (len <= 1)
2102 1.1 christos return NULL;
2103 1.1 christos
2104 1.1 christos /* Eat the leading '_'. */
2105 1.1 christos if (d_next_char (di) != '_')
2106 1.1 christos return NULL;
2107 1.1 christos len--;
2108 1.1 christos
2109 1.1 christos str = d_str (di);
2110 1.1 christos i = 0;
2111 1.1 christos
2112 1.1 christos while (len > 0)
2113 1.1 christos {
2114 1.1 christos c = str[i];
2115 1.1 christos if (!c)
2116 1.1 christos return NULL;
2117 1.1 christos
2118 1.1 christos /* Each chunk is either a '$' escape... */
2119 1.1 christos if (c == '$')
2120 1.1 christos {
2121 1.1 christos i++;
2122 1.1 christos switch (str[i++])
2123 1.1 christos {
2124 1.1 christos case 'S':
2125 1.1 christos c = '/';
2126 1.1 christos break;
2127 1.1 christos case '_':
2128 1.1 christos c = '.';
2129 1.1 christos break;
2130 1.1 christos case '$':
2131 1.1 christos c = '$';
2132 1.1 christos break;
2133 1.1 christos default:
2134 1.1 christos return NULL;
2135 1.1 christos }
2136 1.1 christos next = d_make_character (di, c);
2137 1.1 christos d_advance (di, i);
2138 1.1 christos str = d_str (di);
2139 1.1 christos len -= i;
2140 1.1 christos i = 0;
2141 1.1 christos if (next == NULL)
2142 1.1 christos return NULL;
2143 1.1 christos }
2144 1.1 christos /* ... or a sequence of characters. */
2145 1.1 christos else
2146 1.1 christos {
2147 1.1 christos while (i < len && str[i] && str[i] != '$')
2148 1.1 christos i++;
2149 1.1 christos
2150 1.1 christos next = d_make_name (di, str, i);
2151 1.1 christos d_advance (di, i);
2152 1.1 christos str = d_str (di);
2153 1.1 christos len -= i;
2154 1.1 christos i = 0;
2155 1.1 christos if (next == NULL)
2156 1.1 christos return NULL;
2157 1.1 christos }
2158 1.1 christos
2159 1.1 christos if (p == NULL)
2160 1.1 christos p = next;
2161 1.1 christos else
2162 1.1 christos {
2163 1.1 christos p = d_make_comp (di, DEMANGLE_COMPONENT_COMPOUND_NAME, p, next);
2164 1.1 christos if (p == NULL)
2165 1.1 christos return NULL;
2166 1.1 christos }
2167 1.1 christos }
2168 1.1 christos
2169 1.1 christos p = d_make_comp (di, DEMANGLE_COMPONENT_JAVA_RESOURCE, p, NULL);
2170 1.1 christos
2171 1.1 christos return p;
2172 1.1 christos }
2173 1.1 christos
2174 1.1 christos /* <special-name> ::= TV <type>
2175 1.1 christos ::= TT <type>
2176 1.1 christos ::= TI <type>
2177 1.1 christos ::= TS <type>
2178 1.7 christos ::= TA <template-arg>
2179 1.1 christos ::= GV <(object) name>
2180 1.1 christos ::= T <call-offset> <(base) encoding>
2181 1.1 christos ::= Tc <call-offset> <call-offset> <(base) encoding>
2182 1.1 christos Also g++ extensions:
2183 1.1 christos ::= TC <type> <(offset) number> _ <(base) type>
2184 1.1 christos ::= TF <type>
2185 1.1 christos ::= TJ <type>
2186 1.1 christos ::= GR <name>
2187 1.1 christos ::= GA <encoding>
2188 1.1 christos ::= Gr <resource name>
2189 1.1 christos ::= GTt <encoding>
2190 1.1 christos ::= GTn <encoding>
2191 1.1 christos */
2192 1.1 christos
2193 1.1 christos static struct demangle_component *
2194 1.1 christos d_special_name (struct d_info *di)
2195 1.1 christos {
2196 1.1 christos di->expansion += 20;
2197 1.1 christos if (d_check_char (di, 'T'))
2198 1.1 christos {
2199 1.1 christos switch (d_next_char (di))
2200 1.1 christos {
2201 1.1 christos case 'V':
2202 1.1 christos di->expansion -= 5;
2203 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_VTABLE,
2204 1.1 christos cplus_demangle_type (di), NULL);
2205 1.1 christos case 'T':
2206 1.1 christos di->expansion -= 10;
2207 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_VTT,
2208 1.1 christos cplus_demangle_type (di), NULL);
2209 1.1 christos case 'I':
2210 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO,
2211 1.1 christos cplus_demangle_type (di), NULL);
2212 1.1 christos case 'S':
2213 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_NAME,
2214 1.1 christos cplus_demangle_type (di), NULL);
2215 1.1 christos
2216 1.1 christos case 'h':
2217 1.1 christos if (! d_call_offset (di, 'h'))
2218 1.1 christos return NULL;
2219 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_THUNK,
2220 1.1 christos d_encoding (di, 0), NULL);
2221 1.1 christos
2222 1.1 christos case 'v':
2223 1.1 christos if (! d_call_offset (di, 'v'))
2224 1.1 christos return NULL;
2225 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_VIRTUAL_THUNK,
2226 1.1 christos d_encoding (di, 0), NULL);
2227 1.1 christos
2228 1.1 christos case 'c':
2229 1.1 christos if (! d_call_offset (di, '\0'))
2230 1.1 christos return NULL;
2231 1.1 christos if (! d_call_offset (di, '\0'))
2232 1.1 christos return NULL;
2233 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_COVARIANT_THUNK,
2234 1.1 christos d_encoding (di, 0), NULL);
2235 1.1 christos
2236 1.1 christos case 'C':
2237 1.1 christos {
2238 1.1 christos struct demangle_component *derived_type;
2239 1.6 christos int offset;
2240 1.1 christos struct demangle_component *base_type;
2241 1.1 christos
2242 1.1 christos derived_type = cplus_demangle_type (di);
2243 1.1 christos offset = d_number (di);
2244 1.1 christos if (offset < 0)
2245 1.1 christos return NULL;
2246 1.1 christos if (! d_check_char (di, '_'))
2247 1.1 christos return NULL;
2248 1.1 christos base_type = cplus_demangle_type (di);
2249 1.1 christos /* We don't display the offset. FIXME: We should display
2250 1.1 christos it in verbose mode. */
2251 1.1 christos di->expansion += 5;
2252 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE,
2253 1.1 christos base_type, derived_type);
2254 1.1 christos }
2255 1.1 christos
2256 1.1 christos case 'F':
2257 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_FN,
2258 1.1 christos cplus_demangle_type (di), NULL);
2259 1.1 christos case 'J':
2260 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_JAVA_CLASS,
2261 1.1 christos cplus_demangle_type (di), NULL);
2262 1.1 christos
2263 1.3 christos case 'H':
2264 1.3 christos return d_make_comp (di, DEMANGLE_COMPONENT_TLS_INIT,
2265 1.8 christos d_name (di, 0), NULL);
2266 1.3 christos
2267 1.3 christos case 'W':
2268 1.3 christos return d_make_comp (di, DEMANGLE_COMPONENT_TLS_WRAPPER,
2269 1.8 christos d_name (di, 0), NULL);
2270 1.3 christos
2271 1.7 christos case 'A':
2272 1.7 christos return d_make_comp (di, DEMANGLE_COMPONENT_TPARM_OBJ,
2273 1.7 christos d_template_arg (di), NULL);
2274 1.7 christos
2275 1.1 christos default:
2276 1.1 christos return NULL;
2277 1.1 christos }
2278 1.1 christos }
2279 1.1 christos else if (d_check_char (di, 'G'))
2280 1.1 christos {
2281 1.1 christos switch (d_next_char (di))
2282 1.1 christos {
2283 1.1 christos case 'V':
2284 1.6 christos return d_make_comp (di, DEMANGLE_COMPONENT_GUARD,
2285 1.8 christos d_name (di, 0), NULL);
2286 1.1 christos
2287 1.1 christos case 'R':
2288 1.1 christos {
2289 1.8 christos struct demangle_component *name = d_name (di, 0);
2290 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, name,
2291 1.1 christos d_number_component (di));
2292 1.1 christos }
2293 1.1 christos
2294 1.1 christos case 'A':
2295 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS,
2296 1.1 christos d_encoding (di, 0), NULL);
2297 1.1 christos
2298 1.8 christos case 'I':
2299 1.8 christos {
2300 1.8 christos struct demangle_component *module = NULL;
2301 1.8 christos if (!d_maybe_module_name (di, &module) || !module)
2302 1.8 christos return NULL;
2303 1.8 christos return d_make_comp (di, DEMANGLE_COMPONENT_MODULE_INIT,
2304 1.8 christos module, NULL);
2305 1.8 christos }
2306 1.1 christos case 'T':
2307 1.1 christos switch (d_next_char (di))
2308 1.1 christos {
2309 1.1 christos case 'n':
2310 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE,
2311 1.1 christos d_encoding (di, 0), NULL);
2312 1.1 christos default:
2313 1.1 christos /* ??? The proposal is that other letters (such as 'h') stand
2314 1.1 christos for different variants of transaction cloning, such as
2315 1.1 christos compiling directly for hardware transaction support. But
2316 1.1 christos they still should all be transactional clones of some sort
2317 1.1 christos so go ahead and call them that. */
2318 1.1 christos case 't':
2319 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_TRANSACTION_CLONE,
2320 1.1 christos d_encoding (di, 0), NULL);
2321 1.1 christos }
2322 1.1 christos
2323 1.1 christos case 'r':
2324 1.1 christos return d_java_resource (di);
2325 1.1 christos
2326 1.1 christos default:
2327 1.1 christos return NULL;
2328 1.1 christos }
2329 1.1 christos }
2330 1.1 christos else
2331 1.1 christos return NULL;
2332 1.1 christos }
2333 1.1 christos
2334 1.1 christos /* <call-offset> ::= h <nv-offset> _
2335 1.1 christos ::= v <v-offset> _
2336 1.1 christos
2337 1.1 christos <nv-offset> ::= <(offset) number>
2338 1.1 christos
2339 1.1 christos <v-offset> ::= <(offset) number> _ <(virtual offset) number>
2340 1.1 christos
2341 1.1 christos The C parameter, if not '\0', is a character we just read which is
2342 1.1 christos the start of the <call-offset>.
2343 1.1 christos
2344 1.1 christos We don't display the offset information anywhere. FIXME: We should
2345 1.1 christos display it in verbose mode. */
2346 1.1 christos
2347 1.1 christos static int
2348 1.1 christos d_call_offset (struct d_info *di, int c)
2349 1.1 christos {
2350 1.1 christos if (c == '\0')
2351 1.1 christos c = d_next_char (di);
2352 1.1 christos
2353 1.1 christos if (c == 'h')
2354 1.1 christos d_number (di);
2355 1.1 christos else if (c == 'v')
2356 1.1 christos {
2357 1.1 christos d_number (di);
2358 1.1 christos if (! d_check_char (di, '_'))
2359 1.1 christos return 0;
2360 1.1 christos d_number (di);
2361 1.1 christos }
2362 1.1 christos else
2363 1.1 christos return 0;
2364 1.1 christos
2365 1.1 christos if (! d_check_char (di, '_'))
2366 1.1 christos return 0;
2367 1.1 christos
2368 1.1 christos return 1;
2369 1.1 christos }
2370 1.1 christos
2371 1.1 christos /* <ctor-dtor-name> ::= C1
2372 1.1 christos ::= C2
2373 1.1 christos ::= C3
2374 1.1 christos ::= D0
2375 1.1 christos ::= D1
2376 1.1 christos ::= D2
2377 1.1 christos */
2378 1.1 christos
2379 1.1 christos static struct demangle_component *
2380 1.1 christos d_ctor_dtor_name (struct d_info *di)
2381 1.1 christos {
2382 1.1 christos if (di->last_name != NULL)
2383 1.1 christos {
2384 1.1 christos if (di->last_name->type == DEMANGLE_COMPONENT_NAME)
2385 1.1 christos di->expansion += di->last_name->u.s_name.len;
2386 1.1 christos else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD)
2387 1.1 christos di->expansion += di->last_name->u.s_string.len;
2388 1.1 christos }
2389 1.1 christos switch (d_peek_char (di))
2390 1.1 christos {
2391 1.1 christos case 'C':
2392 1.1 christos {
2393 1.1 christos enum gnu_v3_ctor_kinds kind;
2394 1.6 christos int inheriting = 0;
2395 1.6 christos
2396 1.6 christos if (d_peek_next_char (di) == 'I')
2397 1.6 christos {
2398 1.6 christos inheriting = 1;
2399 1.6 christos d_advance (di, 1);
2400 1.6 christos }
2401 1.1 christos
2402 1.1 christos switch (d_peek_next_char (di))
2403 1.1 christos {
2404 1.1 christos case '1':
2405 1.1 christos kind = gnu_v3_complete_object_ctor;
2406 1.1 christos break;
2407 1.1 christos case '2':
2408 1.1 christos kind = gnu_v3_base_object_ctor;
2409 1.1 christos break;
2410 1.1 christos case '3':
2411 1.1 christos kind = gnu_v3_complete_object_allocating_ctor;
2412 1.1 christos break;
2413 1.3 christos case '4':
2414 1.3 christos kind = gnu_v3_unified_ctor;
2415 1.3 christos break;
2416 1.1 christos case '5':
2417 1.1 christos kind = gnu_v3_object_ctor_group;
2418 1.1 christos break;
2419 1.1 christos default:
2420 1.1 christos return NULL;
2421 1.1 christos }
2422 1.6 christos
2423 1.1 christos d_advance (di, 2);
2424 1.6 christos
2425 1.6 christos if (inheriting)
2426 1.6 christos cplus_demangle_type (di);
2427 1.6 christos
2428 1.1 christos return d_make_ctor (di, kind, di->last_name);
2429 1.1 christos }
2430 1.1 christos
2431 1.1 christos case 'D':
2432 1.1 christos {
2433 1.1 christos enum gnu_v3_dtor_kinds kind;
2434 1.1 christos
2435 1.1 christos switch (d_peek_next_char (di))
2436 1.1 christos {
2437 1.1 christos case '0':
2438 1.1 christos kind = gnu_v3_deleting_dtor;
2439 1.1 christos break;
2440 1.1 christos case '1':
2441 1.1 christos kind = gnu_v3_complete_object_dtor;
2442 1.1 christos break;
2443 1.1 christos case '2':
2444 1.1 christos kind = gnu_v3_base_object_dtor;
2445 1.1 christos break;
2446 1.3 christos /* digit '3' is not used */
2447 1.3 christos case '4':
2448 1.3 christos kind = gnu_v3_unified_dtor;
2449 1.3 christos break;
2450 1.1 christos case '5':
2451 1.1 christos kind = gnu_v3_object_dtor_group;
2452 1.1 christos break;
2453 1.1 christos default:
2454 1.1 christos return NULL;
2455 1.1 christos }
2456 1.1 christos d_advance (di, 2);
2457 1.1 christos return d_make_dtor (di, kind, di->last_name);
2458 1.1 christos }
2459 1.1 christos
2460 1.1 christos default:
2461 1.1 christos return NULL;
2462 1.1 christos }
2463 1.1 christos }
2464 1.1 christos
2465 1.6 christos /* True iff we're looking at an order-insensitive type-qualifier, including
2466 1.6 christos function-type-qualifiers. */
2467 1.6 christos
2468 1.6 christos static int
2469 1.6 christos next_is_type_qual (struct d_info *di)
2470 1.6 christos {
2471 1.6 christos char peek = d_peek_char (di);
2472 1.6 christos if (peek == 'r' || peek == 'V' || peek == 'K')
2473 1.6 christos return 1;
2474 1.6 christos if (peek == 'D')
2475 1.6 christos {
2476 1.6 christos peek = d_peek_next_char (di);
2477 1.6 christos if (peek == 'x' || peek == 'o' || peek == 'O' || peek == 'w')
2478 1.6 christos return 1;
2479 1.6 christos }
2480 1.6 christos return 0;
2481 1.6 christos }
2482 1.6 christos
2483 1.1 christos /* <type> ::= <builtin-type>
2484 1.1 christos ::= <function-type>
2485 1.1 christos ::= <class-enum-type>
2486 1.1 christos ::= <array-type>
2487 1.1 christos ::= <pointer-to-member-type>
2488 1.1 christos ::= <template-param>
2489 1.1 christos ::= <template-template-param> <template-args>
2490 1.1 christos ::= <substitution>
2491 1.1 christos ::= <CV-qualifiers> <type>
2492 1.1 christos ::= P <type>
2493 1.1 christos ::= R <type>
2494 1.1 christos ::= O <type> (C++0x)
2495 1.1 christos ::= C <type>
2496 1.1 christos ::= G <type>
2497 1.1 christos ::= U <source-name> <type>
2498 1.1 christos
2499 1.1 christos <builtin-type> ::= various one letter codes
2500 1.1 christos ::= u <source-name>
2501 1.1 christos */
2502 1.1 christos
2503 1.1 christos CP_STATIC_IF_GLIBCPP_V3
2504 1.1 christos const struct demangle_builtin_type_info
2505 1.1 christos cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] =
2506 1.1 christos {
2507 1.1 christos /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT },
2508 1.1 christos /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL },
2509 1.1 christos /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT },
2510 1.1 christos /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT },
2511 1.1 christos /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT },
2512 1.1 christos /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT },
2513 1.1 christos /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT },
2514 1.1 christos /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT },
2515 1.1 christos /* i */ { NL ("int"), NL ("int"), D_PRINT_INT },
2516 1.1 christos /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED },
2517 1.1 christos /* k */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2518 1.1 christos /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG },
2519 1.1 christos /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG },
2520 1.1 christos /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT },
2521 1.1 christos /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2522 1.1 christos D_PRINT_DEFAULT },
2523 1.1 christos /* p */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2524 1.1 christos /* q */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2525 1.1 christos /* r */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2526 1.1 christos /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT },
2527 1.1 christos /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
2528 1.1 christos /* u */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2529 1.1 christos /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID },
2530 1.1 christos /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT },
2531 1.1 christos /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG },
2532 1.1 christos /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2533 1.1 christos D_PRINT_UNSIGNED_LONG_LONG },
2534 1.1 christos /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT },
2535 1.1 christos /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT },
2536 1.1 christos /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT },
2537 1.1 christos /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT },
2538 1.1 christos /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT },
2539 1.7 christos /* 30 */ { NL ("char8_t"), NL ("char8_t"), D_PRINT_DEFAULT },
2540 1.7 christos /* 31 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT },
2541 1.7 christos /* 32 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT },
2542 1.7 christos /* 33 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"),
2543 1.1 christos D_PRINT_DEFAULT },
2544 1.9 christos /* 34 */ { NL ("_Float"), NL ("_Float"), D_PRINT_FLOAT },
2545 1.9 christos /* 35 */ { NL ("std::bfloat16_t"), NL ("std::bfloat16_t"), D_PRINT_FLOAT },
2546 1.1 christos };
2547 1.1 christos
2548 1.1 christos CP_STATIC_IF_GLIBCPP_V3
2549 1.1 christos struct demangle_component *
2550 1.1 christos cplus_demangle_type (struct d_info *di)
2551 1.1 christos {
2552 1.1 christos char peek;
2553 1.1 christos struct demangle_component *ret;
2554 1.1 christos int can_subst;
2555 1.1 christos
2556 1.1 christos /* The ABI specifies that when CV-qualifiers are used, the base type
2557 1.1 christos is substitutable, and the fully qualified type is substitutable,
2558 1.1 christos but the base type with a strict subset of the CV-qualifiers is
2559 1.1 christos not substitutable. The natural recursive implementation of the
2560 1.1 christos CV-qualifiers would cause subsets to be substitutable, so instead
2561 1.1 christos we pull them all off now.
2562 1.1 christos
2563 1.1 christos FIXME: The ABI says that order-insensitive vendor qualifiers
2564 1.1 christos should be handled in the same way, but we have no way to tell
2565 1.1 christos which vendor qualifiers are order-insensitive and which are
2566 1.1 christos order-sensitive. So we just assume that they are all
2567 1.1 christos order-sensitive. g++ 3.4 supports only one vendor qualifier,
2568 1.1 christos __vector, and it treats it as order-sensitive when mangling
2569 1.1 christos names. */
2570 1.1 christos
2571 1.6 christos if (next_is_type_qual (di))
2572 1.1 christos {
2573 1.1 christos struct demangle_component **pret;
2574 1.1 christos
2575 1.1 christos pret = d_cv_qualifiers (di, &ret, 0);
2576 1.1 christos if (pret == NULL)
2577 1.1 christos return NULL;
2578 1.3 christos if (d_peek_char (di) == 'F')
2579 1.3 christos {
2580 1.3 christos /* cv-qualifiers before a function type apply to 'this',
2581 1.3 christos so avoid adding the unqualified function type to
2582 1.3 christos the substitution list. */
2583 1.3 christos *pret = d_function_type (di);
2584 1.3 christos }
2585 1.3 christos else
2586 1.3 christos *pret = cplus_demangle_type (di);
2587 1.3 christos if (!*pret)
2588 1.3 christos return NULL;
2589 1.3 christos if ((*pret)->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
2590 1.3 christos || (*pret)->type == DEMANGLE_COMPONENT_REFERENCE_THIS)
2591 1.3 christos {
2592 1.3 christos /* Move the ref-qualifier outside the cv-qualifiers so that
2593 1.3 christos they are printed in the right order. */
2594 1.3 christos struct demangle_component *fn = d_left (*pret);
2595 1.3 christos d_left (*pret) = ret;
2596 1.3 christos ret = *pret;
2597 1.3 christos *pret = fn;
2598 1.3 christos }
2599 1.3 christos if (! d_add_substitution (di, ret))
2600 1.1 christos return NULL;
2601 1.1 christos return ret;
2602 1.1 christos }
2603 1.1 christos
2604 1.1 christos can_subst = 1;
2605 1.1 christos
2606 1.6 christos peek = d_peek_char (di);
2607 1.1 christos switch (peek)
2608 1.1 christos {
2609 1.1 christos case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2610 1.1 christos case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
2611 1.1 christos case 'o': case 's': case 't':
2612 1.1 christos case 'v': case 'w': case 'x': case 'y': case 'z':
2613 1.1 christos ret = d_make_builtin_type (di,
2614 1.1 christos &cplus_demangle_builtin_types[peek - 'a']);
2615 1.1 christos di->expansion += ret->u.s_builtin.type->len;
2616 1.1 christos can_subst = 0;
2617 1.1 christos d_advance (di, 1);
2618 1.1 christos break;
2619 1.1 christos
2620 1.1 christos case 'u':
2621 1.1 christos d_advance (di, 1);
2622 1.1 christos ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE,
2623 1.1 christos d_source_name (di), NULL);
2624 1.1 christos break;
2625 1.1 christos
2626 1.1 christos case 'F':
2627 1.1 christos ret = d_function_type (di);
2628 1.1 christos break;
2629 1.1 christos
2630 1.1 christos case 'A':
2631 1.1 christos ret = d_array_type (di);
2632 1.1 christos break;
2633 1.1 christos
2634 1.1 christos case 'M':
2635 1.1 christos ret = d_pointer_to_member_type (di);
2636 1.1 christos break;
2637 1.1 christos
2638 1.1 christos case 'T':
2639 1.1 christos ret = d_template_param (di);
2640 1.1 christos if (d_peek_char (di) == 'I')
2641 1.1 christos {
2642 1.3 christos /* This may be <template-template-param> <template-args>.
2643 1.3 christos If this is the type for a conversion operator, we can
2644 1.3 christos have a <template-template-param> here only by following
2645 1.3 christos a derivation like this:
2646 1.3 christos
2647 1.3 christos <nested-name>
2648 1.3 christos -> <template-prefix> <template-args>
2649 1.3 christos -> <prefix> <template-unqualified-name> <template-args>
2650 1.3 christos -> <unqualified-name> <template-unqualified-name> <template-args>
2651 1.3 christos -> <source-name> <template-unqualified-name> <template-args>
2652 1.3 christos -> <source-name> <operator-name> <template-args>
2653 1.3 christos -> <source-name> cv <type> <template-args>
2654 1.3 christos -> <source-name> cv <template-template-param> <template-args> <template-args>
2655 1.3 christos
2656 1.3 christos where the <template-args> is followed by another.
2657 1.3 christos Otherwise, we must have a derivation like this:
2658 1.3 christos
2659 1.3 christos <nested-name>
2660 1.3 christos -> <template-prefix> <template-args>
2661 1.3 christos -> <prefix> <template-unqualified-name> <template-args>
2662 1.3 christos -> <unqualified-name> <template-unqualified-name> <template-args>
2663 1.3 christos -> <source-name> <template-unqualified-name> <template-args>
2664 1.3 christos -> <source-name> <operator-name> <template-args>
2665 1.3 christos -> <source-name> cv <type> <template-args>
2666 1.3 christos -> <source-name> cv <template-param> <template-args>
2667 1.3 christos
2668 1.3 christos where we need to leave the <template-args> to be processed
2669 1.3 christos by d_prefix (following the <template-prefix>).
2670 1.3 christos
2671 1.3 christos The <template-template-param> part is a substitution
2672 1.1 christos candidate. */
2673 1.3 christos if (! di->is_conversion)
2674 1.3 christos {
2675 1.3 christos if (! d_add_substitution (di, ret))
2676 1.3 christos return NULL;
2677 1.3 christos ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2678 1.3 christos d_template_args (di));
2679 1.3 christos }
2680 1.3 christos else
2681 1.3 christos {
2682 1.3 christos struct demangle_component *args;
2683 1.3 christos struct d_info_checkpoint checkpoint;
2684 1.3 christos
2685 1.3 christos d_checkpoint (di, &checkpoint);
2686 1.3 christos args = d_template_args (di);
2687 1.3 christos if (d_peek_char (di) == 'I')
2688 1.3 christos {
2689 1.3 christos if (! d_add_substitution (di, ret))
2690 1.3 christos return NULL;
2691 1.3 christos ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2692 1.3 christos args);
2693 1.3 christos }
2694 1.3 christos else
2695 1.3 christos d_backtrack (di, &checkpoint);
2696 1.3 christos }
2697 1.1 christos }
2698 1.1 christos break;
2699 1.1 christos
2700 1.1 christos case 'O':
2701 1.1 christos d_advance (di, 1);
2702 1.1 christos ret = d_make_comp (di, DEMANGLE_COMPONENT_RVALUE_REFERENCE,
2703 1.1 christos cplus_demangle_type (di), NULL);
2704 1.1 christos break;
2705 1.1 christos
2706 1.1 christos case 'P':
2707 1.1 christos d_advance (di, 1);
2708 1.1 christos ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER,
2709 1.1 christos cplus_demangle_type (di), NULL);
2710 1.1 christos break;
2711 1.1 christos
2712 1.1 christos case 'R':
2713 1.1 christos d_advance (di, 1);
2714 1.1 christos ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE,
2715 1.1 christos cplus_demangle_type (di), NULL);
2716 1.1 christos break;
2717 1.1 christos
2718 1.1 christos case 'C':
2719 1.1 christos d_advance (di, 1);
2720 1.1 christos ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX,
2721 1.1 christos cplus_demangle_type (di), NULL);
2722 1.1 christos break;
2723 1.1 christos
2724 1.1 christos case 'G':
2725 1.1 christos d_advance (di, 1);
2726 1.1 christos ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY,
2727 1.1 christos cplus_demangle_type (di), NULL);
2728 1.1 christos break;
2729 1.1 christos
2730 1.1 christos case 'U':
2731 1.1 christos d_advance (di, 1);
2732 1.1 christos ret = d_source_name (di);
2733 1.3 christos if (d_peek_char (di) == 'I')
2734 1.3 christos ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2735 1.3 christos d_template_args (di));
2736 1.1 christos ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL,
2737 1.1 christos cplus_demangle_type (di), ret);
2738 1.1 christos break;
2739 1.1 christos
2740 1.1 christos case 'D':
2741 1.1 christos can_subst = 0;
2742 1.1 christos d_advance (di, 1);
2743 1.1 christos peek = d_next_char (di);
2744 1.1 christos switch (peek)
2745 1.1 christos {
2746 1.1 christos case 'T':
2747 1.1 christos case 't':
2748 1.1 christos /* decltype (expression) */
2749 1.1 christos ret = d_make_comp (di, DEMANGLE_COMPONENT_DECLTYPE,
2750 1.1 christos d_expression (di), NULL);
2751 1.1 christos if (ret && d_next_char (di) != 'E')
2752 1.1 christos ret = NULL;
2753 1.1 christos can_subst = 1;
2754 1.1 christos break;
2755 1.1 christos
2756 1.1 christos case 'p':
2757 1.1 christos /* Pack expansion. */
2758 1.1 christos ret = d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
2759 1.1 christos cplus_demangle_type (di), NULL);
2760 1.1 christos can_subst = 1;
2761 1.1 christos break;
2762 1.1 christos
2763 1.1 christos case 'a':
2764 1.1 christos /* auto */
2765 1.1 christos ret = d_make_name (di, "auto", 4);
2766 1.1 christos break;
2767 1.6 christos case 'c':
2768 1.6 christos /* decltype(auto) */
2769 1.6 christos ret = d_make_name (di, "decltype(auto)", 14);
2770 1.6 christos break;
2771 1.6 christos
2772 1.1 christos case 'f':
2773 1.1 christos /* 32-bit decimal floating point */
2774 1.1 christos ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[26]);
2775 1.1 christos di->expansion += ret->u.s_builtin.type->len;
2776 1.1 christos break;
2777 1.1 christos case 'd':
2778 1.1 christos /* 64-bit DFP */
2779 1.1 christos ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[27]);
2780 1.1 christos di->expansion += ret->u.s_builtin.type->len;
2781 1.1 christos break;
2782 1.1 christos case 'e':
2783 1.1 christos /* 128-bit DFP */
2784 1.1 christos ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[28]);
2785 1.1 christos di->expansion += ret->u.s_builtin.type->len;
2786 1.1 christos break;
2787 1.1 christos case 'h':
2788 1.1 christos /* 16-bit half-precision FP */
2789 1.1 christos ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[29]);
2790 1.1 christos di->expansion += ret->u.s_builtin.type->len;
2791 1.1 christos break;
2792 1.7 christos case 'u':
2793 1.7 christos /* char8_t */
2794 1.7 christos ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[30]);
2795 1.7 christos di->expansion += ret->u.s_builtin.type->len;
2796 1.7 christos break;
2797 1.1 christos case 's':
2798 1.1 christos /* char16_t */
2799 1.7 christos ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[31]);
2800 1.1 christos di->expansion += ret->u.s_builtin.type->len;
2801 1.1 christos break;
2802 1.1 christos case 'i':
2803 1.1 christos /* char32_t */
2804 1.7 christos ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[32]);
2805 1.1 christos di->expansion += ret->u.s_builtin.type->len;
2806 1.1 christos break;
2807 1.1 christos
2808 1.1 christos case 'F':
2809 1.9 christos /* DF<number>_ - _Float<number>.
2810 1.9 christos DF<number>x - _Float<number>x
2811 1.9 christos DF16b - std::bfloat16_t. */
2812 1.9 christos {
2813 1.9 christos int arg = d_number (di);
2814 1.9 christos char buf[12];
2815 1.9 christos char suffix = 0;
2816 1.9 christos if (d_peek_char (di) == 'b')
2817 1.9 christos {
2818 1.9 christos if (arg != 16)
2819 1.9 christos return NULL;
2820 1.9 christos d_advance (di, 1);
2821 1.9 christos ret = d_make_builtin_type (di,
2822 1.9 christos &cplus_demangle_builtin_types[35]);
2823 1.9 christos di->expansion += ret->u.s_builtin.type->len;
2824 1.9 christos break;
2825 1.9 christos }
2826 1.9 christos if (d_peek_char (di) == 'x')
2827 1.9 christos suffix = 'x';
2828 1.9 christos if (!suffix && d_peek_char (di) != '_')
2829 1.9 christos return NULL;
2830 1.9 christos ret
2831 1.9 christos = d_make_extended_builtin_type (di,
2832 1.9 christos &cplus_demangle_builtin_types[34],
2833 1.9 christos arg, suffix);
2834 1.9 christos d_advance (di, 1);
2835 1.9 christos sprintf (buf, "%d", arg);
2836 1.9 christos di->expansion += ret->u.s_extended_builtin.type->len
2837 1.9 christos + strlen (buf) + (suffix != 0);
2838 1.9 christos break;
2839 1.9 christos }
2840 1.1 christos
2841 1.1 christos case 'v':
2842 1.1 christos ret = d_vector_type (di);
2843 1.1 christos can_subst = 1;
2844 1.1 christos break;
2845 1.1 christos
2846 1.1 christos case 'n':
2847 1.1 christos /* decltype(nullptr) */
2848 1.7 christos ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[33]);
2849 1.1 christos di->expansion += ret->u.s_builtin.type->len;
2850 1.1 christos break;
2851 1.1 christos
2852 1.1 christos default:
2853 1.1 christos return NULL;
2854 1.1 christos }
2855 1.1 christos break;
2856 1.1 christos
2857 1.1 christos default:
2858 1.8 christos return d_class_enum_type (di, 1);
2859 1.1 christos }
2860 1.1 christos
2861 1.1 christos if (can_subst)
2862 1.1 christos {
2863 1.1 christos if (! d_add_substitution (di, ret))
2864 1.1 christos return NULL;
2865 1.1 christos }
2866 1.1 christos
2867 1.1 christos return ret;
2868 1.1 christos }
2869 1.1 christos
2870 1.5 christos /* <CV-qualifiers> ::= [r] [V] [K] [Dx] */
2871 1.1 christos
2872 1.1 christos static struct demangle_component **
2873 1.1 christos d_cv_qualifiers (struct d_info *di,
2874 1.1 christos struct demangle_component **pret, int member_fn)
2875 1.1 christos {
2876 1.1 christos struct demangle_component **pstart;
2877 1.1 christos char peek;
2878 1.1 christos
2879 1.1 christos pstart = pret;
2880 1.1 christos peek = d_peek_char (di);
2881 1.6 christos while (next_is_type_qual (di))
2882 1.1 christos {
2883 1.1 christos enum demangle_component_type t;
2884 1.6 christos struct demangle_component *right = NULL;
2885 1.1 christos
2886 1.1 christos d_advance (di, 1);
2887 1.1 christos if (peek == 'r')
2888 1.1 christos {
2889 1.1 christos t = (member_fn
2890 1.1 christos ? DEMANGLE_COMPONENT_RESTRICT_THIS
2891 1.1 christos : DEMANGLE_COMPONENT_RESTRICT);
2892 1.1 christos di->expansion += sizeof "restrict";
2893 1.1 christos }
2894 1.1 christos else if (peek == 'V')
2895 1.1 christos {
2896 1.1 christos t = (member_fn
2897 1.1 christos ? DEMANGLE_COMPONENT_VOLATILE_THIS
2898 1.1 christos : DEMANGLE_COMPONENT_VOLATILE);
2899 1.1 christos di->expansion += sizeof "volatile";
2900 1.1 christos }
2901 1.5 christos else if (peek == 'K')
2902 1.1 christos {
2903 1.1 christos t = (member_fn
2904 1.1 christos ? DEMANGLE_COMPONENT_CONST_THIS
2905 1.1 christos : DEMANGLE_COMPONENT_CONST);
2906 1.1 christos di->expansion += sizeof "const";
2907 1.1 christos }
2908 1.5 christos else
2909 1.5 christos {
2910 1.6 christos peek = d_next_char (di);
2911 1.6 christos if (peek == 'x')
2912 1.6 christos {
2913 1.6 christos t = DEMANGLE_COMPONENT_TRANSACTION_SAFE;
2914 1.6 christos di->expansion += sizeof "transaction_safe";
2915 1.6 christos }
2916 1.6 christos else if (peek == 'o'
2917 1.6 christos || peek == 'O')
2918 1.6 christos {
2919 1.6 christos t = DEMANGLE_COMPONENT_NOEXCEPT;
2920 1.6 christos di->expansion += sizeof "noexcept";
2921 1.6 christos if (peek == 'O')
2922 1.6 christos {
2923 1.6 christos right = d_expression (di);
2924 1.6 christos if (right == NULL)
2925 1.6 christos return NULL;
2926 1.6 christos if (! d_check_char (di, 'E'))
2927 1.6 christos return NULL;
2928 1.6 christos }
2929 1.6 christos }
2930 1.6 christos else if (peek == 'w')
2931 1.6 christos {
2932 1.6 christos t = DEMANGLE_COMPONENT_THROW_SPEC;
2933 1.6 christos di->expansion += sizeof "throw";
2934 1.6 christos right = d_parmlist (di);
2935 1.6 christos if (right == NULL)
2936 1.6 christos return NULL;
2937 1.6 christos if (! d_check_char (di, 'E'))
2938 1.6 christos return NULL;
2939 1.6 christos }
2940 1.6 christos else
2941 1.6 christos return NULL;
2942 1.5 christos }
2943 1.1 christos
2944 1.6 christos *pret = d_make_comp (di, t, NULL, right);
2945 1.1 christos if (*pret == NULL)
2946 1.1 christos return NULL;
2947 1.1 christos pret = &d_left (*pret);
2948 1.1 christos
2949 1.1 christos peek = d_peek_char (di);
2950 1.1 christos }
2951 1.1 christos
2952 1.1 christos if (!member_fn && peek == 'F')
2953 1.1 christos {
2954 1.1 christos while (pstart != pret)
2955 1.1 christos {
2956 1.1 christos switch ((*pstart)->type)
2957 1.1 christos {
2958 1.1 christos case DEMANGLE_COMPONENT_RESTRICT:
2959 1.1 christos (*pstart)->type = DEMANGLE_COMPONENT_RESTRICT_THIS;
2960 1.1 christos break;
2961 1.1 christos case DEMANGLE_COMPONENT_VOLATILE:
2962 1.1 christos (*pstart)->type = DEMANGLE_COMPONENT_VOLATILE_THIS;
2963 1.1 christos break;
2964 1.1 christos case DEMANGLE_COMPONENT_CONST:
2965 1.1 christos (*pstart)->type = DEMANGLE_COMPONENT_CONST_THIS;
2966 1.1 christos break;
2967 1.1 christos default:
2968 1.1 christos break;
2969 1.1 christos }
2970 1.1 christos pstart = &d_left (*pstart);
2971 1.1 christos }
2972 1.1 christos }
2973 1.1 christos
2974 1.1 christos return pret;
2975 1.1 christos }
2976 1.1 christos
2977 1.3 christos /* <ref-qualifier> ::= R
2978 1.3 christos ::= O */
2979 1.3 christos
2980 1.3 christos static struct demangle_component *
2981 1.3 christos d_ref_qualifier (struct d_info *di, struct demangle_component *sub)
2982 1.3 christos {
2983 1.3 christos struct demangle_component *ret = sub;
2984 1.3 christos char peek;
2985 1.3 christos
2986 1.3 christos peek = d_peek_char (di);
2987 1.3 christos if (peek == 'R' || peek == 'O')
2988 1.3 christos {
2989 1.3 christos enum demangle_component_type t;
2990 1.3 christos if (peek == 'R')
2991 1.3 christos {
2992 1.3 christos t = DEMANGLE_COMPONENT_REFERENCE_THIS;
2993 1.3 christos di->expansion += sizeof "&";
2994 1.3 christos }
2995 1.3 christos else
2996 1.3 christos {
2997 1.3 christos t = DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS;
2998 1.3 christos di->expansion += sizeof "&&";
2999 1.3 christos }
3000 1.3 christos d_advance (di, 1);
3001 1.3 christos
3002 1.3 christos ret = d_make_comp (di, t, ret, NULL);
3003 1.3 christos }
3004 1.3 christos
3005 1.3 christos return ret;
3006 1.3 christos }
3007 1.3 christos
3008 1.5 christos /* <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] [T] E */
3009 1.1 christos
3010 1.1 christos static struct demangle_component *
3011 1.1 christos d_function_type (struct d_info *di)
3012 1.1 christos {
3013 1.7 christos struct demangle_component *ret = NULL;
3014 1.7 christos
3015 1.7 christos if ((di->options & DMGL_NO_RECURSE_LIMIT) == 0)
3016 1.7 christos {
3017 1.7 christos if (di->recursion_level > DEMANGLE_RECURSION_LIMIT)
3018 1.7 christos /* FIXME: There ought to be a way to report
3019 1.7 christos that the recursion limit has been reached. */
3020 1.7 christos return NULL;
3021 1.7 christos
3022 1.7 christos di->recursion_level ++;
3023 1.7 christos }
3024 1.1 christos
3025 1.7 christos if (d_check_char (di, 'F'))
3026 1.1 christos {
3027 1.7 christos if (d_peek_char (di) == 'Y')
3028 1.7 christos {
3029 1.7 christos /* Function has C linkage. We don't print this information.
3030 1.7 christos FIXME: We should print it in verbose mode. */
3031 1.7 christos d_advance (di, 1);
3032 1.7 christos }
3033 1.7 christos ret = d_bare_function_type (di, 1);
3034 1.7 christos ret = d_ref_qualifier (di, ret);
3035 1.7 christos
3036 1.7 christos if (! d_check_char (di, 'E'))
3037 1.7 christos ret = NULL;
3038 1.1 christos }
3039 1.3 christos
3040 1.7 christos if ((di->options & DMGL_NO_RECURSE_LIMIT) == 0)
3041 1.7 christos di->recursion_level --;
3042 1.1 christos return ret;
3043 1.1 christos }
3044 1.1 christos
3045 1.1 christos /* <type>+ */
3046 1.1 christos
3047 1.1 christos static struct demangle_component *
3048 1.1 christos d_parmlist (struct d_info *di)
3049 1.1 christos {
3050 1.1 christos struct demangle_component *tl;
3051 1.1 christos struct demangle_component **ptl;
3052 1.1 christos
3053 1.1 christos tl = NULL;
3054 1.1 christos ptl = &tl;
3055 1.1 christos while (1)
3056 1.1 christos {
3057 1.1 christos struct demangle_component *type;
3058 1.1 christos
3059 1.1 christos char peek = d_peek_char (di);
3060 1.9 christos if (peek == '\0' || peek == 'E' || peek == '.' || peek == 'Q')
3061 1.1 christos break;
3062 1.3 christos if ((peek == 'R' || peek == 'O')
3063 1.3 christos && d_peek_next_char (di) == 'E')
3064 1.3 christos /* Function ref-qualifier, not a ref prefix for a parameter type. */
3065 1.3 christos break;
3066 1.1 christos type = cplus_demangle_type (di);
3067 1.1 christos if (type == NULL)
3068 1.1 christos return NULL;
3069 1.1 christos *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL);
3070 1.1 christos if (*ptl == NULL)
3071 1.1 christos return NULL;
3072 1.1 christos ptl = &d_right (*ptl);
3073 1.1 christos }
3074 1.1 christos
3075 1.1 christos /* There should be at least one parameter type besides the optional
3076 1.1 christos return type. A function which takes no arguments will have a
3077 1.1 christos single parameter type void. */
3078 1.1 christos if (tl == NULL)
3079 1.1 christos return NULL;
3080 1.1 christos
3081 1.1 christos /* If we have a single parameter type void, omit it. */
3082 1.1 christos if (d_right (tl) == NULL
3083 1.1 christos && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
3084 1.1 christos && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
3085 1.1 christos {
3086 1.1 christos di->expansion -= d_left (tl)->u.s_builtin.type->len;
3087 1.1 christos d_left (tl) = NULL;
3088 1.1 christos }
3089 1.1 christos
3090 1.1 christos return tl;
3091 1.1 christos }
3092 1.1 christos
3093 1.1 christos /* <bare-function-type> ::= [J]<type>+ */
3094 1.1 christos
3095 1.1 christos static struct demangle_component *
3096 1.1 christos d_bare_function_type (struct d_info *di, int has_return_type)
3097 1.1 christos {
3098 1.1 christos struct demangle_component *return_type;
3099 1.1 christos struct demangle_component *tl;
3100 1.1 christos char peek;
3101 1.1 christos
3102 1.1 christos /* Detect special qualifier indicating that the first argument
3103 1.1 christos is the return type. */
3104 1.1 christos peek = d_peek_char (di);
3105 1.1 christos if (peek == 'J')
3106 1.1 christos {
3107 1.1 christos d_advance (di, 1);
3108 1.1 christos has_return_type = 1;
3109 1.1 christos }
3110 1.1 christos
3111 1.1 christos if (has_return_type)
3112 1.1 christos {
3113 1.1 christos return_type = cplus_demangle_type (di);
3114 1.1 christos if (return_type == NULL)
3115 1.1 christos return NULL;
3116 1.1 christos }
3117 1.1 christos else
3118 1.1 christos return_type = NULL;
3119 1.1 christos
3120 1.1 christos tl = d_parmlist (di);
3121 1.1 christos if (tl == NULL)
3122 1.1 christos return NULL;
3123 1.1 christos
3124 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE,
3125 1.1 christos return_type, tl);
3126 1.1 christos }
3127 1.1 christos
3128 1.1 christos /* <class-enum-type> ::= <name> */
3129 1.1 christos
3130 1.1 christos static struct demangle_component *
3131 1.8 christos d_class_enum_type (struct d_info *di, int substable)
3132 1.1 christos {
3133 1.8 christos return d_name (di, substable);
3134 1.1 christos }
3135 1.1 christos
3136 1.1 christos /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
3137 1.1 christos ::= A [<(dimension) expression>] _ <(element) type>
3138 1.1 christos */
3139 1.1 christos
3140 1.1 christos static struct demangle_component *
3141 1.1 christos d_array_type (struct d_info *di)
3142 1.1 christos {
3143 1.1 christos char peek;
3144 1.1 christos struct demangle_component *dim;
3145 1.1 christos
3146 1.1 christos if (! d_check_char (di, 'A'))
3147 1.1 christos return NULL;
3148 1.1 christos
3149 1.1 christos peek = d_peek_char (di);
3150 1.1 christos if (peek == '_')
3151 1.1 christos dim = NULL;
3152 1.1 christos else if (IS_DIGIT (peek))
3153 1.1 christos {
3154 1.1 christos const char *s;
3155 1.1 christos
3156 1.1 christos s = d_str (di);
3157 1.1 christos do
3158 1.1 christos {
3159 1.1 christos d_advance (di, 1);
3160 1.1 christos peek = d_peek_char (di);
3161 1.1 christos }
3162 1.1 christos while (IS_DIGIT (peek));
3163 1.1 christos dim = d_make_name (di, s, d_str (di) - s);
3164 1.1 christos if (dim == NULL)
3165 1.1 christos return NULL;
3166 1.1 christos }
3167 1.1 christos else
3168 1.1 christos {
3169 1.1 christos dim = d_expression (di);
3170 1.1 christos if (dim == NULL)
3171 1.1 christos return NULL;
3172 1.1 christos }
3173 1.1 christos
3174 1.1 christos if (! d_check_char (di, '_'))
3175 1.1 christos return NULL;
3176 1.1 christos
3177 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim,
3178 1.1 christos cplus_demangle_type (di));
3179 1.1 christos }
3180 1.1 christos
3181 1.1 christos /* <vector-type> ::= Dv <number> _ <type>
3182 1.1 christos ::= Dv _ <expression> _ <type> */
3183 1.1 christos
3184 1.1 christos static struct demangle_component *
3185 1.1 christos d_vector_type (struct d_info *di)
3186 1.1 christos {
3187 1.1 christos char peek;
3188 1.1 christos struct demangle_component *dim;
3189 1.1 christos
3190 1.1 christos peek = d_peek_char (di);
3191 1.1 christos if (peek == '_')
3192 1.1 christos {
3193 1.1 christos d_advance (di, 1);
3194 1.1 christos dim = d_expression (di);
3195 1.1 christos }
3196 1.1 christos else
3197 1.1 christos dim = d_number_component (di);
3198 1.1 christos
3199 1.1 christos if (dim == NULL)
3200 1.1 christos return NULL;
3201 1.1 christos
3202 1.1 christos if (! d_check_char (di, '_'))
3203 1.1 christos return NULL;
3204 1.1 christos
3205 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_VECTOR_TYPE, dim,
3206 1.1 christos cplus_demangle_type (di));
3207 1.1 christos }
3208 1.1 christos
3209 1.1 christos /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
3210 1.1 christos
3211 1.1 christos static struct demangle_component *
3212 1.1 christos d_pointer_to_member_type (struct d_info *di)
3213 1.1 christos {
3214 1.1 christos struct demangle_component *cl;
3215 1.1 christos struct demangle_component *mem;
3216 1.1 christos
3217 1.1 christos if (! d_check_char (di, 'M'))
3218 1.1 christos return NULL;
3219 1.1 christos
3220 1.1 christos cl = cplus_demangle_type (di);
3221 1.3 christos if (cl == NULL)
3222 1.3 christos return NULL;
3223 1.3 christos
3224 1.3 christos /* The ABI says, "The type of a non-static member function is considered
3225 1.3 christos to be different, for the purposes of substitution, from the type of a
3226 1.3 christos namespace-scope or static member function whose type appears
3227 1.3 christos similar. The types of two non-static member functions are considered
3228 1.3 christos to be different, for the purposes of substitution, if the functions
3229 1.3 christos are members of different classes. In other words, for the purposes of
3230 1.3 christos substitution, the class of which the function is a member is
3231 1.3 christos considered part of the type of function."
3232 1.3 christos
3233 1.3 christos For a pointer to member function, this call to cplus_demangle_type
3234 1.3 christos will end up adding a (possibly qualified) non-member function type to
3235 1.3 christos the substitution table, which is not correct; however, the member
3236 1.3 christos function type will never be used in a substitution, so putting the
3237 1.3 christos wrong type in the substitution table is harmless. */
3238 1.1 christos
3239 1.3 christos mem = cplus_demangle_type (di);
3240 1.3 christos if (mem == NULL)
3241 1.1 christos return NULL;
3242 1.1 christos
3243 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem);
3244 1.1 christos }
3245 1.1 christos
3246 1.1 christos /* <non-negative number> _ */
3247 1.1 christos
3248 1.6 christos static int
3249 1.1 christos d_compact_number (struct d_info *di)
3250 1.1 christos {
3251 1.6 christos int num;
3252 1.1 christos if (d_peek_char (di) == '_')
3253 1.1 christos num = 0;
3254 1.1 christos else if (d_peek_char (di) == 'n')
3255 1.1 christos return -1;
3256 1.1 christos else
3257 1.1 christos num = d_number (di) + 1;
3258 1.1 christos
3259 1.6 christos if (num < 0 || ! d_check_char (di, '_'))
3260 1.1 christos return -1;
3261 1.1 christos return num;
3262 1.1 christos }
3263 1.1 christos
3264 1.1 christos /* <template-param> ::= T_
3265 1.1 christos ::= T <(parameter-2 non-negative) number> _
3266 1.1 christos */
3267 1.1 christos
3268 1.1 christos static struct demangle_component *
3269 1.1 christos d_template_param (struct d_info *di)
3270 1.1 christos {
3271 1.6 christos int param;
3272 1.1 christos
3273 1.1 christos if (! d_check_char (di, 'T'))
3274 1.1 christos return NULL;
3275 1.1 christos
3276 1.1 christos param = d_compact_number (di);
3277 1.1 christos if (param < 0)
3278 1.1 christos return NULL;
3279 1.1 christos
3280 1.1 christos return d_make_template_param (di, param);
3281 1.1 christos }
3282 1.1 christos
3283 1.1 christos /* <template-args> ::= I <template-arg>+ E */
3284 1.1 christos
3285 1.1 christos static struct demangle_component *
3286 1.1 christos d_template_args (struct d_info *di)
3287 1.1 christos {
3288 1.6 christos if (d_peek_char (di) != 'I'
3289 1.6 christos && d_peek_char (di) != 'J')
3290 1.6 christos return NULL;
3291 1.6 christos d_advance (di, 1);
3292 1.6 christos
3293 1.6 christos return d_template_args_1 (di);
3294 1.6 christos }
3295 1.6 christos
3296 1.9 christos /* <template-arg>* [Q <constraint-expression>] E */
3297 1.6 christos
3298 1.6 christos static struct demangle_component *
3299 1.6 christos d_template_args_1 (struct d_info *di)
3300 1.6 christos {
3301 1.1 christos struct demangle_component *hold_last_name;
3302 1.1 christos struct demangle_component *al;
3303 1.1 christos struct demangle_component **pal;
3304 1.1 christos
3305 1.1 christos /* Preserve the last name we saw--don't let the template arguments
3306 1.1 christos clobber it, as that would give us the wrong name for a subsequent
3307 1.1 christos constructor or destructor. */
3308 1.1 christos hold_last_name = di->last_name;
3309 1.1 christos
3310 1.1 christos if (d_peek_char (di) == 'E')
3311 1.1 christos {
3312 1.1 christos /* An argument pack can be empty. */
3313 1.1 christos d_advance (di, 1);
3314 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, NULL, NULL);
3315 1.1 christos }
3316 1.1 christos
3317 1.1 christos al = NULL;
3318 1.1 christos pal = &al;
3319 1.1 christos while (1)
3320 1.1 christos {
3321 1.1 christos struct demangle_component *a;
3322 1.1 christos
3323 1.1 christos a = d_template_arg (di);
3324 1.1 christos if (a == NULL)
3325 1.1 christos return NULL;
3326 1.1 christos
3327 1.1 christos *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL);
3328 1.1 christos if (*pal == NULL)
3329 1.1 christos return NULL;
3330 1.1 christos pal = &d_right (*pal);
3331 1.1 christos
3332 1.9 christos char peek = d_peek_char (di);
3333 1.9 christos if (peek == 'E' || peek == 'Q')
3334 1.9 christos break;
3335 1.1 christos }
3336 1.1 christos
3337 1.9 christos al = d_maybe_constraints (di, al);
3338 1.9 christos
3339 1.9 christos if (d_peek_char (di) != 'E')
3340 1.9 christos return NULL;
3341 1.9 christos d_advance (di, 1);
3342 1.9 christos
3343 1.1 christos di->last_name = hold_last_name;
3344 1.1 christos
3345 1.1 christos return al;
3346 1.1 christos }
3347 1.1 christos
3348 1.1 christos /* <template-arg> ::= <type>
3349 1.1 christos ::= X <expression> E
3350 1.1 christos ::= <expr-primary>
3351 1.1 christos */
3352 1.1 christos
3353 1.1 christos static struct demangle_component *
3354 1.1 christos d_template_arg (struct d_info *di)
3355 1.1 christos {
3356 1.1 christos struct demangle_component *ret;
3357 1.1 christos
3358 1.1 christos switch (d_peek_char (di))
3359 1.1 christos {
3360 1.1 christos case 'X':
3361 1.1 christos d_advance (di, 1);
3362 1.1 christos ret = d_expression (di);
3363 1.1 christos if (! d_check_char (di, 'E'))
3364 1.1 christos return NULL;
3365 1.1 christos return ret;
3366 1.1 christos
3367 1.1 christos case 'L':
3368 1.1 christos return d_expr_primary (di);
3369 1.1 christos
3370 1.1 christos case 'I':
3371 1.1 christos case 'J':
3372 1.1 christos /* An argument pack. */
3373 1.1 christos return d_template_args (di);
3374 1.1 christos
3375 1.1 christos default:
3376 1.1 christos return cplus_demangle_type (di);
3377 1.1 christos }
3378 1.1 christos }
3379 1.1 christos
3380 1.1 christos /* Parse a sequence of expressions until we hit the terminator
3381 1.1 christos character. */
3382 1.1 christos
3383 1.1 christos static struct demangle_component *
3384 1.1 christos d_exprlist (struct d_info *di, char terminator)
3385 1.1 christos {
3386 1.1 christos struct demangle_component *list = NULL;
3387 1.1 christos struct demangle_component **p = &list;
3388 1.1 christos
3389 1.1 christos if (d_peek_char (di) == terminator)
3390 1.1 christos {
3391 1.1 christos d_advance (di, 1);
3392 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, NULL, NULL);
3393 1.1 christos }
3394 1.1 christos
3395 1.1 christos while (1)
3396 1.1 christos {
3397 1.1 christos struct demangle_component *arg = d_expression (di);
3398 1.1 christos if (arg == NULL)
3399 1.1 christos return NULL;
3400 1.1 christos
3401 1.1 christos *p = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, arg, NULL);
3402 1.1 christos if (*p == NULL)
3403 1.1 christos return NULL;
3404 1.1 christos p = &d_right (*p);
3405 1.1 christos
3406 1.1 christos if (d_peek_char (di) == terminator)
3407 1.1 christos {
3408 1.1 christos d_advance (di, 1);
3409 1.1 christos break;
3410 1.1 christos }
3411 1.1 christos }
3412 1.1 christos
3413 1.1 christos return list;
3414 1.1 christos }
3415 1.1 christos
3416 1.1 christos /* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
3417 1.1 christos dynamic_cast, static_cast or reinterpret_cast. */
3418 1.1 christos
3419 1.1 christos static int
3420 1.1 christos op_is_new_cast (struct demangle_component *op)
3421 1.1 christos {
3422 1.1 christos const char *code = op->u.s_operator.op->code;
3423 1.1 christos return (code[1] == 'c'
3424 1.1 christos && (code[0] == 's' || code[0] == 'd'
3425 1.1 christos || code[0] == 'c' || code[0] == 'r'));
3426 1.1 christos }
3427 1.1 christos
3428 1.8 christos /* <unresolved-name> ::= [gs] <base-unresolved-name> # x or (with "gs") ::x
3429 1.8 christos ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x
3430 1.8 christos # T::N::x /decltype(p)::N::x
3431 1.8 christos ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name>
3432 1.8 christos # A::x, N::y, A<T>::z; "gs" means leading "::"
3433 1.8 christos ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name>
3434 1.8 christos
3435 1.8 christos "gs" is handled elsewhere, as a unary operator. */
3436 1.8 christos
3437 1.8 christos static struct demangle_component *
3438 1.8 christos d_unresolved_name (struct d_info *di)
3439 1.8 christos {
3440 1.8 christos struct demangle_component *type;
3441 1.8 christos struct demangle_component *name;
3442 1.8 christos char peek;
3443 1.8 christos
3444 1.8 christos /* Consume the "sr". */
3445 1.8 christos d_advance (di, 2);
3446 1.8 christos
3447 1.8 christos peek = d_peek_char (di);
3448 1.8 christos if (di->unresolved_name_state
3449 1.8 christos && (IS_DIGIT (peek)
3450 1.8 christos || IS_LOWER (peek)
3451 1.8 christos || peek == 'C'
3452 1.8 christos || peek == 'U'
3453 1.8 christos || peek == 'L'))
3454 1.8 christos {
3455 1.8 christos /* The third production is ambiguous with the old unresolved-name syntax
3456 1.8 christos of <type> <base-unresolved-name>; in the old mangling, A::x was mangled
3457 1.8 christos as sr1A1x, now sr1AE1x. So we first try to demangle using the new
3458 1.8 christos mangling, then with the old if that fails. */
3459 1.8 christos di->unresolved_name_state = -1;
3460 1.8 christos type = d_prefix (di, 0);
3461 1.8 christos if (d_peek_char (di) == 'E')
3462 1.8 christos d_advance (di, 1);
3463 1.8 christos }
3464 1.8 christos else
3465 1.8 christos type = cplus_demangle_type (di);
3466 1.8 christos name = d_unqualified_name (di, type, NULL);
3467 1.8 christos if (d_peek_char (di) == 'I')
3468 1.8 christos name = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3469 1.8 christos d_template_args (di));
3470 1.8 christos return name;
3471 1.8 christos }
3472 1.8 christos
3473 1.1 christos /* <expression> ::= <(unary) operator-name> <expression>
3474 1.1 christos ::= <(binary) operator-name> <expression> <expression>
3475 1.1 christos ::= <(trinary) operator-name> <expression> <expression> <expression>
3476 1.1 christos ::= cl <expression>+ E
3477 1.1 christos ::= st <type>
3478 1.1 christos ::= <template-param>
3479 1.8 christos ::= u <source-name> <template-arg>* E # vendor extended expression
3480 1.8 christos ::= <unresolved-name>
3481 1.1 christos ::= <expr-primary>
3482 1.8 christos
3483 1.8 christos <braced-expression> ::= <expression>
3484 1.8 christos ::= di <field source-name> <braced-expression> # .name = expr
3485 1.8 christos ::= dx <index expression> <braced-expression> # [expr] = expr
3486 1.8 christos ::= dX <range begin expression> <range end expression> <braced-expression>
3487 1.8 christos # [expr ... expr] = expr
3488 1.1 christos */
3489 1.1 christos
3490 1.8 christos static struct demangle_component *
3491 1.3 christos d_expression_1 (struct d_info *di)
3492 1.1 christos {
3493 1.1 christos char peek;
3494 1.1 christos
3495 1.1 christos peek = d_peek_char (di);
3496 1.1 christos if (peek == 'L')
3497 1.1 christos return d_expr_primary (di);
3498 1.1 christos else if (peek == 'T')
3499 1.1 christos return d_template_param (di);
3500 1.1 christos else if (peek == 's' && d_peek_next_char (di) == 'r')
3501 1.8 christos return d_unresolved_name (di);
3502 1.1 christos else if (peek == 's' && d_peek_next_char (di) == 'p')
3503 1.1 christos {
3504 1.1 christos d_advance (di, 2);
3505 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
3506 1.3 christos d_expression_1 (di), NULL);
3507 1.1 christos }
3508 1.1 christos else if (peek == 'f' && d_peek_next_char (di) == 'p')
3509 1.1 christos {
3510 1.1 christos /* Function parameter used in a late-specified return type. */
3511 1.1 christos int index;
3512 1.1 christos d_advance (di, 2);
3513 1.1 christos if (d_peek_char (di) == 'T')
3514 1.1 christos {
3515 1.1 christos /* 'this' parameter. */
3516 1.1 christos d_advance (di, 1);
3517 1.1 christos index = 0;
3518 1.1 christos }
3519 1.1 christos else
3520 1.1 christos {
3521 1.6 christos index = d_compact_number (di);
3522 1.6 christos if (index == INT_MAX || index == -1)
3523 1.1 christos return NULL;
3524 1.6 christos index++;
3525 1.1 christos }
3526 1.1 christos return d_make_function_param (di, index);
3527 1.1 christos }
3528 1.1 christos else if (IS_DIGIT (peek)
3529 1.1 christos || (peek == 'o' && d_peek_next_char (di) == 'n'))
3530 1.1 christos {
3531 1.1 christos /* We can get an unqualified name as an expression in the case of
3532 1.1 christos a dependent function call, i.e. decltype(f(t)). */
3533 1.1 christos struct demangle_component *name;
3534 1.1 christos
3535 1.1 christos if (peek == 'o')
3536 1.1 christos /* operator-function-id, i.e. operator+(t). */
3537 1.1 christos d_advance (di, 2);
3538 1.1 christos
3539 1.8 christos name = d_unqualified_name (di, NULL, NULL);
3540 1.1 christos if (name == NULL)
3541 1.1 christos return NULL;
3542 1.1 christos if (d_peek_char (di) == 'I')
3543 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3544 1.1 christos d_template_args (di));
3545 1.1 christos else
3546 1.1 christos return name;
3547 1.1 christos }
3548 1.1 christos else if ((peek == 'i' || peek == 't')
3549 1.1 christos && d_peek_next_char (di) == 'l')
3550 1.1 christos {
3551 1.1 christos /* Brace-enclosed initializer list, untyped or typed. */
3552 1.1 christos struct demangle_component *type = NULL;
3553 1.7 christos d_advance (di, 2);
3554 1.1 christos if (peek == 't')
3555 1.1 christos type = cplus_demangle_type (di);
3556 1.7 christos if (!d_peek_char (di) || !d_peek_next_char (di))
3557 1.5 christos return NULL;
3558 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_INITIALIZER_LIST,
3559 1.1 christos type, d_exprlist (di, 'E'));
3560 1.1 christos }
3561 1.8 christos else if (peek == 'u')
3562 1.8 christos {
3563 1.8 christos /* A vendor extended expression. */
3564 1.8 christos struct demangle_component *name, *args;
3565 1.8 christos d_advance (di, 1);
3566 1.8 christos name = d_source_name (di);
3567 1.8 christos args = d_template_args_1 (di);
3568 1.8 christos return d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_EXPR, name, args);
3569 1.8 christos }
3570 1.1 christos else
3571 1.1 christos {
3572 1.1 christos struct demangle_component *op;
3573 1.1 christos const char *code = NULL;
3574 1.1 christos int args;
3575 1.1 christos
3576 1.1 christos op = d_operator_name (di);
3577 1.1 christos if (op == NULL)
3578 1.1 christos return NULL;
3579 1.1 christos
3580 1.1 christos if (op->type == DEMANGLE_COMPONENT_OPERATOR)
3581 1.1 christos {
3582 1.1 christos code = op->u.s_operator.op->code;
3583 1.1 christos di->expansion += op->u.s_operator.op->len - 2;
3584 1.1 christos if (strcmp (code, "st") == 0)
3585 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3586 1.1 christos cplus_demangle_type (di));
3587 1.1 christos }
3588 1.1 christos
3589 1.1 christos switch (op->type)
3590 1.1 christos {
3591 1.1 christos default:
3592 1.1 christos return NULL;
3593 1.1 christos case DEMANGLE_COMPONENT_OPERATOR:
3594 1.1 christos args = op->u.s_operator.op->args;
3595 1.1 christos break;
3596 1.1 christos case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
3597 1.1 christos args = op->u.s_extended_operator.args;
3598 1.1 christos break;
3599 1.1 christos case DEMANGLE_COMPONENT_CAST:
3600 1.1 christos args = 1;
3601 1.1 christos break;
3602 1.1 christos }
3603 1.1 christos
3604 1.1 christos switch (args)
3605 1.1 christos {
3606 1.1 christos case 0:
3607 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_NULLARY, op, NULL);
3608 1.1 christos
3609 1.1 christos case 1:
3610 1.1 christos {
3611 1.1 christos struct demangle_component *operand;
3612 1.1 christos int suffix = 0;
3613 1.1 christos
3614 1.1 christos if (code && (code[0] == 'p' || code[0] == 'm')
3615 1.1 christos && code[1] == code[0])
3616 1.1 christos /* pp_ and mm_ are the prefix variants. */
3617 1.1 christos suffix = !d_check_char (di, '_');
3618 1.1 christos
3619 1.1 christos if (op->type == DEMANGLE_COMPONENT_CAST
3620 1.1 christos && d_check_char (di, '_'))
3621 1.1 christos operand = d_exprlist (di, 'E');
3622 1.6 christos else if (code && !strcmp (code, "sP"))
3623 1.6 christos operand = d_template_args_1 (di);
3624 1.1 christos else
3625 1.3 christos operand = d_expression_1 (di);
3626 1.1 christos
3627 1.1 christos if (suffix)
3628 1.1 christos /* Indicate the suffix variant for d_print_comp. */
3629 1.6 christos operand = d_make_comp (di, DEMANGLE_COMPONENT_BINARY_ARGS,
3630 1.6 christos operand, operand);
3631 1.6 christos
3632 1.6 christos return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op, operand);
3633 1.1 christos }
3634 1.1 christos case 2:
3635 1.1 christos {
3636 1.1 christos struct demangle_component *left;
3637 1.1 christos struct demangle_component *right;
3638 1.1 christos
3639 1.5 christos if (code == NULL)
3640 1.5 christos return NULL;
3641 1.1 christos if (op_is_new_cast (op))
3642 1.1 christos left = cplus_demangle_type (di);
3643 1.6 christos else if (code[0] == 'f')
3644 1.6 christos /* fold-expression. */
3645 1.6 christos left = d_operator_name (di);
3646 1.8 christos else if (!strcmp (code, "di"))
3647 1.8 christos left = d_unqualified_name (di, NULL, NULL);
3648 1.1 christos else
3649 1.3 christos left = d_expression_1 (di);
3650 1.1 christos if (!strcmp (code, "cl"))
3651 1.1 christos right = d_exprlist (di, 'E');
3652 1.1 christos else if (!strcmp (code, "dt") || !strcmp (code, "pt"))
3653 1.1 christos {
3654 1.8 christos peek = d_peek_char (di);
3655 1.8 christos /* These codes start a qualified name. */
3656 1.8 christos if ((peek == 'g' && d_peek_next_char (di) == 's')
3657 1.8 christos || (peek == 's' && d_peek_next_char (di) == 'r'))
3658 1.8 christos right = d_expression_1 (di);
3659 1.8 christos else
3660 1.8 christos {
3661 1.8 christos /* Otherwise it's an unqualified name. We use
3662 1.8 christos d_unqualified_name rather than d_expression_1 here for
3663 1.8 christos old mangled names that didn't add 'on' before operator
3664 1.8 christos names. */
3665 1.8 christos right = d_unqualified_name (di, NULL, NULL);
3666 1.8 christos if (d_peek_char (di) == 'I')
3667 1.8 christos right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE,
3668 1.8 christos right, d_template_args (di));
3669 1.8 christos }
3670 1.1 christos }
3671 1.1 christos else
3672 1.3 christos right = d_expression_1 (di);
3673 1.1 christos
3674 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
3675 1.1 christos d_make_comp (di,
3676 1.1 christos DEMANGLE_COMPONENT_BINARY_ARGS,
3677 1.1 christos left, right));
3678 1.1 christos }
3679 1.1 christos case 3:
3680 1.1 christos {
3681 1.1 christos struct demangle_component *first;
3682 1.1 christos struct demangle_component *second;
3683 1.1 christos struct demangle_component *third;
3684 1.1 christos
3685 1.5 christos if (code == NULL)
3686 1.5 christos return NULL;
3687 1.8 christos else if (!strcmp (code, "qu")
3688 1.8 christos || !strcmp (code, "dX"))
3689 1.1 christos {
3690 1.1 christos /* ?: expression. */
3691 1.3 christos first = d_expression_1 (di);
3692 1.3 christos second = d_expression_1 (di);
3693 1.3 christos third = d_expression_1 (di);
3694 1.6 christos if (third == NULL)
3695 1.6 christos return NULL;
3696 1.6 christos }
3697 1.6 christos else if (code[0] == 'f')
3698 1.6 christos {
3699 1.6 christos /* fold-expression. */
3700 1.6 christos first = d_operator_name (di);
3701 1.6 christos second = d_expression_1 (di);
3702 1.6 christos third = d_expression_1 (di);
3703 1.6 christos if (third == NULL)
3704 1.6 christos return NULL;
3705 1.1 christos }
3706 1.1 christos else if (code[0] == 'n')
3707 1.1 christos {
3708 1.1 christos /* new-expression. */
3709 1.1 christos if (code[1] != 'w' && code[1] != 'a')
3710 1.1 christos return NULL;
3711 1.1 christos first = d_exprlist (di, '_');
3712 1.1 christos second = cplus_demangle_type (di);
3713 1.1 christos if (d_peek_char (di) == 'E')
3714 1.1 christos {
3715 1.1 christos d_advance (di, 1);
3716 1.1 christos third = NULL;
3717 1.1 christos }
3718 1.1 christos else if (d_peek_char (di) == 'p'
3719 1.1 christos && d_peek_next_char (di) == 'i')
3720 1.1 christos {
3721 1.1 christos /* Parenthesized initializer. */
3722 1.1 christos d_advance (di, 2);
3723 1.1 christos third = d_exprlist (di, 'E');
3724 1.1 christos }
3725 1.1 christos else if (d_peek_char (di) == 'i'
3726 1.1 christos && d_peek_next_char (di) == 'l')
3727 1.1 christos /* initializer-list. */
3728 1.3 christos third = d_expression_1 (di);
3729 1.1 christos else
3730 1.1 christos return NULL;
3731 1.1 christos }
3732 1.1 christos else
3733 1.1 christos return NULL;
3734 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op,
3735 1.1 christos d_make_comp (di,
3736 1.1 christos DEMANGLE_COMPONENT_TRINARY_ARG1,
3737 1.1 christos first,
3738 1.1 christos d_make_comp (di,
3739 1.1 christos DEMANGLE_COMPONENT_TRINARY_ARG2,
3740 1.1 christos second, third)));
3741 1.1 christos }
3742 1.1 christos default:
3743 1.1 christos return NULL;
3744 1.1 christos }
3745 1.1 christos }
3746 1.1 christos }
3747 1.1 christos
3748 1.3 christos static struct demangle_component *
3749 1.3 christos d_expression (struct d_info *di)
3750 1.3 christos {
3751 1.3 christos struct demangle_component *ret;
3752 1.3 christos int was_expression = di->is_expression;
3753 1.3 christos
3754 1.3 christos di->is_expression = 1;
3755 1.3 christos ret = d_expression_1 (di);
3756 1.3 christos di->is_expression = was_expression;
3757 1.3 christos return ret;
3758 1.3 christos }
3759 1.3 christos
3760 1.1 christos /* <expr-primary> ::= L <type> <(value) number> E
3761 1.1 christos ::= L <type> <(value) float> E
3762 1.1 christos ::= L <mangled-name> E
3763 1.1 christos */
3764 1.1 christos
3765 1.1 christos static struct demangle_component *
3766 1.1 christos d_expr_primary (struct d_info *di)
3767 1.1 christos {
3768 1.1 christos struct demangle_component *ret;
3769 1.1 christos
3770 1.1 christos if (! d_check_char (di, 'L'))
3771 1.1 christos return NULL;
3772 1.1 christos if (d_peek_char (di) == '_'
3773 1.1 christos /* Workaround for G++ bug; see comment in write_template_arg. */
3774 1.1 christos || d_peek_char (di) == 'Z')
3775 1.1 christos ret = cplus_demangle_mangled_name (di, 0);
3776 1.1 christos else
3777 1.1 christos {
3778 1.1 christos struct demangle_component *type;
3779 1.1 christos enum demangle_component_type t;
3780 1.1 christos const char *s;
3781 1.1 christos
3782 1.1 christos type = cplus_demangle_type (di);
3783 1.1 christos if (type == NULL)
3784 1.1 christos return NULL;
3785 1.1 christos
3786 1.1 christos /* If we have a type we know how to print, we aren't going to
3787 1.1 christos print the type name itself. */
3788 1.1 christos if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
3789 1.1 christos && type->u.s_builtin.type->print != D_PRINT_DEFAULT)
3790 1.1 christos di->expansion -= type->u.s_builtin.type->len;
3791 1.1 christos
3792 1.7 christos if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
3793 1.7 christos && strcmp (type->u.s_builtin.type->name,
3794 1.7 christos cplus_demangle_builtin_types[33].name) == 0)
3795 1.7 christos {
3796 1.7 christos if (d_peek_char (di) == 'E')
3797 1.7 christos {
3798 1.7 christos d_advance (di, 1);
3799 1.7 christos return type;
3800 1.7 christos }
3801 1.7 christos }
3802 1.7 christos
3803 1.1 christos /* Rather than try to interpret the literal value, we just
3804 1.1 christos collect it as a string. Note that it's possible to have a
3805 1.1 christos floating point literal here. The ABI specifies that the
3806 1.1 christos format of such literals is machine independent. That's fine,
3807 1.1 christos but what's not fine is that versions of g++ up to 3.2 with
3808 1.1 christos -fabi-version=1 used upper case letters in the hex constant,
3809 1.1 christos and dumped out gcc's internal representation. That makes it
3810 1.1 christos hard to tell where the constant ends, and hard to dump the
3811 1.1 christos constant in any readable form anyhow. We don't attempt to
3812 1.1 christos handle these cases. */
3813 1.1 christos
3814 1.1 christos t = DEMANGLE_COMPONENT_LITERAL;
3815 1.1 christos if (d_peek_char (di) == 'n')
3816 1.1 christos {
3817 1.1 christos t = DEMANGLE_COMPONENT_LITERAL_NEG;
3818 1.1 christos d_advance (di, 1);
3819 1.1 christos }
3820 1.1 christos s = d_str (di);
3821 1.1 christos while (d_peek_char (di) != 'E')
3822 1.1 christos {
3823 1.1 christos if (d_peek_char (di) == '\0')
3824 1.1 christos return NULL;
3825 1.1 christos d_advance (di, 1);
3826 1.1 christos }
3827 1.1 christos ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s));
3828 1.1 christos }
3829 1.1 christos if (! d_check_char (di, 'E'))
3830 1.1 christos return NULL;
3831 1.1 christos return ret;
3832 1.1 christos }
3833 1.1 christos
3834 1.1 christos /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3835 1.1 christos ::= Z <(function) encoding> E s [<discriminator>]
3836 1.3 christos ::= Z <(function) encoding> E d [<parameter> number>] _ <entity name>
3837 1.1 christos */
3838 1.1 christos
3839 1.1 christos static struct demangle_component *
3840 1.1 christos d_local_name (struct d_info *di)
3841 1.1 christos {
3842 1.1 christos struct demangle_component *function;
3843 1.6 christos struct demangle_component *name;
3844 1.1 christos
3845 1.1 christos if (! d_check_char (di, 'Z'))
3846 1.1 christos return NULL;
3847 1.1 christos
3848 1.1 christos function = d_encoding (di, 0);
3849 1.6 christos if (!function)
3850 1.6 christos return NULL;
3851 1.1 christos
3852 1.1 christos if (! d_check_char (di, 'E'))
3853 1.1 christos return NULL;
3854 1.1 christos
3855 1.1 christos if (d_peek_char (di) == 's')
3856 1.1 christos {
3857 1.1 christos d_advance (di, 1);
3858 1.1 christos if (! d_discriminator (di))
3859 1.1 christos return NULL;
3860 1.6 christos name = d_make_name (di, "string literal", sizeof "string literal" - 1);
3861 1.1 christos }
3862 1.1 christos else
3863 1.1 christos {
3864 1.1 christos int num = -1;
3865 1.1 christos
3866 1.1 christos if (d_peek_char (di) == 'd')
3867 1.1 christos {
3868 1.1 christos /* Default argument scope: d <number> _. */
3869 1.1 christos d_advance (di, 1);
3870 1.1 christos num = d_compact_number (di);
3871 1.1 christos if (num < 0)
3872 1.1 christos return NULL;
3873 1.1 christos }
3874 1.1 christos
3875 1.8 christos name = d_name (di, 0);
3876 1.6 christos
3877 1.6 christos if (name
3878 1.6 christos /* Lambdas and unnamed types have internal discriminators
3879 1.6 christos and are not functions. */
3880 1.6 christos && name->type != DEMANGLE_COMPONENT_LAMBDA
3881 1.6 christos && name->type != DEMANGLE_COMPONENT_UNNAMED_TYPE)
3882 1.6 christos {
3883 1.6 christos /* Read and ignore an optional discriminator. */
3884 1.6 christos if (! d_discriminator (di))
3885 1.6 christos return NULL;
3886 1.6 christos }
3887 1.6 christos
3888 1.1 christos if (num >= 0)
3889 1.1 christos name = d_make_default_arg (di, num, name);
3890 1.1 christos }
3891 1.6 christos
3892 1.6 christos /* Elide the return type of the containing function so as to not
3893 1.6 christos confuse the user thinking it is the return type of whatever local
3894 1.6 christos function we might be containing. */
3895 1.6 christos if (function->type == DEMANGLE_COMPONENT_TYPED_NAME
3896 1.6 christos && d_right (function)->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
3897 1.6 christos d_left (d_right (function)) = NULL;
3898 1.6 christos
3899 1.6 christos return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
3900 1.1 christos }
3901 1.1 christos
3902 1.6 christos /* <discriminator> ::= _ <number> # when number < 10
3903 1.6 christos ::= __ <number> _ # when number >= 10
3904 1.6 christos
3905 1.6 christos <discriminator> ::= _ <number> # when number >=10
3906 1.6 christos is also accepted to support gcc versions that wrongly mangled that way.
3907 1.1 christos
3908 1.1 christos We demangle the discriminator, but we don't print it out. FIXME:
3909 1.1 christos We should print it out in verbose mode. */
3910 1.1 christos
3911 1.1 christos static int
3912 1.1 christos d_discriminator (struct d_info *di)
3913 1.1 christos {
3914 1.6 christos int discrim, num_underscores = 1;
3915 1.1 christos
3916 1.1 christos if (d_peek_char (di) != '_')
3917 1.1 christos return 1;
3918 1.1 christos d_advance (di, 1);
3919 1.6 christos if (d_peek_char (di) == '_')
3920 1.6 christos {
3921 1.6 christos ++num_underscores;
3922 1.6 christos d_advance (di, 1);
3923 1.6 christos }
3924 1.6 christos
3925 1.1 christos discrim = d_number (di);
3926 1.1 christos if (discrim < 0)
3927 1.1 christos return 0;
3928 1.6 christos if (num_underscores > 1 && discrim >= 10)
3929 1.6 christos {
3930 1.6 christos if (d_peek_char (di) == '_')
3931 1.6 christos d_advance (di, 1);
3932 1.6 christos else
3933 1.6 christos return 0;
3934 1.6 christos }
3935 1.6 christos
3936 1.1 christos return 1;
3937 1.1 christos }
3938 1.1 christos
3939 1.9 christos /* <template-parm> ::= Ty
3940 1.9 christos ::= Tn <type>
3941 1.9 christos ::= Tt <template-head> E
3942 1.9 christos ::= Tp <template-parm> */
3943 1.9 christos
3944 1.9 christos static struct demangle_component *
3945 1.9 christos d_template_parm (struct d_info *di, int *bad)
3946 1.9 christos {
3947 1.9 christos if (d_peek_char (di) != 'T')
3948 1.9 christos return NULL;
3949 1.9 christos
3950 1.9 christos struct demangle_component *op;
3951 1.9 christos enum demangle_component_type kind;
3952 1.9 christos switch (d_peek_next_char (di))
3953 1.9 christos {
3954 1.9 christos default:
3955 1.9 christos return NULL;
3956 1.9 christos
3957 1.9 christos case 'p': /* Pack */
3958 1.9 christos d_advance (di, 2);
3959 1.9 christos op = d_template_parm (di, bad);
3960 1.9 christos kind = DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM;
3961 1.9 christos if (!op)
3962 1.9 christos {
3963 1.9 christos *bad = 1;
3964 1.9 christos return NULL;
3965 1.9 christos }
3966 1.9 christos break;
3967 1.9 christos
3968 1.9 christos case 'y': /* Typename */
3969 1.9 christos d_advance (di, 2);
3970 1.9 christos op = NULL;
3971 1.9 christos kind = DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM;
3972 1.9 christos break;
3973 1.9 christos
3974 1.9 christos case 'n': /* Non-Type */
3975 1.9 christos d_advance (di, 2);
3976 1.9 christos op = cplus_demangle_type (di);
3977 1.9 christos kind = DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM;
3978 1.9 christos if (!op)
3979 1.9 christos {
3980 1.9 christos *bad = 1;
3981 1.9 christos return NULL;
3982 1.9 christos }
3983 1.9 christos break;
3984 1.9 christos
3985 1.9 christos case 't': /* Template */
3986 1.9 christos d_advance (di, 2);
3987 1.9 christos op = d_template_head (di, bad);
3988 1.9 christos kind = DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM;
3989 1.9 christos if (!op || !d_check_char (di, 'E'))
3990 1.9 christos {
3991 1.9 christos *bad = 1;
3992 1.9 christos return NULL;
3993 1.9 christos }
3994 1.9 christos }
3995 1.9 christos
3996 1.9 christos return d_make_comp (di, kind, op, NULL);
3997 1.9 christos }
3998 1.9 christos
3999 1.9 christos /* <template-head> ::= <template-head>? <template-parm> */
4000 1.9 christos
4001 1.9 christos static struct demangle_component *
4002 1.9 christos d_template_head (struct d_info *di, int *bad)
4003 1.9 christos {
4004 1.9 christos struct demangle_component *res = NULL, **slot = &res;
4005 1.9 christos struct demangle_component *op;
4006 1.9 christos
4007 1.9 christos while ((op = d_template_parm (di, bad)))
4008 1.9 christos {
4009 1.9 christos *slot = op;
4010 1.9 christos slot = &d_right (op);
4011 1.9 christos }
4012 1.9 christos
4013 1.9 christos /* Wrap it in a template head, to make concatenating with any parm list, and
4014 1.9 christos printing simpler. */
4015 1.9 christos if (res)
4016 1.9 christos res = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_HEAD, res, NULL);
4017 1.9 christos
4018 1.9 christos return res;
4019 1.9 christos }
4020 1.9 christos
4021 1.9 christos /* <closure-type-name> ::= Ul <template-head>? <lambda-sig> E [ <nonnegative number> ] _ */
4022 1.1 christos
4023 1.1 christos static struct demangle_component *
4024 1.1 christos d_lambda (struct d_info *di)
4025 1.1 christos {
4026 1.1 christos if (! d_check_char (di, 'U'))
4027 1.1 christos return NULL;
4028 1.1 christos if (! d_check_char (di, 'l'))
4029 1.1 christos return NULL;
4030 1.1 christos
4031 1.9 christos int bad = 0;
4032 1.9 christos struct demangle_component *head = d_template_head (di, &bad);
4033 1.9 christos if (bad)
4034 1.9 christos return NULL;
4035 1.9 christos
4036 1.9 christos struct demangle_component *tl = d_parmlist (di);
4037 1.1 christos if (tl == NULL)
4038 1.1 christos return NULL;
4039 1.9 christos if (head)
4040 1.9 christos {
4041 1.9 christos d_right (head) = tl;
4042 1.9 christos tl = head;
4043 1.9 christos }
4044 1.1 christos
4045 1.1 christos if (! d_check_char (di, 'E'))
4046 1.1 christos return NULL;
4047 1.1 christos
4048 1.9 christos int num = d_compact_number (di);
4049 1.1 christos if (num < 0)
4050 1.1 christos return NULL;
4051 1.1 christos
4052 1.9 christos struct demangle_component *ret = d_make_empty (di);
4053 1.1 christos if (ret)
4054 1.1 christos {
4055 1.1 christos ret->type = DEMANGLE_COMPONENT_LAMBDA;
4056 1.1 christos ret->u.s_unary_num.sub = tl;
4057 1.1 christos ret->u.s_unary_num.num = num;
4058 1.1 christos }
4059 1.1 christos
4060 1.1 christos return ret;
4061 1.1 christos }
4062 1.1 christos
4063 1.1 christos /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
4064 1.1 christos
4065 1.1 christos static struct demangle_component *
4066 1.1 christos d_unnamed_type (struct d_info *di)
4067 1.1 christos {
4068 1.1 christos struct demangle_component *ret;
4069 1.6 christos int num;
4070 1.1 christos
4071 1.1 christos if (! d_check_char (di, 'U'))
4072 1.1 christos return NULL;
4073 1.1 christos if (! d_check_char (di, 't'))
4074 1.1 christos return NULL;
4075 1.1 christos
4076 1.1 christos num = d_compact_number (di);
4077 1.1 christos if (num < 0)
4078 1.1 christos return NULL;
4079 1.1 christos
4080 1.1 christos ret = d_make_empty (di);
4081 1.1 christos if (ret)
4082 1.1 christos {
4083 1.1 christos ret->type = DEMANGLE_COMPONENT_UNNAMED_TYPE;
4084 1.1 christos ret->u.s_number.number = num;
4085 1.1 christos }
4086 1.1 christos
4087 1.1 christos if (! d_add_substitution (di, ret))
4088 1.1 christos return NULL;
4089 1.1 christos
4090 1.1 christos return ret;
4091 1.1 christos }
4092 1.1 christos
4093 1.1 christos /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
4094 1.1 christos */
4095 1.1 christos
4096 1.1 christos static struct demangle_component *
4097 1.1 christos d_clone_suffix (struct d_info *di, struct demangle_component *encoding)
4098 1.1 christos {
4099 1.1 christos const char *suffix = d_str (di);
4100 1.1 christos const char *pend = suffix;
4101 1.1 christos struct demangle_component *n;
4102 1.1 christos
4103 1.8 christos if (*pend == '.' && (IS_LOWER (pend[1]) || IS_DIGIT (pend[1])
4104 1.8 christos || pend[1] == '_'))
4105 1.1 christos {
4106 1.1 christos pend += 2;
4107 1.8 christos while (IS_LOWER (*pend) || IS_DIGIT (*pend) || *pend == '_')
4108 1.1 christos ++pend;
4109 1.1 christos }
4110 1.1 christos while (*pend == '.' && IS_DIGIT (pend[1]))
4111 1.1 christos {
4112 1.1 christos pend += 2;
4113 1.1 christos while (IS_DIGIT (*pend))
4114 1.1 christos ++pend;
4115 1.1 christos }
4116 1.1 christos d_advance (di, pend - suffix);
4117 1.1 christos n = d_make_name (di, suffix, pend - suffix);
4118 1.1 christos return d_make_comp (di, DEMANGLE_COMPONENT_CLONE, encoding, n);
4119 1.1 christos }
4120 1.1 christos
4121 1.1 christos /* Add a new substitution. */
4122 1.1 christos
4123 1.1 christos static int
4124 1.1 christos d_add_substitution (struct d_info *di, struct demangle_component *dc)
4125 1.1 christos {
4126 1.1 christos if (dc == NULL)
4127 1.1 christos return 0;
4128 1.1 christos if (di->next_sub >= di->num_subs)
4129 1.1 christos return 0;
4130 1.1 christos di->subs[di->next_sub] = dc;
4131 1.1 christos ++di->next_sub;
4132 1.1 christos return 1;
4133 1.1 christos }
4134 1.1 christos
4135 1.1 christos /* <substitution> ::= S <seq-id> _
4136 1.1 christos ::= S_
4137 1.1 christos ::= St
4138 1.1 christos ::= Sa
4139 1.1 christos ::= Sb
4140 1.1 christos ::= Ss
4141 1.1 christos ::= Si
4142 1.1 christos ::= So
4143 1.1 christos ::= Sd
4144 1.1 christos
4145 1.1 christos If PREFIX is non-zero, then this type is being used as a prefix in
4146 1.1 christos a qualified name. In this case, for the standard substitutions, we
4147 1.1 christos need to check whether we are being used as a prefix for a
4148 1.1 christos constructor or destructor, and return a full template name.
4149 1.1 christos Otherwise we will get something like std::iostream::~iostream()
4150 1.1 christos which does not correspond particularly well to any function which
4151 1.1 christos actually appears in the source.
4152 1.1 christos */
4153 1.1 christos
4154 1.1 christos static const struct d_standard_sub_info standard_subs[] =
4155 1.1 christos {
4156 1.1 christos { 't', NL ("std"),
4157 1.1 christos NL ("std"),
4158 1.1 christos NULL, 0 },
4159 1.1 christos { 'a', NL ("std::allocator"),
4160 1.1 christos NL ("std::allocator"),
4161 1.1 christos NL ("allocator") },
4162 1.1 christos { 'b', NL ("std::basic_string"),
4163 1.1 christos NL ("std::basic_string"),
4164 1.1 christos NL ("basic_string") },
4165 1.1 christos { 's', NL ("std::string"),
4166 1.1 christos NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
4167 1.1 christos NL ("basic_string") },
4168 1.1 christos { 'i', NL ("std::istream"),
4169 1.1 christos NL ("std::basic_istream<char, std::char_traits<char> >"),
4170 1.1 christos NL ("basic_istream") },
4171 1.1 christos { 'o', NL ("std::ostream"),
4172 1.1 christos NL ("std::basic_ostream<char, std::char_traits<char> >"),
4173 1.1 christos NL ("basic_ostream") },
4174 1.1 christos { 'd', NL ("std::iostream"),
4175 1.1 christos NL ("std::basic_iostream<char, std::char_traits<char> >"),
4176 1.1 christos NL ("basic_iostream") }
4177 1.1 christos };
4178 1.1 christos
4179 1.1 christos static struct demangle_component *
4180 1.1 christos d_substitution (struct d_info *di, int prefix)
4181 1.1 christos {
4182 1.1 christos char c;
4183 1.1 christos
4184 1.1 christos if (! d_check_char (di, 'S'))
4185 1.1 christos return NULL;
4186 1.1 christos
4187 1.1 christos c = d_next_char (di);
4188 1.1 christos if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
4189 1.1 christos {
4190 1.1 christos unsigned int id;
4191 1.1 christos
4192 1.1 christos id = 0;
4193 1.1 christos if (c != '_')
4194 1.1 christos {
4195 1.1 christos do
4196 1.1 christos {
4197 1.1 christos unsigned int new_id;
4198 1.1 christos
4199 1.1 christos if (IS_DIGIT (c))
4200 1.1 christos new_id = id * 36 + c - '0';
4201 1.1 christos else if (IS_UPPER (c))
4202 1.1 christos new_id = id * 36 + c - 'A' + 10;
4203 1.1 christos else
4204 1.1 christos return NULL;
4205 1.1 christos if (new_id < id)
4206 1.1 christos return NULL;
4207 1.1 christos id = new_id;
4208 1.1 christos c = d_next_char (di);
4209 1.1 christos }
4210 1.1 christos while (c != '_');
4211 1.1 christos
4212 1.1 christos ++id;
4213 1.1 christos }
4214 1.1 christos
4215 1.1 christos if (id >= (unsigned int) di->next_sub)
4216 1.1 christos return NULL;
4217 1.1 christos
4218 1.1 christos return di->subs[id];
4219 1.1 christos }
4220 1.1 christos else
4221 1.1 christos {
4222 1.1 christos int verbose;
4223 1.1 christos const struct d_standard_sub_info *p;
4224 1.1 christos const struct d_standard_sub_info *pend;
4225 1.1 christos
4226 1.1 christos verbose = (di->options & DMGL_VERBOSE) != 0;
4227 1.1 christos if (! verbose && prefix)
4228 1.1 christos {
4229 1.1 christos char peek;
4230 1.1 christos
4231 1.1 christos peek = d_peek_char (di);
4232 1.1 christos if (peek == 'C' || peek == 'D')
4233 1.1 christos verbose = 1;
4234 1.1 christos }
4235 1.1 christos
4236 1.1 christos pend = (&standard_subs[0]
4237 1.1 christos + sizeof standard_subs / sizeof standard_subs[0]);
4238 1.1 christos for (p = &standard_subs[0]; p < pend; ++p)
4239 1.1 christos {
4240 1.1 christos if (c == p->code)
4241 1.1 christos {
4242 1.1 christos const char *s;
4243 1.1 christos int len;
4244 1.6 christos struct demangle_component *dc;
4245 1.1 christos
4246 1.1 christos if (p->set_last_name != NULL)
4247 1.1 christos di->last_name = d_make_sub (di, p->set_last_name,
4248 1.1 christos p->set_last_name_len);
4249 1.1 christos if (verbose)
4250 1.1 christos {
4251 1.1 christos s = p->full_expansion;
4252 1.1 christos len = p->full_len;
4253 1.1 christos }
4254 1.1 christos else
4255 1.1 christos {
4256 1.1 christos s = p->simple_expansion;
4257 1.1 christos len = p->simple_len;
4258 1.1 christos }
4259 1.1 christos di->expansion += len;
4260 1.6 christos dc = d_make_sub (di, s, len);
4261 1.3 christos if (d_peek_char (di) == 'B')
4262 1.3 christos {
4263 1.3 christos /* If there are ABI tags on the abbreviation, it becomes
4264 1.3 christos a substitution candidate. */
4265 1.6 christos dc = d_abi_tags (di, dc);
4266 1.6 christos if (! d_add_substitution (di, dc))
4267 1.6 christos return NULL;
4268 1.3 christos }
4269 1.6 christos return dc;
4270 1.1 christos }
4271 1.1 christos }
4272 1.1 christos
4273 1.1 christos return NULL;
4274 1.1 christos }
4275 1.1 christos }
4276 1.1 christos
4277 1.3 christos static void
4278 1.3 christos d_checkpoint (struct d_info *di, struct d_info_checkpoint *checkpoint)
4279 1.3 christos {
4280 1.3 christos checkpoint->n = di->n;
4281 1.3 christos checkpoint->next_comp = di->next_comp;
4282 1.3 christos checkpoint->next_sub = di->next_sub;
4283 1.3 christos checkpoint->expansion = di->expansion;
4284 1.3 christos }
4285 1.3 christos
4286 1.3 christos static void
4287 1.3 christos d_backtrack (struct d_info *di, struct d_info_checkpoint *checkpoint)
4288 1.3 christos {
4289 1.3 christos di->n = checkpoint->n;
4290 1.3 christos di->next_comp = checkpoint->next_comp;
4291 1.3 christos di->next_sub = checkpoint->next_sub;
4292 1.3 christos di->expansion = checkpoint->expansion;
4293 1.3 christos }
4294 1.3 christos
4295 1.1 christos /* Initialize a growable string. */
4296 1.1 christos
4297 1.1 christos static void
4298 1.1 christos d_growable_string_init (struct d_growable_string *dgs, size_t estimate)
4299 1.1 christos {
4300 1.1 christos dgs->buf = NULL;
4301 1.1 christos dgs->len = 0;
4302 1.1 christos dgs->alc = 0;
4303 1.1 christos dgs->allocation_failure = 0;
4304 1.1 christos
4305 1.1 christos if (estimate > 0)
4306 1.1 christos d_growable_string_resize (dgs, estimate);
4307 1.1 christos }
4308 1.1 christos
4309 1.1 christos /* Grow a growable string to a given size. */
4310 1.1 christos
4311 1.1 christos static inline void
4312 1.1 christos d_growable_string_resize (struct d_growable_string *dgs, size_t need)
4313 1.1 christos {
4314 1.1 christos size_t newalc;
4315 1.1 christos char *newbuf;
4316 1.1 christos
4317 1.1 christos if (dgs->allocation_failure)
4318 1.1 christos return;
4319 1.1 christos
4320 1.1 christos /* Start allocation at two bytes to avoid any possibility of confusion
4321 1.1 christos with the special value of 1 used as a return in *palc to indicate
4322 1.1 christos allocation failures. */
4323 1.1 christos newalc = dgs->alc > 0 ? dgs->alc : 2;
4324 1.1 christos while (newalc < need)
4325 1.1 christos newalc <<= 1;
4326 1.1 christos
4327 1.1 christos newbuf = (char *) realloc (dgs->buf, newalc);
4328 1.1 christos if (newbuf == NULL)
4329 1.1 christos {
4330 1.1 christos free (dgs->buf);
4331 1.1 christos dgs->buf = NULL;
4332 1.1 christos dgs->len = 0;
4333 1.1 christos dgs->alc = 0;
4334 1.1 christos dgs->allocation_failure = 1;
4335 1.1 christos return;
4336 1.1 christos }
4337 1.1 christos dgs->buf = newbuf;
4338 1.1 christos dgs->alc = newalc;
4339 1.1 christos }
4340 1.1 christos
4341 1.1 christos /* Append a buffer to a growable string. */
4342 1.1 christos
4343 1.1 christos static inline void
4344 1.1 christos d_growable_string_append_buffer (struct d_growable_string *dgs,
4345 1.1 christos const char *s, size_t l)
4346 1.1 christos {
4347 1.1 christos size_t need;
4348 1.1 christos
4349 1.1 christos need = dgs->len + l + 1;
4350 1.1 christos if (need > dgs->alc)
4351 1.1 christos d_growable_string_resize (dgs, need);
4352 1.1 christos
4353 1.1 christos if (dgs->allocation_failure)
4354 1.1 christos return;
4355 1.1 christos
4356 1.1 christos memcpy (dgs->buf + dgs->len, s, l);
4357 1.1 christos dgs->buf[dgs->len + l] = '\0';
4358 1.1 christos dgs->len += l;
4359 1.1 christos }
4360 1.1 christos
4361 1.1 christos /* Bridge growable strings to the callback mechanism. */
4362 1.1 christos
4363 1.1 christos static void
4364 1.1 christos d_growable_string_callback_adapter (const char *s, size_t l, void *opaque)
4365 1.1 christos {
4366 1.1 christos struct d_growable_string *dgs = (struct d_growable_string*) opaque;
4367 1.1 christos
4368 1.1 christos d_growable_string_append_buffer (dgs, s, l);
4369 1.1 christos }
4370 1.1 christos
4371 1.3 christos /* Walk the tree, counting the number of templates encountered, and
4372 1.3 christos the number of times a scope might be saved. These counts will be
4373 1.3 christos used to allocate data structures for d_print_comp, so the logic
4374 1.3 christos here must mirror the logic d_print_comp will use. It is not
4375 1.3 christos important that the resulting numbers are exact, so long as they
4376 1.3 christos are larger than the actual numbers encountered. */
4377 1.3 christos
4378 1.3 christos static void
4379 1.7 christos d_count_templates_scopes (struct d_print_info *dpi,
4380 1.7 christos struct demangle_component *dc)
4381 1.3 christos {
4382 1.7 christos if (dc == NULL || dc->d_counting > 1 || dpi->recursion > MAX_RECURSION_COUNT)
4383 1.3 christos return;
4384 1.3 christos
4385 1.7 christos ++ dc->d_counting;
4386 1.7 christos
4387 1.3 christos switch (dc->type)
4388 1.3 christos {
4389 1.3 christos case DEMANGLE_COMPONENT_NAME:
4390 1.3 christos case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4391 1.3 christos case DEMANGLE_COMPONENT_FUNCTION_PARAM:
4392 1.3 christos case DEMANGLE_COMPONENT_SUB_STD:
4393 1.3 christos case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4394 1.9 christos case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE:
4395 1.3 christos case DEMANGLE_COMPONENT_OPERATOR:
4396 1.3 christos case DEMANGLE_COMPONENT_CHARACTER:
4397 1.3 christos case DEMANGLE_COMPONENT_NUMBER:
4398 1.3 christos case DEMANGLE_COMPONENT_UNNAMED_TYPE:
4399 1.8 christos case DEMANGLE_COMPONENT_STRUCTURED_BINDING:
4400 1.8 christos case DEMANGLE_COMPONENT_MODULE_NAME:
4401 1.8 christos case DEMANGLE_COMPONENT_MODULE_PARTITION:
4402 1.8 christos case DEMANGLE_COMPONENT_MODULE_INIT:
4403 1.9 christos case DEMANGLE_COMPONENT_FIXED_TYPE:
4404 1.9 christos case DEMANGLE_COMPONENT_TEMPLATE_HEAD:
4405 1.9 christos case DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM:
4406 1.9 christos case DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM:
4407 1.9 christos case DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM:
4408 1.9 christos case DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM:
4409 1.3 christos break;
4410 1.3 christos
4411 1.3 christos case DEMANGLE_COMPONENT_TEMPLATE:
4412 1.7 christos dpi->num_copy_templates++;
4413 1.3 christos goto recurse_left_right;
4414 1.3 christos
4415 1.3 christos case DEMANGLE_COMPONENT_REFERENCE:
4416 1.3 christos case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
4417 1.3 christos if (d_left (dc)->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
4418 1.7 christos dpi->num_saved_scopes++;
4419 1.3 christos goto recurse_left_right;
4420 1.3 christos
4421 1.3 christos case DEMANGLE_COMPONENT_QUAL_NAME:
4422 1.3 christos case DEMANGLE_COMPONENT_LOCAL_NAME:
4423 1.3 christos case DEMANGLE_COMPONENT_TYPED_NAME:
4424 1.3 christos case DEMANGLE_COMPONENT_VTABLE:
4425 1.3 christos case DEMANGLE_COMPONENT_VTT:
4426 1.3 christos case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
4427 1.3 christos case DEMANGLE_COMPONENT_TYPEINFO:
4428 1.3 christos case DEMANGLE_COMPONENT_TYPEINFO_NAME:
4429 1.3 christos case DEMANGLE_COMPONENT_TYPEINFO_FN:
4430 1.3 christos case DEMANGLE_COMPONENT_THUNK:
4431 1.3 christos case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
4432 1.3 christos case DEMANGLE_COMPONENT_COVARIANT_THUNK:
4433 1.3 christos case DEMANGLE_COMPONENT_JAVA_CLASS:
4434 1.3 christos case DEMANGLE_COMPONENT_GUARD:
4435 1.3 christos case DEMANGLE_COMPONENT_TLS_INIT:
4436 1.3 christos case DEMANGLE_COMPONENT_TLS_WRAPPER:
4437 1.3 christos case DEMANGLE_COMPONENT_REFTEMP:
4438 1.3 christos case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
4439 1.3 christos case DEMANGLE_COMPONENT_RESTRICT:
4440 1.3 christos case DEMANGLE_COMPONENT_VOLATILE:
4441 1.3 christos case DEMANGLE_COMPONENT_CONST:
4442 1.3 christos case DEMANGLE_COMPONENT_RESTRICT_THIS:
4443 1.3 christos case DEMANGLE_COMPONENT_VOLATILE_THIS:
4444 1.3 christos case DEMANGLE_COMPONENT_CONST_THIS:
4445 1.3 christos case DEMANGLE_COMPONENT_REFERENCE_THIS:
4446 1.3 christos case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
4447 1.9 christos case DEMANGLE_COMPONENT_XOBJ_MEMBER_FUNCTION:
4448 1.5 christos case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
4449 1.6 christos case DEMANGLE_COMPONENT_NOEXCEPT:
4450 1.6 christos case DEMANGLE_COMPONENT_THROW_SPEC:
4451 1.3 christos case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
4452 1.3 christos case DEMANGLE_COMPONENT_POINTER:
4453 1.3 christos case DEMANGLE_COMPONENT_COMPLEX:
4454 1.3 christos case DEMANGLE_COMPONENT_IMAGINARY:
4455 1.3 christos case DEMANGLE_COMPONENT_VENDOR_TYPE:
4456 1.3 christos case DEMANGLE_COMPONENT_FUNCTION_TYPE:
4457 1.3 christos case DEMANGLE_COMPONENT_ARRAY_TYPE:
4458 1.3 christos case DEMANGLE_COMPONENT_PTRMEM_TYPE:
4459 1.3 christos case DEMANGLE_COMPONENT_VECTOR_TYPE:
4460 1.3 christos case DEMANGLE_COMPONENT_ARGLIST:
4461 1.3 christos case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
4462 1.7 christos case DEMANGLE_COMPONENT_TPARM_OBJ:
4463 1.3 christos case DEMANGLE_COMPONENT_INITIALIZER_LIST:
4464 1.3 christos case DEMANGLE_COMPONENT_CAST:
4465 1.5 christos case DEMANGLE_COMPONENT_CONVERSION:
4466 1.3 christos case DEMANGLE_COMPONENT_NULLARY:
4467 1.3 christos case DEMANGLE_COMPONENT_UNARY:
4468 1.3 christos case DEMANGLE_COMPONENT_BINARY:
4469 1.3 christos case DEMANGLE_COMPONENT_BINARY_ARGS:
4470 1.3 christos case DEMANGLE_COMPONENT_TRINARY:
4471 1.3 christos case DEMANGLE_COMPONENT_TRINARY_ARG1:
4472 1.3 christos case DEMANGLE_COMPONENT_TRINARY_ARG2:
4473 1.3 christos case DEMANGLE_COMPONENT_LITERAL:
4474 1.3 christos case DEMANGLE_COMPONENT_LITERAL_NEG:
4475 1.8 christos case DEMANGLE_COMPONENT_VENDOR_EXPR:
4476 1.3 christos case DEMANGLE_COMPONENT_JAVA_RESOURCE:
4477 1.3 christos case DEMANGLE_COMPONENT_COMPOUND_NAME:
4478 1.3 christos case DEMANGLE_COMPONENT_DECLTYPE:
4479 1.3 christos case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
4480 1.3 christos case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
4481 1.3 christos case DEMANGLE_COMPONENT_PACK_EXPANSION:
4482 1.3 christos case DEMANGLE_COMPONENT_TAGGED_NAME:
4483 1.3 christos case DEMANGLE_COMPONENT_CLONE:
4484 1.9 christos case DEMANGLE_COMPONENT_CONSTRAINTS:
4485 1.3 christos recurse_left_right:
4486 1.7 christos /* PR 89394 - Check for too much recursion. */
4487 1.7 christos if (dpi->recursion > DEMANGLE_RECURSION_LIMIT)
4488 1.7 christos /* FIXME: There ought to be a way to report to the
4489 1.7 christos user that the recursion limit has been reached. */
4490 1.7 christos return;
4491 1.7 christos
4492 1.7 christos ++ dpi->recursion;
4493 1.7 christos d_count_templates_scopes (dpi, d_left (dc));
4494 1.7 christos d_count_templates_scopes (dpi, d_right (dc));
4495 1.7 christos -- dpi->recursion;
4496 1.3 christos break;
4497 1.3 christos
4498 1.3 christos case DEMANGLE_COMPONENT_CTOR:
4499 1.7 christos d_count_templates_scopes (dpi, dc->u.s_ctor.name);
4500 1.3 christos break;
4501 1.3 christos
4502 1.3 christos case DEMANGLE_COMPONENT_DTOR:
4503 1.7 christos d_count_templates_scopes (dpi, dc->u.s_dtor.name);
4504 1.3 christos break;
4505 1.3 christos
4506 1.3 christos case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4507 1.7 christos d_count_templates_scopes (dpi, dc->u.s_extended_operator.name);
4508 1.3 christos break;
4509 1.3 christos
4510 1.3 christos case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
4511 1.3 christos case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
4512 1.8 christos case DEMANGLE_COMPONENT_MODULE_ENTITY:
4513 1.9 christos case DEMANGLE_COMPONENT_FRIEND:
4514 1.7 christos d_count_templates_scopes (dpi, d_left (dc));
4515 1.3 christos break;
4516 1.3 christos
4517 1.3 christos case DEMANGLE_COMPONENT_LAMBDA:
4518 1.3 christos case DEMANGLE_COMPONENT_DEFAULT_ARG:
4519 1.7 christos d_count_templates_scopes (dpi, dc->u.s_unary_num.sub);
4520 1.3 christos break;
4521 1.3 christos }
4522 1.3 christos }
4523 1.3 christos
4524 1.1 christos /* Initialize a print information structure. */
4525 1.1 christos
4526 1.1 christos static void
4527 1.1 christos d_print_init (struct d_print_info *dpi, demangle_callbackref callback,
4528 1.7 christos void *opaque, struct demangle_component *dc)
4529 1.1 christos {
4530 1.1 christos dpi->len = 0;
4531 1.1 christos dpi->last_char = '\0';
4532 1.1 christos dpi->templates = NULL;
4533 1.1 christos dpi->modifiers = NULL;
4534 1.1 christos dpi->pack_index = 0;
4535 1.1 christos dpi->flush_count = 0;
4536 1.1 christos
4537 1.1 christos dpi->callback = callback;
4538 1.1 christos dpi->opaque = opaque;
4539 1.1 christos
4540 1.1 christos dpi->demangle_failure = 0;
4541 1.6 christos dpi->recursion = 0;
4542 1.9 christos dpi->lambda_tpl_parms = 0;
4543 1.3 christos
4544 1.3 christos dpi->component_stack = NULL;
4545 1.3 christos
4546 1.3 christos dpi->saved_scopes = NULL;
4547 1.3 christos dpi->next_saved_scope = 0;
4548 1.3 christos dpi->num_saved_scopes = 0;
4549 1.3 christos
4550 1.3 christos dpi->copy_templates = NULL;
4551 1.3 christos dpi->next_copy_template = 0;
4552 1.3 christos dpi->num_copy_templates = 0;
4553 1.3 christos
4554 1.7 christos d_count_templates_scopes (dpi, dc);
4555 1.7 christos /* If we did not reach the recursion limit, then reset the
4556 1.7 christos current recursion value back to 0, so that we can print
4557 1.7 christos the templates. */
4558 1.7 christos if (dpi->recursion < DEMANGLE_RECURSION_LIMIT)
4559 1.7 christos dpi->recursion = 0;
4560 1.3 christos dpi->num_copy_templates *= dpi->num_saved_scopes;
4561 1.3 christos
4562 1.3 christos dpi->current_template = NULL;
4563 1.1 christos }
4564 1.1 christos
4565 1.1 christos /* Indicate that an error occurred during printing, and test for error. */
4566 1.1 christos
4567 1.1 christos static inline void
4568 1.1 christos d_print_error (struct d_print_info *dpi)
4569 1.1 christos {
4570 1.1 christos dpi->demangle_failure = 1;
4571 1.1 christos }
4572 1.1 christos
4573 1.1 christos static inline int
4574 1.1 christos d_print_saw_error (struct d_print_info *dpi)
4575 1.1 christos {
4576 1.1 christos return dpi->demangle_failure != 0;
4577 1.1 christos }
4578 1.1 christos
4579 1.1 christos /* Flush buffered characters to the callback. */
4580 1.1 christos
4581 1.1 christos static inline void
4582 1.1 christos d_print_flush (struct d_print_info *dpi)
4583 1.1 christos {
4584 1.1 christos dpi->buf[dpi->len] = '\0';
4585 1.1 christos dpi->callback (dpi->buf, dpi->len, dpi->opaque);
4586 1.1 christos dpi->len = 0;
4587 1.1 christos dpi->flush_count++;
4588 1.1 christos }
4589 1.1 christos
4590 1.1 christos /* Append characters and buffers for printing. */
4591 1.1 christos
4592 1.1 christos static inline void
4593 1.1 christos d_append_char (struct d_print_info *dpi, char c)
4594 1.1 christos {
4595 1.1 christos if (dpi->len == sizeof (dpi->buf) - 1)
4596 1.1 christos d_print_flush (dpi);
4597 1.1 christos
4598 1.1 christos dpi->buf[dpi->len++] = c;
4599 1.1 christos dpi->last_char = c;
4600 1.1 christos }
4601 1.1 christos
4602 1.1 christos static inline void
4603 1.1 christos d_append_buffer (struct d_print_info *dpi, const char *s, size_t l)
4604 1.1 christos {
4605 1.1 christos size_t i;
4606 1.1 christos
4607 1.1 christos for (i = 0; i < l; i++)
4608 1.1 christos d_append_char (dpi, s[i]);
4609 1.1 christos }
4610 1.1 christos
4611 1.1 christos static inline void
4612 1.1 christos d_append_string (struct d_print_info *dpi, const char *s)
4613 1.1 christos {
4614 1.1 christos d_append_buffer (dpi, s, strlen (s));
4615 1.1 christos }
4616 1.1 christos
4617 1.1 christos static inline void
4618 1.6 christos d_append_num (struct d_print_info *dpi, int l)
4619 1.1 christos {
4620 1.1 christos char buf[25];
4621 1.6 christos sprintf (buf,"%d", l);
4622 1.1 christos d_append_string (dpi, buf);
4623 1.1 christos }
4624 1.1 christos
4625 1.1 christos static inline char
4626 1.1 christos d_last_char (struct d_print_info *dpi)
4627 1.1 christos {
4628 1.1 christos return dpi->last_char;
4629 1.1 christos }
4630 1.1 christos
4631 1.1 christos /* Turn components into a human readable string. OPTIONS is the
4632 1.1 christos options bits passed to the demangler. DC is the tree to print.
4633 1.1 christos CALLBACK is a function to call to flush demangled string segments
4634 1.1 christos as they fill the intermediate buffer, and OPAQUE is a generalized
4635 1.1 christos callback argument. On success, this returns 1. On failure,
4636 1.1 christos it returns 0, indicating a bad parse. It does not use heap
4637 1.1 christos memory to build an output string, so cannot encounter memory
4638 1.1 christos allocation failure. */
4639 1.1 christos
4640 1.1 christos CP_STATIC_IF_GLIBCPP_V3
4641 1.1 christos int
4642 1.1 christos cplus_demangle_print_callback (int options,
4643 1.6 christos struct demangle_component *dc,
4644 1.1 christos demangle_callbackref callback, void *opaque)
4645 1.1 christos {
4646 1.1 christos struct d_print_info dpi;
4647 1.1 christos
4648 1.3 christos d_print_init (&dpi, callback, opaque, dc);
4649 1.1 christos
4650 1.3 christos {
4651 1.3 christos #ifdef CP_DYNAMIC_ARRAYS
4652 1.6 christos /* Avoid zero-length VLAs, which are prohibited by the C99 standard
4653 1.6 christos and flagged as errors by Address Sanitizer. */
4654 1.6 christos __extension__ struct d_saved_scope scopes[(dpi.num_saved_scopes > 0)
4655 1.6 christos ? dpi.num_saved_scopes : 1];
4656 1.6 christos __extension__ struct d_print_template temps[(dpi.num_copy_templates > 0)
4657 1.6 christos ? dpi.num_copy_templates : 1];
4658 1.3 christos
4659 1.3 christos dpi.saved_scopes = scopes;
4660 1.3 christos dpi.copy_templates = temps;
4661 1.3 christos #else
4662 1.3 christos dpi.saved_scopes = alloca (dpi.num_saved_scopes
4663 1.3 christos * sizeof (*dpi.saved_scopes));
4664 1.3 christos dpi.copy_templates = alloca (dpi.num_copy_templates
4665 1.3 christos * sizeof (*dpi.copy_templates));
4666 1.3 christos #endif
4667 1.3 christos
4668 1.3 christos d_print_comp (&dpi, options, dc);
4669 1.3 christos }
4670 1.1 christos
4671 1.1 christos d_print_flush (&dpi);
4672 1.1 christos
4673 1.1 christos return ! d_print_saw_error (&dpi);
4674 1.1 christos }
4675 1.1 christos
4676 1.1 christos /* Turn components into a human readable string. OPTIONS is the
4677 1.1 christos options bits passed to the demangler. DC is the tree to print.
4678 1.1 christos ESTIMATE is a guess at the length of the result. This returns a
4679 1.1 christos string allocated by malloc, or NULL on error. On success, this
4680 1.1 christos sets *PALC to the size of the allocated buffer. On failure, this
4681 1.1 christos sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
4682 1.1 christos failure. */
4683 1.1 christos
4684 1.1 christos CP_STATIC_IF_GLIBCPP_V3
4685 1.1 christos char *
4686 1.6 christos cplus_demangle_print (int options, struct demangle_component *dc,
4687 1.1 christos int estimate, size_t *palc)
4688 1.1 christos {
4689 1.1 christos struct d_growable_string dgs;
4690 1.1 christos
4691 1.1 christos d_growable_string_init (&dgs, estimate);
4692 1.1 christos
4693 1.1 christos if (! cplus_demangle_print_callback (options, dc,
4694 1.1 christos d_growable_string_callback_adapter,
4695 1.1 christos &dgs))
4696 1.1 christos {
4697 1.1 christos free (dgs.buf);
4698 1.1 christos *palc = 0;
4699 1.1 christos return NULL;
4700 1.1 christos }
4701 1.1 christos
4702 1.1 christos *palc = dgs.allocation_failure ? 1 : dgs.alc;
4703 1.1 christos return dgs.buf;
4704 1.1 christos }
4705 1.1 christos
4706 1.1 christos /* Returns the I'th element of the template arglist ARGS, or NULL on
4707 1.6 christos failure. If I is negative, return the entire arglist. */
4708 1.1 christos
4709 1.1 christos static struct demangle_component *
4710 1.1 christos d_index_template_argument (struct demangle_component *args, int i)
4711 1.1 christos {
4712 1.1 christos struct demangle_component *a;
4713 1.1 christos
4714 1.6 christos if (i < 0)
4715 1.6 christos /* Print the whole argument pack. */
4716 1.6 christos return args;
4717 1.6 christos
4718 1.1 christos for (a = args;
4719 1.1 christos a != NULL;
4720 1.1 christos a = d_right (a))
4721 1.1 christos {
4722 1.1 christos if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4723 1.1 christos return NULL;
4724 1.1 christos if (i <= 0)
4725 1.1 christos break;
4726 1.1 christos --i;
4727 1.1 christos }
4728 1.1 christos if (i != 0 || a == NULL)
4729 1.1 christos return NULL;
4730 1.1 christos
4731 1.1 christos return d_left (a);
4732 1.1 christos }
4733 1.1 christos
4734 1.1 christos /* Returns the template argument from the current context indicated by DC,
4735 1.1 christos which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
4736 1.1 christos
4737 1.1 christos static struct demangle_component *
4738 1.1 christos d_lookup_template_argument (struct d_print_info *dpi,
4739 1.1 christos const struct demangle_component *dc)
4740 1.1 christos {
4741 1.1 christos if (dpi->templates == NULL)
4742 1.1 christos {
4743 1.1 christos d_print_error (dpi);
4744 1.1 christos return NULL;
4745 1.1 christos }
4746 1.1 christos
4747 1.1 christos return d_index_template_argument
4748 1.1 christos (d_right (dpi->templates->template_decl),
4749 1.1 christos dc->u.s_number.number);
4750 1.1 christos }
4751 1.1 christos
4752 1.1 christos /* Returns a template argument pack used in DC (any will do), or NULL. */
4753 1.1 christos
4754 1.1 christos static struct demangle_component *
4755 1.1 christos d_find_pack (struct d_print_info *dpi,
4756 1.1 christos const struct demangle_component *dc)
4757 1.1 christos {
4758 1.1 christos struct demangle_component *a;
4759 1.1 christos if (dc == NULL)
4760 1.1 christos return NULL;
4761 1.1 christos
4762 1.1 christos switch (dc->type)
4763 1.1 christos {
4764 1.1 christos case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4765 1.1 christos a = d_lookup_template_argument (dpi, dc);
4766 1.1 christos if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4767 1.1 christos return a;
4768 1.1 christos return NULL;
4769 1.1 christos
4770 1.1 christos case DEMANGLE_COMPONENT_PACK_EXPANSION:
4771 1.1 christos return NULL;
4772 1.1 christos
4773 1.1 christos case DEMANGLE_COMPONENT_LAMBDA:
4774 1.1 christos case DEMANGLE_COMPONENT_NAME:
4775 1.3 christos case DEMANGLE_COMPONENT_TAGGED_NAME:
4776 1.1 christos case DEMANGLE_COMPONENT_OPERATOR:
4777 1.1 christos case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4778 1.9 christos case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE:
4779 1.1 christos case DEMANGLE_COMPONENT_SUB_STD:
4780 1.1 christos case DEMANGLE_COMPONENT_CHARACTER:
4781 1.1 christos case DEMANGLE_COMPONENT_FUNCTION_PARAM:
4782 1.1 christos case DEMANGLE_COMPONENT_UNNAMED_TYPE:
4783 1.5 christos case DEMANGLE_COMPONENT_DEFAULT_ARG:
4784 1.5 christos case DEMANGLE_COMPONENT_NUMBER:
4785 1.1 christos return NULL;
4786 1.1 christos
4787 1.1 christos case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4788 1.1 christos return d_find_pack (dpi, dc->u.s_extended_operator.name);
4789 1.1 christos case DEMANGLE_COMPONENT_CTOR:
4790 1.1 christos return d_find_pack (dpi, dc->u.s_ctor.name);
4791 1.1 christos case DEMANGLE_COMPONENT_DTOR:
4792 1.1 christos return d_find_pack (dpi, dc->u.s_dtor.name);
4793 1.1 christos
4794 1.1 christos default:
4795 1.1 christos a = d_find_pack (dpi, d_left (dc));
4796 1.1 christos if (a)
4797 1.1 christos return a;
4798 1.1 christos return d_find_pack (dpi, d_right (dc));
4799 1.1 christos }
4800 1.1 christos }
4801 1.1 christos
4802 1.1 christos /* Returns the length of the template argument pack DC. */
4803 1.1 christos
4804 1.1 christos static int
4805 1.1 christos d_pack_length (const struct demangle_component *dc)
4806 1.1 christos {
4807 1.1 christos int count = 0;
4808 1.1 christos while (dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
4809 1.1 christos && d_left (dc) != NULL)
4810 1.1 christos {
4811 1.1 christos ++count;
4812 1.1 christos dc = d_right (dc);
4813 1.1 christos }
4814 1.1 christos return count;
4815 1.1 christos }
4816 1.1 christos
4817 1.6 christos /* Returns the number of template args in DC, expanding any pack expansions
4818 1.6 christos found there. */
4819 1.6 christos
4820 1.6 christos static int
4821 1.6 christos d_args_length (struct d_print_info *dpi, const struct demangle_component *dc)
4822 1.6 christos {
4823 1.6 christos int count = 0;
4824 1.6 christos for (; dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST;
4825 1.6 christos dc = d_right (dc))
4826 1.6 christos {
4827 1.6 christos struct demangle_component *elt = d_left (dc);
4828 1.6 christos if (elt == NULL)
4829 1.6 christos break;
4830 1.6 christos if (elt->type == DEMANGLE_COMPONENT_PACK_EXPANSION)
4831 1.6 christos {
4832 1.6 christos struct demangle_component *a = d_find_pack (dpi, d_left (elt));
4833 1.6 christos count += d_pack_length (a);
4834 1.6 christos }
4835 1.6 christos else
4836 1.6 christos ++count;
4837 1.6 christos }
4838 1.6 christos return count;
4839 1.6 christos }
4840 1.6 christos
4841 1.1 christos /* DC is a component of a mangled expression. Print it, wrapped in parens
4842 1.1 christos if needed. */
4843 1.1 christos
4844 1.1 christos static void
4845 1.1 christos d_print_subexpr (struct d_print_info *dpi, int options,
4846 1.6 christos struct demangle_component *dc)
4847 1.1 christos {
4848 1.1 christos int simple = 0;
4849 1.1 christos if (dc->type == DEMANGLE_COMPONENT_NAME
4850 1.1 christos || dc->type == DEMANGLE_COMPONENT_QUAL_NAME
4851 1.1 christos || dc->type == DEMANGLE_COMPONENT_INITIALIZER_LIST
4852 1.1 christos || dc->type == DEMANGLE_COMPONENT_FUNCTION_PARAM)
4853 1.1 christos simple = 1;
4854 1.1 christos if (!simple)
4855 1.1 christos d_append_char (dpi, '(');
4856 1.1 christos d_print_comp (dpi, options, dc);
4857 1.1 christos if (!simple)
4858 1.1 christos d_append_char (dpi, ')');
4859 1.1 christos }
4860 1.1 christos
4861 1.3 christos /* Save the current scope. */
4862 1.3 christos
4863 1.3 christos static void
4864 1.3 christos d_save_scope (struct d_print_info *dpi,
4865 1.3 christos const struct demangle_component *container)
4866 1.3 christos {
4867 1.3 christos struct d_saved_scope *scope;
4868 1.3 christos struct d_print_template *src, **link;
4869 1.3 christos
4870 1.3 christos if (dpi->next_saved_scope >= dpi->num_saved_scopes)
4871 1.3 christos {
4872 1.3 christos d_print_error (dpi);
4873 1.3 christos return;
4874 1.3 christos }
4875 1.3 christos scope = &dpi->saved_scopes[dpi->next_saved_scope];
4876 1.3 christos dpi->next_saved_scope++;
4877 1.3 christos
4878 1.3 christos scope->container = container;
4879 1.3 christos link = &scope->templates;
4880 1.3 christos
4881 1.3 christos for (src = dpi->templates; src != NULL; src = src->next)
4882 1.3 christos {
4883 1.3 christos struct d_print_template *dst;
4884 1.3 christos
4885 1.3 christos if (dpi->next_copy_template >= dpi->num_copy_templates)
4886 1.3 christos {
4887 1.3 christos d_print_error (dpi);
4888 1.3 christos return;
4889 1.3 christos }
4890 1.3 christos dst = &dpi->copy_templates[dpi->next_copy_template];
4891 1.3 christos dpi->next_copy_template++;
4892 1.3 christos
4893 1.3 christos dst->template_decl = src->template_decl;
4894 1.3 christos *link = dst;
4895 1.3 christos link = &dst->next;
4896 1.3 christos }
4897 1.3 christos
4898 1.3 christos *link = NULL;
4899 1.3 christos }
4900 1.3 christos
4901 1.3 christos /* Attempt to locate a previously saved scope. Returns NULL if no
4902 1.3 christos corresponding saved scope was found. */
4903 1.3 christos
4904 1.3 christos static struct d_saved_scope *
4905 1.3 christos d_get_saved_scope (struct d_print_info *dpi,
4906 1.3 christos const struct demangle_component *container)
4907 1.3 christos {
4908 1.3 christos int i;
4909 1.3 christos
4910 1.3 christos for (i = 0; i < dpi->next_saved_scope; i++)
4911 1.3 christos if (dpi->saved_scopes[i].container == container)
4912 1.3 christos return &dpi->saved_scopes[i];
4913 1.3 christos
4914 1.3 christos return NULL;
4915 1.3 christos }
4916 1.3 christos
4917 1.6 christos /* If DC is a C++17 fold-expression, print it and return true; otherwise
4918 1.6 christos return false. */
4919 1.6 christos
4920 1.6 christos static int
4921 1.6 christos d_maybe_print_fold_expression (struct d_print_info *dpi, int options,
4922 1.6 christos struct demangle_component *dc)
4923 1.6 christos {
4924 1.6 christos struct demangle_component *ops, *operator_, *op1, *op2;
4925 1.6 christos int save_idx;
4926 1.6 christos
4927 1.6 christos const char *fold_code = d_left (dc)->u.s_operator.op->code;
4928 1.6 christos if (fold_code[0] != 'f')
4929 1.6 christos return 0;
4930 1.6 christos
4931 1.6 christos ops = d_right (dc);
4932 1.6 christos operator_ = d_left (ops);
4933 1.6 christos op1 = d_right (ops);
4934 1.6 christos op2 = 0;
4935 1.6 christos if (op1->type == DEMANGLE_COMPONENT_TRINARY_ARG2)
4936 1.6 christos {
4937 1.6 christos op2 = d_right (op1);
4938 1.6 christos op1 = d_left (op1);
4939 1.6 christos }
4940 1.6 christos
4941 1.6 christos /* Print the whole pack. */
4942 1.6 christos save_idx = dpi->pack_index;
4943 1.6 christos dpi->pack_index = -1;
4944 1.6 christos
4945 1.6 christos switch (fold_code[1])
4946 1.6 christos {
4947 1.6 christos /* Unary left fold, (... + X). */
4948 1.6 christos case 'l':
4949 1.6 christos d_append_string (dpi, "(...");
4950 1.6 christos d_print_expr_op (dpi, options, operator_);
4951 1.6 christos d_print_subexpr (dpi, options, op1);
4952 1.6 christos d_append_char (dpi, ')');
4953 1.6 christos break;
4954 1.6 christos
4955 1.6 christos /* Unary right fold, (X + ...). */
4956 1.6 christos case 'r':
4957 1.6 christos d_append_char (dpi, '(');
4958 1.6 christos d_print_subexpr (dpi, options, op1);
4959 1.6 christos d_print_expr_op (dpi, options, operator_);
4960 1.6 christos d_append_string (dpi, "...)");
4961 1.6 christos break;
4962 1.6 christos
4963 1.6 christos /* Binary left fold, (42 + ... + X). */
4964 1.6 christos case 'L':
4965 1.6 christos /* Binary right fold, (X + ... + 42). */
4966 1.6 christos case 'R':
4967 1.6 christos d_append_char (dpi, '(');
4968 1.6 christos d_print_subexpr (dpi, options, op1);
4969 1.6 christos d_print_expr_op (dpi, options, operator_);
4970 1.6 christos d_append_string (dpi, "...");
4971 1.6 christos d_print_expr_op (dpi, options, operator_);
4972 1.6 christos d_print_subexpr (dpi, options, op2);
4973 1.6 christos d_append_char (dpi, ')');
4974 1.6 christos break;
4975 1.6 christos }
4976 1.6 christos
4977 1.6 christos dpi->pack_index = save_idx;
4978 1.6 christos return 1;
4979 1.6 christos }
4980 1.6 christos
4981 1.8 christos /* True iff DC represents a C99-style designated initializer. */
4982 1.8 christos
4983 1.8 christos static int
4984 1.8 christos is_designated_init (struct demangle_component *dc)
4985 1.8 christos {
4986 1.8 christos if (dc->type != DEMANGLE_COMPONENT_BINARY
4987 1.8 christos && dc->type != DEMANGLE_COMPONENT_TRINARY)
4988 1.8 christos return 0;
4989 1.8 christos
4990 1.8 christos struct demangle_component *op = d_left (dc);
4991 1.8 christos const char *code = op->u.s_operator.op->code;
4992 1.8 christos return (code[0] == 'd'
4993 1.8 christos && (code[1] == 'i' || code[1] == 'x' || code[1] == 'X'));
4994 1.8 christos }
4995 1.8 christos
4996 1.8 christos /* If DC represents a C99-style designated initializer, print it and return
4997 1.8 christos true; otherwise, return false. */
4998 1.8 christos
4999 1.8 christos static int
5000 1.8 christos d_maybe_print_designated_init (struct d_print_info *dpi, int options,
5001 1.8 christos struct demangle_component *dc)
5002 1.8 christos {
5003 1.8 christos if (!is_designated_init (dc))
5004 1.8 christos return 0;
5005 1.8 christos
5006 1.8 christos const char *code = d_left (dc)->u.s_operator.op->code;
5007 1.8 christos
5008 1.8 christos struct demangle_component *operands = d_right (dc);
5009 1.8 christos struct demangle_component *op1 = d_left (operands);
5010 1.8 christos struct demangle_component *op2 = d_right (operands);
5011 1.8 christos
5012 1.8 christos if (code[1] == 'i')
5013 1.8 christos d_append_char (dpi, '.');
5014 1.8 christos else
5015 1.8 christos d_append_char (dpi, '[');
5016 1.8 christos
5017 1.8 christos d_print_comp (dpi, options, op1);
5018 1.8 christos if (code[1] == 'X')
5019 1.8 christos {
5020 1.8 christos d_append_string (dpi, " ... ");
5021 1.8 christos d_print_comp (dpi, options, d_left (op2));
5022 1.8 christos op2 = d_right (op2);
5023 1.8 christos }
5024 1.8 christos if (code[1] != 'i')
5025 1.8 christos d_append_char (dpi, ']');
5026 1.8 christos if (is_designated_init (op2))
5027 1.8 christos {
5028 1.8 christos /* Don't put '=' or '(' between chained designators. */
5029 1.8 christos d_print_comp (dpi, options, op2);
5030 1.8 christos }
5031 1.8 christos else
5032 1.8 christos {
5033 1.8 christos d_append_char (dpi, '=');
5034 1.8 christos d_print_subexpr (dpi, options, op2);
5035 1.8 christos }
5036 1.8 christos return 1;
5037 1.8 christos }
5038 1.8 christos
5039 1.9 christos static void
5040 1.9 christos d_print_lambda_parm_name (struct d_print_info *dpi, int type, unsigned index)
5041 1.9 christos {
5042 1.9 christos const char *str;
5043 1.9 christos switch (type)
5044 1.9 christos {
5045 1.9 christos default:
5046 1.9 christos dpi->demangle_failure = 1;
5047 1.9 christos str = "";
5048 1.9 christos break;
5049 1.9 christos
5050 1.9 christos case DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM:
5051 1.9 christos str = "$T";
5052 1.9 christos break;
5053 1.9 christos
5054 1.9 christos case DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM:
5055 1.9 christos str = "$N";
5056 1.9 christos break;
5057 1.9 christos
5058 1.9 christos case DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM:
5059 1.9 christos str = "$TT";
5060 1.9 christos break;
5061 1.9 christos }
5062 1.9 christos d_append_string (dpi, str);
5063 1.9 christos d_append_num (dpi, index);
5064 1.9 christos }
5065 1.9 christos
5066 1.1 christos /* Subroutine to handle components. */
5067 1.1 christos
5068 1.1 christos static void
5069 1.3 christos d_print_comp_inner (struct d_print_info *dpi, int options,
5070 1.6 christos struct demangle_component *dc)
5071 1.1 christos {
5072 1.1 christos /* Magic variable to let reference smashing skip over the next modifier
5073 1.1 christos without needing to modify *dc. */
5074 1.6 christos struct demangle_component *mod_inner = NULL;
5075 1.1 christos
5076 1.3 christos /* Variable used to store the current templates while a previously
5077 1.3 christos captured scope is used. */
5078 1.3 christos struct d_print_template *saved_templates;
5079 1.3 christos
5080 1.3 christos /* Nonzero if templates have been stored in the above variable. */
5081 1.3 christos int need_template_restore = 0;
5082 1.3 christos
5083 1.1 christos if (dc == NULL)
5084 1.1 christos {
5085 1.1 christos d_print_error (dpi);
5086 1.1 christos return;
5087 1.1 christos }
5088 1.1 christos if (d_print_saw_error (dpi))
5089 1.1 christos return;
5090 1.1 christos
5091 1.1 christos switch (dc->type)
5092 1.1 christos {
5093 1.1 christos case DEMANGLE_COMPONENT_NAME:
5094 1.1 christos if ((options & DMGL_JAVA) == 0)
5095 1.1 christos d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len);
5096 1.1 christos else
5097 1.1 christos d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
5098 1.1 christos return;
5099 1.1 christos
5100 1.3 christos case DEMANGLE_COMPONENT_TAGGED_NAME:
5101 1.3 christos d_print_comp (dpi, options, d_left (dc));
5102 1.3 christos d_append_string (dpi, "[abi:");
5103 1.3 christos d_print_comp (dpi, options, d_right (dc));
5104 1.3 christos d_append_char (dpi, ']');
5105 1.3 christos return;
5106 1.3 christos
5107 1.8 christos case DEMANGLE_COMPONENT_STRUCTURED_BINDING:
5108 1.8 christos d_append_char (dpi, '[');
5109 1.8 christos for (;;)
5110 1.8 christos {
5111 1.8 christos d_print_comp (dpi, options, d_left (dc));
5112 1.8 christos dc = d_right (dc);
5113 1.8 christos if (!dc)
5114 1.8 christos break;
5115 1.8 christos d_append_string (dpi, ", ");
5116 1.8 christos }
5117 1.8 christos d_append_char (dpi, ']');
5118 1.8 christos return;
5119 1.8 christos
5120 1.8 christos case DEMANGLE_COMPONENT_MODULE_ENTITY:
5121 1.8 christos d_print_comp (dpi, options, d_left (dc));
5122 1.8 christos d_append_char (dpi, '@');
5123 1.8 christos d_print_comp (dpi, options, d_right (dc));
5124 1.8 christos return;
5125 1.8 christos
5126 1.8 christos case DEMANGLE_COMPONENT_MODULE_NAME:
5127 1.8 christos case DEMANGLE_COMPONENT_MODULE_PARTITION:
5128 1.8 christos {
5129 1.8 christos if (d_left (dc))
5130 1.8 christos d_print_comp (dpi, options, d_left (dc));
5131 1.8 christos char c = dc->type == DEMANGLE_COMPONENT_MODULE_PARTITION
5132 1.8 christos ? ':' : d_left (dc) ? '.' : 0;
5133 1.8 christos if (c)
5134 1.8 christos d_append_char (dpi, c);
5135 1.8 christos d_print_comp (dpi, options, d_right (dc));
5136 1.8 christos }
5137 1.8 christos return;
5138 1.8 christos
5139 1.1 christos case DEMANGLE_COMPONENT_QUAL_NAME:
5140 1.1 christos case DEMANGLE_COMPONENT_LOCAL_NAME:
5141 1.1 christos d_print_comp (dpi, options, d_left (dc));
5142 1.1 christos if ((options & DMGL_JAVA) == 0)
5143 1.1 christos d_append_string (dpi, "::");
5144 1.1 christos else
5145 1.1 christos d_append_char (dpi, '.');
5146 1.3 christos {
5147 1.3 christos struct demangle_component *local_name = d_right (dc);
5148 1.3 christos if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
5149 1.3 christos {
5150 1.3 christos d_append_string (dpi, "{default arg#");
5151 1.3 christos d_append_num (dpi, local_name->u.s_unary_num.num + 1);
5152 1.3 christos d_append_string (dpi, "}::");
5153 1.3 christos local_name = local_name->u.s_unary_num.sub;
5154 1.3 christos }
5155 1.3 christos d_print_comp (dpi, options, local_name);
5156 1.3 christos }
5157 1.1 christos return;
5158 1.1 christos
5159 1.1 christos case DEMANGLE_COMPONENT_TYPED_NAME:
5160 1.1 christos {
5161 1.1 christos struct d_print_mod *hold_modifiers;
5162 1.1 christos struct demangle_component *typed_name;
5163 1.1 christos struct d_print_mod adpm[4];
5164 1.1 christos unsigned int i;
5165 1.1 christos struct d_print_template dpt;
5166 1.1 christos
5167 1.1 christos /* Pass the name down to the type so that it can be printed in
5168 1.1 christos the right place for the type. We also have to pass down
5169 1.1 christos any CV-qualifiers, which apply to the this parameter. */
5170 1.1 christos hold_modifiers = dpi->modifiers;
5171 1.1 christos dpi->modifiers = 0;
5172 1.1 christos i = 0;
5173 1.1 christos typed_name = d_left (dc);
5174 1.1 christos while (typed_name != NULL)
5175 1.1 christos {
5176 1.1 christos if (i >= sizeof adpm / sizeof adpm[0])
5177 1.1 christos {
5178 1.1 christos d_print_error (dpi);
5179 1.1 christos return;
5180 1.1 christos }
5181 1.1 christos
5182 1.1 christos adpm[i].next = dpi->modifiers;
5183 1.1 christos dpi->modifiers = &adpm[i];
5184 1.1 christos adpm[i].mod = typed_name;
5185 1.1 christos adpm[i].printed = 0;
5186 1.1 christos adpm[i].templates = dpi->templates;
5187 1.1 christos ++i;
5188 1.1 christos
5189 1.6 christos if (!is_fnqual_component_type (typed_name->type))
5190 1.1 christos break;
5191 1.1 christos
5192 1.1 christos typed_name = d_left (typed_name);
5193 1.1 christos }
5194 1.1 christos
5195 1.1 christos if (typed_name == NULL)
5196 1.1 christos {
5197 1.1 christos d_print_error (dpi);
5198 1.1 christos return;
5199 1.1 christos }
5200 1.1 christos
5201 1.1 christos /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
5202 1.1 christos there may be CV-qualifiers on its right argument which
5203 1.6 christos really apply here; this happens when parsing a class that
5204 1.1 christos is local to a function. */
5205 1.1 christos if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME)
5206 1.1 christos {
5207 1.6 christos typed_name = d_right (typed_name);
5208 1.6 christos if (typed_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
5209 1.6 christos typed_name = typed_name->u.s_unary_num.sub;
5210 1.7 christos while (typed_name != NULL
5211 1.7 christos && is_fnqual_component_type (typed_name->type))
5212 1.1 christos {
5213 1.1 christos if (i >= sizeof adpm / sizeof adpm[0])
5214 1.1 christos {
5215 1.1 christos d_print_error (dpi);
5216 1.1 christos return;
5217 1.1 christos }
5218 1.1 christos
5219 1.1 christos adpm[i] = adpm[i - 1];
5220 1.1 christos adpm[i].next = &adpm[i - 1];
5221 1.1 christos dpi->modifiers = &adpm[i];
5222 1.1 christos
5223 1.6 christos adpm[i - 1].mod = typed_name;
5224 1.1 christos adpm[i - 1].printed = 0;
5225 1.1 christos adpm[i - 1].templates = dpi->templates;
5226 1.1 christos ++i;
5227 1.1 christos
5228 1.6 christos typed_name = d_left (typed_name);
5229 1.1 christos }
5230 1.7 christos if (typed_name == NULL)
5231 1.7 christos {
5232 1.7 christos d_print_error (dpi);
5233 1.7 christos return;
5234 1.7 christos }
5235 1.1 christos }
5236 1.1 christos
5237 1.6 christos /* If typed_name is a template, then it applies to the
5238 1.6 christos function type as well. */
5239 1.6 christos if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
5240 1.6 christos {
5241 1.6 christos dpt.next = dpi->templates;
5242 1.6 christos dpi->templates = &dpt;
5243 1.6 christos dpt.template_decl = typed_name;
5244 1.9 christos
5245 1.9 christos /* Constraints are mangled as part of the template argument list,
5246 1.9 christos so they wrap the _TEMPLATE_ARGLIST. But
5247 1.9 christos d_lookup_template_argument expects the RHS of _TEMPLATE to be
5248 1.9 christos the _ARGLIST, and constraints need to refer to these args. So
5249 1.9 christos move the _CONSTRAINTS out of the _TEMPLATE and onto the type.
5250 1.9 christos This will result in them being printed after the () like a
5251 1.9 christos trailing requires-clause, but that seems like our best option
5252 1.9 christos given that we aren't printing a template-head. */
5253 1.9 christos struct demangle_component *tnr = d_right (typed_name);
5254 1.9 christos if (tnr->type == DEMANGLE_COMPONENT_CONSTRAINTS)
5255 1.9 christos {
5256 1.9 christos d_right (typed_name) = d_left (tnr);
5257 1.9 christos d_left (tnr) = d_right (dc);
5258 1.9 christos d_right (dc) = tnr;
5259 1.9 christos }
5260 1.6 christos }
5261 1.6 christos
5262 1.1 christos d_print_comp (dpi, options, d_right (dc));
5263 1.1 christos
5264 1.1 christos if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
5265 1.1 christos dpi->templates = dpt.next;
5266 1.1 christos
5267 1.1 christos /* If the modifiers didn't get printed by the type, print them
5268 1.1 christos now. */
5269 1.1 christos while (i > 0)
5270 1.1 christos {
5271 1.1 christos --i;
5272 1.1 christos if (! adpm[i].printed)
5273 1.1 christos {
5274 1.1 christos d_append_char (dpi, ' ');
5275 1.1 christos d_print_mod (dpi, options, adpm[i].mod);
5276 1.1 christos }
5277 1.1 christos }
5278 1.1 christos
5279 1.1 christos dpi->modifiers = hold_modifiers;
5280 1.1 christos
5281 1.1 christos return;
5282 1.1 christos }
5283 1.1 christos
5284 1.1 christos case DEMANGLE_COMPONENT_TEMPLATE:
5285 1.1 christos {
5286 1.1 christos struct d_print_mod *hold_dpm;
5287 1.1 christos struct demangle_component *dcl;
5288 1.3 christos const struct demangle_component *hold_current;
5289 1.3 christos
5290 1.3 christos /* This template may need to be referenced by a cast operator
5291 1.3 christos contained in its subtree. */
5292 1.3 christos hold_current = dpi->current_template;
5293 1.3 christos dpi->current_template = dc;
5294 1.1 christos
5295 1.1 christos /* Don't push modifiers into a template definition. Doing so
5296 1.1 christos could give the wrong definition for a template argument.
5297 1.1 christos Instead, treat the template essentially as a name. */
5298 1.1 christos
5299 1.1 christos hold_dpm = dpi->modifiers;
5300 1.1 christos dpi->modifiers = NULL;
5301 1.1 christos
5302 1.1 christos dcl = d_left (dc);
5303 1.1 christos
5304 1.1 christos if ((options & DMGL_JAVA) != 0
5305 1.1 christos && dcl->type == DEMANGLE_COMPONENT_NAME
5306 1.1 christos && dcl->u.s_name.len == 6
5307 1.1 christos && strncmp (dcl->u.s_name.s, "JArray", 6) == 0)
5308 1.1 christos {
5309 1.1 christos /* Special-case Java arrays, so that JArray<TYPE> appears
5310 1.1 christos instead as TYPE[]. */
5311 1.1 christos
5312 1.1 christos d_print_comp (dpi, options, d_right (dc));
5313 1.1 christos d_append_string (dpi, "[]");
5314 1.1 christos }
5315 1.1 christos else
5316 1.1 christos {
5317 1.1 christos d_print_comp (dpi, options, dcl);
5318 1.1 christos if (d_last_char (dpi) == '<')
5319 1.1 christos d_append_char (dpi, ' ');
5320 1.1 christos d_append_char (dpi, '<');
5321 1.1 christos d_print_comp (dpi, options, d_right (dc));
5322 1.1 christos /* Avoid generating two consecutive '>' characters, to avoid
5323 1.1 christos the C++ syntactic ambiguity. */
5324 1.1 christos if (d_last_char (dpi) == '>')
5325 1.1 christos d_append_char (dpi, ' ');
5326 1.1 christos d_append_char (dpi, '>');
5327 1.1 christos }
5328 1.1 christos
5329 1.1 christos dpi->modifiers = hold_dpm;
5330 1.3 christos dpi->current_template = hold_current;
5331 1.1 christos
5332 1.1 christos return;
5333 1.1 christos }
5334 1.1 christos
5335 1.1 christos case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
5336 1.9 christos if (dpi->lambda_tpl_parms > dc->u.s_number.number + 1)
5337 1.9 christos {
5338 1.9 christos const struct demangle_component *a
5339 1.9 christos = d_left (dpi->templates->template_decl);
5340 1.9 christos unsigned c;
5341 1.9 christos for (c = dc->u.s_number.number; a && c; c--)
5342 1.9 christos a = d_right (a);
5343 1.9 christos if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM)
5344 1.9 christos a = d_left (a);
5345 1.9 christos if (!a)
5346 1.9 christos dpi->demangle_failure = 1;
5347 1.9 christos else
5348 1.9 christos d_print_lambda_parm_name (dpi, a->type, dc->u.s_number.number);
5349 1.9 christos }
5350 1.9 christos else if (dpi->lambda_tpl_parms)
5351 1.6 christos {
5352 1.6 christos /* Show the template parm index, as that's how g++ displays
5353 1.6 christos these, and future proofs us against potential
5354 1.6 christos '[]<typename T> (T *a, T *b) {...}'. */
5355 1.6 christos d_append_buffer (dpi, "auto:", 5);
5356 1.6 christos d_append_num (dpi, dc->u.s_number.number + 1);
5357 1.6 christos }
5358 1.6 christos else
5359 1.6 christos {
5360 1.6 christos struct d_print_template *hold_dpt;
5361 1.6 christos struct demangle_component *a = d_lookup_template_argument (dpi, dc);
5362 1.1 christos
5363 1.6 christos if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
5364 1.6 christos a = d_index_template_argument (a, dpi->pack_index);
5365 1.1 christos
5366 1.6 christos if (a == NULL)
5367 1.6 christos {
5368 1.6 christos d_print_error (dpi);
5369 1.6 christos return;
5370 1.6 christos }
5371 1.1 christos
5372 1.6 christos /* While processing this parameter, we need to pop the list
5373 1.6 christos of templates. This is because the template parameter may
5374 1.6 christos itself be a reference to a parameter of an outer
5375 1.6 christos template. */
5376 1.1 christos
5377 1.6 christos hold_dpt = dpi->templates;
5378 1.6 christos dpi->templates = hold_dpt->next;
5379 1.1 christos
5380 1.6 christos d_print_comp (dpi, options, a);
5381 1.1 christos
5382 1.6 christos dpi->templates = hold_dpt;
5383 1.6 christos }
5384 1.6 christos return;
5385 1.1 christos
5386 1.7 christos case DEMANGLE_COMPONENT_TPARM_OBJ:
5387 1.7 christos d_append_string (dpi, "template parameter object for ");
5388 1.7 christos d_print_comp (dpi, options, d_left (dc));
5389 1.7 christos return;
5390 1.7 christos
5391 1.1 christos case DEMANGLE_COMPONENT_CTOR:
5392 1.1 christos d_print_comp (dpi, options, dc->u.s_ctor.name);
5393 1.1 christos return;
5394 1.1 christos
5395 1.1 christos case DEMANGLE_COMPONENT_DTOR:
5396 1.1 christos d_append_char (dpi, '~');
5397 1.1 christos d_print_comp (dpi, options, dc->u.s_dtor.name);
5398 1.1 christos return;
5399 1.1 christos
5400 1.8 christos case DEMANGLE_COMPONENT_MODULE_INIT:
5401 1.8 christos d_append_string (dpi, "initializer for module ");
5402 1.8 christos d_print_comp (dpi, options, d_left (dc));
5403 1.8 christos return;
5404 1.8 christos
5405 1.1 christos case DEMANGLE_COMPONENT_VTABLE:
5406 1.1 christos d_append_string (dpi, "vtable for ");
5407 1.1 christos d_print_comp (dpi, options, d_left (dc));
5408 1.1 christos return;
5409 1.1 christos
5410 1.1 christos case DEMANGLE_COMPONENT_VTT:
5411 1.1 christos d_append_string (dpi, "VTT for ");
5412 1.1 christos d_print_comp (dpi, options, d_left (dc));
5413 1.1 christos return;
5414 1.1 christos
5415 1.1 christos case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
5416 1.1 christos d_append_string (dpi, "construction vtable for ");
5417 1.1 christos d_print_comp (dpi, options, d_left (dc));
5418 1.1 christos d_append_string (dpi, "-in-");
5419 1.1 christos d_print_comp (dpi, options, d_right (dc));
5420 1.1 christos return;
5421 1.1 christos
5422 1.1 christos case DEMANGLE_COMPONENT_TYPEINFO:
5423 1.1 christos d_append_string (dpi, "typeinfo for ");
5424 1.1 christos d_print_comp (dpi, options, d_left (dc));
5425 1.1 christos return;
5426 1.1 christos
5427 1.1 christos case DEMANGLE_COMPONENT_TYPEINFO_NAME:
5428 1.1 christos d_append_string (dpi, "typeinfo name for ");
5429 1.1 christos d_print_comp (dpi, options, d_left (dc));
5430 1.1 christos return;
5431 1.1 christos
5432 1.1 christos case DEMANGLE_COMPONENT_TYPEINFO_FN:
5433 1.1 christos d_append_string (dpi, "typeinfo fn for ");
5434 1.1 christos d_print_comp (dpi, options, d_left (dc));
5435 1.1 christos return;
5436 1.1 christos
5437 1.1 christos case DEMANGLE_COMPONENT_THUNK:
5438 1.1 christos d_append_string (dpi, "non-virtual thunk to ");
5439 1.1 christos d_print_comp (dpi, options, d_left (dc));
5440 1.1 christos return;
5441 1.1 christos
5442 1.1 christos case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
5443 1.1 christos d_append_string (dpi, "virtual thunk to ");
5444 1.1 christos d_print_comp (dpi, options, d_left (dc));
5445 1.1 christos return;
5446 1.1 christos
5447 1.1 christos case DEMANGLE_COMPONENT_COVARIANT_THUNK:
5448 1.1 christos d_append_string (dpi, "covariant return thunk to ");
5449 1.1 christos d_print_comp (dpi, options, d_left (dc));
5450 1.1 christos return;
5451 1.1 christos
5452 1.1 christos case DEMANGLE_COMPONENT_JAVA_CLASS:
5453 1.1 christos d_append_string (dpi, "java Class for ");
5454 1.1 christos d_print_comp (dpi, options, d_left (dc));
5455 1.1 christos return;
5456 1.1 christos
5457 1.1 christos case DEMANGLE_COMPONENT_GUARD:
5458 1.1 christos d_append_string (dpi, "guard variable for ");
5459 1.1 christos d_print_comp (dpi, options, d_left (dc));
5460 1.1 christos return;
5461 1.1 christos
5462 1.3 christos case DEMANGLE_COMPONENT_TLS_INIT:
5463 1.3 christos d_append_string (dpi, "TLS init function for ");
5464 1.3 christos d_print_comp (dpi, options, d_left (dc));
5465 1.3 christos return;
5466 1.3 christos
5467 1.3 christos case DEMANGLE_COMPONENT_TLS_WRAPPER:
5468 1.3 christos d_append_string (dpi, "TLS wrapper function for ");
5469 1.3 christos d_print_comp (dpi, options, d_left (dc));
5470 1.3 christos return;
5471 1.3 christos
5472 1.1 christos case DEMANGLE_COMPONENT_REFTEMP:
5473 1.1 christos d_append_string (dpi, "reference temporary #");
5474 1.1 christos d_print_comp (dpi, options, d_right (dc));
5475 1.1 christos d_append_string (dpi, " for ");
5476 1.1 christos d_print_comp (dpi, options, d_left (dc));
5477 1.1 christos return;
5478 1.1 christos
5479 1.1 christos case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
5480 1.1 christos d_append_string (dpi, "hidden alias for ");
5481 1.1 christos d_print_comp (dpi, options, d_left (dc));
5482 1.1 christos return;
5483 1.1 christos
5484 1.1 christos case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
5485 1.1 christos d_append_string (dpi, "transaction clone for ");
5486 1.1 christos d_print_comp (dpi, options, d_left (dc));
5487 1.1 christos return;
5488 1.1 christos
5489 1.1 christos case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
5490 1.1 christos d_append_string (dpi, "non-transaction clone for ");
5491 1.1 christos d_print_comp (dpi, options, d_left (dc));
5492 1.1 christos return;
5493 1.1 christos
5494 1.1 christos case DEMANGLE_COMPONENT_SUB_STD:
5495 1.1 christos d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len);
5496 1.1 christos return;
5497 1.1 christos
5498 1.1 christos case DEMANGLE_COMPONENT_RESTRICT:
5499 1.1 christos case DEMANGLE_COMPONENT_VOLATILE:
5500 1.1 christos case DEMANGLE_COMPONENT_CONST:
5501 1.1 christos {
5502 1.1 christos struct d_print_mod *pdpm;
5503 1.1 christos
5504 1.1 christos /* When printing arrays, it's possible to have cases where the
5505 1.1 christos same CV-qualifier gets pushed on the stack multiple times.
5506 1.1 christos We only need to print it once. */
5507 1.1 christos
5508 1.1 christos for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next)
5509 1.1 christos {
5510 1.1 christos if (! pdpm->printed)
5511 1.1 christos {
5512 1.1 christos if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT
5513 1.1 christos && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE
5514 1.1 christos && pdpm->mod->type != DEMANGLE_COMPONENT_CONST)
5515 1.1 christos break;
5516 1.1 christos if (pdpm->mod->type == dc->type)
5517 1.1 christos {
5518 1.1 christos d_print_comp (dpi, options, d_left (dc));
5519 1.1 christos return;
5520 1.1 christos }
5521 1.1 christos }
5522 1.1 christos }
5523 1.1 christos }
5524 1.1 christos goto modifier;
5525 1.1 christos
5526 1.1 christos case DEMANGLE_COMPONENT_REFERENCE:
5527 1.1 christos case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5528 1.1 christos {
5529 1.1 christos /* Handle reference smashing: & + && = &. */
5530 1.6 christos struct demangle_component *sub = d_left (dc);
5531 1.9 christos if (!dpi->lambda_tpl_parms
5532 1.6 christos && sub->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
5533 1.1 christos {
5534 1.3 christos struct d_saved_scope *scope = d_get_saved_scope (dpi, sub);
5535 1.3 christos struct demangle_component *a;
5536 1.3 christos
5537 1.3 christos if (scope == NULL)
5538 1.3 christos {
5539 1.3 christos /* This is the first time SUB has been traversed.
5540 1.3 christos We need to capture the current templates so
5541 1.3 christos they can be restored if SUB is reentered as a
5542 1.3 christos substitution. */
5543 1.3 christos d_save_scope (dpi, sub);
5544 1.3 christos if (d_print_saw_error (dpi))
5545 1.3 christos return;
5546 1.3 christos }
5547 1.3 christos else
5548 1.3 christos {
5549 1.3 christos const struct d_component_stack *dcse;
5550 1.3 christos int found_self_or_parent = 0;
5551 1.3 christos
5552 1.3 christos /* This traversal is reentering SUB as a substition.
5553 1.3 christos If we are not beneath SUB or DC in the tree then we
5554 1.3 christos need to restore SUB's template stack temporarily. */
5555 1.3 christos for (dcse = dpi->component_stack; dcse != NULL;
5556 1.3 christos dcse = dcse->parent)
5557 1.3 christos {
5558 1.3 christos if (dcse->dc == sub
5559 1.3 christos || (dcse->dc == dc
5560 1.3 christos && dcse != dpi->component_stack))
5561 1.3 christos {
5562 1.3 christos found_self_or_parent = 1;
5563 1.3 christos break;
5564 1.3 christos }
5565 1.3 christos }
5566 1.3 christos
5567 1.3 christos if (!found_self_or_parent)
5568 1.3 christos {
5569 1.3 christos saved_templates = dpi->templates;
5570 1.3 christos dpi->templates = scope->templates;
5571 1.3 christos need_template_restore = 1;
5572 1.3 christos }
5573 1.3 christos }
5574 1.3 christos
5575 1.3 christos a = d_lookup_template_argument (dpi, sub);
5576 1.1 christos if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
5577 1.1 christos a = d_index_template_argument (a, dpi->pack_index);
5578 1.1 christos
5579 1.1 christos if (a == NULL)
5580 1.1 christos {
5581 1.3 christos if (need_template_restore)
5582 1.3 christos dpi->templates = saved_templates;
5583 1.3 christos
5584 1.1 christos d_print_error (dpi);
5585 1.1 christos return;
5586 1.1 christos }
5587 1.1 christos
5588 1.1 christos sub = a;
5589 1.1 christos }
5590 1.1 christos
5591 1.1 christos if (sub->type == DEMANGLE_COMPONENT_REFERENCE
5592 1.1 christos || sub->type == dc->type)
5593 1.1 christos dc = sub;
5594 1.1 christos else if (sub->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE)
5595 1.1 christos mod_inner = d_left (sub);
5596 1.1 christos }
5597 1.1 christos /* Fall through. */
5598 1.1 christos
5599 1.1 christos case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5600 1.1 christos case DEMANGLE_COMPONENT_POINTER:
5601 1.1 christos case DEMANGLE_COMPONENT_COMPLEX:
5602 1.1 christos case DEMANGLE_COMPONENT_IMAGINARY:
5603 1.6 christos FNQUAL_COMPONENT_CASE:
5604 1.1 christos modifier:
5605 1.1 christos {
5606 1.1 christos /* We keep a list of modifiers on the stack. */
5607 1.1 christos struct d_print_mod dpm;
5608 1.1 christos
5609 1.1 christos dpm.next = dpi->modifiers;
5610 1.1 christos dpi->modifiers = &dpm;
5611 1.1 christos dpm.mod = dc;
5612 1.1 christos dpm.printed = 0;
5613 1.1 christos dpm.templates = dpi->templates;
5614 1.1 christos
5615 1.1 christos if (!mod_inner)
5616 1.1 christos mod_inner = d_left (dc);
5617 1.1 christos
5618 1.1 christos d_print_comp (dpi, options, mod_inner);
5619 1.1 christos
5620 1.1 christos /* If the modifier didn't get printed by the type, print it
5621 1.1 christos now. */
5622 1.1 christos if (! dpm.printed)
5623 1.1 christos d_print_mod (dpi, options, dc);
5624 1.1 christos
5625 1.1 christos dpi->modifiers = dpm.next;
5626 1.1 christos
5627 1.3 christos if (need_template_restore)
5628 1.3 christos dpi->templates = saved_templates;
5629 1.3 christos
5630 1.1 christos return;
5631 1.1 christos }
5632 1.1 christos
5633 1.1 christos case DEMANGLE_COMPONENT_BUILTIN_TYPE:
5634 1.1 christos if ((options & DMGL_JAVA) == 0)
5635 1.1 christos d_append_buffer (dpi, dc->u.s_builtin.type->name,
5636 1.1 christos dc->u.s_builtin.type->len);
5637 1.1 christos else
5638 1.1 christos d_append_buffer (dpi, dc->u.s_builtin.type->java_name,
5639 1.1 christos dc->u.s_builtin.type->java_len);
5640 1.1 christos return;
5641 1.1 christos
5642 1.9 christos case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE:
5643 1.9 christos d_append_buffer (dpi, dc->u.s_extended_builtin.type->name,
5644 1.9 christos dc->u.s_extended_builtin.type->len);
5645 1.9 christos d_append_num (dpi, dc->u.s_extended_builtin.arg);
5646 1.9 christos if (dc->u.s_extended_builtin.suffix)
5647 1.9 christos d_append_buffer (dpi, &dc->u.s_extended_builtin.suffix, 1);
5648 1.9 christos return;
5649 1.9 christos
5650 1.1 christos case DEMANGLE_COMPONENT_VENDOR_TYPE:
5651 1.1 christos d_print_comp (dpi, options, d_left (dc));
5652 1.1 christos return;
5653 1.1 christos
5654 1.1 christos case DEMANGLE_COMPONENT_FUNCTION_TYPE:
5655 1.1 christos {
5656 1.1 christos if ((options & DMGL_RET_POSTFIX) != 0)
5657 1.1 christos d_print_function_type (dpi,
5658 1.1 christos options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5659 1.1 christos dc, dpi->modifiers);
5660 1.1 christos
5661 1.1 christos /* Print return type if present */
5662 1.1 christos if (d_left (dc) != NULL && (options & DMGL_RET_POSTFIX) != 0)
5663 1.1 christos d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5664 1.1 christos d_left (dc));
5665 1.1 christos else if (d_left (dc) != NULL && (options & DMGL_RET_DROP) == 0)
5666 1.1 christos {
5667 1.1 christos struct d_print_mod dpm;
5668 1.1 christos
5669 1.1 christos /* We must pass this type down as a modifier in order to
5670 1.1 christos print it in the right location. */
5671 1.1 christos dpm.next = dpi->modifiers;
5672 1.1 christos dpi->modifiers = &dpm;
5673 1.1 christos dpm.mod = dc;
5674 1.1 christos dpm.printed = 0;
5675 1.1 christos dpm.templates = dpi->templates;
5676 1.1 christos
5677 1.1 christos d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5678 1.1 christos d_left (dc));
5679 1.1 christos
5680 1.1 christos dpi->modifiers = dpm.next;
5681 1.1 christos
5682 1.1 christos if (dpm.printed)
5683 1.1 christos return;
5684 1.1 christos
5685 1.1 christos /* In standard prefix notation, there is a space between the
5686 1.1 christos return type and the function signature. */
5687 1.1 christos if ((options & DMGL_RET_POSTFIX) == 0)
5688 1.1 christos d_append_char (dpi, ' ');
5689 1.1 christos }
5690 1.1 christos
5691 1.1 christos if ((options & DMGL_RET_POSTFIX) == 0)
5692 1.1 christos d_print_function_type (dpi,
5693 1.1 christos options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5694 1.1 christos dc, dpi->modifiers);
5695 1.1 christos
5696 1.1 christos return;
5697 1.1 christos }
5698 1.1 christos
5699 1.1 christos case DEMANGLE_COMPONENT_ARRAY_TYPE:
5700 1.1 christos {
5701 1.1 christos struct d_print_mod *hold_modifiers;
5702 1.1 christos struct d_print_mod adpm[4];
5703 1.1 christos unsigned int i;
5704 1.1 christos struct d_print_mod *pdpm;
5705 1.1 christos
5706 1.1 christos /* We must pass this type down as a modifier in order to print
5707 1.1 christos multi-dimensional arrays correctly. If the array itself is
5708 1.1 christos CV-qualified, we act as though the element type were
5709 1.1 christos CV-qualified. We do this by copying the modifiers down
5710 1.1 christos rather than fiddling pointers, so that we don't wind up
5711 1.1 christos with a d_print_mod higher on the stack pointing into our
5712 1.1 christos stack frame after we return. */
5713 1.1 christos
5714 1.1 christos hold_modifiers = dpi->modifiers;
5715 1.1 christos
5716 1.1 christos adpm[0].next = hold_modifiers;
5717 1.1 christos dpi->modifiers = &adpm[0];
5718 1.1 christos adpm[0].mod = dc;
5719 1.1 christos adpm[0].printed = 0;
5720 1.1 christos adpm[0].templates = dpi->templates;
5721 1.1 christos
5722 1.1 christos i = 1;
5723 1.1 christos pdpm = hold_modifiers;
5724 1.1 christos while (pdpm != NULL
5725 1.1 christos && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT
5726 1.1 christos || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE
5727 1.1 christos || pdpm->mod->type == DEMANGLE_COMPONENT_CONST))
5728 1.1 christos {
5729 1.1 christos if (! pdpm->printed)
5730 1.1 christos {
5731 1.1 christos if (i >= sizeof adpm / sizeof adpm[0])
5732 1.1 christos {
5733 1.1 christos d_print_error (dpi);
5734 1.1 christos return;
5735 1.1 christos }
5736 1.1 christos
5737 1.1 christos adpm[i] = *pdpm;
5738 1.1 christos adpm[i].next = dpi->modifiers;
5739 1.1 christos dpi->modifiers = &adpm[i];
5740 1.1 christos pdpm->printed = 1;
5741 1.1 christos ++i;
5742 1.1 christos }
5743 1.1 christos
5744 1.1 christos pdpm = pdpm->next;
5745 1.1 christos }
5746 1.1 christos
5747 1.1 christos d_print_comp (dpi, options, d_right (dc));
5748 1.1 christos
5749 1.1 christos dpi->modifiers = hold_modifiers;
5750 1.1 christos
5751 1.1 christos if (adpm[0].printed)
5752 1.1 christos return;
5753 1.1 christos
5754 1.1 christos while (i > 1)
5755 1.1 christos {
5756 1.1 christos --i;
5757 1.1 christos d_print_mod (dpi, options, adpm[i].mod);
5758 1.1 christos }
5759 1.1 christos
5760 1.1 christos d_print_array_type (dpi, options, dc, dpi->modifiers);
5761 1.1 christos
5762 1.1 christos return;
5763 1.1 christos }
5764 1.1 christos
5765 1.1 christos case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5766 1.1 christos case DEMANGLE_COMPONENT_VECTOR_TYPE:
5767 1.1 christos {
5768 1.1 christos struct d_print_mod dpm;
5769 1.1 christos
5770 1.1 christos dpm.next = dpi->modifiers;
5771 1.1 christos dpi->modifiers = &dpm;
5772 1.1 christos dpm.mod = dc;
5773 1.1 christos dpm.printed = 0;
5774 1.1 christos dpm.templates = dpi->templates;
5775 1.1 christos
5776 1.1 christos d_print_comp (dpi, options, d_right (dc));
5777 1.1 christos
5778 1.1 christos /* If the modifier didn't get printed by the type, print it
5779 1.1 christos now. */
5780 1.1 christos if (! dpm.printed)
5781 1.1 christos d_print_mod (dpi, options, dc);
5782 1.1 christos
5783 1.1 christos dpi->modifiers = dpm.next;
5784 1.1 christos
5785 1.1 christos return;
5786 1.1 christos }
5787 1.1 christos
5788 1.1 christos case DEMANGLE_COMPONENT_ARGLIST:
5789 1.1 christos case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
5790 1.1 christos if (d_left (dc) != NULL)
5791 1.1 christos d_print_comp (dpi, options, d_left (dc));
5792 1.1 christos if (d_right (dc) != NULL)
5793 1.1 christos {
5794 1.1 christos size_t len;
5795 1.1 christos unsigned long int flush_count;
5796 1.1 christos /* Make sure ", " isn't flushed by d_append_string, otherwise
5797 1.1 christos dpi->len -= 2 wouldn't work. */
5798 1.1 christos if (dpi->len >= sizeof (dpi->buf) - 2)
5799 1.1 christos d_print_flush (dpi);
5800 1.1 christos d_append_string (dpi, ", ");
5801 1.1 christos len = dpi->len;
5802 1.1 christos flush_count = dpi->flush_count;
5803 1.1 christos d_print_comp (dpi, options, d_right (dc));
5804 1.1 christos /* If that didn't print anything (which can happen with empty
5805 1.1 christos template argument packs), remove the comma and space. */
5806 1.1 christos if (dpi->flush_count == flush_count && dpi->len == len)
5807 1.1 christos dpi->len -= 2;
5808 1.1 christos }
5809 1.1 christos return;
5810 1.1 christos
5811 1.1 christos case DEMANGLE_COMPONENT_INITIALIZER_LIST:
5812 1.1 christos {
5813 1.1 christos struct demangle_component *type = d_left (dc);
5814 1.1 christos struct demangle_component *list = d_right (dc);
5815 1.1 christos
5816 1.1 christos if (type)
5817 1.1 christos d_print_comp (dpi, options, type);
5818 1.1 christos d_append_char (dpi, '{');
5819 1.1 christos d_print_comp (dpi, options, list);
5820 1.1 christos d_append_char (dpi, '}');
5821 1.1 christos }
5822 1.1 christos return;
5823 1.1 christos
5824 1.1 christos case DEMANGLE_COMPONENT_OPERATOR:
5825 1.1 christos {
5826 1.1 christos const struct demangle_operator_info *op = dc->u.s_operator.op;
5827 1.1 christos int len = op->len;
5828 1.1 christos
5829 1.1 christos d_append_string (dpi, "operator");
5830 1.1 christos /* Add a space before new/delete. */
5831 1.1 christos if (IS_LOWER (op->name[0]))
5832 1.1 christos d_append_char (dpi, ' ');
5833 1.1 christos /* Omit a trailing space. */
5834 1.1 christos if (op->name[len-1] == ' ')
5835 1.1 christos --len;
5836 1.1 christos d_append_buffer (dpi, op->name, len);
5837 1.1 christos return;
5838 1.1 christos }
5839 1.1 christos
5840 1.1 christos case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
5841 1.1 christos d_append_string (dpi, "operator ");
5842 1.1 christos d_print_comp (dpi, options, dc->u.s_extended_operator.name);
5843 1.1 christos return;
5844 1.1 christos
5845 1.5 christos case DEMANGLE_COMPONENT_CONVERSION:
5846 1.1 christos d_append_string (dpi, "operator ");
5847 1.5 christos d_print_conversion (dpi, options, dc);
5848 1.1 christos return;
5849 1.1 christos
5850 1.1 christos case DEMANGLE_COMPONENT_NULLARY:
5851 1.1 christos d_print_expr_op (dpi, options, d_left (dc));
5852 1.1 christos return;
5853 1.1 christos
5854 1.1 christos case DEMANGLE_COMPONENT_UNARY:
5855 1.1 christos {
5856 1.1 christos struct demangle_component *op = d_left (dc);
5857 1.1 christos struct demangle_component *operand = d_right (dc);
5858 1.1 christos const char *code = NULL;
5859 1.1 christos
5860 1.1 christos if (op->type == DEMANGLE_COMPONENT_OPERATOR)
5861 1.1 christos {
5862 1.1 christos code = op->u.s_operator.op->code;
5863 1.1 christos if (!strcmp (code, "ad"))
5864 1.1 christos {
5865 1.1 christos /* Don't print the argument list for the address of a
5866 1.1 christos function. */
5867 1.1 christos if (operand->type == DEMANGLE_COMPONENT_TYPED_NAME
5868 1.1 christos && d_left (operand)->type == DEMANGLE_COMPONENT_QUAL_NAME
5869 1.1 christos && d_right (operand)->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
5870 1.1 christos operand = d_left (operand);
5871 1.1 christos }
5872 1.1 christos if (operand->type == DEMANGLE_COMPONENT_BINARY_ARGS)
5873 1.1 christos {
5874 1.1 christos /* This indicates a suffix operator. */
5875 1.1 christos operand = d_left (operand);
5876 1.1 christos d_print_subexpr (dpi, options, operand);
5877 1.1 christos d_print_expr_op (dpi, options, op);
5878 1.1 christos return;
5879 1.1 christos }
5880 1.1 christos }
5881 1.1 christos
5882 1.6 christos /* For sizeof..., just print the pack length. */
5883 1.6 christos if (code && !strcmp (code, "sZ"))
5884 1.6 christos {
5885 1.6 christos struct demangle_component *a = d_find_pack (dpi, operand);
5886 1.6 christos int len = d_pack_length (a);
5887 1.6 christos d_append_num (dpi, len);
5888 1.6 christos return;
5889 1.6 christos }
5890 1.6 christos else if (code && !strcmp (code, "sP"))
5891 1.6 christos {
5892 1.6 christos int len = d_args_length (dpi, operand);
5893 1.6 christos d_append_num (dpi, len);
5894 1.6 christos return;
5895 1.6 christos }
5896 1.6 christos
5897 1.1 christos if (op->type != DEMANGLE_COMPONENT_CAST)
5898 1.1 christos d_print_expr_op (dpi, options, op);
5899 1.1 christos else
5900 1.1 christos {
5901 1.1 christos d_append_char (dpi, '(');
5902 1.1 christos d_print_cast (dpi, options, op);
5903 1.1 christos d_append_char (dpi, ')');
5904 1.1 christos }
5905 1.1 christos if (code && !strcmp (code, "gs"))
5906 1.1 christos /* Avoid parens after '::'. */
5907 1.1 christos d_print_comp (dpi, options, operand);
5908 1.9 christos else if (code && (!strcmp (code, "st") || !strcmp (code, "nx")))
5909 1.9 christos /* Always print parens for sizeof (type) and noexcept(expr). */
5910 1.1 christos {
5911 1.1 christos d_append_char (dpi, '(');
5912 1.1 christos d_print_comp (dpi, options, operand);
5913 1.1 christos d_append_char (dpi, ')');
5914 1.1 christos }
5915 1.1 christos else
5916 1.1 christos d_print_subexpr (dpi, options, operand);
5917 1.1 christos }
5918 1.1 christos return;
5919 1.1 christos
5920 1.1 christos case DEMANGLE_COMPONENT_BINARY:
5921 1.1 christos if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS)
5922 1.1 christos {
5923 1.1 christos d_print_error (dpi);
5924 1.1 christos return;
5925 1.1 christos }
5926 1.1 christos
5927 1.1 christos if (op_is_new_cast (d_left (dc)))
5928 1.1 christos {
5929 1.1 christos d_print_expr_op (dpi, options, d_left (dc));
5930 1.1 christos d_append_char (dpi, '<');
5931 1.1 christos d_print_comp (dpi, options, d_left (d_right (dc)));
5932 1.1 christos d_append_string (dpi, ">(");
5933 1.1 christos d_print_comp (dpi, options, d_right (d_right (dc)));
5934 1.1 christos d_append_char (dpi, ')');
5935 1.1 christos return;
5936 1.1 christos }
5937 1.1 christos
5938 1.6 christos if (d_maybe_print_fold_expression (dpi, options, dc))
5939 1.6 christos return;
5940 1.6 christos
5941 1.8 christos if (d_maybe_print_designated_init (dpi, options, dc))
5942 1.8 christos return;
5943 1.8 christos
5944 1.1 christos /* We wrap an expression which uses the greater-than operator in
5945 1.1 christos an extra layer of parens so that it does not get confused
5946 1.1 christos with the '>' which ends the template parameters. */
5947 1.1 christos if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
5948 1.1 christos && d_left (dc)->u.s_operator.op->len == 1
5949 1.1 christos && d_left (dc)->u.s_operator.op->name[0] == '>')
5950 1.1 christos d_append_char (dpi, '(');
5951 1.1 christos
5952 1.1 christos if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") == 0
5953 1.1 christos && d_left (d_right (dc))->type == DEMANGLE_COMPONENT_TYPED_NAME)
5954 1.1 christos {
5955 1.1 christos /* Function call used in an expression should not have printed types
5956 1.1 christos of the function arguments. Values of the function arguments still
5957 1.1 christos get printed below. */
5958 1.1 christos
5959 1.1 christos const struct demangle_component *func = d_left (d_right (dc));
5960 1.1 christos
5961 1.1 christos if (d_right (func)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
5962 1.1 christos d_print_error (dpi);
5963 1.1 christos d_print_subexpr (dpi, options, d_left (func));
5964 1.1 christos }
5965 1.1 christos else
5966 1.1 christos d_print_subexpr (dpi, options, d_left (d_right (dc)));
5967 1.1 christos if (strcmp (d_left (dc)->u.s_operator.op->code, "ix") == 0)
5968 1.1 christos {
5969 1.1 christos d_append_char (dpi, '[');
5970 1.1 christos d_print_comp (dpi, options, d_right (d_right (dc)));
5971 1.1 christos d_append_char (dpi, ']');
5972 1.1 christos }
5973 1.1 christos else
5974 1.1 christos {
5975 1.1 christos if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") != 0)
5976 1.1 christos d_print_expr_op (dpi, options, d_left (dc));
5977 1.1 christos d_print_subexpr (dpi, options, d_right (d_right (dc)));
5978 1.1 christos }
5979 1.1 christos
5980 1.1 christos if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
5981 1.1 christos && d_left (dc)->u.s_operator.op->len == 1
5982 1.1 christos && d_left (dc)->u.s_operator.op->name[0] == '>')
5983 1.1 christos d_append_char (dpi, ')');
5984 1.1 christos
5985 1.1 christos return;
5986 1.1 christos
5987 1.1 christos case DEMANGLE_COMPONENT_BINARY_ARGS:
5988 1.1 christos /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
5989 1.1 christos d_print_error (dpi);
5990 1.1 christos return;
5991 1.1 christos
5992 1.1 christos case DEMANGLE_COMPONENT_TRINARY:
5993 1.1 christos if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1
5994 1.1 christos || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2)
5995 1.1 christos {
5996 1.1 christos d_print_error (dpi);
5997 1.1 christos return;
5998 1.1 christos }
5999 1.6 christos if (d_maybe_print_fold_expression (dpi, options, dc))
6000 1.6 christos return;
6001 1.8 christos if (d_maybe_print_designated_init (dpi, options, dc))
6002 1.8 christos return;
6003 1.1 christos {
6004 1.1 christos struct demangle_component *op = d_left (dc);
6005 1.1 christos struct demangle_component *first = d_left (d_right (dc));
6006 1.1 christos struct demangle_component *second = d_left (d_right (d_right (dc)));
6007 1.1 christos struct demangle_component *third = d_right (d_right (d_right (dc)));
6008 1.1 christos
6009 1.1 christos if (!strcmp (op->u.s_operator.op->code, "qu"))
6010 1.1 christos {
6011 1.1 christos d_print_subexpr (dpi, options, first);
6012 1.1 christos d_print_expr_op (dpi, options, op);
6013 1.1 christos d_print_subexpr (dpi, options, second);
6014 1.1 christos d_append_string (dpi, " : ");
6015 1.1 christos d_print_subexpr (dpi, options, third);
6016 1.1 christos }
6017 1.1 christos else
6018 1.1 christos {
6019 1.1 christos d_append_string (dpi, "new ");
6020 1.1 christos if (d_left (first) != NULL)
6021 1.1 christos {
6022 1.1 christos d_print_subexpr (dpi, options, first);
6023 1.1 christos d_append_char (dpi, ' ');
6024 1.1 christos }
6025 1.1 christos d_print_comp (dpi, options, second);
6026 1.1 christos if (third)
6027 1.1 christos d_print_subexpr (dpi, options, third);
6028 1.1 christos }
6029 1.1 christos }
6030 1.1 christos return;
6031 1.1 christos
6032 1.1 christos case DEMANGLE_COMPONENT_TRINARY_ARG1:
6033 1.1 christos case DEMANGLE_COMPONENT_TRINARY_ARG2:
6034 1.1 christos /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
6035 1.1 christos d_print_error (dpi);
6036 1.1 christos return;
6037 1.1 christos
6038 1.1 christos case DEMANGLE_COMPONENT_LITERAL:
6039 1.1 christos case DEMANGLE_COMPONENT_LITERAL_NEG:
6040 1.1 christos {
6041 1.1 christos enum d_builtin_type_print tp;
6042 1.1 christos
6043 1.1 christos /* For some builtin types, produce simpler output. */
6044 1.1 christos tp = D_PRINT_DEFAULT;
6045 1.1 christos if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE)
6046 1.1 christos {
6047 1.1 christos tp = d_left (dc)->u.s_builtin.type->print;
6048 1.1 christos switch (tp)
6049 1.1 christos {
6050 1.1 christos case D_PRINT_INT:
6051 1.1 christos case D_PRINT_UNSIGNED:
6052 1.1 christos case D_PRINT_LONG:
6053 1.1 christos case D_PRINT_UNSIGNED_LONG:
6054 1.1 christos case D_PRINT_LONG_LONG:
6055 1.1 christos case D_PRINT_UNSIGNED_LONG_LONG:
6056 1.1 christos if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME)
6057 1.1 christos {
6058 1.1 christos if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
6059 1.1 christos d_append_char (dpi, '-');
6060 1.1 christos d_print_comp (dpi, options, d_right (dc));
6061 1.1 christos switch (tp)
6062 1.1 christos {
6063 1.1 christos default:
6064 1.1 christos break;
6065 1.1 christos case D_PRINT_UNSIGNED:
6066 1.1 christos d_append_char (dpi, 'u');
6067 1.1 christos break;
6068 1.1 christos case D_PRINT_LONG:
6069 1.1 christos d_append_char (dpi, 'l');
6070 1.1 christos break;
6071 1.1 christos case D_PRINT_UNSIGNED_LONG:
6072 1.1 christos d_append_string (dpi, "ul");
6073 1.1 christos break;
6074 1.1 christos case D_PRINT_LONG_LONG:
6075 1.1 christos d_append_string (dpi, "ll");
6076 1.1 christos break;
6077 1.1 christos case D_PRINT_UNSIGNED_LONG_LONG:
6078 1.1 christos d_append_string (dpi, "ull");
6079 1.1 christos break;
6080 1.1 christos }
6081 1.1 christos return;
6082 1.1 christos }
6083 1.1 christos break;
6084 1.1 christos
6085 1.1 christos case D_PRINT_BOOL:
6086 1.1 christos if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME
6087 1.1 christos && d_right (dc)->u.s_name.len == 1
6088 1.1 christos && dc->type == DEMANGLE_COMPONENT_LITERAL)
6089 1.1 christos {
6090 1.1 christos switch (d_right (dc)->u.s_name.s[0])
6091 1.1 christos {
6092 1.1 christos case '0':
6093 1.1 christos d_append_string (dpi, "false");
6094 1.1 christos return;
6095 1.1 christos case '1':
6096 1.1 christos d_append_string (dpi, "true");
6097 1.1 christos return;
6098 1.1 christos default:
6099 1.1 christos break;
6100 1.1 christos }
6101 1.1 christos }
6102 1.1 christos break;
6103 1.1 christos
6104 1.1 christos default:
6105 1.1 christos break;
6106 1.1 christos }
6107 1.1 christos }
6108 1.1 christos
6109 1.1 christos d_append_char (dpi, '(');
6110 1.1 christos d_print_comp (dpi, options, d_left (dc));
6111 1.1 christos d_append_char (dpi, ')');
6112 1.1 christos if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
6113 1.1 christos d_append_char (dpi, '-');
6114 1.1 christos if (tp == D_PRINT_FLOAT)
6115 1.1 christos d_append_char (dpi, '[');
6116 1.1 christos d_print_comp (dpi, options, d_right (dc));
6117 1.1 christos if (tp == D_PRINT_FLOAT)
6118 1.1 christos d_append_char (dpi, ']');
6119 1.1 christos }
6120 1.1 christos return;
6121 1.1 christos
6122 1.8 christos case DEMANGLE_COMPONENT_VENDOR_EXPR:
6123 1.8 christos d_print_comp (dpi, options, d_left (dc));
6124 1.8 christos d_append_char (dpi, '(');
6125 1.8 christos d_print_comp (dpi, options, d_right (dc));
6126 1.8 christos d_append_char (dpi, ')');
6127 1.8 christos return;
6128 1.8 christos
6129 1.1 christos case DEMANGLE_COMPONENT_NUMBER:
6130 1.1 christos d_append_num (dpi, dc->u.s_number.number);
6131 1.1 christos return;
6132 1.1 christos
6133 1.1 christos case DEMANGLE_COMPONENT_JAVA_RESOURCE:
6134 1.1 christos d_append_string (dpi, "java resource ");
6135 1.1 christos d_print_comp (dpi, options, d_left (dc));
6136 1.1 christos return;
6137 1.1 christos
6138 1.1 christos case DEMANGLE_COMPONENT_COMPOUND_NAME:
6139 1.1 christos d_print_comp (dpi, options, d_left (dc));
6140 1.1 christos d_print_comp (dpi, options, d_right (dc));
6141 1.1 christos return;
6142 1.1 christos
6143 1.1 christos case DEMANGLE_COMPONENT_CHARACTER:
6144 1.1 christos d_append_char (dpi, dc->u.s_character.character);
6145 1.1 christos return;
6146 1.1 christos
6147 1.1 christos case DEMANGLE_COMPONENT_DECLTYPE:
6148 1.1 christos d_append_string (dpi, "decltype (");
6149 1.1 christos d_print_comp (dpi, options, d_left (dc));
6150 1.1 christos d_append_char (dpi, ')');
6151 1.1 christos return;
6152 1.1 christos
6153 1.1 christos case DEMANGLE_COMPONENT_PACK_EXPANSION:
6154 1.1 christos {
6155 1.9 christos struct demangle_component *a = NULL;
6156 1.9 christos
6157 1.9 christos if (!dpi->lambda_tpl_parms)
6158 1.9 christos a = d_find_pack (dpi, d_left (dc));
6159 1.1 christos if (a == NULL)
6160 1.1 christos {
6161 1.1 christos /* d_find_pack won't find anything if the only packs involved
6162 1.1 christos in this expansion are function parameter packs; in that
6163 1.1 christos case, just print the pattern and "...". */
6164 1.1 christos d_print_subexpr (dpi, options, d_left (dc));
6165 1.1 christos d_append_string (dpi, "...");
6166 1.1 christos }
6167 1.9 christos else
6168 1.9 christos {
6169 1.9 christos int len = d_pack_length (a);
6170 1.9 christos int i;
6171 1.1 christos
6172 1.9 christos dc = d_left (dc);
6173 1.9 christos for (i = 0; i < len; ++i)
6174 1.9 christos {
6175 1.9 christos if (i)
6176 1.9 christos d_append_string (dpi, ", ");
6177 1.9 christos dpi->pack_index = i;
6178 1.9 christos d_print_comp (dpi, options, dc);
6179 1.9 christos }
6180 1.1 christos }
6181 1.1 christos }
6182 1.1 christos return;
6183 1.1 christos
6184 1.1 christos case DEMANGLE_COMPONENT_FUNCTION_PARAM:
6185 1.1 christos {
6186 1.1 christos long num = dc->u.s_number.number;
6187 1.1 christos if (num == 0)
6188 1.1 christos d_append_string (dpi, "this");
6189 1.1 christos else
6190 1.1 christos {
6191 1.1 christos d_append_string (dpi, "{parm#");
6192 1.1 christos d_append_num (dpi, num);
6193 1.1 christos d_append_char (dpi, '}');
6194 1.1 christos }
6195 1.1 christos }
6196 1.1 christos return;
6197 1.1 christos
6198 1.1 christos case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
6199 1.1 christos d_append_string (dpi, "global constructors keyed to ");
6200 1.1 christos d_print_comp (dpi, options, dc->u.s_binary.left);
6201 1.1 christos return;
6202 1.1 christos
6203 1.1 christos case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
6204 1.1 christos d_append_string (dpi, "global destructors keyed to ");
6205 1.1 christos d_print_comp (dpi, options, dc->u.s_binary.left);
6206 1.1 christos return;
6207 1.1 christos
6208 1.1 christos case DEMANGLE_COMPONENT_LAMBDA:
6209 1.9 christos {
6210 1.9 christos d_append_string (dpi, "{lambda");
6211 1.9 christos struct demangle_component *parms = dc->u.s_unary_num.sub;
6212 1.9 christos struct d_print_template dpt;
6213 1.9 christos /* Generic lambda auto parms are mangled as the (synthedic) template
6214 1.9 christos type parm they are. We need to tell the printer that (a) we're in
6215 1.9 christos a lambda, and (b) the number of synthetic parms. */
6216 1.9 christos int saved_tpl_parms = dpi->lambda_tpl_parms;
6217 1.9 christos dpi->lambda_tpl_parms = 0;
6218 1.9 christos /* Hang any lambda head as-if template args. */
6219 1.9 christos dpt.template_decl = NULL;
6220 1.9 christos dpt.next = dpi->templates;
6221 1.9 christos dpi->templates = &dpt;
6222 1.9 christos if (parms && parms->type == DEMANGLE_COMPONENT_TEMPLATE_HEAD)
6223 1.9 christos {
6224 1.9 christos dpt.template_decl = parms;
6225 1.9 christos
6226 1.9 christos d_append_char (dpi, '<');
6227 1.9 christos struct demangle_component *parm;
6228 1.9 christos for (parm = d_left (parms); parm; parm = d_right (parm))
6229 1.9 christos {
6230 1.9 christos if (dpi->lambda_tpl_parms++)
6231 1.9 christos d_append_string (dpi, ", ");
6232 1.9 christos d_print_comp (dpi, options, parm);
6233 1.9 christos d_append_char (dpi, ' ');
6234 1.9 christos if (parm->type == DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM)
6235 1.9 christos parm = d_left (parm);
6236 1.9 christos d_print_lambda_parm_name (dpi, parm->type,
6237 1.9 christos dpi->lambda_tpl_parms - 1);
6238 1.9 christos }
6239 1.9 christos d_append_char (dpi, '>');
6240 1.9 christos
6241 1.9 christos parms = d_right (parms);
6242 1.9 christos }
6243 1.9 christos dpi->lambda_tpl_parms++;
6244 1.9 christos
6245 1.9 christos d_append_char (dpi, '(');
6246 1.9 christos d_print_comp (dpi, options, parms);
6247 1.9 christos dpi->lambda_tpl_parms = saved_tpl_parms;
6248 1.9 christos dpi->templates = dpt.next;
6249 1.9 christos d_append_string (dpi, ")#");
6250 1.9 christos d_append_num (dpi, dc->u.s_unary_num.num + 1);
6251 1.9 christos d_append_char (dpi, '}');
6252 1.9 christos }
6253 1.1 christos return;
6254 1.1 christos
6255 1.1 christos case DEMANGLE_COMPONENT_UNNAMED_TYPE:
6256 1.1 christos d_append_string (dpi, "{unnamed type#");
6257 1.1 christos d_append_num (dpi, dc->u.s_number.number + 1);
6258 1.1 christos d_append_char (dpi, '}');
6259 1.1 christos return;
6260 1.1 christos
6261 1.1 christos case DEMANGLE_COMPONENT_CLONE:
6262 1.1 christos d_print_comp (dpi, options, d_left (dc));
6263 1.1 christos d_append_string (dpi, " [clone ");
6264 1.1 christos d_print_comp (dpi, options, d_right (dc));
6265 1.1 christos d_append_char (dpi, ']');
6266 1.1 christos return;
6267 1.1 christos
6268 1.9 christos case DEMANGLE_COMPONENT_FRIEND:
6269 1.9 christos d_print_comp (dpi, options, d_left (dc));
6270 1.9 christos d_append_string (dpi, "[friend]");
6271 1.9 christos return;
6272 1.9 christos
6273 1.9 christos case DEMANGLE_COMPONENT_TEMPLATE_HEAD:
6274 1.9 christos {
6275 1.9 christos d_append_char (dpi, '<');
6276 1.9 christos int count = 0;
6277 1.9 christos struct demangle_component *parm;
6278 1.9 christos for (parm = d_left (dc); parm; parm = d_right (parm))
6279 1.9 christos {
6280 1.9 christos if (count++)
6281 1.9 christos d_append_string (dpi, ", ");
6282 1.9 christos d_print_comp (dpi, options, parm);
6283 1.9 christos }
6284 1.9 christos d_append_char (dpi, '>');
6285 1.9 christos }
6286 1.9 christos return;
6287 1.9 christos
6288 1.9 christos case DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM:
6289 1.9 christos d_append_string (dpi, "typename");
6290 1.9 christos return;
6291 1.9 christos
6292 1.9 christos case DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM:
6293 1.9 christos d_print_comp (dpi, options, d_left (dc));
6294 1.9 christos return;
6295 1.9 christos
6296 1.9 christos case DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM:
6297 1.9 christos d_append_string (dpi, "template");
6298 1.9 christos d_print_comp (dpi, options, d_left (dc));
6299 1.9 christos d_append_string (dpi, " class");
6300 1.9 christos return;
6301 1.9 christos
6302 1.9 christos case DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM:
6303 1.9 christos d_print_comp (dpi, options, d_left (dc));
6304 1.9 christos d_append_string (dpi, "...");
6305 1.9 christos return;
6306 1.9 christos
6307 1.9 christos case DEMANGLE_COMPONENT_CONSTRAINTS:
6308 1.9 christos d_print_comp (dpi, options, d_left (dc));
6309 1.9 christos d_append_string (dpi, " requires ");
6310 1.9 christos d_print_comp (dpi, options, d_right (dc));
6311 1.9 christos return;
6312 1.9 christos
6313 1.1 christos default:
6314 1.1 christos d_print_error (dpi);
6315 1.1 christos return;
6316 1.1 christos }
6317 1.1 christos }
6318 1.1 christos
6319 1.3 christos static void
6320 1.3 christos d_print_comp (struct d_print_info *dpi, int options,
6321 1.6 christos struct demangle_component *dc)
6322 1.3 christos {
6323 1.3 christos struct d_component_stack self;
6324 1.6 christos if (dc == NULL || dc->d_printing > 1 || dpi->recursion > MAX_RECURSION_COUNT)
6325 1.6 christos {
6326 1.6 christos d_print_error (dpi);
6327 1.6 christos return;
6328 1.6 christos }
6329 1.6 christos
6330 1.6 christos dc->d_printing++;
6331 1.6 christos dpi->recursion++;
6332 1.3 christos
6333 1.3 christos self.dc = dc;
6334 1.3 christos self.parent = dpi->component_stack;
6335 1.3 christos dpi->component_stack = &self;
6336 1.3 christos
6337 1.3 christos d_print_comp_inner (dpi, options, dc);
6338 1.3 christos
6339 1.3 christos dpi->component_stack = self.parent;
6340 1.6 christos dc->d_printing--;
6341 1.6 christos dpi->recursion--;
6342 1.3 christos }
6343 1.3 christos
6344 1.1 christos /* Print a Java dentifier. For Java we try to handle encoded extended
6345 1.1 christos Unicode characters. The C++ ABI doesn't mention Unicode encoding,
6346 1.1 christos so we don't it for C++. Characters are encoded as
6347 1.1 christos __U<hex-char>+_. */
6348 1.1 christos
6349 1.1 christos static void
6350 1.1 christos d_print_java_identifier (struct d_print_info *dpi, const char *name, int len)
6351 1.1 christos {
6352 1.1 christos const char *p;
6353 1.1 christos const char *end;
6354 1.1 christos
6355 1.1 christos end = name + len;
6356 1.1 christos for (p = name; p < end; ++p)
6357 1.1 christos {
6358 1.1 christos if (end - p > 3
6359 1.1 christos && p[0] == '_'
6360 1.1 christos && p[1] == '_'
6361 1.1 christos && p[2] == 'U')
6362 1.1 christos {
6363 1.1 christos unsigned long c;
6364 1.1 christos const char *q;
6365 1.1 christos
6366 1.1 christos c = 0;
6367 1.1 christos for (q = p + 3; q < end; ++q)
6368 1.1 christos {
6369 1.1 christos int dig;
6370 1.1 christos
6371 1.1 christos if (IS_DIGIT (*q))
6372 1.1 christos dig = *q - '0';
6373 1.1 christos else if (*q >= 'A' && *q <= 'F')
6374 1.1 christos dig = *q - 'A' + 10;
6375 1.1 christos else if (*q >= 'a' && *q <= 'f')
6376 1.1 christos dig = *q - 'a' + 10;
6377 1.1 christos else
6378 1.1 christos break;
6379 1.1 christos
6380 1.1 christos c = c * 16 + dig;
6381 1.1 christos }
6382 1.1 christos /* If the Unicode character is larger than 256, we don't try
6383 1.1 christos to deal with it here. FIXME. */
6384 1.1 christos if (q < end && *q == '_' && c < 256)
6385 1.1 christos {
6386 1.1 christos d_append_char (dpi, c);
6387 1.1 christos p = q;
6388 1.1 christos continue;
6389 1.1 christos }
6390 1.1 christos }
6391 1.1 christos
6392 1.1 christos d_append_char (dpi, *p);
6393 1.1 christos }
6394 1.1 christos }
6395 1.1 christos
6396 1.1 christos /* Print a list of modifiers. SUFFIX is 1 if we are printing
6397 1.1 christos qualifiers on this after printing a function. */
6398 1.1 christos
6399 1.1 christos static void
6400 1.1 christos d_print_mod_list (struct d_print_info *dpi, int options,
6401 1.1 christos struct d_print_mod *mods, int suffix)
6402 1.1 christos {
6403 1.1 christos struct d_print_template *hold_dpt;
6404 1.1 christos
6405 1.1 christos if (mods == NULL || d_print_saw_error (dpi))
6406 1.1 christos return;
6407 1.1 christos
6408 1.1 christos if (mods->printed
6409 1.1 christos || (! suffix
6410 1.6 christos && (is_fnqual_component_type (mods->mod->type))))
6411 1.1 christos {
6412 1.1 christos d_print_mod_list (dpi, options, mods->next, suffix);
6413 1.1 christos return;
6414 1.1 christos }
6415 1.1 christos
6416 1.1 christos mods->printed = 1;
6417 1.1 christos
6418 1.1 christos hold_dpt = dpi->templates;
6419 1.1 christos dpi->templates = mods->templates;
6420 1.1 christos
6421 1.1 christos if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
6422 1.1 christos {
6423 1.1 christos d_print_function_type (dpi, options, mods->mod, mods->next);
6424 1.1 christos dpi->templates = hold_dpt;
6425 1.1 christos return;
6426 1.1 christos }
6427 1.1 christos else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
6428 1.1 christos {
6429 1.1 christos d_print_array_type (dpi, options, mods->mod, mods->next);
6430 1.1 christos dpi->templates = hold_dpt;
6431 1.1 christos return;
6432 1.1 christos }
6433 1.1 christos else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME)
6434 1.1 christos {
6435 1.1 christos struct d_print_mod *hold_modifiers;
6436 1.1 christos struct demangle_component *dc;
6437 1.1 christos
6438 1.1 christos /* When this is on the modifier stack, we have pulled any
6439 1.1 christos qualifiers off the right argument already. Otherwise, we
6440 1.1 christos print it as usual, but don't let the left argument see any
6441 1.1 christos modifiers. */
6442 1.1 christos
6443 1.1 christos hold_modifiers = dpi->modifiers;
6444 1.1 christos dpi->modifiers = NULL;
6445 1.1 christos d_print_comp (dpi, options, d_left (mods->mod));
6446 1.1 christos dpi->modifiers = hold_modifiers;
6447 1.1 christos
6448 1.1 christos if ((options & DMGL_JAVA) == 0)
6449 1.1 christos d_append_string (dpi, "::");
6450 1.1 christos else
6451 1.1 christos d_append_char (dpi, '.');
6452 1.1 christos
6453 1.1 christos dc = d_right (mods->mod);
6454 1.1 christos
6455 1.1 christos if (dc->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
6456 1.1 christos {
6457 1.1 christos d_append_string (dpi, "{default arg#");
6458 1.1 christos d_append_num (dpi, dc->u.s_unary_num.num + 1);
6459 1.1 christos d_append_string (dpi, "}::");
6460 1.1 christos dc = dc->u.s_unary_num.sub;
6461 1.1 christos }
6462 1.1 christos
6463 1.6 christos while (is_fnqual_component_type (dc->type))
6464 1.1 christos dc = d_left (dc);
6465 1.1 christos
6466 1.1 christos d_print_comp (dpi, options, dc);
6467 1.1 christos
6468 1.1 christos dpi->templates = hold_dpt;
6469 1.1 christos return;
6470 1.1 christos }
6471 1.1 christos
6472 1.1 christos d_print_mod (dpi, options, mods->mod);
6473 1.1 christos
6474 1.1 christos dpi->templates = hold_dpt;
6475 1.1 christos
6476 1.1 christos d_print_mod_list (dpi, options, mods->next, suffix);
6477 1.1 christos }
6478 1.1 christos
6479 1.1 christos /* Print a modifier. */
6480 1.1 christos
6481 1.1 christos static void
6482 1.1 christos d_print_mod (struct d_print_info *dpi, int options,
6483 1.6 christos struct demangle_component *mod)
6484 1.1 christos {
6485 1.1 christos switch (mod->type)
6486 1.1 christos {
6487 1.1 christos case DEMANGLE_COMPONENT_RESTRICT:
6488 1.1 christos case DEMANGLE_COMPONENT_RESTRICT_THIS:
6489 1.1 christos d_append_string (dpi, " restrict");
6490 1.1 christos return;
6491 1.1 christos case DEMANGLE_COMPONENT_VOLATILE:
6492 1.1 christos case DEMANGLE_COMPONENT_VOLATILE_THIS:
6493 1.1 christos d_append_string (dpi, " volatile");
6494 1.1 christos return;
6495 1.1 christos case DEMANGLE_COMPONENT_CONST:
6496 1.1 christos case DEMANGLE_COMPONENT_CONST_THIS:
6497 1.1 christos d_append_string (dpi, " const");
6498 1.1 christos return;
6499 1.5 christos case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
6500 1.5 christos d_append_string (dpi, " transaction_safe");
6501 1.5 christos return;
6502 1.6 christos case DEMANGLE_COMPONENT_NOEXCEPT:
6503 1.6 christos d_append_string (dpi, " noexcept");
6504 1.6 christos if (d_right (mod))
6505 1.6 christos {
6506 1.6 christos d_append_char (dpi, '(');
6507 1.6 christos d_print_comp (dpi, options, d_right (mod));
6508 1.6 christos d_append_char (dpi, ')');
6509 1.6 christos }
6510 1.6 christos return;
6511 1.6 christos case DEMANGLE_COMPONENT_THROW_SPEC:
6512 1.6 christos d_append_string (dpi, " throw");
6513 1.6 christos if (d_right (mod))
6514 1.6 christos {
6515 1.6 christos d_append_char (dpi, '(');
6516 1.6 christos d_print_comp (dpi, options, d_right (mod));
6517 1.6 christos d_append_char (dpi, ')');
6518 1.6 christos }
6519 1.6 christos return;
6520 1.1 christos case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
6521 1.1 christos d_append_char (dpi, ' ');
6522 1.1 christos d_print_comp (dpi, options, d_right (mod));
6523 1.1 christos return;
6524 1.1 christos case DEMANGLE_COMPONENT_POINTER:
6525 1.1 christos /* There is no pointer symbol in Java. */
6526 1.1 christos if ((options & DMGL_JAVA) == 0)
6527 1.1 christos d_append_char (dpi, '*');
6528 1.1 christos return;
6529 1.3 christos case DEMANGLE_COMPONENT_REFERENCE_THIS:
6530 1.3 christos /* For the ref-qualifier, put a space before the &. */
6531 1.3 christos d_append_char (dpi, ' ');
6532 1.6 christos /* FALLTHRU */
6533 1.1 christos case DEMANGLE_COMPONENT_REFERENCE:
6534 1.1 christos d_append_char (dpi, '&');
6535 1.1 christos return;
6536 1.3 christos case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
6537 1.3 christos d_append_char (dpi, ' ');
6538 1.6 christos /* FALLTHRU */
6539 1.1 christos case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
6540 1.1 christos d_append_string (dpi, "&&");
6541 1.1 christos return;
6542 1.9 christos case DEMANGLE_COMPONENT_XOBJ_MEMBER_FUNCTION:
6543 1.9 christos return;
6544 1.1 christos case DEMANGLE_COMPONENT_COMPLEX:
6545 1.7 christos d_append_string (dpi, " _Complex");
6546 1.1 christos return;
6547 1.1 christos case DEMANGLE_COMPONENT_IMAGINARY:
6548 1.7 christos d_append_string (dpi, " _Imaginary");
6549 1.1 christos return;
6550 1.1 christos case DEMANGLE_COMPONENT_PTRMEM_TYPE:
6551 1.1 christos if (d_last_char (dpi) != '(')
6552 1.1 christos d_append_char (dpi, ' ');
6553 1.1 christos d_print_comp (dpi, options, d_left (mod));
6554 1.1 christos d_append_string (dpi, "::*");
6555 1.1 christos return;
6556 1.1 christos case DEMANGLE_COMPONENT_TYPED_NAME:
6557 1.1 christos d_print_comp (dpi, options, d_left (mod));
6558 1.1 christos return;
6559 1.1 christos case DEMANGLE_COMPONENT_VECTOR_TYPE:
6560 1.1 christos d_append_string (dpi, " __vector(");
6561 1.1 christos d_print_comp (dpi, options, d_left (mod));
6562 1.1 christos d_append_char (dpi, ')');
6563 1.1 christos return;
6564 1.1 christos
6565 1.1 christos default:
6566 1.1 christos /* Otherwise, we have something that won't go back on the
6567 1.1 christos modifier stack, so we can just print it. */
6568 1.1 christos d_print_comp (dpi, options, mod);
6569 1.1 christos return;
6570 1.1 christos }
6571 1.1 christos }
6572 1.1 christos
6573 1.1 christos /* Print a function type, except for the return type. */
6574 1.1 christos
6575 1.1 christos static void
6576 1.1 christos d_print_function_type (struct d_print_info *dpi, int options,
6577 1.6 christos struct demangle_component *dc,
6578 1.1 christos struct d_print_mod *mods)
6579 1.1 christos {
6580 1.1 christos int need_paren;
6581 1.1 christos int need_space;
6582 1.9 christos int xobj_memfn;
6583 1.1 christos struct d_print_mod *p;
6584 1.1 christos struct d_print_mod *hold_modifiers;
6585 1.1 christos
6586 1.1 christos need_paren = 0;
6587 1.1 christos need_space = 0;
6588 1.9 christos xobj_memfn = 0;
6589 1.1 christos for (p = mods; p != NULL; p = p->next)
6590 1.1 christos {
6591 1.1 christos if (p->printed)
6592 1.1 christos break;
6593 1.1 christos
6594 1.1 christos switch (p->mod->type)
6595 1.1 christos {
6596 1.1 christos case DEMANGLE_COMPONENT_POINTER:
6597 1.1 christos case DEMANGLE_COMPONENT_REFERENCE:
6598 1.1 christos case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
6599 1.1 christos need_paren = 1;
6600 1.1 christos break;
6601 1.1 christos case DEMANGLE_COMPONENT_RESTRICT:
6602 1.1 christos case DEMANGLE_COMPONENT_VOLATILE:
6603 1.1 christos case DEMANGLE_COMPONENT_CONST:
6604 1.1 christos case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
6605 1.1 christos case DEMANGLE_COMPONENT_COMPLEX:
6606 1.1 christos case DEMANGLE_COMPONENT_IMAGINARY:
6607 1.1 christos case DEMANGLE_COMPONENT_PTRMEM_TYPE:
6608 1.1 christos need_space = 1;
6609 1.1 christos need_paren = 1;
6610 1.1 christos break;
6611 1.9 christos case DEMANGLE_COMPONENT_XOBJ_MEMBER_FUNCTION:
6612 1.9 christos xobj_memfn = 1;
6613 1.1 christos break;
6614 1.1 christos default:
6615 1.1 christos break;
6616 1.1 christos }
6617 1.1 christos if (need_paren)
6618 1.1 christos break;
6619 1.1 christos }
6620 1.1 christos
6621 1.1 christos if (need_paren)
6622 1.1 christos {
6623 1.1 christos if (! need_space)
6624 1.1 christos {
6625 1.1 christos if (d_last_char (dpi) != '('
6626 1.1 christos && d_last_char (dpi) != '*')
6627 1.1 christos need_space = 1;
6628 1.1 christos }
6629 1.1 christos if (need_space && d_last_char (dpi) != ' ')
6630 1.1 christos d_append_char (dpi, ' ');
6631 1.1 christos d_append_char (dpi, '(');
6632 1.1 christos }
6633 1.1 christos
6634 1.1 christos hold_modifiers = dpi->modifiers;
6635 1.1 christos dpi->modifiers = NULL;
6636 1.1 christos
6637 1.1 christos d_print_mod_list (dpi, options, mods, 0);
6638 1.1 christos
6639 1.1 christos if (need_paren)
6640 1.1 christos d_append_char (dpi, ')');
6641 1.1 christos
6642 1.1 christos d_append_char (dpi, '(');
6643 1.9 christos if (xobj_memfn)
6644 1.9 christos d_append_string (dpi, "this ");
6645 1.1 christos
6646 1.1 christos if (d_right (dc) != NULL)
6647 1.1 christos d_print_comp (dpi, options, d_right (dc));
6648 1.1 christos
6649 1.1 christos d_append_char (dpi, ')');
6650 1.1 christos
6651 1.1 christos d_print_mod_list (dpi, options, mods, 1);
6652 1.1 christos
6653 1.1 christos dpi->modifiers = hold_modifiers;
6654 1.1 christos }
6655 1.1 christos
6656 1.1 christos /* Print an array type, except for the element type. */
6657 1.1 christos
6658 1.1 christos static void
6659 1.1 christos d_print_array_type (struct d_print_info *dpi, int options,
6660 1.6 christos struct demangle_component *dc,
6661 1.1 christos struct d_print_mod *mods)
6662 1.1 christos {
6663 1.1 christos int need_space;
6664 1.1 christos
6665 1.1 christos need_space = 1;
6666 1.1 christos if (mods != NULL)
6667 1.1 christos {
6668 1.1 christos int need_paren;
6669 1.1 christos struct d_print_mod *p;
6670 1.1 christos
6671 1.1 christos need_paren = 0;
6672 1.1 christos for (p = mods; p != NULL; p = p->next)
6673 1.1 christos {
6674 1.1 christos if (! p->printed)
6675 1.1 christos {
6676 1.1 christos if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
6677 1.1 christos {
6678 1.1 christos need_space = 0;
6679 1.1 christos break;
6680 1.1 christos }
6681 1.1 christos else
6682 1.1 christos {
6683 1.1 christos need_paren = 1;
6684 1.1 christos need_space = 1;
6685 1.1 christos break;
6686 1.1 christos }
6687 1.1 christos }
6688 1.1 christos }
6689 1.1 christos
6690 1.1 christos if (need_paren)
6691 1.1 christos d_append_string (dpi, " (");
6692 1.1 christos
6693 1.1 christos d_print_mod_list (dpi, options, mods, 0);
6694 1.1 christos
6695 1.1 christos if (need_paren)
6696 1.1 christos d_append_char (dpi, ')');
6697 1.1 christos }
6698 1.1 christos
6699 1.1 christos if (need_space)
6700 1.1 christos d_append_char (dpi, ' ');
6701 1.1 christos
6702 1.1 christos d_append_char (dpi, '[');
6703 1.1 christos
6704 1.1 christos if (d_left (dc) != NULL)
6705 1.1 christos d_print_comp (dpi, options, d_left (dc));
6706 1.1 christos
6707 1.1 christos d_append_char (dpi, ']');
6708 1.1 christos }
6709 1.1 christos
6710 1.1 christos /* Print an operator in an expression. */
6711 1.1 christos
6712 1.1 christos static void
6713 1.1 christos d_print_expr_op (struct d_print_info *dpi, int options,
6714 1.6 christos struct demangle_component *dc)
6715 1.1 christos {
6716 1.1 christos if (dc->type == DEMANGLE_COMPONENT_OPERATOR)
6717 1.1 christos d_append_buffer (dpi, dc->u.s_operator.op->name,
6718 1.1 christos dc->u.s_operator.op->len);
6719 1.1 christos else
6720 1.1 christos d_print_comp (dpi, options, dc);
6721 1.1 christos }
6722 1.1 christos
6723 1.1 christos /* Print a cast. */
6724 1.1 christos
6725 1.1 christos static void
6726 1.1 christos d_print_cast (struct d_print_info *dpi, int options,
6727 1.6 christos struct demangle_component *dc)
6728 1.5 christos {
6729 1.5 christos d_print_comp (dpi, options, d_left (dc));
6730 1.5 christos }
6731 1.5 christos
6732 1.5 christos /* Print a conversion operator. */
6733 1.5 christos
6734 1.5 christos static void
6735 1.5 christos d_print_conversion (struct d_print_info *dpi, int options,
6736 1.6 christos struct demangle_component *dc)
6737 1.1 christos {
6738 1.3 christos struct d_print_template dpt;
6739 1.3 christos
6740 1.5 christos /* For a conversion operator, we need the template parameters from
6741 1.3 christos the enclosing template in scope for processing the type. */
6742 1.3 christos if (dpi->current_template != NULL)
6743 1.1 christos {
6744 1.1 christos dpt.next = dpi->templates;
6745 1.1 christos dpi->templates = &dpt;
6746 1.3 christos dpt.template_decl = dpi->current_template;
6747 1.3 christos }
6748 1.1 christos
6749 1.9 christos d_print_comp (dpi, options, d_left (dc));
6750 1.1 christos
6751 1.9 christos if (dpi->current_template != NULL)
6752 1.9 christos dpi->templates = dpt.next;
6753 1.1 christos }
6754 1.1 christos
6755 1.1 christos /* Initialize the information structure we use to pass around
6756 1.1 christos information. */
6757 1.1 christos
6758 1.1 christos CP_STATIC_IF_GLIBCPP_V3
6759 1.1 christos void
6760 1.1 christos cplus_demangle_init_info (const char *mangled, int options, size_t len,
6761 1.1 christos struct d_info *di)
6762 1.1 christos {
6763 1.1 christos di->s = mangled;
6764 1.1 christos di->send = mangled + len;
6765 1.1 christos di->options = options;
6766 1.1 christos
6767 1.1 christos di->n = mangled;
6768 1.1 christos
6769 1.7 christos /* We cannot need more components than twice the number of chars in
6770 1.1 christos the mangled string. Most components correspond directly to
6771 1.1 christos chars, but the ARGLIST types are exceptions. */
6772 1.1 christos di->num_comps = 2 * len;
6773 1.1 christos di->next_comp = 0;
6774 1.1 christos
6775 1.7 christos /* Similarly, we cannot need more substitutions than there are
6776 1.1 christos chars in the mangled string. */
6777 1.1 christos di->num_subs = len;
6778 1.1 christos di->next_sub = 0;
6779 1.1 christos
6780 1.1 christos di->last_name = NULL;
6781 1.1 christos
6782 1.1 christos di->expansion = 0;
6783 1.3 christos di->is_expression = 0;
6784 1.3 christos di->is_conversion = 0;
6785 1.7 christos di->recursion_level = 0;
6786 1.1 christos }
6787 1.1 christos
6788 1.1 christos /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
6789 1.1 christos mangled name, return strings in repeated callback giving the demangled
6790 1.1 christos name. OPTIONS is the usual libiberty demangler options. On success,
6791 1.1 christos this returns 1. On failure, returns 0. */
6792 1.1 christos
6793 1.1 christos static int
6794 1.1 christos d_demangle_callback (const char *mangled, int options,
6795 1.1 christos demangle_callbackref callback, void *opaque)
6796 1.1 christos {
6797 1.1 christos enum
6798 1.1 christos {
6799 1.1 christos DCT_TYPE,
6800 1.1 christos DCT_MANGLED,
6801 1.1 christos DCT_GLOBAL_CTORS,
6802 1.1 christos DCT_GLOBAL_DTORS
6803 1.1 christos }
6804 1.1 christos type;
6805 1.1 christos struct d_info di;
6806 1.1 christos struct demangle_component *dc;
6807 1.1 christos int status;
6808 1.1 christos
6809 1.1 christos if (mangled[0] == '_' && mangled[1] == 'Z')
6810 1.1 christos type = DCT_MANGLED;
6811 1.1 christos else if (strncmp (mangled, "_GLOBAL_", 8) == 0
6812 1.1 christos && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
6813 1.1 christos && (mangled[9] == 'D' || mangled[9] == 'I')
6814 1.1 christos && mangled[10] == '_')
6815 1.1 christos type = mangled[9] == 'I' ? DCT_GLOBAL_CTORS : DCT_GLOBAL_DTORS;
6816 1.1 christos else
6817 1.1 christos {
6818 1.1 christos if ((options & DMGL_TYPES) == 0)
6819 1.1 christos return 0;
6820 1.1 christos type = DCT_TYPE;
6821 1.1 christos }
6822 1.1 christos
6823 1.8 christos di.unresolved_name_state = 1;
6824 1.8 christos
6825 1.8 christos again:
6826 1.1 christos cplus_demangle_init_info (mangled, options, strlen (mangled), &di);
6827 1.1 christos
6828 1.7 christos /* PR 87675 - Check for a mangled string that is so long
6829 1.7 christos that we do not have enough stack space to demangle it. */
6830 1.7 christos if (((options & DMGL_NO_RECURSE_LIMIT) == 0)
6831 1.7 christos /* This check is a bit arbitrary, since what we really want to do is to
6832 1.7 christos compare the sizes of the di.comps and di.subs arrays against the
6833 1.7 christos amount of stack space remaining. But there is no portable way to do
6834 1.7 christos this, so instead we use the recursion limit as a guide to the maximum
6835 1.7 christos size of the arrays. */
6836 1.7 christos && (unsigned long) di.num_comps > DEMANGLE_RECURSION_LIMIT)
6837 1.7 christos {
6838 1.7 christos /* FIXME: We need a way to indicate that a stack limit has been reached. */
6839 1.7 christos return 0;
6840 1.7 christos }
6841 1.7 christos
6842 1.1 christos {
6843 1.1 christos #ifdef CP_DYNAMIC_ARRAYS
6844 1.1 christos __extension__ struct demangle_component comps[di.num_comps];
6845 1.1 christos __extension__ struct demangle_component *subs[di.num_subs];
6846 1.1 christos
6847 1.1 christos di.comps = comps;
6848 1.1 christos di.subs = subs;
6849 1.1 christos #else
6850 1.1 christos di.comps = alloca (di.num_comps * sizeof (*di.comps));
6851 1.1 christos di.subs = alloca (di.num_subs * sizeof (*di.subs));
6852 1.1 christos #endif
6853 1.1 christos
6854 1.1 christos switch (type)
6855 1.1 christos {
6856 1.1 christos case DCT_TYPE:
6857 1.1 christos dc = cplus_demangle_type (&di);
6858 1.1 christos break;
6859 1.1 christos case DCT_MANGLED:
6860 1.1 christos dc = cplus_demangle_mangled_name (&di, 1);
6861 1.1 christos break;
6862 1.1 christos case DCT_GLOBAL_CTORS:
6863 1.1 christos case DCT_GLOBAL_DTORS:
6864 1.1 christos d_advance (&di, 11);
6865 1.1 christos dc = d_make_comp (&di,
6866 1.1 christos (type == DCT_GLOBAL_CTORS
6867 1.1 christos ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
6868 1.1 christos : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS),
6869 1.1 christos d_make_demangle_mangled_name (&di, d_str (&di)),
6870 1.1 christos NULL);
6871 1.1 christos d_advance (&di, strlen (d_str (&di)));
6872 1.1 christos break;
6873 1.3 christos default:
6874 1.3 christos abort (); /* We have listed all the cases. */
6875 1.1 christos }
6876 1.1 christos
6877 1.1 christos /* If DMGL_PARAMS is set, then if we didn't consume the entire
6878 1.1 christos mangled string, then we didn't successfully demangle it. If
6879 1.1 christos DMGL_PARAMS is not set, we didn't look at the trailing
6880 1.1 christos parameters. */
6881 1.1 christos if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0')
6882 1.1 christos dc = NULL;
6883 1.1 christos
6884 1.8 christos /* See discussion in d_unresolved_name. */
6885 1.8 christos if (dc == NULL && di.unresolved_name_state == -1)
6886 1.8 christos {
6887 1.8 christos di.unresolved_name_state = 0;
6888 1.8 christos goto again;
6889 1.8 christos }
6890 1.8 christos
6891 1.1 christos #ifdef CP_DEMANGLE_DEBUG
6892 1.1 christos d_dump (dc, 0);
6893 1.1 christos #endif
6894 1.1 christos
6895 1.1 christos status = (dc != NULL)
6896 1.1 christos ? cplus_demangle_print_callback (options, dc, callback, opaque)
6897 1.1 christos : 0;
6898 1.1 christos }
6899 1.1 christos
6900 1.1 christos return status;
6901 1.1 christos }
6902 1.1 christos
6903 1.1 christos /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
6904 1.1 christos name, return a buffer allocated with malloc holding the demangled
6905 1.1 christos name. OPTIONS is the usual libiberty demangler options. On
6906 1.1 christos success, this sets *PALC to the allocated size of the returned
6907 1.1 christos buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
6908 1.1 christos a memory allocation failure, and returns NULL. */
6909 1.1 christos
6910 1.1 christos static char *
6911 1.1 christos d_demangle (const char *mangled, int options, size_t *palc)
6912 1.1 christos {
6913 1.1 christos struct d_growable_string dgs;
6914 1.1 christos int status;
6915 1.1 christos
6916 1.1 christos d_growable_string_init (&dgs, 0);
6917 1.1 christos
6918 1.1 christos status = d_demangle_callback (mangled, options,
6919 1.1 christos d_growable_string_callback_adapter, &dgs);
6920 1.1 christos if (status == 0)
6921 1.1 christos {
6922 1.1 christos free (dgs.buf);
6923 1.1 christos *palc = 0;
6924 1.1 christos return NULL;
6925 1.1 christos }
6926 1.1 christos
6927 1.1 christos *palc = dgs.allocation_failure ? 1 : dgs.alc;
6928 1.1 christos return dgs.buf;
6929 1.1 christos }
6930 1.1 christos
6931 1.1 christos #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
6932 1.1 christos
6933 1.1 christos extern char *__cxa_demangle (const char *, char *, size_t *, int *);
6934 1.1 christos
6935 1.1 christos /* ia64 ABI-mandated entry point in the C++ runtime library for
6936 1.1 christos performing demangling. MANGLED_NAME is a NUL-terminated character
6937 1.1 christos string containing the name to be demangled.
6938 1.1 christos
6939 1.1 christos OUTPUT_BUFFER is a region of memory, allocated with malloc, of
6940 1.1 christos *LENGTH bytes, into which the demangled name is stored. If
6941 1.1 christos OUTPUT_BUFFER is not long enough, it is expanded using realloc.
6942 1.1 christos OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
6943 1.1 christos is placed in a region of memory allocated with malloc.
6944 1.1 christos
6945 1.1 christos If LENGTH is non-NULL, the length of the buffer containing the
6946 1.1 christos demangled name, is placed in *LENGTH.
6947 1.1 christos
6948 1.1 christos The return value is a pointer to the start of the NUL-terminated
6949 1.1 christos demangled name, or NULL if the demangling fails. The caller is
6950 1.1 christos responsible for deallocating this memory using free.
6951 1.1 christos
6952 1.1 christos *STATUS is set to one of the following values:
6953 1.1 christos 0: The demangling operation succeeded.
6954 1.1 christos -1: A memory allocation failure occurred.
6955 1.1 christos -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6956 1.1 christos -3: One of the arguments is invalid.
6957 1.1 christos
6958 1.1 christos The demangling is performed using the C++ ABI mangling rules, with
6959 1.1 christos GNU extensions. */
6960 1.1 christos
6961 1.1 christos char *
6962 1.1 christos __cxa_demangle (const char *mangled_name, char *output_buffer,
6963 1.1 christos size_t *length, int *status)
6964 1.1 christos {
6965 1.1 christos char *demangled;
6966 1.1 christos size_t alc;
6967 1.1 christos
6968 1.1 christos if (mangled_name == NULL)
6969 1.1 christos {
6970 1.1 christos if (status != NULL)
6971 1.1 christos *status = -3;
6972 1.1 christos return NULL;
6973 1.1 christos }
6974 1.1 christos
6975 1.1 christos if (output_buffer != NULL && length == NULL)
6976 1.1 christos {
6977 1.1 christos if (status != NULL)
6978 1.1 christos *status = -3;
6979 1.1 christos return NULL;
6980 1.1 christos }
6981 1.1 christos
6982 1.1 christos demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc);
6983 1.1 christos
6984 1.1 christos if (demangled == NULL)
6985 1.1 christos {
6986 1.1 christos if (status != NULL)
6987 1.1 christos {
6988 1.1 christos if (alc == 1)
6989 1.1 christos *status = -1;
6990 1.1 christos else
6991 1.1 christos *status = -2;
6992 1.1 christos }
6993 1.1 christos return NULL;
6994 1.1 christos }
6995 1.1 christos
6996 1.1 christos if (output_buffer == NULL)
6997 1.1 christos {
6998 1.1 christos if (length != NULL)
6999 1.1 christos *length = alc;
7000 1.1 christos }
7001 1.1 christos else
7002 1.1 christos {
7003 1.1 christos if (strlen (demangled) < *length)
7004 1.1 christos {
7005 1.1 christos strcpy (output_buffer, demangled);
7006 1.1 christos free (demangled);
7007 1.1 christos demangled = output_buffer;
7008 1.1 christos }
7009 1.1 christos else
7010 1.1 christos {
7011 1.1 christos free (output_buffer);
7012 1.1 christos *length = alc;
7013 1.1 christos }
7014 1.1 christos }
7015 1.1 christos
7016 1.1 christos if (status != NULL)
7017 1.1 christos *status = 0;
7018 1.1 christos
7019 1.1 christos return demangled;
7020 1.1 christos }
7021 1.1 christos
7022 1.1 christos extern int __gcclibcxx_demangle_callback (const char *,
7023 1.1 christos void (*)
7024 1.1 christos (const char *, size_t, void *),
7025 1.1 christos void *);
7026 1.1 christos
7027 1.1 christos /* Alternative, allocationless entry point in the C++ runtime library
7028 1.1 christos for performing demangling. MANGLED_NAME is a NUL-terminated character
7029 1.1 christos string containing the name to be demangled.
7030 1.1 christos
7031 1.1 christos CALLBACK is a callback function, called with demangled string
7032 1.1 christos segments as demangling progresses; it is called at least once,
7033 1.1 christos but may be called more than once. OPAQUE is a generalized pointer
7034 1.1 christos used as a callback argument.
7035 1.1 christos
7036 1.1 christos The return code is one of the following values, equivalent to
7037 1.1 christos the STATUS values of __cxa_demangle() (excluding -1, since this
7038 1.1 christos function performs no memory allocations):
7039 1.1 christos 0: The demangling operation succeeded.
7040 1.1 christos -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
7041 1.1 christos -3: One of the arguments is invalid.
7042 1.1 christos
7043 1.1 christos The demangling is performed using the C++ ABI mangling rules, with
7044 1.1 christos GNU extensions. */
7045 1.1 christos
7046 1.1 christos int
7047 1.1 christos __gcclibcxx_demangle_callback (const char *mangled_name,
7048 1.1 christos void (*callback) (const char *, size_t, void *),
7049 1.1 christos void *opaque)
7050 1.1 christos {
7051 1.1 christos int status;
7052 1.1 christos
7053 1.1 christos if (mangled_name == NULL || callback == NULL)
7054 1.1 christos return -3;
7055 1.1 christos
7056 1.1 christos status = d_demangle_callback (mangled_name, DMGL_PARAMS | DMGL_TYPES,
7057 1.1 christos callback, opaque);
7058 1.1 christos if (status == 0)
7059 1.1 christos return -2;
7060 1.1 christos
7061 1.1 christos return 0;
7062 1.1 christos }
7063 1.1 christos
7064 1.1 christos #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
7065 1.1 christos
7066 1.1 christos /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
7067 1.1 christos mangled name, return a buffer allocated with malloc holding the
7068 1.1 christos demangled name. Otherwise, return NULL. */
7069 1.1 christos
7070 1.1 christos char *
7071 1.1 christos cplus_demangle_v3 (const char *mangled, int options)
7072 1.1 christos {
7073 1.1 christos size_t alc;
7074 1.1 christos
7075 1.1 christos return d_demangle (mangled, options, &alc);
7076 1.1 christos }
7077 1.1 christos
7078 1.1 christos int
7079 1.1 christos cplus_demangle_v3_callback (const char *mangled, int options,
7080 1.1 christos demangle_callbackref callback, void *opaque)
7081 1.1 christos {
7082 1.1 christos return d_demangle_callback (mangled, options, callback, opaque);
7083 1.1 christos }
7084 1.1 christos
7085 1.1 christos /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
7086 1.1 christos conventions, but the output formatting is a little different.
7087 1.1 christos This instructs the C++ demangler not to emit pointer characters ("*"), to
7088 1.1 christos use Java's namespace separator symbol ("." instead of "::"), and to output
7089 1.1 christos JArray<TYPE> as TYPE[]. */
7090 1.1 christos
7091 1.1 christos char *
7092 1.1 christos java_demangle_v3 (const char *mangled)
7093 1.1 christos {
7094 1.1 christos size_t alc;
7095 1.1 christos
7096 1.1 christos return d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, &alc);
7097 1.1 christos }
7098 1.1 christos
7099 1.1 christos int
7100 1.1 christos java_demangle_v3_callback (const char *mangled,
7101 1.1 christos demangle_callbackref callback, void *opaque)
7102 1.1 christos {
7103 1.1 christos return d_demangle_callback (mangled,
7104 1.1 christos DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX,
7105 1.1 christos callback, opaque);
7106 1.1 christos }
7107 1.1 christos
7108 1.1 christos #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
7109 1.1 christos
7110 1.1 christos #ifndef IN_GLIBCPP_V3
7111 1.1 christos
7112 1.1 christos /* Demangle a string in order to find out whether it is a constructor
7113 1.1 christos or destructor. Return non-zero on success. Set *CTOR_KIND and
7114 1.1 christos *DTOR_KIND appropriately. */
7115 1.1 christos
7116 1.1 christos static int
7117 1.1 christos is_ctor_or_dtor (const char *mangled,
7118 1.1 christos enum gnu_v3_ctor_kinds *ctor_kind,
7119 1.1 christos enum gnu_v3_dtor_kinds *dtor_kind)
7120 1.1 christos {
7121 1.1 christos struct d_info di;
7122 1.1 christos struct demangle_component *dc;
7123 1.1 christos int ret;
7124 1.1 christos
7125 1.1 christos *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
7126 1.1 christos *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
7127 1.1 christos
7128 1.1 christos cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di);
7129 1.1 christos
7130 1.1 christos {
7131 1.1 christos #ifdef CP_DYNAMIC_ARRAYS
7132 1.1 christos __extension__ struct demangle_component comps[di.num_comps];
7133 1.1 christos __extension__ struct demangle_component *subs[di.num_subs];
7134 1.1 christos
7135 1.1 christos di.comps = comps;
7136 1.1 christos di.subs = subs;
7137 1.1 christos #else
7138 1.1 christos di.comps = alloca (di.num_comps * sizeof (*di.comps));
7139 1.1 christos di.subs = alloca (di.num_subs * sizeof (*di.subs));
7140 1.1 christos #endif
7141 1.1 christos
7142 1.1 christos dc = cplus_demangle_mangled_name (&di, 1);
7143 1.1 christos
7144 1.1 christos /* Note that because we did not pass DMGL_PARAMS, we don't expect
7145 1.1 christos to demangle the entire string. */
7146 1.1 christos
7147 1.1 christos ret = 0;
7148 1.1 christos while (dc != NULL)
7149 1.1 christos {
7150 1.1 christos switch (dc->type)
7151 1.1 christos {
7152 1.3 christos /* These cannot appear on a constructor or destructor. */
7153 1.3 christos case DEMANGLE_COMPONENT_RESTRICT_THIS:
7154 1.3 christos case DEMANGLE_COMPONENT_VOLATILE_THIS:
7155 1.3 christos case DEMANGLE_COMPONENT_CONST_THIS:
7156 1.3 christos case DEMANGLE_COMPONENT_REFERENCE_THIS:
7157 1.3 christos case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
7158 1.1 christos default:
7159 1.1 christos dc = NULL;
7160 1.1 christos break;
7161 1.1 christos case DEMANGLE_COMPONENT_TYPED_NAME:
7162 1.1 christos case DEMANGLE_COMPONENT_TEMPLATE:
7163 1.1 christos dc = d_left (dc);
7164 1.1 christos break;
7165 1.1 christos case DEMANGLE_COMPONENT_QUAL_NAME:
7166 1.1 christos case DEMANGLE_COMPONENT_LOCAL_NAME:
7167 1.1 christos dc = d_right (dc);
7168 1.1 christos break;
7169 1.1 christos case DEMANGLE_COMPONENT_CTOR:
7170 1.1 christos *ctor_kind = dc->u.s_ctor.kind;
7171 1.1 christos ret = 1;
7172 1.1 christos dc = NULL;
7173 1.1 christos break;
7174 1.1 christos case DEMANGLE_COMPONENT_DTOR:
7175 1.1 christos *dtor_kind = dc->u.s_dtor.kind;
7176 1.1 christos ret = 1;
7177 1.1 christos dc = NULL;
7178 1.1 christos break;
7179 1.1 christos }
7180 1.1 christos }
7181 1.1 christos }
7182 1.1 christos
7183 1.1 christos return ret;
7184 1.1 christos }
7185 1.1 christos
7186 1.1 christos /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
7187 1.1 christos name. A non-zero return indicates the type of constructor. */
7188 1.1 christos
7189 1.1 christos enum gnu_v3_ctor_kinds
7190 1.1 christos is_gnu_v3_mangled_ctor (const char *name)
7191 1.1 christos {
7192 1.1 christos enum gnu_v3_ctor_kinds ctor_kind;
7193 1.1 christos enum gnu_v3_dtor_kinds dtor_kind;
7194 1.1 christos
7195 1.1 christos if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
7196 1.1 christos return (enum gnu_v3_ctor_kinds) 0;
7197 1.1 christos return ctor_kind;
7198 1.1 christos }
7199 1.1 christos
7200 1.1 christos
7201 1.1 christos /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
7202 1.1 christos name. A non-zero return indicates the type of destructor. */
7203 1.1 christos
7204 1.1 christos enum gnu_v3_dtor_kinds
7205 1.1 christos is_gnu_v3_mangled_dtor (const char *name)
7206 1.1 christos {
7207 1.1 christos enum gnu_v3_ctor_kinds ctor_kind;
7208 1.1 christos enum gnu_v3_dtor_kinds dtor_kind;
7209 1.1 christos
7210 1.1 christos if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
7211 1.1 christos return (enum gnu_v3_dtor_kinds) 0;
7212 1.1 christos return dtor_kind;
7213 1.1 christos }
7214 1.1 christos
7215 1.1 christos #endif /* IN_GLIBCPP_V3 */
7216 1.1 christos
7217 1.1 christos #ifdef STANDALONE_DEMANGLER
7218 1.1 christos
7219 1.1 christos #include "getopt.h"
7220 1.1 christos #include "dyn-string.h"
7221 1.1 christos
7222 1.1 christos static void print_usage (FILE* fp, int exit_value);
7223 1.1 christos
7224 1.1 christos #define IS_ALPHA(CHAR) \
7225 1.1 christos (((CHAR) >= 'a' && (CHAR) <= 'z') \
7226 1.1 christos || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
7227 1.1 christos
7228 1.1 christos /* Non-zero if CHAR is a character than can occur in a mangled name. */
7229 1.1 christos #define is_mangled_char(CHAR) \
7230 1.1 christos (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
7231 1.1 christos || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
7232 1.1 christos
7233 1.1 christos /* The name of this program, as invoked. */
7234 1.1 christos const char* program_name;
7235 1.1 christos
7236 1.1 christos /* Prints usage summary to FP and then exits with EXIT_VALUE. */
7237 1.1 christos
7238 1.1 christos static void
7239 1.1 christos print_usage (FILE* fp, int exit_value)
7240 1.1 christos {
7241 1.1 christos fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
7242 1.1 christos fprintf (fp, "Options:\n");
7243 1.1 christos fprintf (fp, " -h,--help Display this message.\n");
7244 1.1 christos fprintf (fp, " -p,--no-params Don't display function parameters\n");
7245 1.1 christos fprintf (fp, " -v,--verbose Produce verbose demanglings.\n");
7246 1.1 christos fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n");
7247 1.1 christos
7248 1.1 christos exit (exit_value);
7249 1.1 christos }
7250 1.1 christos
7251 1.1 christos /* Option specification for getopt_long. */
7252 1.1 christos static const struct option long_options[] =
7253 1.1 christos {
7254 1.1 christos { "help", no_argument, NULL, 'h' },
7255 1.1 christos { "no-params", no_argument, NULL, 'p' },
7256 1.1 christos { "verbose", no_argument, NULL, 'v' },
7257 1.1 christos { NULL, no_argument, NULL, 0 },
7258 1.1 christos };
7259 1.1 christos
7260 1.1 christos /* Main entry for a demangling filter executable. It will demangle
7261 1.1 christos its command line arguments, if any. If none are provided, it will
7262 1.1 christos filter stdin to stdout, replacing any recognized mangled C++ names
7263 1.1 christos with their demangled equivalents. */
7264 1.1 christos
7265 1.1 christos int
7266 1.1 christos main (int argc, char *argv[])
7267 1.1 christos {
7268 1.1 christos int i;
7269 1.1 christos int opt_char;
7270 1.1 christos int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
7271 1.1 christos
7272 1.1 christos /* Use the program name of this program, as invoked. */
7273 1.1 christos program_name = argv[0];
7274 1.1 christos
7275 1.1 christos /* Parse options. */
7276 1.1 christos do
7277 1.1 christos {
7278 1.1 christos opt_char = getopt_long (argc, argv, "hpv", long_options, NULL);
7279 1.1 christos switch (opt_char)
7280 1.1 christos {
7281 1.1 christos case '?': /* Unrecognized option. */
7282 1.1 christos print_usage (stderr, 1);
7283 1.1 christos break;
7284 1.1 christos
7285 1.1 christos case 'h':
7286 1.1 christos print_usage (stdout, 0);
7287 1.1 christos break;
7288 1.1 christos
7289 1.1 christos case 'p':
7290 1.1 christos options &= ~ DMGL_PARAMS;
7291 1.1 christos break;
7292 1.1 christos
7293 1.1 christos case 'v':
7294 1.1 christos options |= DMGL_VERBOSE;
7295 1.1 christos break;
7296 1.1 christos }
7297 1.1 christos }
7298 1.1 christos while (opt_char != -1);
7299 1.1 christos
7300 1.1 christos if (optind == argc)
7301 1.1 christos /* No command line arguments were provided. Filter stdin. */
7302 1.1 christos {
7303 1.1 christos dyn_string_t mangled = dyn_string_new (3);
7304 1.1 christos char *s;
7305 1.1 christos
7306 1.1 christos /* Read all of input. */
7307 1.1 christos while (!feof (stdin))
7308 1.1 christos {
7309 1.1 christos char c;
7310 1.1 christos
7311 1.1 christos /* Pile characters into mangled until we hit one that can't
7312 1.1 christos occur in a mangled name. */
7313 1.1 christos c = getchar ();
7314 1.1 christos while (!feof (stdin) && is_mangled_char (c))
7315 1.1 christos {
7316 1.1 christos dyn_string_append_char (mangled, c);
7317 1.1 christos if (feof (stdin))
7318 1.1 christos break;
7319 1.1 christos c = getchar ();
7320 1.1 christos }
7321 1.1 christos
7322 1.1 christos if (dyn_string_length (mangled) > 0)
7323 1.1 christos {
7324 1.1 christos #ifdef IN_GLIBCPP_V3
7325 1.1 christos s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL);
7326 1.1 christos #else
7327 1.1 christos s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
7328 1.1 christos #endif
7329 1.1 christos
7330 1.1 christos if (s != NULL)
7331 1.1 christos {
7332 1.1 christos fputs (s, stdout);
7333 1.1 christos free (s);
7334 1.1 christos }
7335 1.1 christos else
7336 1.1 christos {
7337 1.1 christos /* It might not have been a mangled name. Print the
7338 1.1 christos original text. */
7339 1.1 christos fputs (dyn_string_buf (mangled), stdout);
7340 1.1 christos }
7341 1.1 christos
7342 1.1 christos dyn_string_clear (mangled);
7343 1.1 christos }
7344 1.1 christos
7345 1.1 christos /* If we haven't hit EOF yet, we've read one character that
7346 1.1 christos can't occur in a mangled name, so print it out. */
7347 1.1 christos if (!feof (stdin))
7348 1.1 christos putchar (c);
7349 1.1 christos }
7350 1.1 christos
7351 1.1 christos dyn_string_delete (mangled);
7352 1.1 christos }
7353 1.1 christos else
7354 1.1 christos /* Demangle command line arguments. */
7355 1.1 christos {
7356 1.1 christos /* Loop over command line arguments. */
7357 1.1 christos for (i = optind; i < argc; ++i)
7358 1.1 christos {
7359 1.1 christos char *s;
7360 1.1 christos #ifdef IN_GLIBCPP_V3
7361 1.1 christos int status;
7362 1.1 christos #endif
7363 1.1 christos
7364 1.1 christos /* Attempt to demangle. */
7365 1.1 christos #ifdef IN_GLIBCPP_V3
7366 1.1 christos s = __cxa_demangle (argv[i], NULL, NULL, &status);
7367 1.1 christos #else
7368 1.1 christos s = cplus_demangle_v3 (argv[i], options);
7369 1.1 christos #endif
7370 1.1 christos
7371 1.1 christos /* If it worked, print the demangled name. */
7372 1.1 christos if (s != NULL)
7373 1.1 christos {
7374 1.1 christos printf ("%s\n", s);
7375 1.1 christos free (s);
7376 1.1 christos }
7377 1.1 christos else
7378 1.1 christos {
7379 1.1 christos #ifdef IN_GLIBCPP_V3
7380 1.1 christos fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status);
7381 1.1 christos #else
7382 1.1 christos fprintf (stderr, "Failed: %s\n", argv[i]);
7383 1.1 christos #endif
7384 1.1 christos }
7385 1.1 christos }
7386 1.1 christos }
7387 1.1 christos
7388 1.1 christos return 0;
7389 1.1 christos }
7390 1.1 christos
7391 1.1 christos #endif /* STANDALONE_DEMANGLER */
7392