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