Adjust dg-bogus pattern to match the text of the changed diagnostic.
[official-gcc.git] / libiberty / cp-demangle.c
blob04832ff6830ab341c63480974dea848ef4c65f4f
1 /* Demangler for g++ V3 ABI.
2 Copyright (C) 2003-2017 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor <ian@wasabisystems.com>.
5 This file is part of the libiberty library, which is part of GCC.
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.
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.)
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.
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.
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
35 This code was written while looking at the demangler written by
36 Alex Samuel <samuel@codesourcery.com>.
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.
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)
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.
67 This file also defines some other functions and variables which are
68 only to be used by the file cp-demint.c.
70 Preprocessor macros you can define while compiling this file:
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]().
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.
88 STANDALONE_DEMANGLER
89 If defined, this file defines a main() function which demangles
90 any arguments, or, if none, demangles stdin.
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.
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. */
101 #if defined (_AIX) && !defined (__GNUC__)
102 #pragma alloca
103 #endif
105 #ifdef HAVE_CONFIG_H
106 #include "config.h"
107 #endif
109 #include <stdio.h>
111 #ifdef HAVE_STDLIB_H
112 #include <stdlib.h>
113 #endif
114 #ifdef HAVE_STRING_H
115 #include <string.h>
116 #endif
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 */
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
137 #include "ansidecl.h"
138 #include "libiberty.h"
139 #include "demangle.h"
140 #include "cp-demangle.h"
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
148 #define CP_STATIC_IF_GLIBCPP_V3 static
150 #define cplus_demangle_fill_name d_fill_name
151 static int d_fill_name (struct demangle_component *, const char *, int);
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 *);
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 *);
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 *);
168 #define cplus_demangle_mangled_name d_mangled_name
169 static struct demangle_component *d_mangled_name (struct d_info *, int);
171 #define cplus_demangle_type d_type
172 static struct demangle_component *d_type (struct d_info *);
174 #define cplus_demangle_print d_print
175 static char *d_print (int, struct demangle_component *, int, size_t *);
177 #define cplus_demangle_print_callback d_print_callback
178 static int d_print_callback (int, struct demangle_component *,
179 demangle_callbackref, void *);
181 #define cplus_demangle_init_info d_init_info
182 static void d_init_info (const char *, int, size_t, struct d_info *);
184 #else /* ! defined(IN_GLIBCPP_V3) */
185 #define CP_STATIC_IF_GLIBCPP_V3
186 #endif /* ! defined(IN_GLIBCPP_V3) */
188 /* See if the compiler supports dynamic arrays. */
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__) */
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.
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. */
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')
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)
221 /* Information we keep for the standard substitutions. */
223 struct d_standard_sub_info
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;
244 /* Accessors for subtrees of struct demangle_component. */
246 #define d_left(dc) ((dc)->u.s_binary.left)
247 #define d_right(dc) ((dc)->u.s_binary.right)
249 /* A list of templates. This is used while printing. */
251 struct d_print_template
253 /* Next template on the list. */
254 struct d_print_template *next;
255 /* This template. */
256 const struct demangle_component *template_decl;
259 /* A list of type modifiers. This is used while printing. */
261 struct d_print_mod
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 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;
274 /* We use these structures to hold information during printing. */
276 struct d_growable_string
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;
288 /* Stack of components, innermost first, used to avoid loops. */
290 struct d_component_stack
292 /* This component. */
293 const struct demangle_component *dc;
294 /* This component's parent. */
295 const struct d_component_stack *parent;
298 /* A demangle component and some scope captured when it was first
299 traversed. */
301 struct d_saved_scope
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;
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. */
314 struct d_info_checkpoint
316 const char *n;
317 int next_comp;
318 int next_sub;
319 int did_subs;
320 int expansion;
323 enum { D_PRINT_BUFFER_LENGTH = 256 };
324 struct d_print_info
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;
371 #ifdef CP_DEMANGLE_DEBUG
372 static void d_dump (struct demangle_component *, int);
373 #endif
375 static struct demangle_component *
376 d_make_empty (struct d_info *);
378 static struct demangle_component *
379 d_make_comp (struct d_info *, enum demangle_component_type,
380 struct demangle_component *,
381 struct demangle_component *);
383 static struct demangle_component *
384 d_make_name (struct d_info *, const char *, int);
386 static struct demangle_component *
387 d_make_demangle_mangled_name (struct d_info *, const char *);
389 static struct demangle_component *
390 d_make_builtin_type (struct d_info *,
391 const struct demangle_builtin_type_info *);
393 static struct demangle_component *
394 d_make_operator (struct d_info *,
395 const struct demangle_operator_info *);
397 static struct demangle_component *
398 d_make_extended_operator (struct d_info *, int,
399 struct demangle_component *);
401 static struct demangle_component *
402 d_make_ctor (struct d_info *, enum gnu_v3_ctor_kinds,
403 struct demangle_component *);
405 static struct demangle_component *
406 d_make_dtor (struct d_info *, enum gnu_v3_dtor_kinds,
407 struct demangle_component *);
409 static struct demangle_component *
410 d_make_template_param (struct d_info *, int);
412 static struct demangle_component *
413 d_make_sub (struct d_info *, const char *, int);
415 static int
416 has_return_type (struct demangle_component *);
418 static int
419 is_ctor_dtor_or_conversion (struct demangle_component *);
421 static struct demangle_component *d_encoding (struct d_info *, int);
423 static struct demangle_component *d_name (struct d_info *);
425 static struct demangle_component *d_nested_name (struct d_info *);
427 static struct demangle_component *d_prefix (struct d_info *);
429 static struct demangle_component *d_unqualified_name (struct d_info *);
431 static struct demangle_component *d_source_name (struct d_info *);
433 static int d_number (struct d_info *);
435 static struct demangle_component *d_identifier (struct d_info *, int);
437 static struct demangle_component *d_operator_name (struct d_info *);
439 static struct demangle_component *d_special_name (struct d_info *);
441 static struct demangle_component *d_parmlist (struct d_info *);
443 static int d_call_offset (struct d_info *, int);
445 static struct demangle_component *d_ctor_dtor_name (struct d_info *);
447 static struct demangle_component **
448 d_cv_qualifiers (struct d_info *, struct demangle_component **, int);
450 static struct demangle_component *
451 d_ref_qualifier (struct d_info *, struct demangle_component *);
453 static struct demangle_component *
454 d_function_type (struct d_info *);
456 static struct demangle_component *
457 d_bare_function_type (struct d_info *, int);
459 static struct demangle_component *
460 d_class_enum_type (struct d_info *);
462 static struct demangle_component *d_array_type (struct d_info *);
464 static struct demangle_component *d_vector_type (struct d_info *);
466 static struct demangle_component *
467 d_pointer_to_member_type (struct d_info *);
469 static struct demangle_component *
470 d_template_param (struct d_info *);
472 static struct demangle_component *d_template_args (struct d_info *);
473 static struct demangle_component *d_template_args_1 (struct d_info *);
475 static struct demangle_component *
476 d_template_arg (struct d_info *);
478 static struct demangle_component *d_expression (struct d_info *);
480 static struct demangle_component *d_expr_primary (struct d_info *);
482 static struct demangle_component *d_local_name (struct d_info *);
484 static int d_discriminator (struct d_info *);
486 static struct demangle_component *d_lambda (struct d_info *);
488 static struct demangle_component *d_unnamed_type (struct d_info *);
490 static struct demangle_component *
491 d_clone_suffix (struct d_info *, struct demangle_component *);
493 static int
494 d_add_substitution (struct d_info *, struct demangle_component *);
496 static struct demangle_component *d_substitution (struct d_info *, int);
498 static void d_checkpoint (struct d_info *, struct d_info_checkpoint *);
500 static void d_backtrack (struct d_info *, struct d_info_checkpoint *);
502 static void d_growable_string_init (struct d_growable_string *, size_t);
504 static inline void
505 d_growable_string_resize (struct d_growable_string *, size_t);
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 *);
513 static void
514 d_print_init (struct d_print_info *, demangle_callbackref, void *,
515 const struct demangle_component *);
517 static inline void d_print_error (struct d_print_info *);
519 static inline int d_print_saw_error (struct d_print_info *);
521 static inline void d_print_flush (struct d_print_info *);
523 static inline void d_append_char (struct d_print_info *, char);
525 static inline void d_append_buffer (struct d_print_info *,
526 const char *, size_t);
528 static inline void d_append_string (struct d_print_info *, const char *);
530 static inline char d_last_char (struct d_print_info *);
532 static void
533 d_print_comp (struct d_print_info *, int, struct demangle_component *);
535 static void
536 d_print_java_identifier (struct d_print_info *, const char *, int);
538 static void
539 d_print_mod_list (struct d_print_info *, int, struct d_print_mod *, int);
541 static void
542 d_print_mod (struct d_print_info *, int, struct demangle_component *);
544 static void
545 d_print_function_type (struct d_print_info *, int,
546 struct demangle_component *,
547 struct d_print_mod *);
549 static void
550 d_print_array_type (struct d_print_info *, int,
551 struct demangle_component *,
552 struct d_print_mod *);
554 static void
555 d_print_expr_op (struct d_print_info *, int, struct demangle_component *);
557 static void d_print_cast (struct d_print_info *, int,
558 struct demangle_component *);
559 static void d_print_conversion (struct d_print_info *, int,
560 struct demangle_component *);
562 static int d_demangle_callback (const char *, int,
563 demangle_callbackref, void *);
564 static char *d_demangle (const char *, int, size_t *);
566 /* True iff TYPE is a demangling component representing a
567 function-type-qualifier. */
569 static int
570 is_fnqual_component_type (enum demangle_component_type type)
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);
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
592 #ifdef CP_DEMANGLE_DEBUG
594 static void
595 d_dump (struct demangle_component *dc, int indent)
597 int i;
599 if (dc == NULL)
601 if (indent == 0)
602 printf ("failed demangling\n");
603 return;
606 for (i = 0; i < indent; ++i)
607 putchar (' ');
609 switch (dc->type)
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;
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;
843 d_dump (d_left (dc), indent + 2);
844 d_dump (d_right (dc), indent + 2);
847 #endif /* CP_DEMANGLE_DEBUG */
849 /* Fill in a DEMANGLE_COMPONENT_NAME. */
851 CP_STATIC_IF_GLIBCPP_V3
853 cplus_demangle_fill_name (struct demangle_component *p, const char *s, int len)
855 if (p == NULL || s == NULL || len == 0)
856 return 0;
857 p->d_printing = 0;
858 p->type = DEMANGLE_COMPONENT_NAME;
859 p->u.s_name.s = s;
860 p->u.s_name.len = len;
861 return 1;
864 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
866 CP_STATIC_IF_GLIBCPP_V3
868 cplus_demangle_fill_extended_operator (struct demangle_component *p, int args,
869 struct demangle_component *name)
871 if (p == NULL || args < 0 || name == NULL)
872 return 0;
873 p->d_printing = 0;
874 p->type = DEMANGLE_COMPONENT_EXTENDED_OPERATOR;
875 p->u.s_extended_operator.args = args;
876 p->u.s_extended_operator.name = name;
877 return 1;
880 /* Fill in a DEMANGLE_COMPONENT_CTOR. */
882 CP_STATIC_IF_GLIBCPP_V3
884 cplus_demangle_fill_ctor (struct demangle_component *p,
885 enum gnu_v3_ctor_kinds kind,
886 struct demangle_component *name)
888 if (p == NULL
889 || name == NULL
890 || (int) kind < gnu_v3_complete_object_ctor
891 || (int) kind > gnu_v3_object_ctor_group)
892 return 0;
893 p->d_printing = 0;
894 p->type = DEMANGLE_COMPONENT_CTOR;
895 p->u.s_ctor.kind = kind;
896 p->u.s_ctor.name = name;
897 return 1;
900 /* Fill in a DEMANGLE_COMPONENT_DTOR. */
902 CP_STATIC_IF_GLIBCPP_V3
904 cplus_demangle_fill_dtor (struct demangle_component *p,
905 enum gnu_v3_dtor_kinds kind,
906 struct demangle_component *name)
908 if (p == NULL
909 || name == NULL
910 || (int) kind < gnu_v3_deleting_dtor
911 || (int) kind > gnu_v3_object_dtor_group)
912 return 0;
913 p->d_printing = 0;
914 p->type = DEMANGLE_COMPONENT_DTOR;
915 p->u.s_dtor.kind = kind;
916 p->u.s_dtor.name = name;
917 return 1;
920 /* Add a new component. */
922 static struct demangle_component *
923 d_make_empty (struct d_info *di)
925 struct demangle_component *p;
927 if (di->next_comp >= di->num_comps)
928 return NULL;
929 p = &di->comps[di->next_comp];
930 p->d_printing = 0;
931 ++di->next_comp;
932 return p;
935 /* Add a new generic component. */
937 static struct demangle_component *
938 d_make_comp (struct d_info *di, enum demangle_component_type type,
939 struct demangle_component *left,
940 struct demangle_component *right)
942 struct demangle_component *p;
944 /* We check for errors here. A typical error would be a NULL return
945 from a subroutine. We catch those here, and return NULL
946 upward. */
947 switch (type)
949 /* These types require two parameters. */
950 case DEMANGLE_COMPONENT_QUAL_NAME:
951 case DEMANGLE_COMPONENT_LOCAL_NAME:
952 case DEMANGLE_COMPONENT_TYPED_NAME:
953 case DEMANGLE_COMPONENT_TAGGED_NAME:
954 case DEMANGLE_COMPONENT_TEMPLATE:
955 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
956 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
957 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
958 case DEMANGLE_COMPONENT_UNARY:
959 case DEMANGLE_COMPONENT_BINARY:
960 case DEMANGLE_COMPONENT_BINARY_ARGS:
961 case DEMANGLE_COMPONENT_TRINARY:
962 case DEMANGLE_COMPONENT_TRINARY_ARG1:
963 case DEMANGLE_COMPONENT_LITERAL:
964 case DEMANGLE_COMPONENT_LITERAL_NEG:
965 case DEMANGLE_COMPONENT_COMPOUND_NAME:
966 case DEMANGLE_COMPONENT_VECTOR_TYPE:
967 case DEMANGLE_COMPONENT_CLONE:
968 if (left == NULL || right == NULL)
969 return NULL;
970 break;
972 /* These types only require one parameter. */
973 case DEMANGLE_COMPONENT_VTABLE:
974 case DEMANGLE_COMPONENT_VTT:
975 case DEMANGLE_COMPONENT_TYPEINFO:
976 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
977 case DEMANGLE_COMPONENT_TYPEINFO_FN:
978 case DEMANGLE_COMPONENT_THUNK:
979 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
980 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
981 case DEMANGLE_COMPONENT_JAVA_CLASS:
982 case DEMANGLE_COMPONENT_GUARD:
983 case DEMANGLE_COMPONENT_TLS_INIT:
984 case DEMANGLE_COMPONENT_TLS_WRAPPER:
985 case DEMANGLE_COMPONENT_REFTEMP:
986 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
987 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
988 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
989 case DEMANGLE_COMPONENT_POINTER:
990 case DEMANGLE_COMPONENT_REFERENCE:
991 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
992 case DEMANGLE_COMPONENT_COMPLEX:
993 case DEMANGLE_COMPONENT_IMAGINARY:
994 case DEMANGLE_COMPONENT_VENDOR_TYPE:
995 case DEMANGLE_COMPONENT_CAST:
996 case DEMANGLE_COMPONENT_CONVERSION:
997 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
998 case DEMANGLE_COMPONENT_DECLTYPE:
999 case DEMANGLE_COMPONENT_PACK_EXPANSION:
1000 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
1001 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
1002 case DEMANGLE_COMPONENT_NULLARY:
1003 case DEMANGLE_COMPONENT_TRINARY_ARG2:
1004 if (left == NULL)
1005 return NULL;
1006 break;
1008 /* This needs a right parameter, but the left parameter can be
1009 empty. */
1010 case DEMANGLE_COMPONENT_ARRAY_TYPE:
1011 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
1012 if (right == NULL)
1013 return NULL;
1014 break;
1016 /* These are allowed to have no parameters--in some cases they
1017 will be filled in later. */
1018 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
1019 case DEMANGLE_COMPONENT_RESTRICT:
1020 case DEMANGLE_COMPONENT_VOLATILE:
1021 case DEMANGLE_COMPONENT_CONST:
1022 case DEMANGLE_COMPONENT_ARGLIST:
1023 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
1024 FNQUAL_COMPONENT_CASE:
1025 break;
1027 /* Other types should not be seen here. */
1028 default:
1029 return NULL;
1032 p = d_make_empty (di);
1033 if (p != NULL)
1035 p->type = type;
1036 p->u.s_binary.left = left;
1037 p->u.s_binary.right = right;
1039 return p;
1042 /* Add a new demangle mangled name component. */
1044 static struct demangle_component *
1045 d_make_demangle_mangled_name (struct d_info *di, const char *s)
1047 if (d_peek_char (di) != '_' || d_peek_next_char (di) != 'Z')
1048 return d_make_name (di, s, strlen (s));
1049 d_advance (di, 2);
1050 return d_encoding (di, 0);
1053 /* Add a new name component. */
1055 static struct demangle_component *
1056 d_make_name (struct d_info *di, const char *s, int len)
1058 struct demangle_component *p;
1060 p = d_make_empty (di);
1061 if (! cplus_demangle_fill_name (p, s, len))
1062 return NULL;
1063 return p;
1066 /* Add a new builtin type component. */
1068 static struct demangle_component *
1069 d_make_builtin_type (struct d_info *di,
1070 const struct demangle_builtin_type_info *type)
1072 struct demangle_component *p;
1074 if (type == NULL)
1075 return NULL;
1076 p = d_make_empty (di);
1077 if (p != NULL)
1079 p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE;
1080 p->u.s_builtin.type = type;
1082 return p;
1085 /* Add a new operator component. */
1087 static struct demangle_component *
1088 d_make_operator (struct d_info *di, const struct demangle_operator_info *op)
1090 struct demangle_component *p;
1092 p = d_make_empty (di);
1093 if (p != NULL)
1095 p->type = DEMANGLE_COMPONENT_OPERATOR;
1096 p->u.s_operator.op = op;
1098 return p;
1101 /* Add a new extended operator component. */
1103 static struct demangle_component *
1104 d_make_extended_operator (struct d_info *di, int args,
1105 struct demangle_component *name)
1107 struct demangle_component *p;
1109 p = d_make_empty (di);
1110 if (! cplus_demangle_fill_extended_operator (p, args, name))
1111 return NULL;
1112 return p;
1115 static struct demangle_component *
1116 d_make_default_arg (struct d_info *di, int num,
1117 struct demangle_component *sub)
1119 struct demangle_component *p = d_make_empty (di);
1120 if (p)
1122 p->type = DEMANGLE_COMPONENT_DEFAULT_ARG;
1123 p->u.s_unary_num.num = num;
1124 p->u.s_unary_num.sub = sub;
1126 return p;
1129 /* Add a new constructor component. */
1131 static struct demangle_component *
1132 d_make_ctor (struct d_info *di, enum gnu_v3_ctor_kinds kind,
1133 struct demangle_component *name)
1135 struct demangle_component *p;
1137 p = d_make_empty (di);
1138 if (! cplus_demangle_fill_ctor (p, kind, name))
1139 return NULL;
1140 return p;
1143 /* Add a new destructor component. */
1145 static struct demangle_component *
1146 d_make_dtor (struct d_info *di, enum gnu_v3_dtor_kinds kind,
1147 struct demangle_component *name)
1149 struct demangle_component *p;
1151 p = d_make_empty (di);
1152 if (! cplus_demangle_fill_dtor (p, kind, name))
1153 return NULL;
1154 return p;
1157 /* Add a new template parameter. */
1159 static struct demangle_component *
1160 d_make_template_param (struct d_info *di, int i)
1162 struct demangle_component *p;
1164 p = d_make_empty (di);
1165 if (p != NULL)
1167 p->type = DEMANGLE_COMPONENT_TEMPLATE_PARAM;
1168 p->u.s_number.number = i;
1170 return p;
1173 /* Add a new function parameter. */
1175 static struct demangle_component *
1176 d_make_function_param (struct d_info *di, int i)
1178 struct demangle_component *p;
1180 p = d_make_empty (di);
1181 if (p != NULL)
1183 p->type = DEMANGLE_COMPONENT_FUNCTION_PARAM;
1184 p->u.s_number.number = i;
1186 return p;
1189 /* Add a new standard substitution component. */
1191 static struct demangle_component *
1192 d_make_sub (struct d_info *di, const char *name, int len)
1194 struct demangle_component *p;
1196 p = d_make_empty (di);
1197 if (p != NULL)
1199 p->type = DEMANGLE_COMPONENT_SUB_STD;
1200 p->u.s_string.string = name;
1201 p->u.s_string.len = len;
1203 return p;
1206 /* <mangled-name> ::= _Z <encoding> [<clone-suffix>]*
1208 TOP_LEVEL is non-zero when called at the top level. */
1210 CP_STATIC_IF_GLIBCPP_V3
1211 struct demangle_component *
1212 cplus_demangle_mangled_name (struct d_info *di, int top_level)
1214 struct demangle_component *p;
1216 if (! d_check_char (di, '_')
1217 /* Allow missing _ if not at toplevel to work around a
1218 bug in G++ abi-version=2 mangling; see the comment in
1219 write_template_arg. */
1220 && top_level)
1221 return NULL;
1222 if (! d_check_char (di, 'Z'))
1223 return NULL;
1224 p = d_encoding (di, top_level);
1226 /* If at top level and parsing parameters, check for a clone
1227 suffix. */
1228 if (top_level && (di->options & DMGL_PARAMS) != 0)
1229 while (d_peek_char (di) == '.'
1230 && (IS_LOWER (d_peek_next_char (di))
1231 || d_peek_next_char (di) == '_'
1232 || IS_DIGIT (d_peek_next_char (di))))
1233 p = d_clone_suffix (di, p);
1235 return p;
1238 /* Return whether a function should have a return type. The argument
1239 is the function name, which may be qualified in various ways. The
1240 rules are that template functions have return types with some
1241 exceptions, function types which are not part of a function name
1242 mangling have return types with some exceptions, and non-template
1243 function names do not have return types. The exceptions are that
1244 constructors, destructors, and conversion operators do not have
1245 return types. */
1247 static int
1248 has_return_type (struct demangle_component *dc)
1250 if (dc == NULL)
1251 return 0;
1252 switch (dc->type)
1254 default:
1255 return 0;
1256 case DEMANGLE_COMPONENT_TEMPLATE:
1257 return ! is_ctor_dtor_or_conversion (d_left (dc));
1258 FNQUAL_COMPONENT_CASE:
1259 return has_return_type (d_left (dc));
1263 /* Return whether a name is a constructor, a destructor, or a
1264 conversion operator. */
1266 static int
1267 is_ctor_dtor_or_conversion (struct demangle_component *dc)
1269 if (dc == NULL)
1270 return 0;
1271 switch (dc->type)
1273 default:
1274 return 0;
1275 case DEMANGLE_COMPONENT_QUAL_NAME:
1276 case DEMANGLE_COMPONENT_LOCAL_NAME:
1277 return is_ctor_dtor_or_conversion (d_right (dc));
1278 case DEMANGLE_COMPONENT_CTOR:
1279 case DEMANGLE_COMPONENT_DTOR:
1280 case DEMANGLE_COMPONENT_CONVERSION:
1281 return 1;
1285 /* <encoding> ::= <(function) name> <bare-function-type>
1286 ::= <(data) name>
1287 ::= <special-name>
1289 TOP_LEVEL is non-zero when called at the top level, in which case
1290 if DMGL_PARAMS is not set we do not demangle the function
1291 parameters. We only set this at the top level, because otherwise
1292 we would not correctly demangle names in local scopes. */
1294 static struct demangle_component *
1295 d_encoding (struct d_info *di, int top_level)
1297 char peek = d_peek_char (di);
1299 if (peek == 'G' || peek == 'T')
1300 return d_special_name (di);
1301 else
1303 struct demangle_component *dc;
1305 dc = d_name (di);
1307 if (dc != NULL && top_level && (di->options & DMGL_PARAMS) == 0)
1309 /* Strip off any initial CV-qualifiers, as they really apply
1310 to the `this' parameter, and they were not output by the
1311 v2 demangler without DMGL_PARAMS. */
1312 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1313 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1314 || dc->type == DEMANGLE_COMPONENT_CONST_THIS
1315 || dc->type == DEMANGLE_COMPONENT_REFERENCE_THIS
1316 || dc->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)
1317 dc = d_left (dc);
1319 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1320 there may be function-qualifiers on its right argument which
1321 really apply here; this happens when parsing a class
1322 which is local to a function. */
1323 if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME)
1325 struct demangle_component *dcr;
1327 dcr = d_right (dc);
1328 while (is_fnqual_component_type (dcr->type))
1329 dcr = d_left (dcr);
1330 dc->u.s_binary.right = dcr;
1333 return dc;
1336 peek = d_peek_char (di);
1337 if (dc == NULL || peek == '\0' || peek == 'E')
1338 return dc;
1339 return d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, dc,
1340 d_bare_function_type (di, has_return_type (dc)));
1344 /* <tagged-name> ::= <name> B <source-name> */
1346 static struct demangle_component *
1347 d_abi_tags (struct d_info *di, struct demangle_component *dc)
1349 struct demangle_component *hold_last_name;
1350 char peek;
1352 /* Preserve the last name, so the ABI tag doesn't clobber it. */
1353 hold_last_name = di->last_name;
1355 while (peek = d_peek_char (di),
1356 peek == 'B')
1358 struct demangle_component *tag;
1359 d_advance (di, 1);
1360 tag = d_source_name (di);
1361 dc = d_make_comp (di, DEMANGLE_COMPONENT_TAGGED_NAME, dc, tag);
1364 di->last_name = hold_last_name;
1366 return dc;
1369 /* <name> ::= <nested-name>
1370 ::= <unscoped-name>
1371 ::= <unscoped-template-name> <template-args>
1372 ::= <local-name>
1374 <unscoped-name> ::= <unqualified-name>
1375 ::= St <unqualified-name>
1377 <unscoped-template-name> ::= <unscoped-name>
1378 ::= <substitution>
1381 static struct demangle_component *
1382 d_name (struct d_info *di)
1384 char peek = d_peek_char (di);
1385 struct demangle_component *dc;
1387 switch (peek)
1389 case 'N':
1390 return d_nested_name (di);
1392 case 'Z':
1393 return d_local_name (di);
1395 case 'U':
1396 return d_unqualified_name (di);
1398 case 'S':
1400 int subst;
1402 if (d_peek_next_char (di) != 't')
1404 dc = d_substitution (di, 0);
1405 subst = 1;
1407 else
1409 d_advance (di, 2);
1410 dc = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME,
1411 d_make_name (di, "std", 3),
1412 d_unqualified_name (di));
1413 di->expansion += 3;
1414 subst = 0;
1417 if (d_peek_char (di) != 'I')
1419 /* The grammar does not permit this case to occur if we
1420 called d_substitution() above (i.e., subst == 1). We
1421 don't bother to check. */
1423 else
1425 /* This is <template-args>, which means that we just saw
1426 <unscoped-template-name>, which is a substitution
1427 candidate if we didn't just get it from a
1428 substitution. */
1429 if (! subst)
1431 if (! d_add_substitution (di, dc))
1432 return NULL;
1434 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1435 d_template_args (di));
1438 return dc;
1441 case 'L':
1442 default:
1443 dc = d_unqualified_name (di);
1444 if (d_peek_char (di) == 'I')
1446 /* This is <template-args>, which means that we just saw
1447 <unscoped-template-name>, which is a substitution
1448 candidate. */
1449 if (! d_add_substitution (di, dc))
1450 return NULL;
1451 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1452 d_template_args (di));
1454 return dc;
1458 /* <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
1459 ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
1462 static struct demangle_component *
1463 d_nested_name (struct d_info *di)
1465 struct demangle_component *ret;
1466 struct demangle_component **pret;
1467 struct demangle_component *rqual;
1469 if (! d_check_char (di, 'N'))
1470 return NULL;
1472 pret = d_cv_qualifiers (di, &ret, 1);
1473 if (pret == NULL)
1474 return NULL;
1476 /* Parse the ref-qualifier now and then attach it
1477 once we have something to attach it to. */
1478 rqual = d_ref_qualifier (di, NULL);
1480 *pret = d_prefix (di);
1481 if (*pret == NULL)
1482 return NULL;
1484 if (rqual)
1486 d_left (rqual) = ret;
1487 ret = rqual;
1490 if (! d_check_char (di, 'E'))
1491 return NULL;
1493 return ret;
1496 /* <prefix> ::= <prefix> <unqualified-name>
1497 ::= <template-prefix> <template-args>
1498 ::= <template-param>
1499 ::= <decltype>
1501 ::= <substitution>
1503 <template-prefix> ::= <prefix> <(template) unqualified-name>
1504 ::= <template-param>
1505 ::= <substitution>
1508 static struct demangle_component *
1509 d_prefix (struct d_info *di)
1511 struct demangle_component *ret = NULL;
1513 while (1)
1515 char peek;
1516 enum demangle_component_type comb_type;
1517 struct demangle_component *dc;
1519 peek = d_peek_char (di);
1520 if (peek == '\0')
1521 return NULL;
1523 /* The older code accepts a <local-name> here, but I don't see
1524 that in the grammar. The older code does not accept a
1525 <template-param> here. */
1527 comb_type = DEMANGLE_COMPONENT_QUAL_NAME;
1528 if (peek == 'D')
1530 char peek2 = d_peek_next_char (di);
1531 if (peek2 == 'T' || peek2 == 't')
1532 /* Decltype. */
1533 dc = cplus_demangle_type (di);
1534 else
1535 /* Destructor name. */
1536 dc = d_unqualified_name (di);
1538 else if (IS_DIGIT (peek)
1539 || IS_LOWER (peek)
1540 || peek == 'C'
1541 || peek == 'U'
1542 || peek == 'L')
1543 dc = d_unqualified_name (di);
1544 else if (peek == 'S')
1545 dc = d_substitution (di, 1);
1546 else if (peek == 'I')
1548 if (ret == NULL)
1549 return NULL;
1550 comb_type = DEMANGLE_COMPONENT_TEMPLATE;
1551 dc = d_template_args (di);
1553 else if (peek == 'T')
1554 dc = d_template_param (di);
1555 else if (peek == 'E')
1556 return ret;
1557 else if (peek == 'M')
1559 /* Initializer scope for a lambda. We don't need to represent
1560 this; the normal code will just treat the variable as a type
1561 scope, which gives appropriate output. */
1562 if (ret == NULL)
1563 return NULL;
1564 d_advance (di, 1);
1565 continue;
1567 else
1568 return NULL;
1570 if (ret == NULL)
1571 ret = dc;
1572 else
1573 ret = d_make_comp (di, comb_type, ret, dc);
1575 if (peek != 'S' && d_peek_char (di) != 'E')
1577 if (! d_add_substitution (di, ret))
1578 return NULL;
1583 /* <unqualified-name> ::= <operator-name>
1584 ::= <ctor-dtor-name>
1585 ::= <source-name>
1586 ::= <local-source-name>
1588 <local-source-name> ::= L <source-name> <discriminator>
1591 static struct demangle_component *
1592 d_unqualified_name (struct d_info *di)
1594 struct demangle_component *ret;
1595 char peek;
1597 peek = d_peek_char (di);
1598 if (IS_DIGIT (peek))
1599 ret = d_source_name (di);
1600 else if (IS_LOWER (peek))
1602 if (peek == 'o' && d_peek_next_char (di) == 'n')
1603 d_advance (di, 2);
1604 ret = d_operator_name (di);
1605 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_OPERATOR)
1607 di->expansion += sizeof "operator" + ret->u.s_operator.op->len - 2;
1608 if (!strcmp (ret->u.s_operator.op->code, "li"))
1609 ret = d_make_comp (di, DEMANGLE_COMPONENT_UNARY, ret,
1610 d_source_name (di));
1613 else if (peek == 'C' || peek == 'D')
1614 ret = d_ctor_dtor_name (di);
1615 else if (peek == 'L')
1617 d_advance (di, 1);
1619 ret = d_source_name (di);
1620 if (ret == NULL)
1621 return NULL;
1622 if (! d_discriminator (di))
1623 return NULL;
1625 else if (peek == 'U')
1627 switch (d_peek_next_char (di))
1629 case 'l':
1630 ret = d_lambda (di);
1631 break;
1632 case 't':
1633 ret = d_unnamed_type (di);
1634 break;
1635 default:
1636 return NULL;
1639 else
1640 return NULL;
1642 if (d_peek_char (di) == 'B')
1643 ret = d_abi_tags (di, ret);
1644 return ret;
1647 /* <source-name> ::= <(positive length) number> <identifier> */
1649 static struct demangle_component *
1650 d_source_name (struct d_info *di)
1652 int len;
1653 struct demangle_component *ret;
1655 len = d_number (di);
1656 if (len <= 0)
1657 return NULL;
1658 ret = d_identifier (di, len);
1659 di->last_name = ret;
1660 return ret;
1663 /* number ::= [n] <(non-negative decimal integer)> */
1665 static int
1666 d_number (struct d_info *di)
1668 int negative;
1669 char peek;
1670 int ret;
1672 negative = 0;
1673 peek = d_peek_char (di);
1674 if (peek == 'n')
1676 negative = 1;
1677 d_advance (di, 1);
1678 peek = d_peek_char (di);
1681 ret = 0;
1682 while (1)
1684 if (! IS_DIGIT (peek))
1686 if (negative)
1687 ret = - ret;
1688 return ret;
1690 ret = ret * 10 + peek - '0';
1691 d_advance (di, 1);
1692 peek = d_peek_char (di);
1696 /* Like d_number, but returns a demangle_component. */
1698 static struct demangle_component *
1699 d_number_component (struct d_info *di)
1701 struct demangle_component *ret = d_make_empty (di);
1702 if (ret)
1704 ret->type = DEMANGLE_COMPONENT_NUMBER;
1705 ret->u.s_number.number = d_number (di);
1707 return ret;
1710 /* identifier ::= <(unqualified source code identifier)> */
1712 static struct demangle_component *
1713 d_identifier (struct d_info *di, int len)
1715 const char *name;
1717 name = d_str (di);
1719 if (di->send - name < len)
1720 return NULL;
1722 d_advance (di, len);
1724 /* A Java mangled name may have a trailing '$' if it is a C++
1725 keyword. This '$' is not included in the length count. We just
1726 ignore the '$'. */
1727 if ((di->options & DMGL_JAVA) != 0
1728 && d_peek_char (di) == '$')
1729 d_advance (di, 1);
1731 /* Look for something which looks like a gcc encoding of an
1732 anonymous namespace, and replace it with a more user friendly
1733 name. */
1734 if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
1735 && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX,
1736 ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0)
1738 const char *s;
1740 s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN;
1741 if ((*s == '.' || *s == '_' || *s == '$')
1742 && s[1] == 'N')
1744 di->expansion -= len - sizeof "(anonymous namespace)";
1745 return d_make_name (di, "(anonymous namespace)",
1746 sizeof "(anonymous namespace)" - 1);
1750 return d_make_name (di, name, len);
1753 /* operator_name ::= many different two character encodings.
1754 ::= cv <type>
1755 ::= v <digit> <source-name>
1757 This list is sorted for binary search. */
1759 #define NL(s) s, (sizeof s) - 1
1761 CP_STATIC_IF_GLIBCPP_V3
1762 const struct demangle_operator_info cplus_demangle_operators[] =
1764 { "aN", NL ("&="), 2 },
1765 { "aS", NL ("="), 2 },
1766 { "aa", NL ("&&"), 2 },
1767 { "ad", NL ("&"), 1 },
1768 { "an", NL ("&"), 2 },
1769 { "at", NL ("alignof "), 1 },
1770 { "az", NL ("alignof "), 1 },
1771 { "cc", NL ("const_cast"), 2 },
1772 { "cl", NL ("()"), 2 },
1773 { "cm", NL (","), 2 },
1774 { "co", NL ("~"), 1 },
1775 { "dV", NL ("/="), 2 },
1776 { "da", NL ("delete[] "), 1 },
1777 { "dc", NL ("dynamic_cast"), 2 },
1778 { "de", NL ("*"), 1 },
1779 { "dl", NL ("delete "), 1 },
1780 { "ds", NL (".*"), 2 },
1781 { "dt", NL ("."), 2 },
1782 { "dv", NL ("/"), 2 },
1783 { "eO", NL ("^="), 2 },
1784 { "eo", NL ("^"), 2 },
1785 { "eq", NL ("=="), 2 },
1786 { "fL", NL ("..."), 3 },
1787 { "fR", NL ("..."), 3 },
1788 { "fl", NL ("..."), 2 },
1789 { "fr", NL ("..."), 2 },
1790 { "ge", NL (">="), 2 },
1791 { "gs", NL ("::"), 1 },
1792 { "gt", NL (">"), 2 },
1793 { "ix", NL ("[]"), 2 },
1794 { "lS", NL ("<<="), 2 },
1795 { "le", NL ("<="), 2 },
1796 { "li", NL ("operator\"\" "), 1 },
1797 { "ls", NL ("<<"), 2 },
1798 { "lt", NL ("<"), 2 },
1799 { "mI", NL ("-="), 2 },
1800 { "mL", NL ("*="), 2 },
1801 { "mi", NL ("-"), 2 },
1802 { "ml", NL ("*"), 2 },
1803 { "mm", NL ("--"), 1 },
1804 { "na", NL ("new[]"), 3 },
1805 { "ne", NL ("!="), 2 },
1806 { "ng", NL ("-"), 1 },
1807 { "nt", NL ("!"), 1 },
1808 { "nw", NL ("new"), 3 },
1809 { "oR", NL ("|="), 2 },
1810 { "oo", NL ("||"), 2 },
1811 { "or", NL ("|"), 2 },
1812 { "pL", NL ("+="), 2 },
1813 { "pl", NL ("+"), 2 },
1814 { "pm", NL ("->*"), 2 },
1815 { "pp", NL ("++"), 1 },
1816 { "ps", NL ("+"), 1 },
1817 { "pt", NL ("->"), 2 },
1818 { "qu", NL ("?"), 3 },
1819 { "rM", NL ("%="), 2 },
1820 { "rS", NL (">>="), 2 },
1821 { "rc", NL ("reinterpret_cast"), 2 },
1822 { "rm", NL ("%"), 2 },
1823 { "rs", NL (">>"), 2 },
1824 { "sP", NL ("sizeof..."), 1 },
1825 { "sZ", NL ("sizeof..."), 1 },
1826 { "sc", NL ("static_cast"), 2 },
1827 { "st", NL ("sizeof "), 1 },
1828 { "sz", NL ("sizeof "), 1 },
1829 { "tr", NL ("throw"), 0 },
1830 { "tw", NL ("throw "), 1 },
1831 { NULL, NULL, 0, 0 }
1834 static struct demangle_component *
1835 d_operator_name (struct d_info *di)
1837 char c1;
1838 char c2;
1840 c1 = d_next_char (di);
1841 c2 = d_next_char (di);
1842 if (c1 == 'v' && IS_DIGIT (c2))
1843 return d_make_extended_operator (di, c2 - '0', d_source_name (di));
1844 else if (c1 == 'c' && c2 == 'v')
1846 struct demangle_component *type;
1847 int was_conversion = di->is_conversion;
1848 struct demangle_component *res;
1850 di->is_conversion = ! di->is_expression;
1851 type = cplus_demangle_type (di);
1852 if (di->is_conversion)
1853 res = d_make_comp (di, DEMANGLE_COMPONENT_CONVERSION, type, NULL);
1854 else
1855 res = d_make_comp (di, DEMANGLE_COMPONENT_CAST, type, NULL);
1856 di->is_conversion = was_conversion;
1857 return res;
1859 else
1861 /* LOW is the inclusive lower bound. */
1862 int low = 0;
1863 /* HIGH is the exclusive upper bound. We subtract one to ignore
1864 the sentinel at the end of the array. */
1865 int high = ((sizeof (cplus_demangle_operators)
1866 / sizeof (cplus_demangle_operators[0]))
1867 - 1);
1869 while (1)
1871 int i;
1872 const struct demangle_operator_info *p;
1874 i = low + (high - low) / 2;
1875 p = cplus_demangle_operators + i;
1877 if (c1 == p->code[0] && c2 == p->code[1])
1878 return d_make_operator (di, p);
1880 if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1]))
1881 high = i;
1882 else
1883 low = i + 1;
1884 if (low == high)
1885 return NULL;
1890 static struct demangle_component *
1891 d_make_character (struct d_info *di, int c)
1893 struct demangle_component *p;
1894 p = d_make_empty (di);
1895 if (p != NULL)
1897 p->type = DEMANGLE_COMPONENT_CHARACTER;
1898 p->u.s_character.character = c;
1900 return p;
1903 static struct demangle_component *
1904 d_java_resource (struct d_info *di)
1906 struct demangle_component *p = NULL;
1907 struct demangle_component *next = NULL;
1908 int len, i;
1909 char c;
1910 const char *str;
1912 len = d_number (di);
1913 if (len <= 1)
1914 return NULL;
1916 /* Eat the leading '_'. */
1917 if (d_next_char (di) != '_')
1918 return NULL;
1919 len--;
1921 str = d_str (di);
1922 i = 0;
1924 while (len > 0)
1926 c = str[i];
1927 if (!c)
1928 return NULL;
1930 /* Each chunk is either a '$' escape... */
1931 if (c == '$')
1933 i++;
1934 switch (str[i++])
1936 case 'S':
1937 c = '/';
1938 break;
1939 case '_':
1940 c = '.';
1941 break;
1942 case '$':
1943 c = '$';
1944 break;
1945 default:
1946 return NULL;
1948 next = d_make_character (di, c);
1949 d_advance (di, i);
1950 str = d_str (di);
1951 len -= i;
1952 i = 0;
1953 if (next == NULL)
1954 return NULL;
1956 /* ... or a sequence of characters. */
1957 else
1959 while (i < len && str[i] && str[i] != '$')
1960 i++;
1962 next = d_make_name (di, str, i);
1963 d_advance (di, i);
1964 str = d_str (di);
1965 len -= i;
1966 i = 0;
1967 if (next == NULL)
1968 return NULL;
1971 if (p == NULL)
1972 p = next;
1973 else
1975 p = d_make_comp (di, DEMANGLE_COMPONENT_COMPOUND_NAME, p, next);
1976 if (p == NULL)
1977 return NULL;
1981 p = d_make_comp (di, DEMANGLE_COMPONENT_JAVA_RESOURCE, p, NULL);
1983 return p;
1986 /* <special-name> ::= TV <type>
1987 ::= TT <type>
1988 ::= TI <type>
1989 ::= TS <type>
1990 ::= GV <(object) name>
1991 ::= T <call-offset> <(base) encoding>
1992 ::= Tc <call-offset> <call-offset> <(base) encoding>
1993 Also g++ extensions:
1994 ::= TC <type> <(offset) number> _ <(base) type>
1995 ::= TF <type>
1996 ::= TJ <type>
1997 ::= GR <name>
1998 ::= GA <encoding>
1999 ::= Gr <resource name>
2000 ::= GTt <encoding>
2001 ::= GTn <encoding>
2004 static struct demangle_component *
2005 d_special_name (struct d_info *di)
2007 di->expansion += 20;
2008 if (d_check_char (di, 'T'))
2010 switch (d_next_char (di))
2012 case 'V':
2013 di->expansion -= 5;
2014 return d_make_comp (di, DEMANGLE_COMPONENT_VTABLE,
2015 cplus_demangle_type (di), NULL);
2016 case 'T':
2017 di->expansion -= 10;
2018 return d_make_comp (di, DEMANGLE_COMPONENT_VTT,
2019 cplus_demangle_type (di), NULL);
2020 case 'I':
2021 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO,
2022 cplus_demangle_type (di), NULL);
2023 case 'S':
2024 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_NAME,
2025 cplus_demangle_type (di), NULL);
2027 case 'h':
2028 if (! d_call_offset (di, 'h'))
2029 return NULL;
2030 return d_make_comp (di, DEMANGLE_COMPONENT_THUNK,
2031 d_encoding (di, 0), NULL);
2033 case 'v':
2034 if (! d_call_offset (di, 'v'))
2035 return NULL;
2036 return d_make_comp (di, DEMANGLE_COMPONENT_VIRTUAL_THUNK,
2037 d_encoding (di, 0), NULL);
2039 case 'c':
2040 if (! d_call_offset (di, '\0'))
2041 return NULL;
2042 if (! d_call_offset (di, '\0'))
2043 return NULL;
2044 return d_make_comp (di, DEMANGLE_COMPONENT_COVARIANT_THUNK,
2045 d_encoding (di, 0), NULL);
2047 case 'C':
2049 struct demangle_component *derived_type;
2050 int offset;
2051 struct demangle_component *base_type;
2053 derived_type = cplus_demangle_type (di);
2054 offset = d_number (di);
2055 if (offset < 0)
2056 return NULL;
2057 if (! d_check_char (di, '_'))
2058 return NULL;
2059 base_type = cplus_demangle_type (di);
2060 /* We don't display the offset. FIXME: We should display
2061 it in verbose mode. */
2062 di->expansion += 5;
2063 return d_make_comp (di, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE,
2064 base_type, derived_type);
2067 case 'F':
2068 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_FN,
2069 cplus_demangle_type (di), NULL);
2070 case 'J':
2071 return d_make_comp (di, DEMANGLE_COMPONENT_JAVA_CLASS,
2072 cplus_demangle_type (di), NULL);
2074 case 'H':
2075 return d_make_comp (di, DEMANGLE_COMPONENT_TLS_INIT,
2076 d_name (di), NULL);
2078 case 'W':
2079 return d_make_comp (di, DEMANGLE_COMPONENT_TLS_WRAPPER,
2080 d_name (di), NULL);
2082 default:
2083 return NULL;
2086 else if (d_check_char (di, 'G'))
2088 switch (d_next_char (di))
2090 case 'V':
2091 return d_make_comp (di, DEMANGLE_COMPONENT_GUARD, d_name (di), NULL);
2093 case 'R':
2095 struct demangle_component *name = d_name (di);
2096 return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, name,
2097 d_number_component (di));
2100 case 'A':
2101 return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS,
2102 d_encoding (di, 0), NULL);
2104 case 'T':
2105 switch (d_next_char (di))
2107 case 'n':
2108 return d_make_comp (di, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE,
2109 d_encoding (di, 0), NULL);
2110 default:
2111 /* ??? The proposal is that other letters (such as 'h') stand
2112 for different variants of transaction cloning, such as
2113 compiling directly for hardware transaction support. But
2114 they still should all be transactional clones of some sort
2115 so go ahead and call them that. */
2116 case 't':
2117 return d_make_comp (di, DEMANGLE_COMPONENT_TRANSACTION_CLONE,
2118 d_encoding (di, 0), NULL);
2121 case 'r':
2122 return d_java_resource (di);
2124 default:
2125 return NULL;
2128 else
2129 return NULL;
2132 /* <call-offset> ::= h <nv-offset> _
2133 ::= v <v-offset> _
2135 <nv-offset> ::= <(offset) number>
2137 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
2139 The C parameter, if not '\0', is a character we just read which is
2140 the start of the <call-offset>.
2142 We don't display the offset information anywhere. FIXME: We should
2143 display it in verbose mode. */
2145 static int
2146 d_call_offset (struct d_info *di, int c)
2148 if (c == '\0')
2149 c = d_next_char (di);
2151 if (c == 'h')
2152 d_number (di);
2153 else if (c == 'v')
2155 d_number (di);
2156 if (! d_check_char (di, '_'))
2157 return 0;
2158 d_number (di);
2160 else
2161 return 0;
2163 if (! d_check_char (di, '_'))
2164 return 0;
2166 return 1;
2169 /* <ctor-dtor-name> ::= C1
2170 ::= C2
2171 ::= C3
2172 ::= D0
2173 ::= D1
2174 ::= D2
2177 static struct demangle_component *
2178 d_ctor_dtor_name (struct d_info *di)
2180 if (di->last_name != NULL)
2182 if (di->last_name->type == DEMANGLE_COMPONENT_NAME)
2183 di->expansion += di->last_name->u.s_name.len;
2184 else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD)
2185 di->expansion += di->last_name->u.s_string.len;
2187 switch (d_peek_char (di))
2189 case 'C':
2191 enum gnu_v3_ctor_kinds kind;
2192 int inheriting = 0;
2194 if (d_peek_next_char (di) == 'I')
2196 inheriting = 1;
2197 d_advance (di, 1);
2200 switch (d_peek_next_char (di))
2202 case '1':
2203 kind = gnu_v3_complete_object_ctor;
2204 break;
2205 case '2':
2206 kind = gnu_v3_base_object_ctor;
2207 break;
2208 case '3':
2209 kind = gnu_v3_complete_object_allocating_ctor;
2210 break;
2211 case '4':
2212 kind = gnu_v3_unified_ctor;
2213 break;
2214 case '5':
2215 kind = gnu_v3_object_ctor_group;
2216 break;
2217 default:
2218 return NULL;
2221 d_advance (di, 2);
2223 if (inheriting)
2224 cplus_demangle_type (di);
2226 return d_make_ctor (di, kind, di->last_name);
2229 case 'D':
2231 enum gnu_v3_dtor_kinds kind;
2233 switch (d_peek_next_char (di))
2235 case '0':
2236 kind = gnu_v3_deleting_dtor;
2237 break;
2238 case '1':
2239 kind = gnu_v3_complete_object_dtor;
2240 break;
2241 case '2':
2242 kind = gnu_v3_base_object_dtor;
2243 break;
2244 /* digit '3' is not used */
2245 case '4':
2246 kind = gnu_v3_unified_dtor;
2247 break;
2248 case '5':
2249 kind = gnu_v3_object_dtor_group;
2250 break;
2251 default:
2252 return NULL;
2254 d_advance (di, 2);
2255 return d_make_dtor (di, kind, di->last_name);
2258 default:
2259 return NULL;
2263 /* True iff we're looking at an order-insensitive type-qualifier, including
2264 function-type-qualifiers. */
2266 static int
2267 next_is_type_qual (struct d_info *di)
2269 char peek = d_peek_char (di);
2270 if (peek == 'r' || peek == 'V' || peek == 'K')
2271 return 1;
2272 if (peek == 'D')
2274 peek = d_peek_next_char (di);
2275 if (peek == 'x' || peek == 'o' || peek == 'O' || peek == 'w')
2276 return 1;
2278 return 0;
2281 /* <type> ::= <builtin-type>
2282 ::= <function-type>
2283 ::= <class-enum-type>
2284 ::= <array-type>
2285 ::= <pointer-to-member-type>
2286 ::= <template-param>
2287 ::= <template-template-param> <template-args>
2288 ::= <substitution>
2289 ::= <CV-qualifiers> <type>
2290 ::= P <type>
2291 ::= R <type>
2292 ::= O <type> (C++0x)
2293 ::= C <type>
2294 ::= G <type>
2295 ::= U <source-name> <type>
2297 <builtin-type> ::= various one letter codes
2298 ::= u <source-name>
2301 CP_STATIC_IF_GLIBCPP_V3
2302 const struct demangle_builtin_type_info
2303 cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] =
2305 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT },
2306 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL },
2307 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT },
2308 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT },
2309 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT },
2310 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT },
2311 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT },
2312 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT },
2313 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT },
2314 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED },
2315 /* k */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2316 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG },
2317 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG },
2318 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT },
2319 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2320 D_PRINT_DEFAULT },
2321 /* p */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2322 /* q */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2323 /* r */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2324 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT },
2325 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
2326 /* u */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2327 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID },
2328 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT },
2329 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG },
2330 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2331 D_PRINT_UNSIGNED_LONG_LONG },
2332 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT },
2333 /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT },
2334 /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT },
2335 /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT },
2336 /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT },
2337 /* 30 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT },
2338 /* 31 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT },
2339 /* 32 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"),
2340 D_PRINT_DEFAULT },
2343 CP_STATIC_IF_GLIBCPP_V3
2344 struct demangle_component *
2345 cplus_demangle_type (struct d_info *di)
2347 char peek;
2348 struct demangle_component *ret;
2349 int can_subst;
2351 /* The ABI specifies that when CV-qualifiers are used, the base type
2352 is substitutable, and the fully qualified type is substitutable,
2353 but the base type with a strict subset of the CV-qualifiers is
2354 not substitutable. The natural recursive implementation of the
2355 CV-qualifiers would cause subsets to be substitutable, so instead
2356 we pull them all off now.
2358 FIXME: The ABI says that order-insensitive vendor qualifiers
2359 should be handled in the same way, but we have no way to tell
2360 which vendor qualifiers are order-insensitive and which are
2361 order-sensitive. So we just assume that they are all
2362 order-sensitive. g++ 3.4 supports only one vendor qualifier,
2363 __vector, and it treats it as order-sensitive when mangling
2364 names. */
2366 if (next_is_type_qual (di))
2368 struct demangle_component **pret;
2370 pret = d_cv_qualifiers (di, &ret, 0);
2371 if (pret == NULL)
2372 return NULL;
2373 if (d_peek_char (di) == 'F')
2375 /* cv-qualifiers before a function type apply to 'this',
2376 so avoid adding the unqualified function type to
2377 the substitution list. */
2378 *pret = d_function_type (di);
2380 else
2381 *pret = cplus_demangle_type (di);
2382 if (!*pret)
2383 return NULL;
2384 if ((*pret)->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
2385 || (*pret)->type == DEMANGLE_COMPONENT_REFERENCE_THIS)
2387 /* Move the ref-qualifier outside the cv-qualifiers so that
2388 they are printed in the right order. */
2389 struct demangle_component *fn = d_left (*pret);
2390 d_left (*pret) = ret;
2391 ret = *pret;
2392 *pret = fn;
2394 if (! d_add_substitution (di, ret))
2395 return NULL;
2396 return ret;
2399 can_subst = 1;
2401 peek = d_peek_char (di);
2402 switch (peek)
2404 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2405 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
2406 case 'o': case 's': case 't':
2407 case 'v': case 'w': case 'x': case 'y': case 'z':
2408 ret = d_make_builtin_type (di,
2409 &cplus_demangle_builtin_types[peek - 'a']);
2410 di->expansion += ret->u.s_builtin.type->len;
2411 can_subst = 0;
2412 d_advance (di, 1);
2413 break;
2415 case 'u':
2416 d_advance (di, 1);
2417 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE,
2418 d_source_name (di), NULL);
2419 break;
2421 case 'F':
2422 ret = d_function_type (di);
2423 break;
2425 case '0': case '1': case '2': case '3': case '4':
2426 case '5': case '6': case '7': case '8': case '9':
2427 case 'N':
2428 case 'Z':
2429 ret = d_class_enum_type (di);
2430 break;
2432 case 'A':
2433 ret = d_array_type (di);
2434 break;
2436 case 'M':
2437 ret = d_pointer_to_member_type (di);
2438 break;
2440 case 'T':
2441 ret = d_template_param (di);
2442 if (d_peek_char (di) == 'I')
2444 /* This may be <template-template-param> <template-args>.
2445 If this is the type for a conversion operator, we can
2446 have a <template-template-param> here only by following
2447 a derivation like this:
2449 <nested-name>
2450 -> <template-prefix> <template-args>
2451 -> <prefix> <template-unqualified-name> <template-args>
2452 -> <unqualified-name> <template-unqualified-name> <template-args>
2453 -> <source-name> <template-unqualified-name> <template-args>
2454 -> <source-name> <operator-name> <template-args>
2455 -> <source-name> cv <type> <template-args>
2456 -> <source-name> cv <template-template-param> <template-args> <template-args>
2458 where the <template-args> is followed by another.
2459 Otherwise, we must have a derivation like this:
2461 <nested-name>
2462 -> <template-prefix> <template-args>
2463 -> <prefix> <template-unqualified-name> <template-args>
2464 -> <unqualified-name> <template-unqualified-name> <template-args>
2465 -> <source-name> <template-unqualified-name> <template-args>
2466 -> <source-name> <operator-name> <template-args>
2467 -> <source-name> cv <type> <template-args>
2468 -> <source-name> cv <template-param> <template-args>
2470 where we need to leave the <template-args> to be processed
2471 by d_prefix (following the <template-prefix>).
2473 The <template-template-param> part is a substitution
2474 candidate. */
2475 if (! di->is_conversion)
2477 if (! d_add_substitution (di, ret))
2478 return NULL;
2479 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2480 d_template_args (di));
2482 else
2484 struct demangle_component *args;
2485 struct d_info_checkpoint checkpoint;
2487 d_checkpoint (di, &checkpoint);
2488 args = d_template_args (di);
2489 if (d_peek_char (di) == 'I')
2491 if (! d_add_substitution (di, ret))
2492 return NULL;
2493 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2494 args);
2496 else
2497 d_backtrack (di, &checkpoint);
2500 break;
2502 case 'S':
2503 /* If this is a special substitution, then it is the start of
2504 <class-enum-type>. */
2506 char peek_next;
2508 peek_next = d_peek_next_char (di);
2509 if (IS_DIGIT (peek_next)
2510 || peek_next == '_'
2511 || IS_UPPER (peek_next))
2513 ret = d_substitution (di, 0);
2514 /* The substituted name may have been a template name and
2515 may be followed by tepmlate args. */
2516 if (d_peek_char (di) == 'I')
2517 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2518 d_template_args (di));
2519 else
2520 can_subst = 0;
2522 else
2524 ret = d_class_enum_type (di);
2525 /* If the substitution was a complete type, then it is not
2526 a new substitution candidate. However, if the
2527 substitution was followed by template arguments, then
2528 the whole thing is a substitution candidate. */
2529 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD)
2530 can_subst = 0;
2533 break;
2535 case 'O':
2536 d_advance (di, 1);
2537 ret = d_make_comp (di, DEMANGLE_COMPONENT_RVALUE_REFERENCE,
2538 cplus_demangle_type (di), NULL);
2539 break;
2541 case 'P':
2542 d_advance (di, 1);
2543 ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER,
2544 cplus_demangle_type (di), NULL);
2545 break;
2547 case 'R':
2548 d_advance (di, 1);
2549 ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE,
2550 cplus_demangle_type (di), NULL);
2551 break;
2553 case 'C':
2554 d_advance (di, 1);
2555 ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX,
2556 cplus_demangle_type (di), NULL);
2557 break;
2559 case 'G':
2560 d_advance (di, 1);
2561 ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY,
2562 cplus_demangle_type (di), NULL);
2563 break;
2565 case 'U':
2566 d_advance (di, 1);
2567 ret = d_source_name (di);
2568 if (d_peek_char (di) == 'I')
2569 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2570 d_template_args (di));
2571 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL,
2572 cplus_demangle_type (di), ret);
2573 break;
2575 case 'D':
2576 can_subst = 0;
2577 d_advance (di, 1);
2578 peek = d_next_char (di);
2579 switch (peek)
2581 case 'T':
2582 case 't':
2583 /* decltype (expression) */
2584 ret = d_make_comp (di, DEMANGLE_COMPONENT_DECLTYPE,
2585 d_expression (di), NULL);
2586 if (ret && d_next_char (di) != 'E')
2587 ret = NULL;
2588 can_subst = 1;
2589 break;
2591 case 'p':
2592 /* Pack expansion. */
2593 ret = d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
2594 cplus_demangle_type (di), NULL);
2595 can_subst = 1;
2596 break;
2598 case 'a':
2599 /* auto */
2600 ret = d_make_name (di, "auto", 4);
2601 break;
2602 case 'c':
2603 /* decltype(auto) */
2604 ret = d_make_name (di, "decltype(auto)", 14);
2605 break;
2607 case 'f':
2608 /* 32-bit decimal floating point */
2609 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[26]);
2610 di->expansion += ret->u.s_builtin.type->len;
2611 break;
2612 case 'd':
2613 /* 64-bit DFP */
2614 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[27]);
2615 di->expansion += ret->u.s_builtin.type->len;
2616 break;
2617 case 'e':
2618 /* 128-bit DFP */
2619 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[28]);
2620 di->expansion += ret->u.s_builtin.type->len;
2621 break;
2622 case 'h':
2623 /* 16-bit half-precision FP */
2624 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[29]);
2625 di->expansion += ret->u.s_builtin.type->len;
2626 break;
2627 case 's':
2628 /* char16_t */
2629 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[30]);
2630 di->expansion += ret->u.s_builtin.type->len;
2631 break;
2632 case 'i':
2633 /* char32_t */
2634 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[31]);
2635 di->expansion += ret->u.s_builtin.type->len;
2636 break;
2638 case 'F':
2639 /* Fixed point types. DF<int bits><length><fract bits><sat> */
2640 ret = d_make_empty (di);
2641 ret->type = DEMANGLE_COMPONENT_FIXED_TYPE;
2642 if ((ret->u.s_fixed.accum = IS_DIGIT (d_peek_char (di))))
2643 /* For demangling we don't care about the bits. */
2644 d_number (di);
2645 ret->u.s_fixed.length = cplus_demangle_type (di);
2646 if (ret->u.s_fixed.length == NULL)
2647 return NULL;
2648 d_number (di);
2649 peek = d_next_char (di);
2650 ret->u.s_fixed.sat = (peek == 's');
2651 break;
2653 case 'v':
2654 ret = d_vector_type (di);
2655 can_subst = 1;
2656 break;
2658 case 'n':
2659 /* decltype(nullptr) */
2660 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[32]);
2661 di->expansion += ret->u.s_builtin.type->len;
2662 break;
2664 default:
2665 return NULL;
2667 break;
2669 default:
2670 return NULL;
2673 if (can_subst)
2675 if (! d_add_substitution (di, ret))
2676 return NULL;
2679 return ret;
2682 /* <CV-qualifiers> ::= [r] [V] [K] [Dx] */
2684 static struct demangle_component **
2685 d_cv_qualifiers (struct d_info *di,
2686 struct demangle_component **pret, int member_fn)
2688 struct demangle_component **pstart;
2689 char peek;
2691 pstart = pret;
2692 peek = d_peek_char (di);
2693 while (next_is_type_qual (di))
2695 enum demangle_component_type t;
2696 struct demangle_component *right = NULL;
2698 d_advance (di, 1);
2699 if (peek == 'r')
2701 t = (member_fn
2702 ? DEMANGLE_COMPONENT_RESTRICT_THIS
2703 : DEMANGLE_COMPONENT_RESTRICT);
2704 di->expansion += sizeof "restrict";
2706 else if (peek == 'V')
2708 t = (member_fn
2709 ? DEMANGLE_COMPONENT_VOLATILE_THIS
2710 : DEMANGLE_COMPONENT_VOLATILE);
2711 di->expansion += sizeof "volatile";
2713 else if (peek == 'K')
2715 t = (member_fn
2716 ? DEMANGLE_COMPONENT_CONST_THIS
2717 : DEMANGLE_COMPONENT_CONST);
2718 di->expansion += sizeof "const";
2720 else
2722 peek = d_next_char (di);
2723 if (peek == 'x')
2725 t = DEMANGLE_COMPONENT_TRANSACTION_SAFE;
2726 di->expansion += sizeof "transaction_safe";
2728 else if (peek == 'o'
2729 || peek == 'O')
2731 t = DEMANGLE_COMPONENT_NOEXCEPT;
2732 di->expansion += sizeof "noexcept";
2733 if (peek == 'O')
2735 right = d_expression (di);
2736 if (right == NULL)
2737 return NULL;
2738 if (! d_check_char (di, 'E'))
2739 return NULL;
2742 else if (peek == 'w')
2744 t = DEMANGLE_COMPONENT_THROW_SPEC;
2745 di->expansion += sizeof "throw";
2746 right = d_parmlist (di);
2747 if (right == NULL)
2748 return NULL;
2749 if (! d_check_char (di, 'E'))
2750 return NULL;
2752 else
2753 return NULL;
2756 *pret = d_make_comp (di, t, NULL, right);
2757 if (*pret == NULL)
2758 return NULL;
2759 pret = &d_left (*pret);
2761 peek = d_peek_char (di);
2764 if (!member_fn && peek == 'F')
2766 while (pstart != pret)
2768 switch ((*pstart)->type)
2770 case DEMANGLE_COMPONENT_RESTRICT:
2771 (*pstart)->type = DEMANGLE_COMPONENT_RESTRICT_THIS;
2772 break;
2773 case DEMANGLE_COMPONENT_VOLATILE:
2774 (*pstart)->type = DEMANGLE_COMPONENT_VOLATILE_THIS;
2775 break;
2776 case DEMANGLE_COMPONENT_CONST:
2777 (*pstart)->type = DEMANGLE_COMPONENT_CONST_THIS;
2778 break;
2779 default:
2780 break;
2782 pstart = &d_left (*pstart);
2786 return pret;
2789 /* <ref-qualifier> ::= R
2790 ::= O */
2792 static struct demangle_component *
2793 d_ref_qualifier (struct d_info *di, struct demangle_component *sub)
2795 struct demangle_component *ret = sub;
2796 char peek;
2798 peek = d_peek_char (di);
2799 if (peek == 'R' || peek == 'O')
2801 enum demangle_component_type t;
2802 if (peek == 'R')
2804 t = DEMANGLE_COMPONENT_REFERENCE_THIS;
2805 di->expansion += sizeof "&";
2807 else
2809 t = DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS;
2810 di->expansion += sizeof "&&";
2812 d_advance (di, 1);
2814 ret = d_make_comp (di, t, ret, NULL);
2817 return ret;
2820 /* <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] [T] E */
2822 static struct demangle_component *
2823 d_function_type (struct d_info *di)
2825 struct demangle_component *ret;
2827 if (! d_check_char (di, 'F'))
2828 return NULL;
2829 if (d_peek_char (di) == 'Y')
2831 /* Function has C linkage. We don't print this information.
2832 FIXME: We should print it in verbose mode. */
2833 d_advance (di, 1);
2835 ret = d_bare_function_type (di, 1);
2836 ret = d_ref_qualifier (di, ret);
2838 if (! d_check_char (di, 'E'))
2839 return NULL;
2840 return ret;
2843 /* <type>+ */
2845 static struct demangle_component *
2846 d_parmlist (struct d_info *di)
2848 struct demangle_component *tl;
2849 struct demangle_component **ptl;
2851 tl = NULL;
2852 ptl = &tl;
2853 while (1)
2855 struct demangle_component *type;
2857 char peek = d_peek_char (di);
2858 if (peek == '\0' || peek == 'E' || peek == '.')
2859 break;
2860 if ((peek == 'R' || peek == 'O')
2861 && d_peek_next_char (di) == 'E')
2862 /* Function ref-qualifier, not a ref prefix for a parameter type. */
2863 break;
2864 type = cplus_demangle_type (di);
2865 if (type == NULL)
2866 return NULL;
2867 *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL);
2868 if (*ptl == NULL)
2869 return NULL;
2870 ptl = &d_right (*ptl);
2873 /* There should be at least one parameter type besides the optional
2874 return type. A function which takes no arguments will have a
2875 single parameter type void. */
2876 if (tl == NULL)
2877 return NULL;
2879 /* If we have a single parameter type void, omit it. */
2880 if (d_right (tl) == NULL
2881 && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
2882 && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
2884 di->expansion -= d_left (tl)->u.s_builtin.type->len;
2885 d_left (tl) = NULL;
2888 return tl;
2891 /* <bare-function-type> ::= [J]<type>+ */
2893 static struct demangle_component *
2894 d_bare_function_type (struct d_info *di, int has_return_type)
2896 struct demangle_component *return_type;
2897 struct demangle_component *tl;
2898 char peek;
2900 /* Detect special qualifier indicating that the first argument
2901 is the return type. */
2902 peek = d_peek_char (di);
2903 if (peek == 'J')
2905 d_advance (di, 1);
2906 has_return_type = 1;
2909 if (has_return_type)
2911 return_type = cplus_demangle_type (di);
2912 if (return_type == NULL)
2913 return NULL;
2915 else
2916 return_type = NULL;
2918 tl = d_parmlist (di);
2919 if (tl == NULL)
2920 return NULL;
2922 return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE,
2923 return_type, tl);
2926 /* <class-enum-type> ::= <name> */
2928 static struct demangle_component *
2929 d_class_enum_type (struct d_info *di)
2931 return d_name (di);
2934 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2935 ::= A [<(dimension) expression>] _ <(element) type>
2938 static struct demangle_component *
2939 d_array_type (struct d_info *di)
2941 char peek;
2942 struct demangle_component *dim;
2944 if (! d_check_char (di, 'A'))
2945 return NULL;
2947 peek = d_peek_char (di);
2948 if (peek == '_')
2949 dim = NULL;
2950 else if (IS_DIGIT (peek))
2952 const char *s;
2954 s = d_str (di);
2957 d_advance (di, 1);
2958 peek = d_peek_char (di);
2960 while (IS_DIGIT (peek));
2961 dim = d_make_name (di, s, d_str (di) - s);
2962 if (dim == NULL)
2963 return NULL;
2965 else
2967 dim = d_expression (di);
2968 if (dim == NULL)
2969 return NULL;
2972 if (! d_check_char (di, '_'))
2973 return NULL;
2975 return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim,
2976 cplus_demangle_type (di));
2979 /* <vector-type> ::= Dv <number> _ <type>
2980 ::= Dv _ <expression> _ <type> */
2982 static struct demangle_component *
2983 d_vector_type (struct d_info *di)
2985 char peek;
2986 struct demangle_component *dim;
2988 peek = d_peek_char (di);
2989 if (peek == '_')
2991 d_advance (di, 1);
2992 dim = d_expression (di);
2994 else
2995 dim = d_number_component (di);
2997 if (dim == NULL)
2998 return NULL;
3000 if (! d_check_char (di, '_'))
3001 return NULL;
3003 return d_make_comp (di, DEMANGLE_COMPONENT_VECTOR_TYPE, dim,
3004 cplus_demangle_type (di));
3007 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
3009 static struct demangle_component *
3010 d_pointer_to_member_type (struct d_info *di)
3012 struct demangle_component *cl;
3013 struct demangle_component *mem;
3015 if (! d_check_char (di, 'M'))
3016 return NULL;
3018 cl = cplus_demangle_type (di);
3019 if (cl == NULL)
3020 return NULL;
3022 /* The ABI says, "The type of a non-static member function is considered
3023 to be different, for the purposes of substitution, from the type of a
3024 namespace-scope or static member function whose type appears
3025 similar. The types of two non-static member functions are considered
3026 to be different, for the purposes of substitution, if the functions
3027 are members of different classes. In other words, for the purposes of
3028 substitution, the class of which the function is a member is
3029 considered part of the type of function."
3031 For a pointer to member function, this call to cplus_demangle_type
3032 will end up adding a (possibly qualified) non-member function type to
3033 the substitution table, which is not correct; however, the member
3034 function type will never be used in a substitution, so putting the
3035 wrong type in the substitution table is harmless. */
3037 mem = cplus_demangle_type (di);
3038 if (mem == NULL)
3039 return NULL;
3041 return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem);
3044 /* <non-negative number> _ */
3046 static int
3047 d_compact_number (struct d_info *di)
3049 int num;
3050 if (d_peek_char (di) == '_')
3051 num = 0;
3052 else if (d_peek_char (di) == 'n')
3053 return -1;
3054 else
3055 num = d_number (di) + 1;
3057 if (num < 0 || ! d_check_char (di, '_'))
3058 return -1;
3059 return num;
3062 /* <template-param> ::= T_
3063 ::= T <(parameter-2 non-negative) number> _
3066 static struct demangle_component *
3067 d_template_param (struct d_info *di)
3069 int param;
3071 if (! d_check_char (di, 'T'))
3072 return NULL;
3074 param = d_compact_number (di);
3075 if (param < 0)
3076 return NULL;
3078 ++di->did_subs;
3080 return d_make_template_param (di, param);
3083 /* <template-args> ::= I <template-arg>+ E */
3085 static struct demangle_component *
3086 d_template_args (struct d_info *di)
3088 if (d_peek_char (di) != 'I'
3089 && d_peek_char (di) != 'J')
3090 return NULL;
3091 d_advance (di, 1);
3093 return d_template_args_1 (di);
3096 /* <template-arg>* E */
3098 static struct demangle_component *
3099 d_template_args_1 (struct d_info *di)
3101 struct demangle_component *hold_last_name;
3102 struct demangle_component *al;
3103 struct demangle_component **pal;
3105 /* Preserve the last name we saw--don't let the template arguments
3106 clobber it, as that would give us the wrong name for a subsequent
3107 constructor or destructor. */
3108 hold_last_name = di->last_name;
3110 if (d_peek_char (di) == 'E')
3112 /* An argument pack can be empty. */
3113 d_advance (di, 1);
3114 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, NULL, NULL);
3117 al = NULL;
3118 pal = &al;
3119 while (1)
3121 struct demangle_component *a;
3123 a = d_template_arg (di);
3124 if (a == NULL)
3125 return NULL;
3127 *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL);
3128 if (*pal == NULL)
3129 return NULL;
3130 pal = &d_right (*pal);
3132 if (d_peek_char (di) == 'E')
3134 d_advance (di, 1);
3135 break;
3139 di->last_name = hold_last_name;
3141 return al;
3144 /* <template-arg> ::= <type>
3145 ::= X <expression> E
3146 ::= <expr-primary>
3149 static struct demangle_component *
3150 d_template_arg (struct d_info *di)
3152 struct demangle_component *ret;
3154 switch (d_peek_char (di))
3156 case 'X':
3157 d_advance (di, 1);
3158 ret = d_expression (di);
3159 if (! d_check_char (di, 'E'))
3160 return NULL;
3161 return ret;
3163 case 'L':
3164 return d_expr_primary (di);
3166 case 'I':
3167 case 'J':
3168 /* An argument pack. */
3169 return d_template_args (di);
3171 default:
3172 return cplus_demangle_type (di);
3176 /* Parse a sequence of expressions until we hit the terminator
3177 character. */
3179 static struct demangle_component *
3180 d_exprlist (struct d_info *di, char terminator)
3182 struct demangle_component *list = NULL;
3183 struct demangle_component **p = &list;
3185 if (d_peek_char (di) == terminator)
3187 d_advance (di, 1);
3188 return d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, NULL, NULL);
3191 while (1)
3193 struct demangle_component *arg = d_expression (di);
3194 if (arg == NULL)
3195 return NULL;
3197 *p = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, arg, NULL);
3198 if (*p == NULL)
3199 return NULL;
3200 p = &d_right (*p);
3202 if (d_peek_char (di) == terminator)
3204 d_advance (di, 1);
3205 break;
3209 return list;
3212 /* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
3213 dynamic_cast, static_cast or reinterpret_cast. */
3215 static int
3216 op_is_new_cast (struct demangle_component *op)
3218 const char *code = op->u.s_operator.op->code;
3219 return (code[1] == 'c'
3220 && (code[0] == 's' || code[0] == 'd'
3221 || code[0] == 'c' || code[0] == 'r'));
3224 /* <expression> ::= <(unary) operator-name> <expression>
3225 ::= <(binary) operator-name> <expression> <expression>
3226 ::= <(trinary) operator-name> <expression> <expression> <expression>
3227 ::= cl <expression>+ E
3228 ::= st <type>
3229 ::= <template-param>
3230 ::= sr <type> <unqualified-name>
3231 ::= sr <type> <unqualified-name> <template-args>
3232 ::= <expr-primary>
3235 static inline struct demangle_component *
3236 d_expression_1 (struct d_info *di)
3238 char peek;
3240 peek = d_peek_char (di);
3241 if (peek == 'L')
3242 return d_expr_primary (di);
3243 else if (peek == 'T')
3244 return d_template_param (di);
3245 else if (peek == 's' && d_peek_next_char (di) == 'r')
3247 struct demangle_component *type;
3248 struct demangle_component *name;
3250 d_advance (di, 2);
3251 type = cplus_demangle_type (di);
3252 name = d_unqualified_name (di);
3253 if (d_peek_char (di) != 'I')
3254 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name);
3255 else
3256 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type,
3257 d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3258 d_template_args (di)));
3260 else if (peek == 's' && d_peek_next_char (di) == 'p')
3262 d_advance (di, 2);
3263 return d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
3264 d_expression_1 (di), NULL);
3266 else if (peek == 'f' && d_peek_next_char (di) == 'p')
3268 /* Function parameter used in a late-specified return type. */
3269 int index;
3270 d_advance (di, 2);
3271 if (d_peek_char (di) == 'T')
3273 /* 'this' parameter. */
3274 d_advance (di, 1);
3275 index = 0;
3277 else
3279 index = d_compact_number (di);
3280 if (index == INT_MAX || index == -1)
3281 return NULL;
3282 index++;
3284 return d_make_function_param (di, index);
3286 else if (IS_DIGIT (peek)
3287 || (peek == 'o' && d_peek_next_char (di) == 'n'))
3289 /* We can get an unqualified name as an expression in the case of
3290 a dependent function call, i.e. decltype(f(t)). */
3291 struct demangle_component *name;
3293 if (peek == 'o')
3294 /* operator-function-id, i.e. operator+(t). */
3295 d_advance (di, 2);
3297 name = d_unqualified_name (di);
3298 if (name == NULL)
3299 return NULL;
3300 if (d_peek_char (di) == 'I')
3301 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3302 d_template_args (di));
3303 else
3304 return name;
3306 else if ((peek == 'i' || peek == 't')
3307 && d_peek_next_char (di) == 'l')
3309 /* Brace-enclosed initializer list, untyped or typed. */
3310 struct demangle_component *type = NULL;
3311 if (peek == 't')
3312 type = cplus_demangle_type (di);
3313 if (!d_peek_next_char (di))
3314 return NULL;
3315 d_advance (di, 2);
3316 return d_make_comp (di, DEMANGLE_COMPONENT_INITIALIZER_LIST,
3317 type, d_exprlist (di, 'E'));
3319 else
3321 struct demangle_component *op;
3322 const char *code = NULL;
3323 int args;
3325 op = d_operator_name (di);
3326 if (op == NULL)
3327 return NULL;
3329 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
3331 code = op->u.s_operator.op->code;
3332 di->expansion += op->u.s_operator.op->len - 2;
3333 if (strcmp (code, "st") == 0)
3334 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3335 cplus_demangle_type (di));
3338 switch (op->type)
3340 default:
3341 return NULL;
3342 case DEMANGLE_COMPONENT_OPERATOR:
3343 args = op->u.s_operator.op->args;
3344 break;
3345 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
3346 args = op->u.s_extended_operator.args;
3347 break;
3348 case DEMANGLE_COMPONENT_CAST:
3349 args = 1;
3350 break;
3353 switch (args)
3355 case 0:
3356 return d_make_comp (di, DEMANGLE_COMPONENT_NULLARY, op, NULL);
3358 case 1:
3360 struct demangle_component *operand;
3361 int suffix = 0;
3363 if (code && (code[0] == 'p' || code[0] == 'm')
3364 && code[1] == code[0])
3365 /* pp_ and mm_ are the prefix variants. */
3366 suffix = !d_check_char (di, '_');
3368 if (op->type == DEMANGLE_COMPONENT_CAST
3369 && d_check_char (di, '_'))
3370 operand = d_exprlist (di, 'E');
3371 else if (code && !strcmp (code, "sP"))
3372 operand = d_template_args_1 (di);
3373 else
3374 operand = d_expression_1 (di);
3376 if (suffix)
3377 /* Indicate the suffix variant for d_print_comp. */
3378 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3379 d_make_comp (di,
3380 DEMANGLE_COMPONENT_BINARY_ARGS,
3381 operand, operand));
3382 else
3383 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3384 operand);
3386 case 2:
3388 struct demangle_component *left;
3389 struct demangle_component *right;
3391 if (code == NULL)
3392 return NULL;
3393 if (op_is_new_cast (op))
3394 left = cplus_demangle_type (di);
3395 else if (code[0] == 'f')
3396 /* fold-expression. */
3397 left = d_operator_name (di);
3398 else
3399 left = d_expression_1 (di);
3400 if (!strcmp (code, "cl"))
3401 right = d_exprlist (di, 'E');
3402 else if (!strcmp (code, "dt") || !strcmp (code, "pt"))
3404 right = d_unqualified_name (di);
3405 if (d_peek_char (di) == 'I')
3406 right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE,
3407 right, d_template_args (di));
3409 else
3410 right = d_expression_1 (di);
3412 return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
3413 d_make_comp (di,
3414 DEMANGLE_COMPONENT_BINARY_ARGS,
3415 left, right));
3417 case 3:
3419 struct demangle_component *first;
3420 struct demangle_component *second;
3421 struct demangle_component *third;
3423 if (code == NULL)
3424 return NULL;
3425 else if (!strcmp (code, "qu"))
3427 /* ?: expression. */
3428 first = d_expression_1 (di);
3429 second = d_expression_1 (di);
3430 third = d_expression_1 (di);
3431 if (third == NULL)
3432 return NULL;
3434 else if (code[0] == 'f')
3436 /* fold-expression. */
3437 first = d_operator_name (di);
3438 second = d_expression_1 (di);
3439 third = d_expression_1 (di);
3440 if (third == NULL)
3441 return NULL;
3443 else if (code[0] == 'n')
3445 /* new-expression. */
3446 if (code[1] != 'w' && code[1] != 'a')
3447 return NULL;
3448 first = d_exprlist (di, '_');
3449 second = cplus_demangle_type (di);
3450 if (d_peek_char (di) == 'E')
3452 d_advance (di, 1);
3453 third = NULL;
3455 else if (d_peek_char (di) == 'p'
3456 && d_peek_next_char (di) == 'i')
3458 /* Parenthesized initializer. */
3459 d_advance (di, 2);
3460 third = d_exprlist (di, 'E');
3462 else if (d_peek_char (di) == 'i'
3463 && d_peek_next_char (di) == 'l')
3464 /* initializer-list. */
3465 third = d_expression_1 (di);
3466 else
3467 return NULL;
3469 else
3470 return NULL;
3471 return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op,
3472 d_make_comp (di,
3473 DEMANGLE_COMPONENT_TRINARY_ARG1,
3474 first,
3475 d_make_comp (di,
3476 DEMANGLE_COMPONENT_TRINARY_ARG2,
3477 second, third)));
3479 default:
3480 return NULL;
3485 static struct demangle_component *
3486 d_expression (struct d_info *di)
3488 struct demangle_component *ret;
3489 int was_expression = di->is_expression;
3491 di->is_expression = 1;
3492 ret = d_expression_1 (di);
3493 di->is_expression = was_expression;
3494 return ret;
3497 /* <expr-primary> ::= L <type> <(value) number> E
3498 ::= L <type> <(value) float> E
3499 ::= L <mangled-name> E
3502 static struct demangle_component *
3503 d_expr_primary (struct d_info *di)
3505 struct demangle_component *ret;
3507 if (! d_check_char (di, 'L'))
3508 return NULL;
3509 if (d_peek_char (di) == '_'
3510 /* Workaround for G++ bug; see comment in write_template_arg. */
3511 || d_peek_char (di) == 'Z')
3512 ret = cplus_demangle_mangled_name (di, 0);
3513 else
3515 struct demangle_component *type;
3516 enum demangle_component_type t;
3517 const char *s;
3519 type = cplus_demangle_type (di);
3520 if (type == NULL)
3521 return NULL;
3523 /* If we have a type we know how to print, we aren't going to
3524 print the type name itself. */
3525 if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
3526 && type->u.s_builtin.type->print != D_PRINT_DEFAULT)
3527 di->expansion -= type->u.s_builtin.type->len;
3529 /* Rather than try to interpret the literal value, we just
3530 collect it as a string. Note that it's possible to have a
3531 floating point literal here. The ABI specifies that the
3532 format of such literals is machine independent. That's fine,
3533 but what's not fine is that versions of g++ up to 3.2 with
3534 -fabi-version=1 used upper case letters in the hex constant,
3535 and dumped out gcc's internal representation. That makes it
3536 hard to tell where the constant ends, and hard to dump the
3537 constant in any readable form anyhow. We don't attempt to
3538 handle these cases. */
3540 t = DEMANGLE_COMPONENT_LITERAL;
3541 if (d_peek_char (di) == 'n')
3543 t = DEMANGLE_COMPONENT_LITERAL_NEG;
3544 d_advance (di, 1);
3546 s = d_str (di);
3547 while (d_peek_char (di) != 'E')
3549 if (d_peek_char (di) == '\0')
3550 return NULL;
3551 d_advance (di, 1);
3553 ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s));
3555 if (! d_check_char (di, 'E'))
3556 return NULL;
3557 return ret;
3560 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3561 ::= Z <(function) encoding> E s [<discriminator>]
3562 ::= Z <(function) encoding> E d [<parameter> number>] _ <entity name>
3565 static struct demangle_component *
3566 d_local_name (struct d_info *di)
3568 struct demangle_component *function;
3570 if (! d_check_char (di, 'Z'))
3571 return NULL;
3573 function = d_encoding (di, 0);
3575 if (! d_check_char (di, 'E'))
3576 return NULL;
3578 if (d_peek_char (di) == 's')
3580 d_advance (di, 1);
3581 if (! d_discriminator (di))
3582 return NULL;
3583 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function,
3584 d_make_name (di, "string literal",
3585 sizeof "string literal" - 1));
3587 else
3589 struct demangle_component *name;
3590 int num = -1;
3592 if (d_peek_char (di) == 'd')
3594 /* Default argument scope: d <number> _. */
3595 d_advance (di, 1);
3596 num = d_compact_number (di);
3597 if (num < 0)
3598 return NULL;
3601 name = d_name (di);
3602 if (name)
3603 switch (name->type)
3605 /* Lambdas and unnamed types have internal discriminators. */
3606 case DEMANGLE_COMPONENT_LAMBDA:
3607 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
3608 break;
3609 default:
3610 if (! d_discriminator (di))
3611 return NULL;
3613 if (num >= 0)
3614 name = d_make_default_arg (di, num, name);
3615 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
3619 /* <discriminator> ::= _ <number> # when number < 10
3620 ::= __ <number> _ # when number >= 10
3622 <discriminator> ::= _ <number> # when number >=10
3623 is also accepted to support gcc versions that wrongly mangled that way.
3625 We demangle the discriminator, but we don't print it out. FIXME:
3626 We should print it out in verbose mode. */
3628 static int
3629 d_discriminator (struct d_info *di)
3631 int discrim, num_underscores = 1;
3633 if (d_peek_char (di) != '_')
3634 return 1;
3635 d_advance (di, 1);
3636 if (d_peek_char (di) == '_')
3638 ++num_underscores;
3639 d_advance (di, 1);
3642 discrim = d_number (di);
3643 if (discrim < 0)
3644 return 0;
3645 if (num_underscores > 1 && discrim >= 10)
3647 if (d_peek_char (di) == '_')
3648 d_advance (di, 1);
3649 else
3650 return 0;
3653 return 1;
3656 /* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */
3658 static struct demangle_component *
3659 d_lambda (struct d_info *di)
3661 struct demangle_component *tl;
3662 struct demangle_component *ret;
3663 int num;
3665 if (! d_check_char (di, 'U'))
3666 return NULL;
3667 if (! d_check_char (di, 'l'))
3668 return NULL;
3670 tl = d_parmlist (di);
3671 if (tl == NULL)
3672 return NULL;
3674 if (! d_check_char (di, 'E'))
3675 return NULL;
3677 num = d_compact_number (di);
3678 if (num < 0)
3679 return NULL;
3681 ret = d_make_empty (di);
3682 if (ret)
3684 ret->type = DEMANGLE_COMPONENT_LAMBDA;
3685 ret->u.s_unary_num.sub = tl;
3686 ret->u.s_unary_num.num = num;
3689 if (! d_add_substitution (di, ret))
3690 return NULL;
3692 return ret;
3695 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
3697 static struct demangle_component *
3698 d_unnamed_type (struct d_info *di)
3700 struct demangle_component *ret;
3701 int num;
3703 if (! d_check_char (di, 'U'))
3704 return NULL;
3705 if (! d_check_char (di, 't'))
3706 return NULL;
3708 num = d_compact_number (di);
3709 if (num < 0)
3710 return NULL;
3712 ret = d_make_empty (di);
3713 if (ret)
3715 ret->type = DEMANGLE_COMPONENT_UNNAMED_TYPE;
3716 ret->u.s_number.number = num;
3719 if (! d_add_substitution (di, ret))
3720 return NULL;
3722 return ret;
3725 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
3728 static struct demangle_component *
3729 d_clone_suffix (struct d_info *di, struct demangle_component *encoding)
3731 const char *suffix = d_str (di);
3732 const char *pend = suffix;
3733 struct demangle_component *n;
3735 if (*pend == '.' && (IS_LOWER (pend[1]) || pend[1] == '_'))
3737 pend += 2;
3738 while (IS_LOWER (*pend) || *pend == '_')
3739 ++pend;
3741 while (*pend == '.' && IS_DIGIT (pend[1]))
3743 pend += 2;
3744 while (IS_DIGIT (*pend))
3745 ++pend;
3747 d_advance (di, pend - suffix);
3748 n = d_make_name (di, suffix, pend - suffix);
3749 return d_make_comp (di, DEMANGLE_COMPONENT_CLONE, encoding, n);
3752 /* Add a new substitution. */
3754 static int
3755 d_add_substitution (struct d_info *di, struct demangle_component *dc)
3757 if (dc == NULL)
3758 return 0;
3759 if (di->next_sub >= di->num_subs)
3760 return 0;
3761 di->subs[di->next_sub] = dc;
3762 ++di->next_sub;
3763 return 1;
3766 /* <substitution> ::= S <seq-id> _
3767 ::= S_
3768 ::= St
3769 ::= Sa
3770 ::= Sb
3771 ::= Ss
3772 ::= Si
3773 ::= So
3774 ::= Sd
3776 If PREFIX is non-zero, then this type is being used as a prefix in
3777 a qualified name. In this case, for the standard substitutions, we
3778 need to check whether we are being used as a prefix for a
3779 constructor or destructor, and return a full template name.
3780 Otherwise we will get something like std::iostream::~iostream()
3781 which does not correspond particularly well to any function which
3782 actually appears in the source.
3785 static const struct d_standard_sub_info standard_subs[] =
3787 { 't', NL ("std"),
3788 NL ("std"),
3789 NULL, 0 },
3790 { 'a', NL ("std::allocator"),
3791 NL ("std::allocator"),
3792 NL ("allocator") },
3793 { 'b', NL ("std::basic_string"),
3794 NL ("std::basic_string"),
3795 NL ("basic_string") },
3796 { 's', NL ("std::string"),
3797 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
3798 NL ("basic_string") },
3799 { 'i', NL ("std::istream"),
3800 NL ("std::basic_istream<char, std::char_traits<char> >"),
3801 NL ("basic_istream") },
3802 { 'o', NL ("std::ostream"),
3803 NL ("std::basic_ostream<char, std::char_traits<char> >"),
3804 NL ("basic_ostream") },
3805 { 'd', NL ("std::iostream"),
3806 NL ("std::basic_iostream<char, std::char_traits<char> >"),
3807 NL ("basic_iostream") }
3810 static struct demangle_component *
3811 d_substitution (struct d_info *di, int prefix)
3813 char c;
3815 if (! d_check_char (di, 'S'))
3816 return NULL;
3818 c = d_next_char (di);
3819 if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
3821 unsigned int id;
3823 id = 0;
3824 if (c != '_')
3828 unsigned int new_id;
3830 if (IS_DIGIT (c))
3831 new_id = id * 36 + c - '0';
3832 else if (IS_UPPER (c))
3833 new_id = id * 36 + c - 'A' + 10;
3834 else
3835 return NULL;
3836 if (new_id < id)
3837 return NULL;
3838 id = new_id;
3839 c = d_next_char (di);
3841 while (c != '_');
3843 ++id;
3846 if (id >= (unsigned int) di->next_sub)
3847 return NULL;
3849 ++di->did_subs;
3851 return di->subs[id];
3853 else
3855 int verbose;
3856 const struct d_standard_sub_info *p;
3857 const struct d_standard_sub_info *pend;
3859 verbose = (di->options & DMGL_VERBOSE) != 0;
3860 if (! verbose && prefix)
3862 char peek;
3864 peek = d_peek_char (di);
3865 if (peek == 'C' || peek == 'D')
3866 verbose = 1;
3869 pend = (&standard_subs[0]
3870 + sizeof standard_subs / sizeof standard_subs[0]);
3871 for (p = &standard_subs[0]; p < pend; ++p)
3873 if (c == p->code)
3875 const char *s;
3876 int len;
3877 struct demangle_component *dc;
3879 if (p->set_last_name != NULL)
3880 di->last_name = d_make_sub (di, p->set_last_name,
3881 p->set_last_name_len);
3882 if (verbose)
3884 s = p->full_expansion;
3885 len = p->full_len;
3887 else
3889 s = p->simple_expansion;
3890 len = p->simple_len;
3892 di->expansion += len;
3893 dc = d_make_sub (di, s, len);
3894 if (d_peek_char (di) == 'B')
3896 /* If there are ABI tags on the abbreviation, it becomes
3897 a substitution candidate. */
3898 dc = d_abi_tags (di, dc);
3899 d_add_substitution (di, dc);
3901 return dc;
3905 return NULL;
3909 static void
3910 d_checkpoint (struct d_info *di, struct d_info_checkpoint *checkpoint)
3912 checkpoint->n = di->n;
3913 checkpoint->next_comp = di->next_comp;
3914 checkpoint->next_sub = di->next_sub;
3915 checkpoint->did_subs = di->did_subs;
3916 checkpoint->expansion = di->expansion;
3919 static void
3920 d_backtrack (struct d_info *di, struct d_info_checkpoint *checkpoint)
3922 di->n = checkpoint->n;
3923 di->next_comp = checkpoint->next_comp;
3924 di->next_sub = checkpoint->next_sub;
3925 di->did_subs = checkpoint->did_subs;
3926 di->expansion = checkpoint->expansion;
3929 /* Initialize a growable string. */
3931 static void
3932 d_growable_string_init (struct d_growable_string *dgs, size_t estimate)
3934 dgs->buf = NULL;
3935 dgs->len = 0;
3936 dgs->alc = 0;
3937 dgs->allocation_failure = 0;
3939 if (estimate > 0)
3940 d_growable_string_resize (dgs, estimate);
3943 /* Grow a growable string to a given size. */
3945 static inline void
3946 d_growable_string_resize (struct d_growable_string *dgs, size_t need)
3948 size_t newalc;
3949 char *newbuf;
3951 if (dgs->allocation_failure)
3952 return;
3954 /* Start allocation at two bytes to avoid any possibility of confusion
3955 with the special value of 1 used as a return in *palc to indicate
3956 allocation failures. */
3957 newalc = dgs->alc > 0 ? dgs->alc : 2;
3958 while (newalc < need)
3959 newalc <<= 1;
3961 newbuf = (char *) realloc (dgs->buf, newalc);
3962 if (newbuf == NULL)
3964 free (dgs->buf);
3965 dgs->buf = NULL;
3966 dgs->len = 0;
3967 dgs->alc = 0;
3968 dgs->allocation_failure = 1;
3969 return;
3971 dgs->buf = newbuf;
3972 dgs->alc = newalc;
3975 /* Append a buffer to a growable string. */
3977 static inline void
3978 d_growable_string_append_buffer (struct d_growable_string *dgs,
3979 const char *s, size_t l)
3981 size_t need;
3983 need = dgs->len + l + 1;
3984 if (need > dgs->alc)
3985 d_growable_string_resize (dgs, need);
3987 if (dgs->allocation_failure)
3988 return;
3990 memcpy (dgs->buf + dgs->len, s, l);
3991 dgs->buf[dgs->len + l] = '\0';
3992 dgs->len += l;
3995 /* Bridge growable strings to the callback mechanism. */
3997 static void
3998 d_growable_string_callback_adapter (const char *s, size_t l, void *opaque)
4000 struct d_growable_string *dgs = (struct d_growable_string*) opaque;
4002 d_growable_string_append_buffer (dgs, s, l);
4005 /* Walk the tree, counting the number of templates encountered, and
4006 the number of times a scope might be saved. These counts will be
4007 used to allocate data structures for d_print_comp, so the logic
4008 here must mirror the logic d_print_comp will use. It is not
4009 important that the resulting numbers are exact, so long as they
4010 are larger than the actual numbers encountered. */
4012 static void
4013 d_count_templates_scopes (int *num_templates, int *num_scopes,
4014 const struct demangle_component *dc)
4016 if (dc == NULL)
4017 return;
4019 switch (dc->type)
4021 case DEMANGLE_COMPONENT_NAME:
4022 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4023 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
4024 case DEMANGLE_COMPONENT_SUB_STD:
4025 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4026 case DEMANGLE_COMPONENT_OPERATOR:
4027 case DEMANGLE_COMPONENT_CHARACTER:
4028 case DEMANGLE_COMPONENT_NUMBER:
4029 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
4030 break;
4032 case DEMANGLE_COMPONENT_TEMPLATE:
4033 (*num_templates)++;
4034 goto recurse_left_right;
4036 case DEMANGLE_COMPONENT_REFERENCE:
4037 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
4038 if (d_left (dc)->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
4039 (*num_scopes)++;
4040 goto recurse_left_right;
4042 case DEMANGLE_COMPONENT_QUAL_NAME:
4043 case DEMANGLE_COMPONENT_LOCAL_NAME:
4044 case DEMANGLE_COMPONENT_TYPED_NAME:
4045 case DEMANGLE_COMPONENT_VTABLE:
4046 case DEMANGLE_COMPONENT_VTT:
4047 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
4048 case DEMANGLE_COMPONENT_TYPEINFO:
4049 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
4050 case DEMANGLE_COMPONENT_TYPEINFO_FN:
4051 case DEMANGLE_COMPONENT_THUNK:
4052 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
4053 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
4054 case DEMANGLE_COMPONENT_JAVA_CLASS:
4055 case DEMANGLE_COMPONENT_GUARD:
4056 case DEMANGLE_COMPONENT_TLS_INIT:
4057 case DEMANGLE_COMPONENT_TLS_WRAPPER:
4058 case DEMANGLE_COMPONENT_REFTEMP:
4059 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
4060 case DEMANGLE_COMPONENT_RESTRICT:
4061 case DEMANGLE_COMPONENT_VOLATILE:
4062 case DEMANGLE_COMPONENT_CONST:
4063 case DEMANGLE_COMPONENT_RESTRICT_THIS:
4064 case DEMANGLE_COMPONENT_VOLATILE_THIS:
4065 case DEMANGLE_COMPONENT_CONST_THIS:
4066 case DEMANGLE_COMPONENT_REFERENCE_THIS:
4067 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
4068 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
4069 case DEMANGLE_COMPONENT_NOEXCEPT:
4070 case DEMANGLE_COMPONENT_THROW_SPEC:
4071 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
4072 case DEMANGLE_COMPONENT_POINTER:
4073 case DEMANGLE_COMPONENT_COMPLEX:
4074 case DEMANGLE_COMPONENT_IMAGINARY:
4075 case DEMANGLE_COMPONENT_VENDOR_TYPE:
4076 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
4077 case DEMANGLE_COMPONENT_ARRAY_TYPE:
4078 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
4079 case DEMANGLE_COMPONENT_VECTOR_TYPE:
4080 case DEMANGLE_COMPONENT_ARGLIST:
4081 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
4082 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
4083 case DEMANGLE_COMPONENT_CAST:
4084 case DEMANGLE_COMPONENT_CONVERSION:
4085 case DEMANGLE_COMPONENT_NULLARY:
4086 case DEMANGLE_COMPONENT_UNARY:
4087 case DEMANGLE_COMPONENT_BINARY:
4088 case DEMANGLE_COMPONENT_BINARY_ARGS:
4089 case DEMANGLE_COMPONENT_TRINARY:
4090 case DEMANGLE_COMPONENT_TRINARY_ARG1:
4091 case DEMANGLE_COMPONENT_TRINARY_ARG2:
4092 case DEMANGLE_COMPONENT_LITERAL:
4093 case DEMANGLE_COMPONENT_LITERAL_NEG:
4094 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
4095 case DEMANGLE_COMPONENT_COMPOUND_NAME:
4096 case DEMANGLE_COMPONENT_DECLTYPE:
4097 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
4098 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
4099 case DEMANGLE_COMPONENT_PACK_EXPANSION:
4100 case DEMANGLE_COMPONENT_TAGGED_NAME:
4101 case DEMANGLE_COMPONENT_CLONE:
4102 recurse_left_right:
4103 d_count_templates_scopes (num_templates, num_scopes,
4104 d_left (dc));
4105 d_count_templates_scopes (num_templates, num_scopes,
4106 d_right (dc));
4107 break;
4109 case DEMANGLE_COMPONENT_CTOR:
4110 d_count_templates_scopes (num_templates, num_scopes,
4111 dc->u.s_ctor.name);
4112 break;
4114 case DEMANGLE_COMPONENT_DTOR:
4115 d_count_templates_scopes (num_templates, num_scopes,
4116 dc->u.s_dtor.name);
4117 break;
4119 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4120 d_count_templates_scopes (num_templates, num_scopes,
4121 dc->u.s_extended_operator.name);
4122 break;
4124 case DEMANGLE_COMPONENT_FIXED_TYPE:
4125 d_count_templates_scopes (num_templates, num_scopes,
4126 dc->u.s_fixed.length);
4127 break;
4129 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
4130 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
4131 d_count_templates_scopes (num_templates, num_scopes,
4132 d_left (dc));
4133 break;
4135 case DEMANGLE_COMPONENT_LAMBDA:
4136 case DEMANGLE_COMPONENT_DEFAULT_ARG:
4137 d_count_templates_scopes (num_templates, num_scopes,
4138 dc->u.s_unary_num.sub);
4139 break;
4143 /* Initialize a print information structure. */
4145 static void
4146 d_print_init (struct d_print_info *dpi, demangle_callbackref callback,
4147 void *opaque, const struct demangle_component *dc)
4149 dpi->len = 0;
4150 dpi->last_char = '\0';
4151 dpi->templates = NULL;
4152 dpi->modifiers = NULL;
4153 dpi->pack_index = 0;
4154 dpi->flush_count = 0;
4156 dpi->callback = callback;
4157 dpi->opaque = opaque;
4159 dpi->demangle_failure = 0;
4160 dpi->is_lambda_arg = 0;
4162 dpi->component_stack = NULL;
4164 dpi->saved_scopes = NULL;
4165 dpi->next_saved_scope = 0;
4166 dpi->num_saved_scopes = 0;
4168 dpi->copy_templates = NULL;
4169 dpi->next_copy_template = 0;
4170 dpi->num_copy_templates = 0;
4172 d_count_templates_scopes (&dpi->num_copy_templates,
4173 &dpi->num_saved_scopes, dc);
4174 dpi->num_copy_templates *= dpi->num_saved_scopes;
4176 dpi->current_template = NULL;
4179 /* Indicate that an error occurred during printing, and test for error. */
4181 static inline void
4182 d_print_error (struct d_print_info *dpi)
4184 dpi->demangle_failure = 1;
4187 static inline int
4188 d_print_saw_error (struct d_print_info *dpi)
4190 return dpi->demangle_failure != 0;
4193 /* Flush buffered characters to the callback. */
4195 static inline void
4196 d_print_flush (struct d_print_info *dpi)
4198 dpi->buf[dpi->len] = '\0';
4199 dpi->callback (dpi->buf, dpi->len, dpi->opaque);
4200 dpi->len = 0;
4201 dpi->flush_count++;
4204 /* Append characters and buffers for printing. */
4206 static inline void
4207 d_append_char (struct d_print_info *dpi, char c)
4209 if (dpi->len == sizeof (dpi->buf) - 1)
4210 d_print_flush (dpi);
4212 dpi->buf[dpi->len++] = c;
4213 dpi->last_char = c;
4216 static inline void
4217 d_append_buffer (struct d_print_info *dpi, const char *s, size_t l)
4219 size_t i;
4221 for (i = 0; i < l; i++)
4222 d_append_char (dpi, s[i]);
4225 static inline void
4226 d_append_string (struct d_print_info *dpi, const char *s)
4228 d_append_buffer (dpi, s, strlen (s));
4231 static inline void
4232 d_append_num (struct d_print_info *dpi, int l)
4234 char buf[25];
4235 sprintf (buf,"%d", l);
4236 d_append_string (dpi, buf);
4239 static inline char
4240 d_last_char (struct d_print_info *dpi)
4242 return dpi->last_char;
4245 /* Turn components into a human readable string. OPTIONS is the
4246 options bits passed to the demangler. DC is the tree to print.
4247 CALLBACK is a function to call to flush demangled string segments
4248 as they fill the intermediate buffer, and OPAQUE is a generalized
4249 callback argument. On success, this returns 1. On failure,
4250 it returns 0, indicating a bad parse. It does not use heap
4251 memory to build an output string, so cannot encounter memory
4252 allocation failure. */
4254 CP_STATIC_IF_GLIBCPP_V3
4256 cplus_demangle_print_callback (int options,
4257 struct demangle_component *dc,
4258 demangle_callbackref callback, void *opaque)
4260 struct d_print_info dpi;
4262 d_print_init (&dpi, callback, opaque, dc);
4265 #ifdef CP_DYNAMIC_ARRAYS
4266 /* Avoid zero-length VLAs, which are prohibited by the C99 standard
4267 and flagged as errors by Address Sanitizer. */
4268 __extension__ struct d_saved_scope scopes[(dpi.num_saved_scopes > 0)
4269 ? dpi.num_saved_scopes : 1];
4270 __extension__ struct d_print_template temps[(dpi.num_copy_templates > 0)
4271 ? dpi.num_copy_templates : 1];
4273 dpi.saved_scopes = scopes;
4274 dpi.copy_templates = temps;
4275 #else
4276 dpi.saved_scopes = alloca (dpi.num_saved_scopes
4277 * sizeof (*dpi.saved_scopes));
4278 dpi.copy_templates = alloca (dpi.num_copy_templates
4279 * sizeof (*dpi.copy_templates));
4280 #endif
4282 d_print_comp (&dpi, options, dc);
4285 d_print_flush (&dpi);
4287 return ! d_print_saw_error (&dpi);
4290 /* Turn components into a human readable string. OPTIONS is the
4291 options bits passed to the demangler. DC is the tree to print.
4292 ESTIMATE is a guess at the length of the result. This returns a
4293 string allocated by malloc, or NULL on error. On success, this
4294 sets *PALC to the size of the allocated buffer. On failure, this
4295 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
4296 failure. */
4298 CP_STATIC_IF_GLIBCPP_V3
4299 char *
4300 cplus_demangle_print (int options, struct demangle_component *dc,
4301 int estimate, size_t *palc)
4303 struct d_growable_string dgs;
4305 d_growable_string_init (&dgs, estimate);
4307 if (! cplus_demangle_print_callback (options, dc,
4308 d_growable_string_callback_adapter,
4309 &dgs))
4311 free (dgs.buf);
4312 *palc = 0;
4313 return NULL;
4316 *palc = dgs.allocation_failure ? 1 : dgs.alc;
4317 return dgs.buf;
4320 /* Returns the I'th element of the template arglist ARGS, or NULL on
4321 failure. If I is negative, return the entire arglist. */
4323 static struct demangle_component *
4324 d_index_template_argument (struct demangle_component *args, int i)
4326 struct demangle_component *a;
4328 if (i < 0)
4329 /* Print the whole argument pack. */
4330 return args;
4332 for (a = args;
4333 a != NULL;
4334 a = d_right (a))
4336 if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4337 return NULL;
4338 if (i <= 0)
4339 break;
4340 --i;
4342 if (i != 0 || a == NULL)
4343 return NULL;
4345 return d_left (a);
4348 /* Returns the template argument from the current context indicated by DC,
4349 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
4351 static struct demangle_component *
4352 d_lookup_template_argument (struct d_print_info *dpi,
4353 const struct demangle_component *dc)
4355 if (dpi->templates == NULL)
4357 d_print_error (dpi);
4358 return NULL;
4361 return d_index_template_argument
4362 (d_right (dpi->templates->template_decl),
4363 dc->u.s_number.number);
4366 /* Returns a template argument pack used in DC (any will do), or NULL. */
4368 static struct demangle_component *
4369 d_find_pack (struct d_print_info *dpi,
4370 const struct demangle_component *dc)
4372 struct demangle_component *a;
4373 if (dc == NULL)
4374 return NULL;
4376 switch (dc->type)
4378 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4379 a = d_lookup_template_argument (dpi, dc);
4380 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4381 return a;
4382 return NULL;
4384 case DEMANGLE_COMPONENT_PACK_EXPANSION:
4385 return NULL;
4387 case DEMANGLE_COMPONENT_LAMBDA:
4388 case DEMANGLE_COMPONENT_NAME:
4389 case DEMANGLE_COMPONENT_TAGGED_NAME:
4390 case DEMANGLE_COMPONENT_OPERATOR:
4391 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4392 case DEMANGLE_COMPONENT_SUB_STD:
4393 case DEMANGLE_COMPONENT_CHARACTER:
4394 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
4395 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
4396 case DEMANGLE_COMPONENT_FIXED_TYPE:
4397 case DEMANGLE_COMPONENT_DEFAULT_ARG:
4398 case DEMANGLE_COMPONENT_NUMBER:
4399 return NULL;
4401 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4402 return d_find_pack (dpi, dc->u.s_extended_operator.name);
4403 case DEMANGLE_COMPONENT_CTOR:
4404 return d_find_pack (dpi, dc->u.s_ctor.name);
4405 case DEMANGLE_COMPONENT_DTOR:
4406 return d_find_pack (dpi, dc->u.s_dtor.name);
4408 default:
4409 a = d_find_pack (dpi, d_left (dc));
4410 if (a)
4411 return a;
4412 return d_find_pack (dpi, d_right (dc));
4416 /* Returns the length of the template argument pack DC. */
4418 static int
4419 d_pack_length (const struct demangle_component *dc)
4421 int count = 0;
4422 while (dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
4423 && d_left (dc) != NULL)
4425 ++count;
4426 dc = d_right (dc);
4428 return count;
4431 /* Returns the number of template args in DC, expanding any pack expansions
4432 found there. */
4434 static int
4435 d_args_length (struct d_print_info *dpi, const struct demangle_component *dc)
4437 int count = 0;
4438 for (; dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST;
4439 dc = d_right (dc))
4441 struct demangle_component *elt = d_left (dc);
4442 if (elt == NULL)
4443 break;
4444 if (elt->type == DEMANGLE_COMPONENT_PACK_EXPANSION)
4446 struct demangle_component *a = d_find_pack (dpi, d_left (elt));
4447 count += d_pack_length (a);
4449 else
4450 ++count;
4452 return count;
4455 /* DC is a component of a mangled expression. Print it, wrapped in parens
4456 if needed. */
4458 static void
4459 d_print_subexpr (struct d_print_info *dpi, int options,
4460 struct demangle_component *dc)
4462 int simple = 0;
4463 if (dc->type == DEMANGLE_COMPONENT_NAME
4464 || dc->type == DEMANGLE_COMPONENT_QUAL_NAME
4465 || dc->type == DEMANGLE_COMPONENT_INITIALIZER_LIST
4466 || dc->type == DEMANGLE_COMPONENT_FUNCTION_PARAM)
4467 simple = 1;
4468 if (!simple)
4469 d_append_char (dpi, '(');
4470 d_print_comp (dpi, options, dc);
4471 if (!simple)
4472 d_append_char (dpi, ')');
4475 /* Save the current scope. */
4477 static void
4478 d_save_scope (struct d_print_info *dpi,
4479 const struct demangle_component *container)
4481 struct d_saved_scope *scope;
4482 struct d_print_template *src, **link;
4484 if (dpi->next_saved_scope >= dpi->num_saved_scopes)
4486 d_print_error (dpi);
4487 return;
4489 scope = &dpi->saved_scopes[dpi->next_saved_scope];
4490 dpi->next_saved_scope++;
4492 scope->container = container;
4493 link = &scope->templates;
4495 for (src = dpi->templates; src != NULL; src = src->next)
4497 struct d_print_template *dst;
4499 if (dpi->next_copy_template >= dpi->num_copy_templates)
4501 d_print_error (dpi);
4502 return;
4504 dst = &dpi->copy_templates[dpi->next_copy_template];
4505 dpi->next_copy_template++;
4507 dst->template_decl = src->template_decl;
4508 *link = dst;
4509 link = &dst->next;
4512 *link = NULL;
4515 /* Attempt to locate a previously saved scope. Returns NULL if no
4516 corresponding saved scope was found. */
4518 static struct d_saved_scope *
4519 d_get_saved_scope (struct d_print_info *dpi,
4520 const struct demangle_component *container)
4522 int i;
4524 for (i = 0; i < dpi->next_saved_scope; i++)
4525 if (dpi->saved_scopes[i].container == container)
4526 return &dpi->saved_scopes[i];
4528 return NULL;
4531 /* If DC is a C++17 fold-expression, print it and return true; otherwise
4532 return false. */
4534 static int
4535 d_maybe_print_fold_expression (struct d_print_info *dpi, int options,
4536 struct demangle_component *dc)
4538 struct demangle_component *ops, *operator_, *op1, *op2;
4539 int save_idx;
4541 const char *fold_code = d_left (dc)->u.s_operator.op->code;
4542 if (fold_code[0] != 'f')
4543 return 0;
4545 ops = d_right (dc);
4546 operator_ = d_left (ops);
4547 op1 = d_right (ops);
4548 op2 = 0;
4549 if (op1->type == DEMANGLE_COMPONENT_TRINARY_ARG2)
4551 op2 = d_right (op1);
4552 op1 = d_left (op1);
4555 /* Print the whole pack. */
4556 save_idx = dpi->pack_index;
4557 dpi->pack_index = -1;
4559 switch (fold_code[1])
4561 /* Unary left fold, (... + X). */
4562 case 'l':
4563 d_append_string (dpi, "(...");
4564 d_print_expr_op (dpi, options, operator_);
4565 d_print_subexpr (dpi, options, op1);
4566 d_append_char (dpi, ')');
4567 break;
4569 /* Unary right fold, (X + ...). */
4570 case 'r':
4571 d_append_char (dpi, '(');
4572 d_print_subexpr (dpi, options, op1);
4573 d_print_expr_op (dpi, options, operator_);
4574 d_append_string (dpi, "...)");
4575 break;
4577 /* Binary left fold, (42 + ... + X). */
4578 case 'L':
4579 /* Binary right fold, (X + ... + 42). */
4580 case 'R':
4581 d_append_char (dpi, '(');
4582 d_print_subexpr (dpi, options, op1);
4583 d_print_expr_op (dpi, options, operator_);
4584 d_append_string (dpi, "...");
4585 d_print_expr_op (dpi, options, operator_);
4586 d_print_subexpr (dpi, options, op2);
4587 d_append_char (dpi, ')');
4588 break;
4591 dpi->pack_index = save_idx;
4592 return 1;
4595 /* Subroutine to handle components. */
4597 static void
4598 d_print_comp_inner (struct d_print_info *dpi, int options,
4599 struct demangle_component *dc)
4601 /* Magic variable to let reference smashing skip over the next modifier
4602 without needing to modify *dc. */
4603 struct demangle_component *mod_inner = NULL;
4605 /* Variable used to store the current templates while a previously
4606 captured scope is used. */
4607 struct d_print_template *saved_templates;
4609 /* Nonzero if templates have been stored in the above variable. */
4610 int need_template_restore = 0;
4612 if (dc == NULL)
4614 d_print_error (dpi);
4615 return;
4617 if (d_print_saw_error (dpi))
4618 return;
4620 switch (dc->type)
4622 case DEMANGLE_COMPONENT_NAME:
4623 if ((options & DMGL_JAVA) == 0)
4624 d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len);
4625 else
4626 d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
4627 return;
4629 case DEMANGLE_COMPONENT_TAGGED_NAME:
4630 d_print_comp (dpi, options, d_left (dc));
4631 d_append_string (dpi, "[abi:");
4632 d_print_comp (dpi, options, d_right (dc));
4633 d_append_char (dpi, ']');
4634 return;
4636 case DEMANGLE_COMPONENT_QUAL_NAME:
4637 case DEMANGLE_COMPONENT_LOCAL_NAME:
4638 d_print_comp (dpi, options, d_left (dc));
4639 if ((options & DMGL_JAVA) == 0)
4640 d_append_string (dpi, "::");
4641 else
4642 d_append_char (dpi, '.');
4644 struct demangle_component *local_name = d_right (dc);
4645 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4647 d_append_string (dpi, "{default arg#");
4648 d_append_num (dpi, local_name->u.s_unary_num.num + 1);
4649 d_append_string (dpi, "}::");
4650 local_name = local_name->u.s_unary_num.sub;
4652 d_print_comp (dpi, options, local_name);
4654 return;
4656 case DEMANGLE_COMPONENT_TYPED_NAME:
4658 struct d_print_mod *hold_modifiers;
4659 struct demangle_component *typed_name;
4660 struct d_print_mod adpm[4];
4661 unsigned int i;
4662 struct d_print_template dpt;
4664 /* Pass the name down to the type so that it can be printed in
4665 the right place for the type. We also have to pass down
4666 any CV-qualifiers, which apply to the this parameter. */
4667 hold_modifiers = dpi->modifiers;
4668 dpi->modifiers = 0;
4669 i = 0;
4670 typed_name = d_left (dc);
4671 while (typed_name != NULL)
4673 if (i >= sizeof adpm / sizeof adpm[0])
4675 d_print_error (dpi);
4676 return;
4679 adpm[i].next = dpi->modifiers;
4680 dpi->modifiers = &adpm[i];
4681 adpm[i].mod = typed_name;
4682 adpm[i].printed = 0;
4683 adpm[i].templates = dpi->templates;
4684 ++i;
4686 if (!is_fnqual_component_type (typed_name->type))
4687 break;
4689 typed_name = d_left (typed_name);
4692 if (typed_name == NULL)
4694 d_print_error (dpi);
4695 return;
4698 /* If typed_name is a template, then it applies to the
4699 function type as well. */
4700 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
4702 dpt.next = dpi->templates;
4703 dpi->templates = &dpt;
4704 dpt.template_decl = typed_name;
4707 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
4708 there may be CV-qualifiers on its right argument which
4709 really apply here; this happens when parsing a class which
4710 is local to a function. */
4711 if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME)
4713 struct demangle_component *local_name;
4715 local_name = d_right (typed_name);
4716 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4717 local_name = local_name->u.s_unary_num.sub;
4718 if (local_name == NULL)
4720 d_print_error (dpi);
4721 return;
4723 while (is_fnqual_component_type (local_name->type))
4725 if (i >= sizeof adpm / sizeof adpm[0])
4727 d_print_error (dpi);
4728 return;
4731 adpm[i] = adpm[i - 1];
4732 adpm[i].next = &adpm[i - 1];
4733 dpi->modifiers = &adpm[i];
4735 adpm[i - 1].mod = local_name;
4736 adpm[i - 1].printed = 0;
4737 adpm[i - 1].templates = dpi->templates;
4738 ++i;
4740 local_name = d_left (local_name);
4744 d_print_comp (dpi, options, d_right (dc));
4746 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
4747 dpi->templates = dpt.next;
4749 /* If the modifiers didn't get printed by the type, print them
4750 now. */
4751 while (i > 0)
4753 --i;
4754 if (! adpm[i].printed)
4756 d_append_char (dpi, ' ');
4757 d_print_mod (dpi, options, adpm[i].mod);
4761 dpi->modifiers = hold_modifiers;
4763 return;
4766 case DEMANGLE_COMPONENT_TEMPLATE:
4768 struct d_print_mod *hold_dpm;
4769 struct demangle_component *dcl;
4770 const struct demangle_component *hold_current;
4772 /* This template may need to be referenced by a cast operator
4773 contained in its subtree. */
4774 hold_current = dpi->current_template;
4775 dpi->current_template = dc;
4777 /* Don't push modifiers into a template definition. Doing so
4778 could give the wrong definition for a template argument.
4779 Instead, treat the template essentially as a name. */
4781 hold_dpm = dpi->modifiers;
4782 dpi->modifiers = NULL;
4784 dcl = d_left (dc);
4786 if ((options & DMGL_JAVA) != 0
4787 && dcl->type == DEMANGLE_COMPONENT_NAME
4788 && dcl->u.s_name.len == 6
4789 && strncmp (dcl->u.s_name.s, "JArray", 6) == 0)
4791 /* Special-case Java arrays, so that JArray<TYPE> appears
4792 instead as TYPE[]. */
4794 d_print_comp (dpi, options, d_right (dc));
4795 d_append_string (dpi, "[]");
4797 else
4799 d_print_comp (dpi, options, dcl);
4800 if (d_last_char (dpi) == '<')
4801 d_append_char (dpi, ' ');
4802 d_append_char (dpi, '<');
4803 d_print_comp (dpi, options, d_right (dc));
4804 /* Avoid generating two consecutive '>' characters, to avoid
4805 the C++ syntactic ambiguity. */
4806 if (d_last_char (dpi) == '>')
4807 d_append_char (dpi, ' ');
4808 d_append_char (dpi, '>');
4811 dpi->modifiers = hold_dpm;
4812 dpi->current_template = hold_current;
4814 return;
4817 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4818 if (dpi->is_lambda_arg)
4820 /* Show the template parm index, as that's how g++ displays
4821 these, and future proofs us against potential
4822 '[]<typename T> (T *a, T *b) {...}'. */
4823 d_append_buffer (dpi, "auto:", 5);
4824 d_append_num (dpi, dc->u.s_number.number + 1);
4826 else
4828 struct d_print_template *hold_dpt;
4829 struct demangle_component *a = d_lookup_template_argument (dpi, dc);
4831 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4832 a = d_index_template_argument (a, dpi->pack_index);
4834 if (a == NULL)
4836 d_print_error (dpi);
4837 return;
4840 /* While processing this parameter, we need to pop the list
4841 of templates. This is because the template parameter may
4842 itself be a reference to a parameter of an outer
4843 template. */
4845 hold_dpt = dpi->templates;
4846 dpi->templates = hold_dpt->next;
4848 d_print_comp (dpi, options, a);
4850 dpi->templates = hold_dpt;
4852 return;
4854 case DEMANGLE_COMPONENT_CTOR:
4855 d_print_comp (dpi, options, dc->u.s_ctor.name);
4856 return;
4858 case DEMANGLE_COMPONENT_DTOR:
4859 d_append_char (dpi, '~');
4860 d_print_comp (dpi, options, dc->u.s_dtor.name);
4861 return;
4863 case DEMANGLE_COMPONENT_VTABLE:
4864 d_append_string (dpi, "vtable for ");
4865 d_print_comp (dpi, options, d_left (dc));
4866 return;
4868 case DEMANGLE_COMPONENT_VTT:
4869 d_append_string (dpi, "VTT for ");
4870 d_print_comp (dpi, options, d_left (dc));
4871 return;
4873 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
4874 d_append_string (dpi, "construction vtable for ");
4875 d_print_comp (dpi, options, d_left (dc));
4876 d_append_string (dpi, "-in-");
4877 d_print_comp (dpi, options, d_right (dc));
4878 return;
4880 case DEMANGLE_COMPONENT_TYPEINFO:
4881 d_append_string (dpi, "typeinfo for ");
4882 d_print_comp (dpi, options, d_left (dc));
4883 return;
4885 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
4886 d_append_string (dpi, "typeinfo name for ");
4887 d_print_comp (dpi, options, d_left (dc));
4888 return;
4890 case DEMANGLE_COMPONENT_TYPEINFO_FN:
4891 d_append_string (dpi, "typeinfo fn for ");
4892 d_print_comp (dpi, options, d_left (dc));
4893 return;
4895 case DEMANGLE_COMPONENT_THUNK:
4896 d_append_string (dpi, "non-virtual thunk to ");
4897 d_print_comp (dpi, options, d_left (dc));
4898 return;
4900 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
4901 d_append_string (dpi, "virtual thunk to ");
4902 d_print_comp (dpi, options, d_left (dc));
4903 return;
4905 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
4906 d_append_string (dpi, "covariant return thunk to ");
4907 d_print_comp (dpi, options, d_left (dc));
4908 return;
4910 case DEMANGLE_COMPONENT_JAVA_CLASS:
4911 d_append_string (dpi, "java Class for ");
4912 d_print_comp (dpi, options, d_left (dc));
4913 return;
4915 case DEMANGLE_COMPONENT_GUARD:
4916 d_append_string (dpi, "guard variable for ");
4917 d_print_comp (dpi, options, d_left (dc));
4918 return;
4920 case DEMANGLE_COMPONENT_TLS_INIT:
4921 d_append_string (dpi, "TLS init function for ");
4922 d_print_comp (dpi, options, d_left (dc));
4923 return;
4925 case DEMANGLE_COMPONENT_TLS_WRAPPER:
4926 d_append_string (dpi, "TLS wrapper function for ");
4927 d_print_comp (dpi, options, d_left (dc));
4928 return;
4930 case DEMANGLE_COMPONENT_REFTEMP:
4931 d_append_string (dpi, "reference temporary #");
4932 d_print_comp (dpi, options, d_right (dc));
4933 d_append_string (dpi, " for ");
4934 d_print_comp (dpi, options, d_left (dc));
4935 return;
4937 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
4938 d_append_string (dpi, "hidden alias for ");
4939 d_print_comp (dpi, options, d_left (dc));
4940 return;
4942 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
4943 d_append_string (dpi, "transaction clone for ");
4944 d_print_comp (dpi, options, d_left (dc));
4945 return;
4947 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
4948 d_append_string (dpi, "non-transaction clone for ");
4949 d_print_comp (dpi, options, d_left (dc));
4950 return;
4952 case DEMANGLE_COMPONENT_SUB_STD:
4953 d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len);
4954 return;
4956 case DEMANGLE_COMPONENT_RESTRICT:
4957 case DEMANGLE_COMPONENT_VOLATILE:
4958 case DEMANGLE_COMPONENT_CONST:
4960 struct d_print_mod *pdpm;
4962 /* When printing arrays, it's possible to have cases where the
4963 same CV-qualifier gets pushed on the stack multiple times.
4964 We only need to print it once. */
4966 for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next)
4968 if (! pdpm->printed)
4970 if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT
4971 && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE
4972 && pdpm->mod->type != DEMANGLE_COMPONENT_CONST)
4973 break;
4974 if (pdpm->mod->type == dc->type)
4976 d_print_comp (dpi, options, d_left (dc));
4977 return;
4982 goto modifier;
4984 case DEMANGLE_COMPONENT_REFERENCE:
4985 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
4987 /* Handle reference smashing: & + && = &. */
4988 struct demangle_component *sub = d_left (dc);
4989 if (!dpi->is_lambda_arg
4990 && sub->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
4992 struct d_saved_scope *scope = d_get_saved_scope (dpi, sub);
4993 struct demangle_component *a;
4995 if (scope == NULL)
4997 /* This is the first time SUB has been traversed.
4998 We need to capture the current templates so
4999 they can be restored if SUB is reentered as a
5000 substitution. */
5001 d_save_scope (dpi, sub);
5002 if (d_print_saw_error (dpi))
5003 return;
5005 else
5007 const struct d_component_stack *dcse;
5008 int found_self_or_parent = 0;
5010 /* This traversal is reentering SUB as a substition.
5011 If we are not beneath SUB or DC in the tree then we
5012 need to restore SUB's template stack temporarily. */
5013 for (dcse = dpi->component_stack; dcse != NULL;
5014 dcse = dcse->parent)
5016 if (dcse->dc == sub
5017 || (dcse->dc == dc
5018 && dcse != dpi->component_stack))
5020 found_self_or_parent = 1;
5021 break;
5025 if (!found_self_or_parent)
5027 saved_templates = dpi->templates;
5028 dpi->templates = scope->templates;
5029 need_template_restore = 1;
5033 a = d_lookup_template_argument (dpi, sub);
5034 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
5035 a = d_index_template_argument (a, dpi->pack_index);
5037 if (a == NULL)
5039 if (need_template_restore)
5040 dpi->templates = saved_templates;
5042 d_print_error (dpi);
5043 return;
5046 sub = a;
5049 if (sub->type == DEMANGLE_COMPONENT_REFERENCE
5050 || sub->type == dc->type)
5051 dc = sub;
5052 else if (sub->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE)
5053 mod_inner = d_left (sub);
5055 /* Fall through. */
5057 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5058 case DEMANGLE_COMPONENT_POINTER:
5059 case DEMANGLE_COMPONENT_COMPLEX:
5060 case DEMANGLE_COMPONENT_IMAGINARY:
5061 FNQUAL_COMPONENT_CASE:
5062 modifier:
5064 /* We keep a list of modifiers on the stack. */
5065 struct d_print_mod dpm;
5067 dpm.next = dpi->modifiers;
5068 dpi->modifiers = &dpm;
5069 dpm.mod = dc;
5070 dpm.printed = 0;
5071 dpm.templates = dpi->templates;
5073 if (!mod_inner)
5074 mod_inner = d_left (dc);
5076 d_print_comp (dpi, options, mod_inner);
5078 /* If the modifier didn't get printed by the type, print it
5079 now. */
5080 if (! dpm.printed)
5081 d_print_mod (dpi, options, dc);
5083 dpi->modifiers = dpm.next;
5085 if (need_template_restore)
5086 dpi->templates = saved_templates;
5088 return;
5091 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
5092 if ((options & DMGL_JAVA) == 0)
5093 d_append_buffer (dpi, dc->u.s_builtin.type->name,
5094 dc->u.s_builtin.type->len);
5095 else
5096 d_append_buffer (dpi, dc->u.s_builtin.type->java_name,
5097 dc->u.s_builtin.type->java_len);
5098 return;
5100 case DEMANGLE_COMPONENT_VENDOR_TYPE:
5101 d_print_comp (dpi, options, d_left (dc));
5102 return;
5104 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
5106 if ((options & DMGL_RET_POSTFIX) != 0)
5107 d_print_function_type (dpi,
5108 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5109 dc, dpi->modifiers);
5111 /* Print return type if present */
5112 if (d_left (dc) != NULL && (options & DMGL_RET_POSTFIX) != 0)
5113 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5114 d_left (dc));
5115 else if (d_left (dc) != NULL && (options & DMGL_RET_DROP) == 0)
5117 struct d_print_mod dpm;
5119 /* We must pass this type down as a modifier in order to
5120 print it in the right location. */
5121 dpm.next = dpi->modifiers;
5122 dpi->modifiers = &dpm;
5123 dpm.mod = dc;
5124 dpm.printed = 0;
5125 dpm.templates = dpi->templates;
5127 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5128 d_left (dc));
5130 dpi->modifiers = dpm.next;
5132 if (dpm.printed)
5133 return;
5135 /* In standard prefix notation, there is a space between the
5136 return type and the function signature. */
5137 if ((options & DMGL_RET_POSTFIX) == 0)
5138 d_append_char (dpi, ' ');
5141 if ((options & DMGL_RET_POSTFIX) == 0)
5142 d_print_function_type (dpi,
5143 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5144 dc, dpi->modifiers);
5146 return;
5149 case DEMANGLE_COMPONENT_ARRAY_TYPE:
5151 struct d_print_mod *hold_modifiers;
5152 struct d_print_mod adpm[4];
5153 unsigned int i;
5154 struct d_print_mod *pdpm;
5156 /* We must pass this type down as a modifier in order to print
5157 multi-dimensional arrays correctly. If the array itself is
5158 CV-qualified, we act as though the element type were
5159 CV-qualified. We do this by copying the modifiers down
5160 rather than fiddling pointers, so that we don't wind up
5161 with a d_print_mod higher on the stack pointing into our
5162 stack frame after we return. */
5164 hold_modifiers = dpi->modifiers;
5166 adpm[0].next = hold_modifiers;
5167 dpi->modifiers = &adpm[0];
5168 adpm[0].mod = dc;
5169 adpm[0].printed = 0;
5170 adpm[0].templates = dpi->templates;
5172 i = 1;
5173 pdpm = hold_modifiers;
5174 while (pdpm != NULL
5175 && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT
5176 || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE
5177 || pdpm->mod->type == DEMANGLE_COMPONENT_CONST))
5179 if (! pdpm->printed)
5181 if (i >= sizeof adpm / sizeof adpm[0])
5183 d_print_error (dpi);
5184 return;
5187 adpm[i] = *pdpm;
5188 adpm[i].next = dpi->modifiers;
5189 dpi->modifiers = &adpm[i];
5190 pdpm->printed = 1;
5191 ++i;
5194 pdpm = pdpm->next;
5197 d_print_comp (dpi, options, d_right (dc));
5199 dpi->modifiers = hold_modifiers;
5201 if (adpm[0].printed)
5202 return;
5204 while (i > 1)
5206 --i;
5207 d_print_mod (dpi, options, adpm[i].mod);
5210 d_print_array_type (dpi, options, dc, dpi->modifiers);
5212 return;
5215 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5216 case DEMANGLE_COMPONENT_VECTOR_TYPE:
5218 struct d_print_mod dpm;
5220 dpm.next = dpi->modifiers;
5221 dpi->modifiers = &dpm;
5222 dpm.mod = dc;
5223 dpm.printed = 0;
5224 dpm.templates = dpi->templates;
5226 d_print_comp (dpi, options, d_right (dc));
5228 /* If the modifier didn't get printed by the type, print it
5229 now. */
5230 if (! dpm.printed)
5231 d_print_mod (dpi, options, dc);
5233 dpi->modifiers = dpm.next;
5235 return;
5238 case DEMANGLE_COMPONENT_FIXED_TYPE:
5239 if (dc->u.s_fixed.sat)
5240 d_append_string (dpi, "_Sat ");
5241 /* Don't print "int _Accum". */
5242 if (dc->u.s_fixed.length->u.s_builtin.type
5243 != &cplus_demangle_builtin_types['i'-'a'])
5245 d_print_comp (dpi, options, dc->u.s_fixed.length);
5246 d_append_char (dpi, ' ');
5248 if (dc->u.s_fixed.accum)
5249 d_append_string (dpi, "_Accum");
5250 else
5251 d_append_string (dpi, "_Fract");
5252 return;
5254 case DEMANGLE_COMPONENT_ARGLIST:
5255 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
5256 if (d_left (dc) != NULL)
5257 d_print_comp (dpi, options, d_left (dc));
5258 if (d_right (dc) != NULL)
5260 size_t len;
5261 unsigned long int flush_count;
5262 /* Make sure ", " isn't flushed by d_append_string, otherwise
5263 dpi->len -= 2 wouldn't work. */
5264 if (dpi->len >= sizeof (dpi->buf) - 2)
5265 d_print_flush (dpi);
5266 d_append_string (dpi, ", ");
5267 len = dpi->len;
5268 flush_count = dpi->flush_count;
5269 d_print_comp (dpi, options, d_right (dc));
5270 /* If that didn't print anything (which can happen with empty
5271 template argument packs), remove the comma and space. */
5272 if (dpi->flush_count == flush_count && dpi->len == len)
5273 dpi->len -= 2;
5275 return;
5277 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
5279 struct demangle_component *type = d_left (dc);
5280 struct demangle_component *list = d_right (dc);
5282 if (type)
5283 d_print_comp (dpi, options, type);
5284 d_append_char (dpi, '{');
5285 d_print_comp (dpi, options, list);
5286 d_append_char (dpi, '}');
5288 return;
5290 case DEMANGLE_COMPONENT_OPERATOR:
5292 const struct demangle_operator_info *op = dc->u.s_operator.op;
5293 int len = op->len;
5295 d_append_string (dpi, "operator");
5296 /* Add a space before new/delete. */
5297 if (IS_LOWER (op->name[0]))
5298 d_append_char (dpi, ' ');
5299 /* Omit a trailing space. */
5300 if (op->name[len-1] == ' ')
5301 --len;
5302 d_append_buffer (dpi, op->name, len);
5303 return;
5306 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
5307 d_append_string (dpi, "operator ");
5308 d_print_comp (dpi, options, dc->u.s_extended_operator.name);
5309 return;
5311 case DEMANGLE_COMPONENT_CONVERSION:
5312 d_append_string (dpi, "operator ");
5313 d_print_conversion (dpi, options, dc);
5314 return;
5316 case DEMANGLE_COMPONENT_NULLARY:
5317 d_print_expr_op (dpi, options, d_left (dc));
5318 return;
5320 case DEMANGLE_COMPONENT_UNARY:
5322 struct demangle_component *op = d_left (dc);
5323 struct demangle_component *operand = d_right (dc);
5324 const char *code = NULL;
5326 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
5328 code = op->u.s_operator.op->code;
5329 if (!strcmp (code, "ad"))
5331 /* Don't print the argument list for the address of a
5332 function. */
5333 if (operand->type == DEMANGLE_COMPONENT_TYPED_NAME
5334 && d_left (operand)->type == DEMANGLE_COMPONENT_QUAL_NAME
5335 && d_right (operand)->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
5336 operand = d_left (operand);
5338 if (operand->type == DEMANGLE_COMPONENT_BINARY_ARGS)
5340 /* This indicates a suffix operator. */
5341 operand = d_left (operand);
5342 d_print_subexpr (dpi, options, operand);
5343 d_print_expr_op (dpi, options, op);
5344 return;
5348 /* For sizeof..., just print the pack length. */
5349 if (code && !strcmp (code, "sZ"))
5351 struct demangle_component *a = d_find_pack (dpi, operand);
5352 int len = d_pack_length (a);
5353 d_append_num (dpi, len);
5354 return;
5356 else if (code && !strcmp (code, "sP"))
5358 int len = d_args_length (dpi, operand);
5359 d_append_num (dpi, len);
5360 return;
5363 if (op->type != DEMANGLE_COMPONENT_CAST)
5364 d_print_expr_op (dpi, options, op);
5365 else
5367 d_append_char (dpi, '(');
5368 d_print_cast (dpi, options, op);
5369 d_append_char (dpi, ')');
5371 if (code && !strcmp (code, "gs"))
5372 /* Avoid parens after '::'. */
5373 d_print_comp (dpi, options, operand);
5374 else if (code && !strcmp (code, "st"))
5375 /* Always print parens for sizeof (type). */
5377 d_append_char (dpi, '(');
5378 d_print_comp (dpi, options, operand);
5379 d_append_char (dpi, ')');
5381 else
5382 d_print_subexpr (dpi, options, operand);
5384 return;
5386 case DEMANGLE_COMPONENT_BINARY:
5387 if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS)
5389 d_print_error (dpi);
5390 return;
5393 if (op_is_new_cast (d_left (dc)))
5395 d_print_expr_op (dpi, options, d_left (dc));
5396 d_append_char (dpi, '<');
5397 d_print_comp (dpi, options, d_left (d_right (dc)));
5398 d_append_string (dpi, ">(");
5399 d_print_comp (dpi, options, d_right (d_right (dc)));
5400 d_append_char (dpi, ')');
5401 return;
5404 if (d_maybe_print_fold_expression (dpi, options, dc))
5405 return;
5407 /* We wrap an expression which uses the greater-than operator in
5408 an extra layer of parens so that it does not get confused
5409 with the '>' which ends the template parameters. */
5410 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
5411 && d_left (dc)->u.s_operator.op->len == 1
5412 && d_left (dc)->u.s_operator.op->name[0] == '>')
5413 d_append_char (dpi, '(');
5415 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") == 0
5416 && d_left (d_right (dc))->type == DEMANGLE_COMPONENT_TYPED_NAME)
5418 /* Function call used in an expression should not have printed types
5419 of the function arguments. Values of the function arguments still
5420 get printed below. */
5422 const struct demangle_component *func = d_left (d_right (dc));
5424 if (d_right (func)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
5425 d_print_error (dpi);
5426 d_print_subexpr (dpi, options, d_left (func));
5428 else
5429 d_print_subexpr (dpi, options, d_left (d_right (dc)));
5430 if (strcmp (d_left (dc)->u.s_operator.op->code, "ix") == 0)
5432 d_append_char (dpi, '[');
5433 d_print_comp (dpi, options, d_right (d_right (dc)));
5434 d_append_char (dpi, ']');
5436 else
5438 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") != 0)
5439 d_print_expr_op (dpi, options, d_left (dc));
5440 d_print_subexpr (dpi, options, d_right (d_right (dc)));
5443 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
5444 && d_left (dc)->u.s_operator.op->len == 1
5445 && d_left (dc)->u.s_operator.op->name[0] == '>')
5446 d_append_char (dpi, ')');
5448 return;
5450 case DEMANGLE_COMPONENT_BINARY_ARGS:
5451 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
5452 d_print_error (dpi);
5453 return;
5455 case DEMANGLE_COMPONENT_TRINARY:
5456 if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1
5457 || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2)
5459 d_print_error (dpi);
5460 return;
5462 if (d_maybe_print_fold_expression (dpi, options, dc))
5463 return;
5465 struct demangle_component *op = d_left (dc);
5466 struct demangle_component *first = d_left (d_right (dc));
5467 struct demangle_component *second = d_left (d_right (d_right (dc)));
5468 struct demangle_component *third = d_right (d_right (d_right (dc)));
5470 if (!strcmp (op->u.s_operator.op->code, "qu"))
5472 d_print_subexpr (dpi, options, first);
5473 d_print_expr_op (dpi, options, op);
5474 d_print_subexpr (dpi, options, second);
5475 d_append_string (dpi, " : ");
5476 d_print_subexpr (dpi, options, third);
5478 else
5480 d_append_string (dpi, "new ");
5481 if (d_left (first) != NULL)
5483 d_print_subexpr (dpi, options, first);
5484 d_append_char (dpi, ' ');
5486 d_print_comp (dpi, options, second);
5487 if (third)
5488 d_print_subexpr (dpi, options, third);
5491 return;
5493 case DEMANGLE_COMPONENT_TRINARY_ARG1:
5494 case DEMANGLE_COMPONENT_TRINARY_ARG2:
5495 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
5496 d_print_error (dpi);
5497 return;
5499 case DEMANGLE_COMPONENT_LITERAL:
5500 case DEMANGLE_COMPONENT_LITERAL_NEG:
5502 enum d_builtin_type_print tp;
5504 /* For some builtin types, produce simpler output. */
5505 tp = D_PRINT_DEFAULT;
5506 if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE)
5508 tp = d_left (dc)->u.s_builtin.type->print;
5509 switch (tp)
5511 case D_PRINT_INT:
5512 case D_PRINT_UNSIGNED:
5513 case D_PRINT_LONG:
5514 case D_PRINT_UNSIGNED_LONG:
5515 case D_PRINT_LONG_LONG:
5516 case D_PRINT_UNSIGNED_LONG_LONG:
5517 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME)
5519 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
5520 d_append_char (dpi, '-');
5521 d_print_comp (dpi, options, d_right (dc));
5522 switch (tp)
5524 default:
5525 break;
5526 case D_PRINT_UNSIGNED:
5527 d_append_char (dpi, 'u');
5528 break;
5529 case D_PRINT_LONG:
5530 d_append_char (dpi, 'l');
5531 break;
5532 case D_PRINT_UNSIGNED_LONG:
5533 d_append_string (dpi, "ul");
5534 break;
5535 case D_PRINT_LONG_LONG:
5536 d_append_string (dpi, "ll");
5537 break;
5538 case D_PRINT_UNSIGNED_LONG_LONG:
5539 d_append_string (dpi, "ull");
5540 break;
5542 return;
5544 break;
5546 case D_PRINT_BOOL:
5547 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME
5548 && d_right (dc)->u.s_name.len == 1
5549 && dc->type == DEMANGLE_COMPONENT_LITERAL)
5551 switch (d_right (dc)->u.s_name.s[0])
5553 case '0':
5554 d_append_string (dpi, "false");
5555 return;
5556 case '1':
5557 d_append_string (dpi, "true");
5558 return;
5559 default:
5560 break;
5563 break;
5565 default:
5566 break;
5570 d_append_char (dpi, '(');
5571 d_print_comp (dpi, options, d_left (dc));
5572 d_append_char (dpi, ')');
5573 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
5574 d_append_char (dpi, '-');
5575 if (tp == D_PRINT_FLOAT)
5576 d_append_char (dpi, '[');
5577 d_print_comp (dpi, options, d_right (dc));
5578 if (tp == D_PRINT_FLOAT)
5579 d_append_char (dpi, ']');
5581 return;
5583 case DEMANGLE_COMPONENT_NUMBER:
5584 d_append_num (dpi, dc->u.s_number.number);
5585 return;
5587 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
5588 d_append_string (dpi, "java resource ");
5589 d_print_comp (dpi, options, d_left (dc));
5590 return;
5592 case DEMANGLE_COMPONENT_COMPOUND_NAME:
5593 d_print_comp (dpi, options, d_left (dc));
5594 d_print_comp (dpi, options, d_right (dc));
5595 return;
5597 case DEMANGLE_COMPONENT_CHARACTER:
5598 d_append_char (dpi, dc->u.s_character.character);
5599 return;
5601 case DEMANGLE_COMPONENT_DECLTYPE:
5602 d_append_string (dpi, "decltype (");
5603 d_print_comp (dpi, options, d_left (dc));
5604 d_append_char (dpi, ')');
5605 return;
5607 case DEMANGLE_COMPONENT_PACK_EXPANSION:
5609 int len;
5610 int i;
5611 struct demangle_component *a = d_find_pack (dpi, d_left (dc));
5612 if (a == NULL)
5614 /* d_find_pack won't find anything if the only packs involved
5615 in this expansion are function parameter packs; in that
5616 case, just print the pattern and "...". */
5617 d_print_subexpr (dpi, options, d_left (dc));
5618 d_append_string (dpi, "...");
5619 return;
5622 len = d_pack_length (a);
5623 dc = d_left (dc);
5624 for (i = 0; i < len; ++i)
5626 dpi->pack_index = i;
5627 d_print_comp (dpi, options, dc);
5628 if (i < len-1)
5629 d_append_string (dpi, ", ");
5632 return;
5634 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
5636 long num = dc->u.s_number.number;
5637 if (num == 0)
5638 d_append_string (dpi, "this");
5639 else
5641 d_append_string (dpi, "{parm#");
5642 d_append_num (dpi, num);
5643 d_append_char (dpi, '}');
5646 return;
5648 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
5649 d_append_string (dpi, "global constructors keyed to ");
5650 d_print_comp (dpi, options, dc->u.s_binary.left);
5651 return;
5653 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
5654 d_append_string (dpi, "global destructors keyed to ");
5655 d_print_comp (dpi, options, dc->u.s_binary.left);
5656 return;
5658 case DEMANGLE_COMPONENT_LAMBDA:
5659 d_append_string (dpi, "{lambda(");
5660 /* Generic lambda auto parms are mangled as the template type
5661 parm they are. */
5662 dpi->is_lambda_arg++;
5663 d_print_comp (dpi, options, dc->u.s_unary_num.sub);
5664 dpi->is_lambda_arg--;
5665 d_append_string (dpi, ")#");
5666 d_append_num (dpi, dc->u.s_unary_num.num + 1);
5667 d_append_char (dpi, '}');
5668 return;
5670 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
5671 d_append_string (dpi, "{unnamed type#");
5672 d_append_num (dpi, dc->u.s_number.number + 1);
5673 d_append_char (dpi, '}');
5674 return;
5676 case DEMANGLE_COMPONENT_CLONE:
5677 d_print_comp (dpi, options, d_left (dc));
5678 d_append_string (dpi, " [clone ");
5679 d_print_comp (dpi, options, d_right (dc));
5680 d_append_char (dpi, ']');
5681 return;
5683 default:
5684 d_print_error (dpi);
5685 return;
5689 static void
5690 d_print_comp (struct d_print_info *dpi, int options,
5691 struct demangle_component *dc)
5693 struct d_component_stack self;
5694 if (dc == NULL || dc->d_printing > 1)
5696 d_print_error (dpi);
5697 return;
5699 else
5700 dc->d_printing++;
5702 self.dc = dc;
5703 self.parent = dpi->component_stack;
5704 dpi->component_stack = &self;
5706 d_print_comp_inner (dpi, options, dc);
5708 dpi->component_stack = self.parent;
5709 dc->d_printing--;
5712 /* Print a Java dentifier. For Java we try to handle encoded extended
5713 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
5714 so we don't it for C++. Characters are encoded as
5715 __U<hex-char>+_. */
5717 static void
5718 d_print_java_identifier (struct d_print_info *dpi, const char *name, int len)
5720 const char *p;
5721 const char *end;
5723 end = name + len;
5724 for (p = name; p < end; ++p)
5726 if (end - p > 3
5727 && p[0] == '_'
5728 && p[1] == '_'
5729 && p[2] == 'U')
5731 unsigned long c;
5732 const char *q;
5734 c = 0;
5735 for (q = p + 3; q < end; ++q)
5737 int dig;
5739 if (IS_DIGIT (*q))
5740 dig = *q - '0';
5741 else if (*q >= 'A' && *q <= 'F')
5742 dig = *q - 'A' + 10;
5743 else if (*q >= 'a' && *q <= 'f')
5744 dig = *q - 'a' + 10;
5745 else
5746 break;
5748 c = c * 16 + dig;
5750 /* If the Unicode character is larger than 256, we don't try
5751 to deal with it here. FIXME. */
5752 if (q < end && *q == '_' && c < 256)
5754 d_append_char (dpi, c);
5755 p = q;
5756 continue;
5760 d_append_char (dpi, *p);
5764 /* Print a list of modifiers. SUFFIX is 1 if we are printing
5765 qualifiers on this after printing a function. */
5767 static void
5768 d_print_mod_list (struct d_print_info *dpi, int options,
5769 struct d_print_mod *mods, int suffix)
5771 struct d_print_template *hold_dpt;
5773 if (mods == NULL || d_print_saw_error (dpi))
5774 return;
5776 if (mods->printed
5777 || (! suffix
5778 && (is_fnqual_component_type (mods->mod->type))))
5780 d_print_mod_list (dpi, options, mods->next, suffix);
5781 return;
5784 mods->printed = 1;
5786 hold_dpt = dpi->templates;
5787 dpi->templates = mods->templates;
5789 if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
5791 d_print_function_type (dpi, options, mods->mod, mods->next);
5792 dpi->templates = hold_dpt;
5793 return;
5795 else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
5797 d_print_array_type (dpi, options, mods->mod, mods->next);
5798 dpi->templates = hold_dpt;
5799 return;
5801 else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME)
5803 struct d_print_mod *hold_modifiers;
5804 struct demangle_component *dc;
5806 /* When this is on the modifier stack, we have pulled any
5807 qualifiers off the right argument already. Otherwise, we
5808 print it as usual, but don't let the left argument see any
5809 modifiers. */
5811 hold_modifiers = dpi->modifiers;
5812 dpi->modifiers = NULL;
5813 d_print_comp (dpi, options, d_left (mods->mod));
5814 dpi->modifiers = hold_modifiers;
5816 if ((options & DMGL_JAVA) == 0)
5817 d_append_string (dpi, "::");
5818 else
5819 d_append_char (dpi, '.');
5821 dc = d_right (mods->mod);
5823 if (dc->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
5825 d_append_string (dpi, "{default arg#");
5826 d_append_num (dpi, dc->u.s_unary_num.num + 1);
5827 d_append_string (dpi, "}::");
5828 dc = dc->u.s_unary_num.sub;
5831 while (is_fnqual_component_type (dc->type))
5832 dc = d_left (dc);
5834 d_print_comp (dpi, options, dc);
5836 dpi->templates = hold_dpt;
5837 return;
5840 d_print_mod (dpi, options, mods->mod);
5842 dpi->templates = hold_dpt;
5844 d_print_mod_list (dpi, options, mods->next, suffix);
5847 /* Print a modifier. */
5849 static void
5850 d_print_mod (struct d_print_info *dpi, int options,
5851 struct demangle_component *mod)
5853 switch (mod->type)
5855 case DEMANGLE_COMPONENT_RESTRICT:
5856 case DEMANGLE_COMPONENT_RESTRICT_THIS:
5857 d_append_string (dpi, " restrict");
5858 return;
5859 case DEMANGLE_COMPONENT_VOLATILE:
5860 case DEMANGLE_COMPONENT_VOLATILE_THIS:
5861 d_append_string (dpi, " volatile");
5862 return;
5863 case DEMANGLE_COMPONENT_CONST:
5864 case DEMANGLE_COMPONENT_CONST_THIS:
5865 d_append_string (dpi, " const");
5866 return;
5867 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
5868 d_append_string (dpi, " transaction_safe");
5869 return;
5870 case DEMANGLE_COMPONENT_NOEXCEPT:
5871 d_append_string (dpi, " noexcept");
5872 if (d_right (mod))
5874 d_append_char (dpi, '(');
5875 d_print_comp (dpi, options, d_right (mod));
5876 d_append_char (dpi, ')');
5878 return;
5879 case DEMANGLE_COMPONENT_THROW_SPEC:
5880 d_append_string (dpi, " throw");
5881 if (d_right (mod))
5883 d_append_char (dpi, '(');
5884 d_print_comp (dpi, options, d_right (mod));
5885 d_append_char (dpi, ')');
5887 return;
5888 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5889 d_append_char (dpi, ' ');
5890 d_print_comp (dpi, options, d_right (mod));
5891 return;
5892 case DEMANGLE_COMPONENT_POINTER:
5893 /* There is no pointer symbol in Java. */
5894 if ((options & DMGL_JAVA) == 0)
5895 d_append_char (dpi, '*');
5896 return;
5897 case DEMANGLE_COMPONENT_REFERENCE_THIS:
5898 /* For the ref-qualifier, put a space before the &. */
5899 d_append_char (dpi, ' ');
5900 /* FALLTHRU */
5901 case DEMANGLE_COMPONENT_REFERENCE:
5902 d_append_char (dpi, '&');
5903 return;
5904 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
5905 d_append_char (dpi, ' ');
5906 /* FALLTHRU */
5907 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5908 d_append_string (dpi, "&&");
5909 return;
5910 case DEMANGLE_COMPONENT_COMPLEX:
5911 d_append_string (dpi, "complex ");
5912 return;
5913 case DEMANGLE_COMPONENT_IMAGINARY:
5914 d_append_string (dpi, "imaginary ");
5915 return;
5916 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5917 if (d_last_char (dpi) != '(')
5918 d_append_char (dpi, ' ');
5919 d_print_comp (dpi, options, d_left (mod));
5920 d_append_string (dpi, "::*");
5921 return;
5922 case DEMANGLE_COMPONENT_TYPED_NAME:
5923 d_print_comp (dpi, options, d_left (mod));
5924 return;
5925 case DEMANGLE_COMPONENT_VECTOR_TYPE:
5926 d_append_string (dpi, " __vector(");
5927 d_print_comp (dpi, options, d_left (mod));
5928 d_append_char (dpi, ')');
5929 return;
5931 default:
5932 /* Otherwise, we have something that won't go back on the
5933 modifier stack, so we can just print it. */
5934 d_print_comp (dpi, options, mod);
5935 return;
5939 /* Print a function type, except for the return type. */
5941 static void
5942 d_print_function_type (struct d_print_info *dpi, int options,
5943 struct demangle_component *dc,
5944 struct d_print_mod *mods)
5946 int need_paren;
5947 int need_space;
5948 struct d_print_mod *p;
5949 struct d_print_mod *hold_modifiers;
5951 need_paren = 0;
5952 need_space = 0;
5953 for (p = mods; p != NULL; p = p->next)
5955 if (p->printed)
5956 break;
5958 switch (p->mod->type)
5960 case DEMANGLE_COMPONENT_POINTER:
5961 case DEMANGLE_COMPONENT_REFERENCE:
5962 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5963 need_paren = 1;
5964 break;
5965 case DEMANGLE_COMPONENT_RESTRICT:
5966 case DEMANGLE_COMPONENT_VOLATILE:
5967 case DEMANGLE_COMPONENT_CONST:
5968 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5969 case DEMANGLE_COMPONENT_COMPLEX:
5970 case DEMANGLE_COMPONENT_IMAGINARY:
5971 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5972 need_space = 1;
5973 need_paren = 1;
5974 break;
5975 FNQUAL_COMPONENT_CASE:
5976 break;
5977 default:
5978 break;
5980 if (need_paren)
5981 break;
5984 if (need_paren)
5986 if (! need_space)
5988 if (d_last_char (dpi) != '('
5989 && d_last_char (dpi) != '*')
5990 need_space = 1;
5992 if (need_space && d_last_char (dpi) != ' ')
5993 d_append_char (dpi, ' ');
5994 d_append_char (dpi, '(');
5997 hold_modifiers = dpi->modifiers;
5998 dpi->modifiers = NULL;
6000 d_print_mod_list (dpi, options, mods, 0);
6002 if (need_paren)
6003 d_append_char (dpi, ')');
6005 d_append_char (dpi, '(');
6007 if (d_right (dc) != NULL)
6008 d_print_comp (dpi, options, d_right (dc));
6010 d_append_char (dpi, ')');
6012 d_print_mod_list (dpi, options, mods, 1);
6014 dpi->modifiers = hold_modifiers;
6017 /* Print an array type, except for the element type. */
6019 static void
6020 d_print_array_type (struct d_print_info *dpi, int options,
6021 struct demangle_component *dc,
6022 struct d_print_mod *mods)
6024 int need_space;
6026 need_space = 1;
6027 if (mods != NULL)
6029 int need_paren;
6030 struct d_print_mod *p;
6032 need_paren = 0;
6033 for (p = mods; p != NULL; p = p->next)
6035 if (! p->printed)
6037 if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
6039 need_space = 0;
6040 break;
6042 else
6044 need_paren = 1;
6045 need_space = 1;
6046 break;
6051 if (need_paren)
6052 d_append_string (dpi, " (");
6054 d_print_mod_list (dpi, options, mods, 0);
6056 if (need_paren)
6057 d_append_char (dpi, ')');
6060 if (need_space)
6061 d_append_char (dpi, ' ');
6063 d_append_char (dpi, '[');
6065 if (d_left (dc) != NULL)
6066 d_print_comp (dpi, options, d_left (dc));
6068 d_append_char (dpi, ']');
6071 /* Print an operator in an expression. */
6073 static void
6074 d_print_expr_op (struct d_print_info *dpi, int options,
6075 struct demangle_component *dc)
6077 if (dc->type == DEMANGLE_COMPONENT_OPERATOR)
6078 d_append_buffer (dpi, dc->u.s_operator.op->name,
6079 dc->u.s_operator.op->len);
6080 else
6081 d_print_comp (dpi, options, dc);
6084 /* Print a cast. */
6086 static void
6087 d_print_cast (struct d_print_info *dpi, int options,
6088 struct demangle_component *dc)
6090 d_print_comp (dpi, options, d_left (dc));
6093 /* Print a conversion operator. */
6095 static void
6096 d_print_conversion (struct d_print_info *dpi, int options,
6097 struct demangle_component *dc)
6099 struct d_print_template dpt;
6101 /* For a conversion operator, we need the template parameters from
6102 the enclosing template in scope for processing the type. */
6103 if (dpi->current_template != NULL)
6105 dpt.next = dpi->templates;
6106 dpi->templates = &dpt;
6107 dpt.template_decl = dpi->current_template;
6110 if (d_left (dc)->type != DEMANGLE_COMPONENT_TEMPLATE)
6112 d_print_comp (dpi, options, d_left (dc));
6113 if (dpi->current_template != NULL)
6114 dpi->templates = dpt.next;
6116 else
6118 d_print_comp (dpi, options, d_left (d_left (dc)));
6120 /* For a templated cast operator, we need to remove the template
6121 parameters from scope after printing the operator name,
6122 so we need to handle the template printing here. */
6123 if (dpi->current_template != NULL)
6124 dpi->templates = dpt.next;
6126 if (d_last_char (dpi) == '<')
6127 d_append_char (dpi, ' ');
6128 d_append_char (dpi, '<');
6129 d_print_comp (dpi, options, d_right (d_left (dc)));
6130 /* Avoid generating two consecutive '>' characters, to avoid
6131 the C++ syntactic ambiguity. */
6132 if (d_last_char (dpi) == '>')
6133 d_append_char (dpi, ' ');
6134 d_append_char (dpi, '>');
6138 /* Initialize the information structure we use to pass around
6139 information. */
6141 CP_STATIC_IF_GLIBCPP_V3
6142 void
6143 cplus_demangle_init_info (const char *mangled, int options, size_t len,
6144 struct d_info *di)
6146 di->s = mangled;
6147 di->send = mangled + len;
6148 di->options = options;
6150 di->n = mangled;
6152 /* We can not need more components than twice the number of chars in
6153 the mangled string. Most components correspond directly to
6154 chars, but the ARGLIST types are exceptions. */
6155 di->num_comps = 2 * len;
6156 di->next_comp = 0;
6158 /* Similarly, we can not need more substitutions than there are
6159 chars in the mangled string. */
6160 di->num_subs = len;
6161 di->next_sub = 0;
6162 di->did_subs = 0;
6164 di->last_name = NULL;
6166 di->expansion = 0;
6167 di->is_expression = 0;
6168 di->is_conversion = 0;
6171 /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
6172 mangled name, return strings in repeated callback giving the demangled
6173 name. OPTIONS is the usual libiberty demangler options. On success,
6174 this returns 1. On failure, returns 0. */
6176 static int
6177 d_demangle_callback (const char *mangled, int options,
6178 demangle_callbackref callback, void *opaque)
6180 enum
6182 DCT_TYPE,
6183 DCT_MANGLED,
6184 DCT_GLOBAL_CTORS,
6185 DCT_GLOBAL_DTORS
6187 type;
6188 struct d_info di;
6189 struct demangle_component *dc;
6190 int status;
6192 if (mangled[0] == '_' && mangled[1] == 'Z')
6193 type = DCT_MANGLED;
6194 else if (strncmp (mangled, "_GLOBAL_", 8) == 0
6195 && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
6196 && (mangled[9] == 'D' || mangled[9] == 'I')
6197 && mangled[10] == '_')
6198 type = mangled[9] == 'I' ? DCT_GLOBAL_CTORS : DCT_GLOBAL_DTORS;
6199 else
6201 if ((options & DMGL_TYPES) == 0)
6202 return 0;
6203 type = DCT_TYPE;
6206 cplus_demangle_init_info (mangled, options, strlen (mangled), &di);
6209 #ifdef CP_DYNAMIC_ARRAYS
6210 __extension__ struct demangle_component comps[di.num_comps];
6211 __extension__ struct demangle_component *subs[di.num_subs];
6213 di.comps = comps;
6214 di.subs = subs;
6215 #else
6216 di.comps = alloca (di.num_comps * sizeof (*di.comps));
6217 di.subs = alloca (di.num_subs * sizeof (*di.subs));
6218 #endif
6220 switch (type)
6222 case DCT_TYPE:
6223 dc = cplus_demangle_type (&di);
6224 break;
6225 case DCT_MANGLED:
6226 dc = cplus_demangle_mangled_name (&di, 1);
6227 break;
6228 case DCT_GLOBAL_CTORS:
6229 case DCT_GLOBAL_DTORS:
6230 d_advance (&di, 11);
6231 dc = d_make_comp (&di,
6232 (type == DCT_GLOBAL_CTORS
6233 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
6234 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS),
6235 d_make_demangle_mangled_name (&di, d_str (&di)),
6236 NULL);
6237 d_advance (&di, strlen (d_str (&di)));
6238 break;
6239 default:
6240 abort (); /* We have listed all the cases. */
6243 /* If DMGL_PARAMS is set, then if we didn't consume the entire
6244 mangled string, then we didn't successfully demangle it. If
6245 DMGL_PARAMS is not set, we didn't look at the trailing
6246 parameters. */
6247 if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0')
6248 dc = NULL;
6250 #ifdef CP_DEMANGLE_DEBUG
6251 d_dump (dc, 0);
6252 #endif
6254 status = (dc != NULL)
6255 ? cplus_demangle_print_callback (options, dc, callback, opaque)
6256 : 0;
6259 return status;
6262 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
6263 name, return a buffer allocated with malloc holding the demangled
6264 name. OPTIONS is the usual libiberty demangler options. On
6265 success, this sets *PALC to the allocated size of the returned
6266 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
6267 a memory allocation failure, and returns NULL. */
6269 static char *
6270 d_demangle (const char *mangled, int options, size_t *palc)
6272 struct d_growable_string dgs;
6273 int status;
6275 d_growable_string_init (&dgs, 0);
6277 status = d_demangle_callback (mangled, options,
6278 d_growable_string_callback_adapter, &dgs);
6279 if (status == 0)
6281 free (dgs.buf);
6282 *palc = 0;
6283 return NULL;
6286 *palc = dgs.allocation_failure ? 1 : dgs.alc;
6287 return dgs.buf;
6290 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
6292 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
6294 /* ia64 ABI-mandated entry point in the C++ runtime library for
6295 performing demangling. MANGLED_NAME is a NUL-terminated character
6296 string containing the name to be demangled.
6298 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
6299 *LENGTH bytes, into which the demangled name is stored. If
6300 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
6301 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
6302 is placed in a region of memory allocated with malloc.
6304 If LENGTH is non-NULL, the length of the buffer containing the
6305 demangled name, is placed in *LENGTH.
6307 The return value is a pointer to the start of the NUL-terminated
6308 demangled name, or NULL if the demangling fails. The caller is
6309 responsible for deallocating this memory using free.
6311 *STATUS is set to one of the following values:
6312 0: The demangling operation succeeded.
6313 -1: A memory allocation failure occurred.
6314 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6315 -3: One of the arguments is invalid.
6317 The demangling is performed using the C++ ABI mangling rules, with
6318 GNU extensions. */
6320 char *
6321 __cxa_demangle (const char *mangled_name, char *output_buffer,
6322 size_t *length, int *status)
6324 char *demangled;
6325 size_t alc;
6327 if (mangled_name == NULL)
6329 if (status != NULL)
6330 *status = -3;
6331 return NULL;
6334 if (output_buffer != NULL && length == NULL)
6336 if (status != NULL)
6337 *status = -3;
6338 return NULL;
6341 demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc);
6343 if (demangled == NULL)
6345 if (status != NULL)
6347 if (alc == 1)
6348 *status = -1;
6349 else
6350 *status = -2;
6352 return NULL;
6355 if (output_buffer == NULL)
6357 if (length != NULL)
6358 *length = alc;
6360 else
6362 if (strlen (demangled) < *length)
6364 strcpy (output_buffer, demangled);
6365 free (demangled);
6366 demangled = output_buffer;
6368 else
6370 free (output_buffer);
6371 *length = alc;
6375 if (status != NULL)
6376 *status = 0;
6378 return demangled;
6381 extern int __gcclibcxx_demangle_callback (const char *,
6382 void (*)
6383 (const char *, size_t, void *),
6384 void *);
6386 /* Alternative, allocationless entry point in the C++ runtime library
6387 for performing demangling. MANGLED_NAME is a NUL-terminated character
6388 string containing the name to be demangled.
6390 CALLBACK is a callback function, called with demangled string
6391 segments as demangling progresses; it is called at least once,
6392 but may be called more than once. OPAQUE is a generalized pointer
6393 used as a callback argument.
6395 The return code is one of the following values, equivalent to
6396 the STATUS values of __cxa_demangle() (excluding -1, since this
6397 function performs no memory allocations):
6398 0: The demangling operation succeeded.
6399 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6400 -3: One of the arguments is invalid.
6402 The demangling is performed using the C++ ABI mangling rules, with
6403 GNU extensions. */
6406 __gcclibcxx_demangle_callback (const char *mangled_name,
6407 void (*callback) (const char *, size_t, void *),
6408 void *opaque)
6410 int status;
6412 if (mangled_name == NULL || callback == NULL)
6413 return -3;
6415 status = d_demangle_callback (mangled_name, DMGL_PARAMS | DMGL_TYPES,
6416 callback, opaque);
6417 if (status == 0)
6418 return -2;
6420 return 0;
6423 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
6425 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
6426 mangled name, return a buffer allocated with malloc holding the
6427 demangled name. Otherwise, return NULL. */
6429 char *
6430 cplus_demangle_v3 (const char *mangled, int options)
6432 size_t alc;
6434 return d_demangle (mangled, options, &alc);
6438 cplus_demangle_v3_callback (const char *mangled, int options,
6439 demangle_callbackref callback, void *opaque)
6441 return d_demangle_callback (mangled, options, callback, opaque);
6444 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
6445 conventions, but the output formatting is a little different.
6446 This instructs the C++ demangler not to emit pointer characters ("*"), to
6447 use Java's namespace separator symbol ("." instead of "::"), and to output
6448 JArray<TYPE> as TYPE[]. */
6450 char *
6451 java_demangle_v3 (const char *mangled)
6453 size_t alc;
6455 return d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, &alc);
6459 java_demangle_v3_callback (const char *mangled,
6460 demangle_callbackref callback, void *opaque)
6462 return d_demangle_callback (mangled,
6463 DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX,
6464 callback, opaque);
6467 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
6469 #ifndef IN_GLIBCPP_V3
6471 /* Demangle a string in order to find out whether it is a constructor
6472 or destructor. Return non-zero on success. Set *CTOR_KIND and
6473 *DTOR_KIND appropriately. */
6475 static int
6476 is_ctor_or_dtor (const char *mangled,
6477 enum gnu_v3_ctor_kinds *ctor_kind,
6478 enum gnu_v3_dtor_kinds *dtor_kind)
6480 struct d_info di;
6481 struct demangle_component *dc;
6482 int ret;
6484 *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
6485 *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
6487 cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di);
6490 #ifdef CP_DYNAMIC_ARRAYS
6491 __extension__ struct demangle_component comps[di.num_comps];
6492 __extension__ struct demangle_component *subs[di.num_subs];
6494 di.comps = comps;
6495 di.subs = subs;
6496 #else
6497 di.comps = alloca (di.num_comps * sizeof (*di.comps));
6498 di.subs = alloca (di.num_subs * sizeof (*di.subs));
6499 #endif
6501 dc = cplus_demangle_mangled_name (&di, 1);
6503 /* Note that because we did not pass DMGL_PARAMS, we don't expect
6504 to demangle the entire string. */
6506 ret = 0;
6507 while (dc != NULL)
6509 switch (dc->type)
6511 /* These cannot appear on a constructor or destructor. */
6512 case DEMANGLE_COMPONENT_RESTRICT_THIS:
6513 case DEMANGLE_COMPONENT_VOLATILE_THIS:
6514 case DEMANGLE_COMPONENT_CONST_THIS:
6515 case DEMANGLE_COMPONENT_REFERENCE_THIS:
6516 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
6517 default:
6518 dc = NULL;
6519 break;
6520 case DEMANGLE_COMPONENT_TYPED_NAME:
6521 case DEMANGLE_COMPONENT_TEMPLATE:
6522 dc = d_left (dc);
6523 break;
6524 case DEMANGLE_COMPONENT_QUAL_NAME:
6525 case DEMANGLE_COMPONENT_LOCAL_NAME:
6526 dc = d_right (dc);
6527 break;
6528 case DEMANGLE_COMPONENT_CTOR:
6529 *ctor_kind = dc->u.s_ctor.kind;
6530 ret = 1;
6531 dc = NULL;
6532 break;
6533 case DEMANGLE_COMPONENT_DTOR:
6534 *dtor_kind = dc->u.s_dtor.kind;
6535 ret = 1;
6536 dc = NULL;
6537 break;
6542 return ret;
6545 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
6546 name. A non-zero return indicates the type of constructor. */
6548 enum gnu_v3_ctor_kinds
6549 is_gnu_v3_mangled_ctor (const char *name)
6551 enum gnu_v3_ctor_kinds ctor_kind;
6552 enum gnu_v3_dtor_kinds dtor_kind;
6554 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
6555 return (enum gnu_v3_ctor_kinds) 0;
6556 return ctor_kind;
6560 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
6561 name. A non-zero return indicates the type of destructor. */
6563 enum gnu_v3_dtor_kinds
6564 is_gnu_v3_mangled_dtor (const char *name)
6566 enum gnu_v3_ctor_kinds ctor_kind;
6567 enum gnu_v3_dtor_kinds dtor_kind;
6569 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
6570 return (enum gnu_v3_dtor_kinds) 0;
6571 return dtor_kind;
6574 #endif /* IN_GLIBCPP_V3 */
6576 #ifdef STANDALONE_DEMANGLER
6578 #include "getopt.h"
6579 #include "dyn-string.h"
6581 static void print_usage (FILE* fp, int exit_value);
6583 #define IS_ALPHA(CHAR) \
6584 (((CHAR) >= 'a' && (CHAR) <= 'z') \
6585 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
6587 /* Non-zero if CHAR is a character than can occur in a mangled name. */
6588 #define is_mangled_char(CHAR) \
6589 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
6590 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
6592 /* The name of this program, as invoked. */
6593 const char* program_name;
6595 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
6597 static void
6598 print_usage (FILE* fp, int exit_value)
6600 fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
6601 fprintf (fp, "Options:\n");
6602 fprintf (fp, " -h,--help Display this message.\n");
6603 fprintf (fp, " -p,--no-params Don't display function parameters\n");
6604 fprintf (fp, " -v,--verbose Produce verbose demanglings.\n");
6605 fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n");
6607 exit (exit_value);
6610 /* Option specification for getopt_long. */
6611 static const struct option long_options[] =
6613 { "help", no_argument, NULL, 'h' },
6614 { "no-params", no_argument, NULL, 'p' },
6615 { "verbose", no_argument, NULL, 'v' },
6616 { NULL, no_argument, NULL, 0 },
6619 /* Main entry for a demangling filter executable. It will demangle
6620 its command line arguments, if any. If none are provided, it will
6621 filter stdin to stdout, replacing any recognized mangled C++ names
6622 with their demangled equivalents. */
6625 main (int argc, char *argv[])
6627 int i;
6628 int opt_char;
6629 int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
6631 /* Use the program name of this program, as invoked. */
6632 program_name = argv[0];
6634 /* Parse options. */
6637 opt_char = getopt_long (argc, argv, "hpv", long_options, NULL);
6638 switch (opt_char)
6640 case '?': /* Unrecognized option. */
6641 print_usage (stderr, 1);
6642 break;
6644 case 'h':
6645 print_usage (stdout, 0);
6646 break;
6648 case 'p':
6649 options &= ~ DMGL_PARAMS;
6650 break;
6652 case 'v':
6653 options |= DMGL_VERBOSE;
6654 break;
6657 while (opt_char != -1);
6659 if (optind == argc)
6660 /* No command line arguments were provided. Filter stdin. */
6662 dyn_string_t mangled = dyn_string_new (3);
6663 char *s;
6665 /* Read all of input. */
6666 while (!feof (stdin))
6668 char c;
6670 /* Pile characters into mangled until we hit one that can't
6671 occur in a mangled name. */
6672 c = getchar ();
6673 while (!feof (stdin) && is_mangled_char (c))
6675 dyn_string_append_char (mangled, c);
6676 if (feof (stdin))
6677 break;
6678 c = getchar ();
6681 if (dyn_string_length (mangled) > 0)
6683 #ifdef IN_GLIBCPP_V3
6684 s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL);
6685 #else
6686 s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
6687 #endif
6689 if (s != NULL)
6691 fputs (s, stdout);
6692 free (s);
6694 else
6696 /* It might not have been a mangled name. Print the
6697 original text. */
6698 fputs (dyn_string_buf (mangled), stdout);
6701 dyn_string_clear (mangled);
6704 /* If we haven't hit EOF yet, we've read one character that
6705 can't occur in a mangled name, so print it out. */
6706 if (!feof (stdin))
6707 putchar (c);
6710 dyn_string_delete (mangled);
6712 else
6713 /* Demangle command line arguments. */
6715 /* Loop over command line arguments. */
6716 for (i = optind; i < argc; ++i)
6718 char *s;
6719 #ifdef IN_GLIBCPP_V3
6720 int status;
6721 #endif
6723 /* Attempt to demangle. */
6724 #ifdef IN_GLIBCPP_V3
6725 s = __cxa_demangle (argv[i], NULL, NULL, &status);
6726 #else
6727 s = cplus_demangle_v3 (argv[i], options);
6728 #endif
6730 /* If it worked, print the demangled name. */
6731 if (s != NULL)
6733 printf ("%s\n", s);
6734 free (s);
6736 else
6738 #ifdef IN_GLIBCPP_V3
6739 fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status);
6740 #else
6741 fprintf (stderr, "Failed: %s\n", argv[i]);
6742 #endif
6747 return 0;
6750 #endif /* STANDALONE_DEMANGLER */