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
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
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
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
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:
73 If defined, this file defines the following functions, q.v.:
74 char *__cxa_demangle (const char *mangled, char *buf, size_t *len,
76 int __gcclibcxx_demangle_callback (const char *,
78 (const char *, size_t, void *),
80 instead of cplus_demangle_v3[_callback]() and
81 java_demangle_v3[_callback]().
84 If defined, this file defines only __cxa_demangle() and
85 __gcclibcxx_demangle_callback(), and no other publically visible
86 functions or variables.
89 If defined, this file defines a main() function which demangles
90 any arguments, or, if none, demangles stdin.
93 If defined, turns on debugging mode, which prints information on
94 stdout about the mangled string. This is not generally useful.
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__)
123 # define alloca __builtin_alloca
125 extern char *alloca ();
126 # endif /* __GNUC__ */
128 #endif /* HAVE_ALLOCA_H */
134 # define INT_MAX (int)(((unsigned int) ~0) >> 1) /* 0x7FFFFFFF */
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
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
155 d_fill_extended_operator (struct demangle_component *, int,
156 struct demangle_component *);
158 #define cplus_demangle_fill_ctor d_fill_ctor
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
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. */
191 #define CP_DYNAMIC_ARRAYS
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
207 As of this writing this file has the following undefined references
208 when compiled with -DIN_GLIBCPP_V3: realloc, free, memcpy, strcpy,
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. */
227 /* The simple string it expands to. */
228 const char *simple_expansion;
229 /* The length of the simple expansion. */
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. */
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;
256 const struct demangle_component *template_decl;
259 /* A list of type modifiers. This is used while printing. */
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;
267 struct demangle_component *mod;
268 /* Whether this modifier was 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. */
280 /* Current length of data in buffer. */
282 /* Allocated size of buffer. */
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
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
323 enum { D_PRINT_BUFFER_LENGTH = 256 };
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. */
331 /* The last character printed, saved individually so that it survives
334 /* Callback function to handle demangled buffer flush. */
335 demangle_callbackref callback;
336 /* Opaque callback argument. */
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.),
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'. */
348 /* The current index into any template argument packs we are using
349 for printing, or -1 to print the whole pack. */
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);
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);
416 has_return_type (struct demangle_component *);
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 *);
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);
505 d_growable_string_resize (struct d_growable_string *, size_t);
508 d_growable_string_append_buffer (struct d_growable_string *,
509 const char *, size_t);
511 d_growable_string_callback_adapter (const char *, size_t, 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 *);
533 d_print_comp (struct d_print_info *, int, struct demangle_component *);
536 d_print_java_identifier (struct d_print_info *, const char *, int);
539 d_print_mod_list (struct d_print_info *, int, struct d_print_mod *, int);
542 d_print_mod (struct d_print_info *, int, struct demangle_component *);
545 d_print_function_type (struct d_print_info *, int,
546 struct demangle_component *,
547 struct d_print_mod *);
550 d_print_array_type (struct d_print_info *, int,
551 struct demangle_component *,
552 struct d_print_mod *);
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. */
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
595 d_dump (struct demangle_component *dc, int indent)
602 printf ("failed demangling\n");
606 for (i = 0; i < indent; ++i)
611 case DEMANGLE_COMPONENT_NAME:
612 printf ("name '%.*s'\n", dc->u.s_name.len, dc->u.s_name.s);
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);
619 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
620 printf ("template parameter %ld\n", dc->u.s_number.number);
622 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
623 printf ("function parameter %ld\n", dc->u.s_number.number);
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);
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);
633 case DEMANGLE_COMPONENT_SUB_STD:
634 printf ("standard substitution %s\n", dc->u.s_string.string);
636 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
637 printf ("builtin type %s\n", dc->u.s_builtin.type->name);
639 case DEMANGLE_COMPONENT_OPERATOR:
640 printf ("operator %s\n", dc->u.s_operator.op->name);
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);
648 case DEMANGLE_COMPONENT_QUAL_NAME:
649 printf ("qualified name\n");
651 case DEMANGLE_COMPONENT_LOCAL_NAME:
652 printf ("local name\n");
654 case DEMANGLE_COMPONENT_TYPED_NAME:
655 printf ("typed name\n");
657 case DEMANGLE_COMPONENT_TEMPLATE:
658 printf ("template\n");
660 case DEMANGLE_COMPONENT_VTABLE:
663 case DEMANGLE_COMPONENT_VTT:
666 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
667 printf ("construction vtable\n");
669 case DEMANGLE_COMPONENT_TYPEINFO:
670 printf ("typeinfo\n");
672 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
673 printf ("typeinfo name\n");
675 case DEMANGLE_COMPONENT_TYPEINFO_FN:
676 printf ("typeinfo function\n");
678 case DEMANGLE_COMPONENT_THUNK:
681 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
682 printf ("virtual thunk\n");
684 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
685 printf ("covariant thunk\n");
687 case DEMANGLE_COMPONENT_JAVA_CLASS:
688 printf ("java class\n");
690 case DEMANGLE_COMPONENT_GUARD:
693 case DEMANGLE_COMPONENT_REFTEMP:
694 printf ("reference temporary\n");
696 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
697 printf ("hidden alias\n");
699 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
700 printf ("transaction clone\n");
702 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
703 printf ("non-transaction clone\n");
705 case DEMANGLE_COMPONENT_RESTRICT:
706 printf ("restrict\n");
708 case DEMANGLE_COMPONENT_VOLATILE:
709 printf ("volatile\n");
711 case DEMANGLE_COMPONENT_CONST:
714 case DEMANGLE_COMPONENT_RESTRICT_THIS:
715 printf ("restrict this\n");
717 case DEMANGLE_COMPONENT_VOLATILE_THIS:
718 printf ("volatile this\n");
720 case DEMANGLE_COMPONENT_CONST_THIS:
721 printf ("const this\n");
723 case DEMANGLE_COMPONENT_REFERENCE_THIS:
724 printf ("reference this\n");
726 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
727 printf ("rvalue reference this\n");
729 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
730 printf ("transaction_safe this\n");
732 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
733 printf ("vendor type qualifier\n");
735 case DEMANGLE_COMPONENT_POINTER:
736 printf ("pointer\n");
738 case DEMANGLE_COMPONENT_REFERENCE:
739 printf ("reference\n");
741 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
742 printf ("rvalue reference\n");
744 case DEMANGLE_COMPONENT_COMPLEX:
745 printf ("complex\n");
747 case DEMANGLE_COMPONENT_IMAGINARY:
748 printf ("imaginary\n");
750 case DEMANGLE_COMPONENT_VENDOR_TYPE:
751 printf ("vendor type\n");
753 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
754 printf ("function type\n");
756 case DEMANGLE_COMPONENT_ARRAY_TYPE:
757 printf ("array type\n");
759 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
760 printf ("pointer to member type\n");
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);
767 case DEMANGLE_COMPONENT_ARGLIST:
768 printf ("argument list\n");
770 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
771 printf ("template argument list\n");
773 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
774 printf ("initializer list\n");
776 case DEMANGLE_COMPONENT_CAST:
779 case DEMANGLE_COMPONENT_CONVERSION:
780 printf ("conversion operator\n");
782 case DEMANGLE_COMPONENT_NULLARY:
783 printf ("nullary operator\n");
785 case DEMANGLE_COMPONENT_UNARY:
786 printf ("unary operator\n");
788 case DEMANGLE_COMPONENT_BINARY:
789 printf ("binary operator\n");
791 case DEMANGLE_COMPONENT_BINARY_ARGS:
792 printf ("binary operator arguments\n");
794 case DEMANGLE_COMPONENT_TRINARY:
795 printf ("trinary operator\n");
797 case DEMANGLE_COMPONENT_TRINARY_ARG1:
798 printf ("trinary operator arguments 1\n");
800 case DEMANGLE_COMPONENT_TRINARY_ARG2:
801 printf ("trinary operator arguments 1\n");
803 case DEMANGLE_COMPONENT_LITERAL:
804 printf ("literal\n");
806 case DEMANGLE_COMPONENT_LITERAL_NEG:
807 printf ("negative literal\n");
809 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
810 printf ("java resource\n");
812 case DEMANGLE_COMPONENT_COMPOUND_NAME:
813 printf ("compound name\n");
815 case DEMANGLE_COMPONENT_CHARACTER:
816 printf ("character '%c'\n", dc->u.s_character.character);
818 case DEMANGLE_COMPONENT_NUMBER:
819 printf ("number %ld\n", dc->u.s_number.number);
821 case DEMANGLE_COMPONENT_DECLTYPE:
822 printf ("decltype\n");
824 case DEMANGLE_COMPONENT_PACK_EXPANSION:
825 printf ("pack expansion\n");
827 case DEMANGLE_COMPONENT_TLS_INIT:
828 printf ("tls init function\n");
830 case DEMANGLE_COMPONENT_TLS_WRAPPER:
831 printf ("tls wrapper function\n");
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);
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);
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)
857 p->type = DEMANGLE_COMPONENT_NAME;
859 p->u.s_name.len = len;
863 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
865 CP_STATIC_IF_GLIBCPP_V3
867 cplus_demangle_fill_extended_operator (struct demangle_component *p, int args,
868 struct demangle_component *name)
870 if (p == NULL || args < 0 || name == NULL)
872 p->type = DEMANGLE_COMPONENT_EXTENDED_OPERATOR;
873 p->u.s_extended_operator.args = args;
874 p->u.s_extended_operator.name = name;
878 /* Fill in a DEMANGLE_COMPONENT_CTOR. */
880 CP_STATIC_IF_GLIBCPP_V3
882 cplus_demangle_fill_ctor (struct demangle_component *p,
883 enum gnu_v3_ctor_kinds kind,
884 struct demangle_component *name)
888 || (int) kind < gnu_v3_complete_object_ctor
889 || (int) kind > gnu_v3_object_ctor_group)
891 p->type = DEMANGLE_COMPONENT_CTOR;
892 p->u.s_ctor.kind = kind;
893 p->u.s_ctor.name = name;
897 /* Fill in a DEMANGLE_COMPONENT_DTOR. */
899 CP_STATIC_IF_GLIBCPP_V3
901 cplus_demangle_fill_dtor (struct demangle_component *p,
902 enum gnu_v3_dtor_kinds kind,
903 struct demangle_component *name)
907 || (int) kind < gnu_v3_deleting_dtor
908 || (int) kind > gnu_v3_object_dtor_group)
910 p->type = DEMANGLE_COMPONENT_DTOR;
911 p->u.s_dtor.kind = kind;
912 p->u.s_dtor.name = name;
916 /* Add a new component. */
918 static struct demangle_component *
919 d_make_empty (struct d_info *di)
921 struct demangle_component *p;
923 if (di->next_comp >= di->num_comps)
925 p = &di->comps[di->next_comp];
931 /* Add a new generic component. */
933 static struct demangle_component *
934 d_make_comp (struct d_info *di, enum demangle_component_type type,
935 struct demangle_component *left,
936 struct demangle_component *right)
938 struct demangle_component *p;
940 /* We check for errors here. A typical error would be a NULL return
941 from a subroutine. We catch those here, and return NULL
945 /* These types require two parameters. */
946 case DEMANGLE_COMPONENT_QUAL_NAME:
947 case DEMANGLE_COMPONENT_LOCAL_NAME:
948 case DEMANGLE_COMPONENT_TYPED_NAME:
949 case DEMANGLE_COMPONENT_TAGGED_NAME:
950 case DEMANGLE_COMPONENT_TEMPLATE:
951 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
952 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
953 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
954 case DEMANGLE_COMPONENT_UNARY:
955 case DEMANGLE_COMPONENT_BINARY:
956 case DEMANGLE_COMPONENT_BINARY_ARGS:
957 case DEMANGLE_COMPONENT_TRINARY:
958 case DEMANGLE_COMPONENT_TRINARY_ARG1:
959 case DEMANGLE_COMPONENT_LITERAL:
960 case DEMANGLE_COMPONENT_LITERAL_NEG:
961 case DEMANGLE_COMPONENT_COMPOUND_NAME:
962 case DEMANGLE_COMPONENT_VECTOR_TYPE:
963 case DEMANGLE_COMPONENT_CLONE:
964 if (left == NULL || right == NULL)
968 /* These types only require one parameter. */
969 case DEMANGLE_COMPONENT_VTABLE:
970 case DEMANGLE_COMPONENT_VTT:
971 case DEMANGLE_COMPONENT_TYPEINFO:
972 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
973 case DEMANGLE_COMPONENT_TYPEINFO_FN:
974 case DEMANGLE_COMPONENT_THUNK:
975 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
976 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
977 case DEMANGLE_COMPONENT_JAVA_CLASS:
978 case DEMANGLE_COMPONENT_GUARD:
979 case DEMANGLE_COMPONENT_TLS_INIT:
980 case DEMANGLE_COMPONENT_TLS_WRAPPER:
981 case DEMANGLE_COMPONENT_REFTEMP:
982 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
983 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
984 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
985 case DEMANGLE_COMPONENT_POINTER:
986 case DEMANGLE_COMPONENT_REFERENCE:
987 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
988 case DEMANGLE_COMPONENT_COMPLEX:
989 case DEMANGLE_COMPONENT_IMAGINARY:
990 case DEMANGLE_COMPONENT_VENDOR_TYPE:
991 case DEMANGLE_COMPONENT_CAST:
992 case DEMANGLE_COMPONENT_CONVERSION:
993 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
994 case DEMANGLE_COMPONENT_DECLTYPE:
995 case DEMANGLE_COMPONENT_PACK_EXPANSION:
996 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
997 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
998 case DEMANGLE_COMPONENT_NULLARY:
999 case DEMANGLE_COMPONENT_TRINARY_ARG2:
1004 /* This needs a right parameter, but the left parameter can be
1006 case DEMANGLE_COMPONENT_ARRAY_TYPE:
1007 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
1012 /* These are allowed to have no parameters--in some cases they
1013 will be filled in later. */
1014 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
1015 case DEMANGLE_COMPONENT_RESTRICT:
1016 case DEMANGLE_COMPONENT_VOLATILE:
1017 case DEMANGLE_COMPONENT_CONST:
1018 case DEMANGLE_COMPONENT_ARGLIST:
1019 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
1020 FNQUAL_COMPONENT_CASE:
1023 /* Other types should not be seen here. */
1028 p = d_make_empty (di);
1032 p->u.s_binary.left = left;
1033 p->u.s_binary.right = right;
1038 /* Add a new demangle mangled name component. */
1040 static struct demangle_component *
1041 d_make_demangle_mangled_name (struct d_info *di, const char *s)
1043 if (d_peek_char (di) != '_' || d_peek_next_char (di) != 'Z')
1044 return d_make_name (di, s, strlen (s));
1046 return d_encoding (di, 0);
1049 /* Add a new name component. */
1051 static struct demangle_component *
1052 d_make_name (struct d_info *di, const char *s, int len)
1054 struct demangle_component *p;
1056 p = d_make_empty (di);
1057 if (! cplus_demangle_fill_name (p, s, len))
1062 /* Add a new builtin type component. */
1064 static struct demangle_component *
1065 d_make_builtin_type (struct d_info *di,
1066 const struct demangle_builtin_type_info *type)
1068 struct demangle_component *p;
1072 p = d_make_empty (di);
1075 p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE;
1076 p->u.s_builtin.type = type;
1081 /* Add a new operator component. */
1083 static struct demangle_component *
1084 d_make_operator (struct d_info *di, const struct demangle_operator_info *op)
1086 struct demangle_component *p;
1088 p = d_make_empty (di);
1091 p->type = DEMANGLE_COMPONENT_OPERATOR;
1092 p->u.s_operator.op = op;
1097 /* Add a new extended operator component. */
1099 static struct demangle_component *
1100 d_make_extended_operator (struct d_info *di, int args,
1101 struct demangle_component *name)
1103 struct demangle_component *p;
1105 p = d_make_empty (di);
1106 if (! cplus_demangle_fill_extended_operator (p, args, name))
1111 static struct demangle_component *
1112 d_make_default_arg (struct d_info *di, int num,
1113 struct demangle_component *sub)
1115 struct demangle_component *p = d_make_empty (di);
1118 p->type = DEMANGLE_COMPONENT_DEFAULT_ARG;
1119 p->u.s_unary_num.num = num;
1120 p->u.s_unary_num.sub = sub;
1125 /* Add a new constructor component. */
1127 static struct demangle_component *
1128 d_make_ctor (struct d_info *di, enum gnu_v3_ctor_kinds kind,
1129 struct demangle_component *name)
1131 struct demangle_component *p;
1133 p = d_make_empty (di);
1134 if (! cplus_demangle_fill_ctor (p, kind, name))
1139 /* Add a new destructor component. */
1141 static struct demangle_component *
1142 d_make_dtor (struct d_info *di, enum gnu_v3_dtor_kinds kind,
1143 struct demangle_component *name)
1145 struct demangle_component *p;
1147 p = d_make_empty (di);
1148 if (! cplus_demangle_fill_dtor (p, kind, name))
1153 /* Add a new template parameter. */
1155 static struct demangle_component *
1156 d_make_template_param (struct d_info *di, int i)
1158 struct demangle_component *p;
1160 p = d_make_empty (di);
1163 p->type = DEMANGLE_COMPONENT_TEMPLATE_PARAM;
1164 p->u.s_number.number = i;
1169 /* Add a new function parameter. */
1171 static struct demangle_component *
1172 d_make_function_param (struct d_info *di, int i)
1174 struct demangle_component *p;
1176 p = d_make_empty (di);
1179 p->type = DEMANGLE_COMPONENT_FUNCTION_PARAM;
1180 p->u.s_number.number = i;
1185 /* Add a new standard substitution component. */
1187 static struct demangle_component *
1188 d_make_sub (struct d_info *di, const char *name, int len)
1190 struct demangle_component *p;
1192 p = d_make_empty (di);
1195 p->type = DEMANGLE_COMPONENT_SUB_STD;
1196 p->u.s_string.string = name;
1197 p->u.s_string.len = len;
1202 /* <mangled-name> ::= _Z <encoding> [<clone-suffix>]*
1204 TOP_LEVEL is non-zero when called at the top level. */
1206 CP_STATIC_IF_GLIBCPP_V3
1207 struct demangle_component *
1208 cplus_demangle_mangled_name (struct d_info *di, int top_level)
1210 struct demangle_component *p;
1212 if (! d_check_char (di, '_')
1213 /* Allow missing _ if not at toplevel to work around a
1214 bug in G++ abi-version=2 mangling; see the comment in
1215 write_template_arg. */
1218 if (! d_check_char (di, 'Z'))
1220 p = d_encoding (di, top_level);
1222 /* If at top level and parsing parameters, check for a clone
1224 if (top_level && (di->options & DMGL_PARAMS) != 0)
1225 while (d_peek_char (di) == '.'
1226 && (IS_LOWER (d_peek_next_char (di))
1227 || d_peek_next_char (di) == '_'
1228 || IS_DIGIT (d_peek_next_char (di))))
1229 p = d_clone_suffix (di, p);
1234 /* Return whether a function should have a return type. The argument
1235 is the function name, which may be qualified in various ways. The
1236 rules are that template functions have return types with some
1237 exceptions, function types which are not part of a function name
1238 mangling have return types with some exceptions, and non-template
1239 function names do not have return types. The exceptions are that
1240 constructors, destructors, and conversion operators do not have
1244 has_return_type (struct demangle_component *dc)
1252 case DEMANGLE_COMPONENT_TEMPLATE:
1253 return ! is_ctor_dtor_or_conversion (d_left (dc));
1254 FNQUAL_COMPONENT_CASE:
1255 return has_return_type (d_left (dc));
1259 /* Return whether a name is a constructor, a destructor, or a
1260 conversion operator. */
1263 is_ctor_dtor_or_conversion (struct demangle_component *dc)
1271 case DEMANGLE_COMPONENT_QUAL_NAME:
1272 case DEMANGLE_COMPONENT_LOCAL_NAME:
1273 return is_ctor_dtor_or_conversion (d_right (dc));
1274 case DEMANGLE_COMPONENT_CTOR:
1275 case DEMANGLE_COMPONENT_DTOR:
1276 case DEMANGLE_COMPONENT_CONVERSION:
1281 /* <encoding> ::= <(function) name> <bare-function-type>
1285 TOP_LEVEL is non-zero when called at the top level, in which case
1286 if DMGL_PARAMS is not set we do not demangle the function
1287 parameters. We only set this at the top level, because otherwise
1288 we would not correctly demangle names in local scopes. */
1290 static struct demangle_component *
1291 d_encoding (struct d_info *di, int top_level)
1293 char peek = d_peek_char (di);
1295 if (peek == 'G' || peek == 'T')
1296 return d_special_name (di);
1299 struct demangle_component *dc;
1303 if (dc != NULL && top_level && (di->options & DMGL_PARAMS) == 0)
1305 /* Strip off any initial CV-qualifiers, as they really apply
1306 to the `this' parameter, and they were not output by the
1307 v2 demangler without DMGL_PARAMS. */
1308 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1309 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1310 || dc->type == DEMANGLE_COMPONENT_CONST_THIS
1311 || dc->type == DEMANGLE_COMPONENT_REFERENCE_THIS
1312 || dc->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)
1315 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1316 there may be function-qualifiers on its right argument which
1317 really apply here; this happens when parsing a class
1318 which is local to a function. */
1319 if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME)
1321 struct demangle_component *dcr;
1324 while (is_fnqual_component_type (dcr->type))
1326 dc->u.s_binary.right = dcr;
1332 peek = d_peek_char (di);
1333 if (dc == NULL || peek == '\0' || peek == 'E')
1335 return d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, dc,
1336 d_bare_function_type (di, has_return_type (dc)));
1340 /* <tagged-name> ::= <name> B <source-name> */
1342 static struct demangle_component *
1343 d_abi_tags (struct d_info *di, struct demangle_component *dc)
1345 struct demangle_component *hold_last_name;
1348 /* Preserve the last name, so the ABI tag doesn't clobber it. */
1349 hold_last_name = di->last_name;
1351 while (peek = d_peek_char (di),
1354 struct demangle_component *tag;
1356 tag = d_source_name (di);
1357 dc = d_make_comp (di, DEMANGLE_COMPONENT_TAGGED_NAME, dc, tag);
1360 di->last_name = hold_last_name;
1365 /* <name> ::= <nested-name>
1367 ::= <unscoped-template-name> <template-args>
1370 <unscoped-name> ::= <unqualified-name>
1371 ::= St <unqualified-name>
1373 <unscoped-template-name> ::= <unscoped-name>
1377 static struct demangle_component *
1378 d_name (struct d_info *di)
1380 char peek = d_peek_char (di);
1381 struct demangle_component *dc;
1386 return d_nested_name (di);
1389 return d_local_name (di);
1392 return d_unqualified_name (di);
1398 if (d_peek_next_char (di) != 't')
1400 dc = d_substitution (di, 0);
1406 dc = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME,
1407 d_make_name (di, "std", 3),
1408 d_unqualified_name (di));
1413 if (d_peek_char (di) != 'I')
1415 /* The grammar does not permit this case to occur if we
1416 called d_substitution() above (i.e., subst == 1). We
1417 don't bother to check. */
1421 /* This is <template-args>, which means that we just saw
1422 <unscoped-template-name>, which is a substitution
1423 candidate if we didn't just get it from a
1427 if (! d_add_substitution (di, dc))
1430 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1431 d_template_args (di));
1439 dc = d_unqualified_name (di);
1440 if (d_peek_char (di) == 'I')
1442 /* This is <template-args>, which means that we just saw
1443 <unscoped-template-name>, which is a substitution
1445 if (! d_add_substitution (di, dc))
1447 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1448 d_template_args (di));
1454 /* <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
1455 ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
1458 static struct demangle_component *
1459 d_nested_name (struct d_info *di)
1461 struct demangle_component *ret;
1462 struct demangle_component **pret;
1463 struct demangle_component *rqual;
1465 if (! d_check_char (di, 'N'))
1468 pret = d_cv_qualifiers (di, &ret, 1);
1472 /* Parse the ref-qualifier now and then attach it
1473 once we have something to attach it to. */
1474 rqual = d_ref_qualifier (di, NULL);
1476 *pret = d_prefix (di);
1482 d_left (rqual) = ret;
1486 if (! d_check_char (di, 'E'))
1492 /* <prefix> ::= <prefix> <unqualified-name>
1493 ::= <template-prefix> <template-args>
1494 ::= <template-param>
1499 <template-prefix> ::= <prefix> <(template) unqualified-name>
1500 ::= <template-param>
1504 static struct demangle_component *
1505 d_prefix (struct d_info *di)
1507 struct demangle_component *ret = NULL;
1512 enum demangle_component_type comb_type;
1513 struct demangle_component *dc;
1515 peek = d_peek_char (di);
1519 /* The older code accepts a <local-name> here, but I don't see
1520 that in the grammar. The older code does not accept a
1521 <template-param> here. */
1523 comb_type = DEMANGLE_COMPONENT_QUAL_NAME;
1526 char peek2 = d_peek_next_char (di);
1527 if (peek2 == 'T' || peek2 == 't')
1529 dc = cplus_demangle_type (di);
1531 /* Destructor name. */
1532 dc = d_unqualified_name (di);
1534 else if (IS_DIGIT (peek)
1539 dc = d_unqualified_name (di);
1540 else if (peek == 'S')
1541 dc = d_substitution (di, 1);
1542 else if (peek == 'I')
1546 comb_type = DEMANGLE_COMPONENT_TEMPLATE;
1547 dc = d_template_args (di);
1549 else if (peek == 'T')
1550 dc = d_template_param (di);
1551 else if (peek == 'E')
1553 else if (peek == 'M')
1555 /* Initializer scope for a lambda. We don't need to represent
1556 this; the normal code will just treat the variable as a type
1557 scope, which gives appropriate output. */
1569 ret = d_make_comp (di, comb_type, ret, dc);
1571 if (peek != 'S' && d_peek_char (di) != 'E')
1573 if (! d_add_substitution (di, ret))
1579 /* <unqualified-name> ::= <operator-name>
1580 ::= <ctor-dtor-name>
1582 ::= <local-source-name>
1584 <local-source-name> ::= L <source-name> <discriminator>
1587 static struct demangle_component *
1588 d_unqualified_name (struct d_info *di)
1590 struct demangle_component *ret;
1593 peek = d_peek_char (di);
1594 if (IS_DIGIT (peek))
1595 ret = d_source_name (di);
1596 else if (IS_LOWER (peek))
1598 if (peek == 'o' && d_peek_next_char (di) == 'n')
1600 ret = d_operator_name (di);
1601 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_OPERATOR)
1603 di->expansion += sizeof "operator" + ret->u.s_operator.op->len - 2;
1604 if (!strcmp (ret->u.s_operator.op->code, "li"))
1605 ret = d_make_comp (di, DEMANGLE_COMPONENT_UNARY, ret,
1606 d_source_name (di));
1609 else if (peek == 'C' || peek == 'D')
1610 ret = d_ctor_dtor_name (di);
1611 else if (peek == 'L')
1615 ret = d_source_name (di);
1618 if (! d_discriminator (di))
1621 else if (peek == 'U')
1623 switch (d_peek_next_char (di))
1626 ret = d_lambda (di);
1629 ret = d_unnamed_type (di);
1638 if (d_peek_char (di) == 'B')
1639 ret = d_abi_tags (di, ret);
1643 /* <source-name> ::= <(positive length) number> <identifier> */
1645 static struct demangle_component *
1646 d_source_name (struct d_info *di)
1649 struct demangle_component *ret;
1651 len = d_number (di);
1654 ret = d_identifier (di, len);
1655 di->last_name = ret;
1659 /* number ::= [n] <(non-negative decimal integer)> */
1662 d_number (struct d_info *di)
1669 peek = d_peek_char (di);
1674 peek = d_peek_char (di);
1680 if (! IS_DIGIT (peek))
1686 ret = ret * 10 + peek - '0';
1688 peek = d_peek_char (di);
1692 /* Like d_number, but returns a demangle_component. */
1694 static struct demangle_component *
1695 d_number_component (struct d_info *di)
1697 struct demangle_component *ret = d_make_empty (di);
1700 ret->type = DEMANGLE_COMPONENT_NUMBER;
1701 ret->u.s_number.number = d_number (di);
1706 /* identifier ::= <(unqualified source code identifier)> */
1708 static struct demangle_component *
1709 d_identifier (struct d_info *di, int len)
1715 if (di->send - name < len)
1718 d_advance (di, len);
1720 /* A Java mangled name may have a trailing '$' if it is a C++
1721 keyword. This '$' is not included in the length count. We just
1723 if ((di->options & DMGL_JAVA) != 0
1724 && d_peek_char (di) == '$')
1727 /* Look for something which looks like a gcc encoding of an
1728 anonymous namespace, and replace it with a more user friendly
1730 if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
1731 && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX,
1732 ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0)
1736 s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN;
1737 if ((*s == '.' || *s == '_' || *s == '$')
1740 di->expansion -= len - sizeof "(anonymous namespace)";
1741 return d_make_name (di, "(anonymous namespace)",
1742 sizeof "(anonymous namespace)" - 1);
1746 return d_make_name (di, name, len);
1749 /* operator_name ::= many different two character encodings.
1751 ::= v <digit> <source-name>
1753 This list is sorted for binary search. */
1755 #define NL(s) s, (sizeof s) - 1
1757 CP_STATIC_IF_GLIBCPP_V3
1758 const struct demangle_operator_info cplus_demangle_operators[] =
1760 { "aN", NL ("&="), 2 },
1761 { "aS", NL ("="), 2 },
1762 { "aa", NL ("&&"), 2 },
1763 { "ad", NL ("&"), 1 },
1764 { "an", NL ("&"), 2 },
1765 { "at", NL ("alignof "), 1 },
1766 { "az", NL ("alignof "), 1 },
1767 { "cc", NL ("const_cast"), 2 },
1768 { "cl", NL ("()"), 2 },
1769 { "cm", NL (","), 2 },
1770 { "co", NL ("~"), 1 },
1771 { "dV", NL ("/="), 2 },
1772 { "da", NL ("delete[] "), 1 },
1773 { "dc", NL ("dynamic_cast"), 2 },
1774 { "de", NL ("*"), 1 },
1775 { "dl", NL ("delete "), 1 },
1776 { "ds", NL (".*"), 2 },
1777 { "dt", NL ("."), 2 },
1778 { "dv", NL ("/"), 2 },
1779 { "eO", NL ("^="), 2 },
1780 { "eo", NL ("^"), 2 },
1781 { "eq", NL ("=="), 2 },
1782 { "fL", NL ("..."), 3 },
1783 { "fR", NL ("..."), 3 },
1784 { "fl", NL ("..."), 2 },
1785 { "fr", NL ("..."), 2 },
1786 { "ge", NL (">="), 2 },
1787 { "gs", NL ("::"), 1 },
1788 { "gt", NL (">"), 2 },
1789 { "ix", NL ("[]"), 2 },
1790 { "lS", NL ("<<="), 2 },
1791 { "le", NL ("<="), 2 },
1792 { "li", NL ("operator\"\" "), 1 },
1793 { "ls", NL ("<<"), 2 },
1794 { "lt", NL ("<"), 2 },
1795 { "mI", NL ("-="), 2 },
1796 { "mL", NL ("*="), 2 },
1797 { "mi", NL ("-"), 2 },
1798 { "ml", NL ("*"), 2 },
1799 { "mm", NL ("--"), 1 },
1800 { "na", NL ("new[]"), 3 },
1801 { "ne", NL ("!="), 2 },
1802 { "ng", NL ("-"), 1 },
1803 { "nt", NL ("!"), 1 },
1804 { "nw", NL ("new"), 3 },
1805 { "oR", NL ("|="), 2 },
1806 { "oo", NL ("||"), 2 },
1807 { "or", NL ("|"), 2 },
1808 { "pL", NL ("+="), 2 },
1809 { "pl", NL ("+"), 2 },
1810 { "pm", NL ("->*"), 2 },
1811 { "pp", NL ("++"), 1 },
1812 { "ps", NL ("+"), 1 },
1813 { "pt", NL ("->"), 2 },
1814 { "qu", NL ("?"), 3 },
1815 { "rM", NL ("%="), 2 },
1816 { "rS", NL (">>="), 2 },
1817 { "rc", NL ("reinterpret_cast"), 2 },
1818 { "rm", NL ("%"), 2 },
1819 { "rs", NL (">>"), 2 },
1820 { "sP", NL ("sizeof..."), 1 },
1821 { "sZ", NL ("sizeof..."), 1 },
1822 { "sc", NL ("static_cast"), 2 },
1823 { "st", NL ("sizeof "), 1 },
1824 { "sz", NL ("sizeof "), 1 },
1825 { "tr", NL ("throw"), 0 },
1826 { "tw", NL ("throw "), 1 },
1827 { NULL, NULL, 0, 0 }
1830 static struct demangle_component *
1831 d_operator_name (struct d_info *di)
1836 c1 = d_next_char (di);
1837 c2 = d_next_char (di);
1838 if (c1 == 'v' && IS_DIGIT (c2))
1839 return d_make_extended_operator (di, c2 - '0', d_source_name (di));
1840 else if (c1 == 'c' && c2 == 'v')
1842 struct demangle_component *type;
1843 int was_conversion = di->is_conversion;
1844 struct demangle_component *res;
1846 di->is_conversion = ! di->is_expression;
1847 type = cplus_demangle_type (di);
1848 if (di->is_conversion)
1849 res = d_make_comp (di, DEMANGLE_COMPONENT_CONVERSION, type, NULL);
1851 res = d_make_comp (di, DEMANGLE_COMPONENT_CAST, type, NULL);
1852 di->is_conversion = was_conversion;
1857 /* LOW is the inclusive lower bound. */
1859 /* HIGH is the exclusive upper bound. We subtract one to ignore
1860 the sentinel at the end of the array. */
1861 int high = ((sizeof (cplus_demangle_operators)
1862 / sizeof (cplus_demangle_operators[0]))
1868 const struct demangle_operator_info *p;
1870 i = low + (high - low) / 2;
1871 p = cplus_demangle_operators + i;
1873 if (c1 == p->code[0] && c2 == p->code[1])
1874 return d_make_operator (di, p);
1876 if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1]))
1886 static struct demangle_component *
1887 d_make_character (struct d_info *di, int c)
1889 struct demangle_component *p;
1890 p = d_make_empty (di);
1893 p->type = DEMANGLE_COMPONENT_CHARACTER;
1894 p->u.s_character.character = c;
1899 static struct demangle_component *
1900 d_java_resource (struct d_info *di)
1902 struct demangle_component *p = NULL;
1903 struct demangle_component *next = NULL;
1908 len = d_number (di);
1912 /* Eat the leading '_'. */
1913 if (d_next_char (di) != '_')
1926 /* Each chunk is either a '$' escape... */
1944 next = d_make_character (di, c);
1952 /* ... or a sequence of characters. */
1955 while (i < len && str[i] && str[i] != '$')
1958 next = d_make_name (di, str, i);
1971 p = d_make_comp (di, DEMANGLE_COMPONENT_COMPOUND_NAME, p, next);
1977 p = d_make_comp (di, DEMANGLE_COMPONENT_JAVA_RESOURCE, p, NULL);
1982 /* <special-name> ::= TV <type>
1986 ::= GV <(object) name>
1987 ::= T <call-offset> <(base) encoding>
1988 ::= Tc <call-offset> <call-offset> <(base) encoding>
1989 Also g++ extensions:
1990 ::= TC <type> <(offset) number> _ <(base) type>
1995 ::= Gr <resource name>
2000 static struct demangle_component *
2001 d_special_name (struct d_info *di)
2003 di->expansion += 20;
2004 if (d_check_char (di, 'T'))
2006 switch (d_next_char (di))
2010 return d_make_comp (di, DEMANGLE_COMPONENT_VTABLE,
2011 cplus_demangle_type (di), NULL);
2013 di->expansion -= 10;
2014 return d_make_comp (di, DEMANGLE_COMPONENT_VTT,
2015 cplus_demangle_type (di), NULL);
2017 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO,
2018 cplus_demangle_type (di), NULL);
2020 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_NAME,
2021 cplus_demangle_type (di), NULL);
2024 if (! d_call_offset (di, 'h'))
2026 return d_make_comp (di, DEMANGLE_COMPONENT_THUNK,
2027 d_encoding (di, 0), NULL);
2030 if (! d_call_offset (di, 'v'))
2032 return d_make_comp (di, DEMANGLE_COMPONENT_VIRTUAL_THUNK,
2033 d_encoding (di, 0), NULL);
2036 if (! d_call_offset (di, '\0'))
2038 if (! d_call_offset (di, '\0'))
2040 return d_make_comp (di, DEMANGLE_COMPONENT_COVARIANT_THUNK,
2041 d_encoding (di, 0), NULL);
2045 struct demangle_component *derived_type;
2047 struct demangle_component *base_type;
2049 derived_type = cplus_demangle_type (di);
2050 offset = d_number (di);
2053 if (! d_check_char (di, '_'))
2055 base_type = cplus_demangle_type (di);
2056 /* We don't display the offset. FIXME: We should display
2057 it in verbose mode. */
2059 return d_make_comp (di, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE,
2060 base_type, derived_type);
2064 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_FN,
2065 cplus_demangle_type (di), NULL);
2067 return d_make_comp (di, DEMANGLE_COMPONENT_JAVA_CLASS,
2068 cplus_demangle_type (di), NULL);
2071 return d_make_comp (di, DEMANGLE_COMPONENT_TLS_INIT,
2075 return d_make_comp (di, DEMANGLE_COMPONENT_TLS_WRAPPER,
2082 else if (d_check_char (di, 'G'))
2084 switch (d_next_char (di))
2087 return d_make_comp (di, DEMANGLE_COMPONENT_GUARD, d_name (di), NULL);
2091 struct demangle_component *name = d_name (di);
2092 return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, name,
2093 d_number_component (di));
2097 return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS,
2098 d_encoding (di, 0), NULL);
2101 switch (d_next_char (di))
2104 return d_make_comp (di, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE,
2105 d_encoding (di, 0), NULL);
2107 /* ??? The proposal is that other letters (such as 'h') stand
2108 for different variants of transaction cloning, such as
2109 compiling directly for hardware transaction support. But
2110 they still should all be transactional clones of some sort
2111 so go ahead and call them that. */
2113 return d_make_comp (di, DEMANGLE_COMPONENT_TRANSACTION_CLONE,
2114 d_encoding (di, 0), NULL);
2118 return d_java_resource (di);
2128 /* <call-offset> ::= h <nv-offset> _
2131 <nv-offset> ::= <(offset) number>
2133 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
2135 The C parameter, if not '\0', is a character we just read which is
2136 the start of the <call-offset>.
2138 We don't display the offset information anywhere. FIXME: We should
2139 display it in verbose mode. */
2142 d_call_offset (struct d_info *di, int c)
2145 c = d_next_char (di);
2152 if (! d_check_char (di, '_'))
2159 if (! d_check_char (di, '_'))
2165 /* <ctor-dtor-name> ::= C1
2173 static struct demangle_component *
2174 d_ctor_dtor_name (struct d_info *di)
2176 if (di->last_name != NULL)
2178 if (di->last_name->type == DEMANGLE_COMPONENT_NAME)
2179 di->expansion += di->last_name->u.s_name.len;
2180 else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD)
2181 di->expansion += di->last_name->u.s_string.len;
2183 switch (d_peek_char (di))
2187 enum gnu_v3_ctor_kinds kind;
2190 if (d_peek_next_char (di) == 'I')
2196 switch (d_peek_next_char (di))
2199 kind = gnu_v3_complete_object_ctor;
2202 kind = gnu_v3_base_object_ctor;
2205 kind = gnu_v3_complete_object_allocating_ctor;
2208 kind = gnu_v3_unified_ctor;
2211 kind = gnu_v3_object_ctor_group;
2220 cplus_demangle_type (di);
2222 return d_make_ctor (di, kind, di->last_name);
2227 enum gnu_v3_dtor_kinds kind;
2229 switch (d_peek_next_char (di))
2232 kind = gnu_v3_deleting_dtor;
2235 kind = gnu_v3_complete_object_dtor;
2238 kind = gnu_v3_base_object_dtor;
2240 /* digit '3' is not used */
2242 kind = gnu_v3_unified_dtor;
2245 kind = gnu_v3_object_dtor_group;
2251 return d_make_dtor (di, kind, di->last_name);
2259 /* True iff we're looking at an order-insensitive type-qualifier, including
2260 function-type-qualifiers. */
2263 next_is_type_qual (struct d_info *di)
2265 char peek = d_peek_char (di);
2266 if (peek == 'r' || peek == 'V' || peek == 'K')
2270 peek = d_peek_next_char (di);
2271 if (peek == 'x' || peek == 'o' || peek == 'O' || peek == 'w')
2277 /* <type> ::= <builtin-type>
2279 ::= <class-enum-type>
2281 ::= <pointer-to-member-type>
2282 ::= <template-param>
2283 ::= <template-template-param> <template-args>
2285 ::= <CV-qualifiers> <type>
2288 ::= O <type> (C++0x)
2291 ::= U <source-name> <type>
2293 <builtin-type> ::= various one letter codes
2297 CP_STATIC_IF_GLIBCPP_V3
2298 const struct demangle_builtin_type_info
2299 cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] =
2301 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT },
2302 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL },
2303 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT },
2304 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT },
2305 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT },
2306 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT },
2307 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT },
2308 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT },
2309 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT },
2310 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED },
2311 /* k */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2312 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG },
2313 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG },
2314 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT },
2315 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2317 /* p */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2318 /* q */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2319 /* r */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2320 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT },
2321 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
2322 /* u */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2323 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID },
2324 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT },
2325 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG },
2326 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2327 D_PRINT_UNSIGNED_LONG_LONG },
2328 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT },
2329 /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT },
2330 /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT },
2331 /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT },
2332 /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT },
2333 /* 30 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT },
2334 /* 31 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT },
2335 /* 32 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"),
2339 CP_STATIC_IF_GLIBCPP_V3
2340 struct demangle_component *
2341 cplus_demangle_type (struct d_info *di)
2344 struct demangle_component *ret;
2347 /* The ABI specifies that when CV-qualifiers are used, the base type
2348 is substitutable, and the fully qualified type is substitutable,
2349 but the base type with a strict subset of the CV-qualifiers is
2350 not substitutable. The natural recursive implementation of the
2351 CV-qualifiers would cause subsets to be substitutable, so instead
2352 we pull them all off now.
2354 FIXME: The ABI says that order-insensitive vendor qualifiers
2355 should be handled in the same way, but we have no way to tell
2356 which vendor qualifiers are order-insensitive and which are
2357 order-sensitive. So we just assume that they are all
2358 order-sensitive. g++ 3.4 supports only one vendor qualifier,
2359 __vector, and it treats it as order-sensitive when mangling
2362 if (next_is_type_qual (di))
2364 struct demangle_component **pret;
2366 pret = d_cv_qualifiers (di, &ret, 0);
2369 if (d_peek_char (di) == 'F')
2371 /* cv-qualifiers before a function type apply to 'this',
2372 so avoid adding the unqualified function type to
2373 the substitution list. */
2374 *pret = d_function_type (di);
2377 *pret = cplus_demangle_type (di);
2380 if ((*pret)->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
2381 || (*pret)->type == DEMANGLE_COMPONENT_REFERENCE_THIS)
2383 /* Move the ref-qualifier outside the cv-qualifiers so that
2384 they are printed in the right order. */
2385 struct demangle_component *fn = d_left (*pret);
2386 d_left (*pret) = ret;
2390 if (! d_add_substitution (di, ret))
2397 peek = d_peek_char (di);
2400 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2401 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
2402 case 'o': case 's': case 't':
2403 case 'v': case 'w': case 'x': case 'y': case 'z':
2404 ret = d_make_builtin_type (di,
2405 &cplus_demangle_builtin_types[peek - 'a']);
2406 di->expansion += ret->u.s_builtin.type->len;
2413 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE,
2414 d_source_name (di), NULL);
2418 ret = d_function_type (di);
2421 case '0': case '1': case '2': case '3': case '4':
2422 case '5': case '6': case '7': case '8': case '9':
2425 ret = d_class_enum_type (di);
2429 ret = d_array_type (di);
2433 ret = d_pointer_to_member_type (di);
2437 ret = d_template_param (di);
2438 if (d_peek_char (di) == 'I')
2440 /* This may be <template-template-param> <template-args>.
2441 If this is the type for a conversion operator, we can
2442 have a <template-template-param> here only by following
2443 a derivation like this:
2446 -> <template-prefix> <template-args>
2447 -> <prefix> <template-unqualified-name> <template-args>
2448 -> <unqualified-name> <template-unqualified-name> <template-args>
2449 -> <source-name> <template-unqualified-name> <template-args>
2450 -> <source-name> <operator-name> <template-args>
2451 -> <source-name> cv <type> <template-args>
2452 -> <source-name> cv <template-template-param> <template-args> <template-args>
2454 where the <template-args> is followed by another.
2455 Otherwise, we must have a derivation like this:
2458 -> <template-prefix> <template-args>
2459 -> <prefix> <template-unqualified-name> <template-args>
2460 -> <unqualified-name> <template-unqualified-name> <template-args>
2461 -> <source-name> <template-unqualified-name> <template-args>
2462 -> <source-name> <operator-name> <template-args>
2463 -> <source-name> cv <type> <template-args>
2464 -> <source-name> cv <template-param> <template-args>
2466 where we need to leave the <template-args> to be processed
2467 by d_prefix (following the <template-prefix>).
2469 The <template-template-param> part is a substitution
2471 if (! di->is_conversion)
2473 if (! d_add_substitution (di, ret))
2475 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2476 d_template_args (di));
2480 struct demangle_component *args;
2481 struct d_info_checkpoint checkpoint;
2483 d_checkpoint (di, &checkpoint);
2484 args = d_template_args (di);
2485 if (d_peek_char (di) == 'I')
2487 if (! d_add_substitution (di, ret))
2489 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2493 d_backtrack (di, &checkpoint);
2499 /* If this is a special substitution, then it is the start of
2500 <class-enum-type>. */
2504 peek_next = d_peek_next_char (di);
2505 if (IS_DIGIT (peek_next)
2507 || IS_UPPER (peek_next))
2509 ret = d_substitution (di, 0);
2510 /* The substituted name may have been a template name and
2511 may be followed by tepmlate args. */
2512 if (d_peek_char (di) == 'I')
2513 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2514 d_template_args (di));
2520 ret = d_class_enum_type (di);
2521 /* If the substitution was a complete type, then it is not
2522 a new substitution candidate. However, if the
2523 substitution was followed by template arguments, then
2524 the whole thing is a substitution candidate. */
2525 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD)
2533 ret = d_make_comp (di, DEMANGLE_COMPONENT_RVALUE_REFERENCE,
2534 cplus_demangle_type (di), NULL);
2539 ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER,
2540 cplus_demangle_type (di), NULL);
2545 ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE,
2546 cplus_demangle_type (di), NULL);
2551 ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX,
2552 cplus_demangle_type (di), NULL);
2557 ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY,
2558 cplus_demangle_type (di), NULL);
2563 ret = d_source_name (di);
2564 if (d_peek_char (di) == 'I')
2565 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2566 d_template_args (di));
2567 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL,
2568 cplus_demangle_type (di), ret);
2574 peek = d_next_char (di);
2579 /* decltype (expression) */
2580 ret = d_make_comp (di, DEMANGLE_COMPONENT_DECLTYPE,
2581 d_expression (di), NULL);
2582 if (ret && d_next_char (di) != 'E')
2588 /* Pack expansion. */
2589 ret = d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
2590 cplus_demangle_type (di), NULL);
2596 ret = d_make_name (di, "auto", 4);
2599 /* decltype(auto) */
2600 ret = d_make_name (di, "decltype(auto)", 14);
2604 /* 32-bit decimal floating point */
2605 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[26]);
2606 di->expansion += ret->u.s_builtin.type->len;
2610 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[27]);
2611 di->expansion += ret->u.s_builtin.type->len;
2615 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[28]);
2616 di->expansion += ret->u.s_builtin.type->len;
2619 /* 16-bit half-precision FP */
2620 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[29]);
2621 di->expansion += ret->u.s_builtin.type->len;
2625 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[30]);
2626 di->expansion += ret->u.s_builtin.type->len;
2630 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[31]);
2631 di->expansion += ret->u.s_builtin.type->len;
2635 /* Fixed point types. DF<int bits><length><fract bits><sat> */
2636 ret = d_make_empty (di);
2637 ret->type = DEMANGLE_COMPONENT_FIXED_TYPE;
2638 if ((ret->u.s_fixed.accum = IS_DIGIT (d_peek_char (di))))
2639 /* For demangling we don't care about the bits. */
2641 ret->u.s_fixed.length = cplus_demangle_type (di);
2642 if (ret->u.s_fixed.length == NULL)
2645 peek = d_next_char (di);
2646 ret->u.s_fixed.sat = (peek == 's');
2650 ret = d_vector_type (di);
2655 /* decltype(nullptr) */
2656 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[32]);
2657 di->expansion += ret->u.s_builtin.type->len;
2671 if (! d_add_substitution (di, ret))
2678 /* <CV-qualifiers> ::= [r] [V] [K] [Dx] */
2680 static struct demangle_component **
2681 d_cv_qualifiers (struct d_info *di,
2682 struct demangle_component **pret, int member_fn)
2684 struct demangle_component **pstart;
2688 peek = d_peek_char (di);
2689 while (next_is_type_qual (di))
2691 enum demangle_component_type t;
2692 struct demangle_component *right = NULL;
2698 ? DEMANGLE_COMPONENT_RESTRICT_THIS
2699 : DEMANGLE_COMPONENT_RESTRICT);
2700 di->expansion += sizeof "restrict";
2702 else if (peek == 'V')
2705 ? DEMANGLE_COMPONENT_VOLATILE_THIS
2706 : DEMANGLE_COMPONENT_VOLATILE);
2707 di->expansion += sizeof "volatile";
2709 else if (peek == 'K')
2712 ? DEMANGLE_COMPONENT_CONST_THIS
2713 : DEMANGLE_COMPONENT_CONST);
2714 di->expansion += sizeof "const";
2718 peek = d_next_char (di);
2721 t = DEMANGLE_COMPONENT_TRANSACTION_SAFE;
2722 di->expansion += sizeof "transaction_safe";
2724 else if (peek == 'o'
2727 t = DEMANGLE_COMPONENT_NOEXCEPT;
2728 di->expansion += sizeof "noexcept";
2731 right = d_expression (di);
2734 if (! d_check_char (di, 'E'))
2738 else if (peek == 'w')
2740 t = DEMANGLE_COMPONENT_THROW_SPEC;
2741 di->expansion += sizeof "throw";
2742 right = d_parmlist (di);
2745 if (! d_check_char (di, 'E'))
2752 *pret = d_make_comp (di, t, NULL, right);
2755 pret = &d_left (*pret);
2757 peek = d_peek_char (di);
2760 if (!member_fn && peek == 'F')
2762 while (pstart != pret)
2764 switch ((*pstart)->type)
2766 case DEMANGLE_COMPONENT_RESTRICT:
2767 (*pstart)->type = DEMANGLE_COMPONENT_RESTRICT_THIS;
2769 case DEMANGLE_COMPONENT_VOLATILE:
2770 (*pstart)->type = DEMANGLE_COMPONENT_VOLATILE_THIS;
2772 case DEMANGLE_COMPONENT_CONST:
2773 (*pstart)->type = DEMANGLE_COMPONENT_CONST_THIS;
2778 pstart = &d_left (*pstart);
2785 /* <ref-qualifier> ::= R
2788 static struct demangle_component *
2789 d_ref_qualifier (struct d_info *di, struct demangle_component *sub)
2791 struct demangle_component *ret = sub;
2794 peek = d_peek_char (di);
2795 if (peek == 'R' || peek == 'O')
2797 enum demangle_component_type t;
2800 t = DEMANGLE_COMPONENT_REFERENCE_THIS;
2801 di->expansion += sizeof "&";
2805 t = DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS;
2806 di->expansion += sizeof "&&";
2810 ret = d_make_comp (di, t, ret, NULL);
2816 /* <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] [T] E */
2818 static struct demangle_component *
2819 d_function_type (struct d_info *di)
2821 struct demangle_component *ret;
2823 if (! d_check_char (di, 'F'))
2825 if (d_peek_char (di) == 'Y')
2827 /* Function has C linkage. We don't print this information.
2828 FIXME: We should print it in verbose mode. */
2831 ret = d_bare_function_type (di, 1);
2832 ret = d_ref_qualifier (di, ret);
2834 if (! d_check_char (di, 'E'))
2841 static struct demangle_component *
2842 d_parmlist (struct d_info *di)
2844 struct demangle_component *tl;
2845 struct demangle_component **ptl;
2851 struct demangle_component *type;
2853 char peek = d_peek_char (di);
2854 if (peek == '\0' || peek == 'E' || peek == '.')
2856 if ((peek == 'R' || peek == 'O')
2857 && d_peek_next_char (di) == 'E')
2858 /* Function ref-qualifier, not a ref prefix for a parameter type. */
2860 type = cplus_demangle_type (di);
2863 *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL);
2866 ptl = &d_right (*ptl);
2869 /* There should be at least one parameter type besides the optional
2870 return type. A function which takes no arguments will have a
2871 single parameter type void. */
2875 /* If we have a single parameter type void, omit it. */
2876 if (d_right (tl) == NULL
2877 && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
2878 && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
2880 di->expansion -= d_left (tl)->u.s_builtin.type->len;
2887 /* <bare-function-type> ::= [J]<type>+ */
2889 static struct demangle_component *
2890 d_bare_function_type (struct d_info *di, int has_return_type)
2892 struct demangle_component *return_type;
2893 struct demangle_component *tl;
2896 /* Detect special qualifier indicating that the first argument
2897 is the return type. */
2898 peek = d_peek_char (di);
2902 has_return_type = 1;
2905 if (has_return_type)
2907 return_type = cplus_demangle_type (di);
2908 if (return_type == NULL)
2914 tl = d_parmlist (di);
2918 return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE,
2922 /* <class-enum-type> ::= <name> */
2924 static struct demangle_component *
2925 d_class_enum_type (struct d_info *di)
2930 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2931 ::= A [<(dimension) expression>] _ <(element) type>
2934 static struct demangle_component *
2935 d_array_type (struct d_info *di)
2938 struct demangle_component *dim;
2940 if (! d_check_char (di, 'A'))
2943 peek = d_peek_char (di);
2946 else if (IS_DIGIT (peek))
2954 peek = d_peek_char (di);
2956 while (IS_DIGIT (peek));
2957 dim = d_make_name (di, s, d_str (di) - s);
2963 dim = d_expression (di);
2968 if (! d_check_char (di, '_'))
2971 return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim,
2972 cplus_demangle_type (di));
2975 /* <vector-type> ::= Dv <number> _ <type>
2976 ::= Dv _ <expression> _ <type> */
2978 static struct demangle_component *
2979 d_vector_type (struct d_info *di)
2982 struct demangle_component *dim;
2984 peek = d_peek_char (di);
2988 dim = d_expression (di);
2991 dim = d_number_component (di);
2996 if (! d_check_char (di, '_'))
2999 return d_make_comp (di, DEMANGLE_COMPONENT_VECTOR_TYPE, dim,
3000 cplus_demangle_type (di));
3003 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
3005 static struct demangle_component *
3006 d_pointer_to_member_type (struct d_info *di)
3008 struct demangle_component *cl;
3009 struct demangle_component *mem;
3011 if (! d_check_char (di, 'M'))
3014 cl = cplus_demangle_type (di);
3018 /* The ABI says, "The type of a non-static member function is considered
3019 to be different, for the purposes of substitution, from the type of a
3020 namespace-scope or static member function whose type appears
3021 similar. The types of two non-static member functions are considered
3022 to be different, for the purposes of substitution, if the functions
3023 are members of different classes. In other words, for the purposes of
3024 substitution, the class of which the function is a member is
3025 considered part of the type of function."
3027 For a pointer to member function, this call to cplus_demangle_type
3028 will end up adding a (possibly qualified) non-member function type to
3029 the substitution table, which is not correct; however, the member
3030 function type will never be used in a substitution, so putting the
3031 wrong type in the substitution table is harmless. */
3033 mem = cplus_demangle_type (di);
3037 return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem);
3040 /* <non-negative number> _ */
3043 d_compact_number (struct d_info *di)
3046 if (d_peek_char (di) == '_')
3048 else if (d_peek_char (di) == 'n')
3051 num = d_number (di) + 1;
3053 if (num < 0 || ! d_check_char (di, '_'))
3058 /* <template-param> ::= T_
3059 ::= T <(parameter-2 non-negative) number> _
3062 static struct demangle_component *
3063 d_template_param (struct d_info *di)
3067 if (! d_check_char (di, 'T'))
3070 param = d_compact_number (di);
3076 return d_make_template_param (di, param);
3079 /* <template-args> ::= I <template-arg>+ E */
3081 static struct demangle_component *
3082 d_template_args (struct d_info *di)
3084 if (d_peek_char (di) != 'I'
3085 && d_peek_char (di) != 'J')
3089 return d_template_args_1 (di);
3092 /* <template-arg>* E */
3094 static struct demangle_component *
3095 d_template_args_1 (struct d_info *di)
3097 struct demangle_component *hold_last_name;
3098 struct demangle_component *al;
3099 struct demangle_component **pal;
3101 /* Preserve the last name we saw--don't let the template arguments
3102 clobber it, as that would give us the wrong name for a subsequent
3103 constructor or destructor. */
3104 hold_last_name = di->last_name;
3106 if (d_peek_char (di) == 'E')
3108 /* An argument pack can be empty. */
3110 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, NULL, NULL);
3117 struct demangle_component *a;
3119 a = d_template_arg (di);
3123 *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL);
3126 pal = &d_right (*pal);
3128 if (d_peek_char (di) == 'E')
3135 di->last_name = hold_last_name;
3140 /* <template-arg> ::= <type>
3141 ::= X <expression> E
3145 static struct demangle_component *
3146 d_template_arg (struct d_info *di)
3148 struct demangle_component *ret;
3150 switch (d_peek_char (di))
3154 ret = d_expression (di);
3155 if (! d_check_char (di, 'E'))
3160 return d_expr_primary (di);
3164 /* An argument pack. */
3165 return d_template_args (di);
3168 return cplus_demangle_type (di);
3172 /* Parse a sequence of expressions until we hit the terminator
3175 static struct demangle_component *
3176 d_exprlist (struct d_info *di, char terminator)
3178 struct demangle_component *list = NULL;
3179 struct demangle_component **p = &list;
3181 if (d_peek_char (di) == terminator)
3184 return d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, NULL, NULL);
3189 struct demangle_component *arg = d_expression (di);
3193 *p = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, arg, NULL);
3198 if (d_peek_char (di) == terminator)
3208 /* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
3209 dynamic_cast, static_cast or reinterpret_cast. */
3212 op_is_new_cast (struct demangle_component *op)
3214 const char *code = op->u.s_operator.op->code;
3215 return (code[1] == 'c'
3216 && (code[0] == 's' || code[0] == 'd'
3217 || code[0] == 'c' || code[0] == 'r'));
3220 /* <expression> ::= <(unary) operator-name> <expression>
3221 ::= <(binary) operator-name> <expression> <expression>
3222 ::= <(trinary) operator-name> <expression> <expression> <expression>
3223 ::= cl <expression>+ E
3225 ::= <template-param>
3226 ::= sr <type> <unqualified-name>
3227 ::= sr <type> <unqualified-name> <template-args>
3231 static inline struct demangle_component *
3232 d_expression_1 (struct d_info *di)
3236 peek = d_peek_char (di);
3238 return d_expr_primary (di);
3239 else if (peek == 'T')
3240 return d_template_param (di);
3241 else if (peek == 's' && d_peek_next_char (di) == 'r')
3243 struct demangle_component *type;
3244 struct demangle_component *name;
3247 type = cplus_demangle_type (di);
3248 name = d_unqualified_name (di);
3249 if (d_peek_char (di) != 'I')
3250 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name);
3252 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type,
3253 d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3254 d_template_args (di)));
3256 else if (peek == 's' && d_peek_next_char (di) == 'p')
3259 return d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
3260 d_expression_1 (di), NULL);
3262 else if (peek == 'f' && d_peek_next_char (di) == 'p')
3264 /* Function parameter used in a late-specified return type. */
3267 if (d_peek_char (di) == 'T')
3269 /* 'this' parameter. */
3275 index = d_compact_number (di);
3276 if (index == INT_MAX || index == -1)
3280 return d_make_function_param (di, index);
3282 else if (IS_DIGIT (peek)
3283 || (peek == 'o' && d_peek_next_char (di) == 'n'))
3285 /* We can get an unqualified name as an expression in the case of
3286 a dependent function call, i.e. decltype(f(t)). */
3287 struct demangle_component *name;
3290 /* operator-function-id, i.e. operator+(t). */
3293 name = d_unqualified_name (di);
3296 if (d_peek_char (di) == 'I')
3297 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3298 d_template_args (di));
3302 else if ((peek == 'i' || peek == 't')
3303 && d_peek_next_char (di) == 'l')
3305 /* Brace-enclosed initializer list, untyped or typed. */
3306 struct demangle_component *type = NULL;
3308 type = cplus_demangle_type (di);
3309 if (!d_peek_next_char (di))
3312 return d_make_comp (di, DEMANGLE_COMPONENT_INITIALIZER_LIST,
3313 type, d_exprlist (di, 'E'));
3317 struct demangle_component *op;
3318 const char *code = NULL;
3321 op = d_operator_name (di);
3325 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
3327 code = op->u.s_operator.op->code;
3328 di->expansion += op->u.s_operator.op->len - 2;
3329 if (strcmp (code, "st") == 0)
3330 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3331 cplus_demangle_type (di));
3338 case DEMANGLE_COMPONENT_OPERATOR:
3339 args = op->u.s_operator.op->args;
3341 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
3342 args = op->u.s_extended_operator.args;
3344 case DEMANGLE_COMPONENT_CAST:
3352 return d_make_comp (di, DEMANGLE_COMPONENT_NULLARY, op, NULL);
3356 struct demangle_component *operand;
3359 if (code && (code[0] == 'p' || code[0] == 'm')
3360 && code[1] == code[0])
3361 /* pp_ and mm_ are the prefix variants. */
3362 suffix = !d_check_char (di, '_');
3364 if (op->type == DEMANGLE_COMPONENT_CAST
3365 && d_check_char (di, '_'))
3366 operand = d_exprlist (di, 'E');
3367 else if (code && !strcmp (code, "sP"))
3368 operand = d_template_args_1 (di);
3370 operand = d_expression_1 (di);
3373 /* Indicate the suffix variant for d_print_comp. */
3374 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3376 DEMANGLE_COMPONENT_BINARY_ARGS,
3379 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3384 struct demangle_component *left;
3385 struct demangle_component *right;
3389 if (op_is_new_cast (op))
3390 left = cplus_demangle_type (di);
3391 else if (code[0] == 'f')
3392 /* fold-expression. */
3393 left = d_operator_name (di);
3395 left = d_expression_1 (di);
3396 if (!strcmp (code, "cl"))
3397 right = d_exprlist (di, 'E');
3398 else if (!strcmp (code, "dt") || !strcmp (code, "pt"))
3400 right = d_unqualified_name (di);
3401 if (d_peek_char (di) == 'I')
3402 right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE,
3403 right, d_template_args (di));
3406 right = d_expression_1 (di);
3408 return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
3410 DEMANGLE_COMPONENT_BINARY_ARGS,
3415 struct demangle_component *first;
3416 struct demangle_component *second;
3417 struct demangle_component *third;
3421 else if (!strcmp (code, "qu"))
3423 /* ?: expression. */
3424 first = d_expression_1 (di);
3425 second = d_expression_1 (di);
3426 third = d_expression_1 (di);
3430 else if (code[0] == 'f')
3432 /* fold-expression. */
3433 first = d_operator_name (di);
3434 second = d_expression_1 (di);
3435 third = d_expression_1 (di);
3439 else if (code[0] == 'n')
3441 /* new-expression. */
3442 if (code[1] != 'w' && code[1] != 'a')
3444 first = d_exprlist (di, '_');
3445 second = cplus_demangle_type (di);
3446 if (d_peek_char (di) == 'E')
3451 else if (d_peek_char (di) == 'p'
3452 && d_peek_next_char (di) == 'i')
3454 /* Parenthesized initializer. */
3456 third = d_exprlist (di, 'E');
3458 else if (d_peek_char (di) == 'i'
3459 && d_peek_next_char (di) == 'l')
3460 /* initializer-list. */
3461 third = d_expression_1 (di);
3467 return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op,
3469 DEMANGLE_COMPONENT_TRINARY_ARG1,
3472 DEMANGLE_COMPONENT_TRINARY_ARG2,
3481 static struct demangle_component *
3482 d_expression (struct d_info *di)
3484 struct demangle_component *ret;
3485 int was_expression = di->is_expression;
3487 di->is_expression = 1;
3488 ret = d_expression_1 (di);
3489 di->is_expression = was_expression;
3493 /* <expr-primary> ::= L <type> <(value) number> E
3494 ::= L <type> <(value) float> E
3495 ::= L <mangled-name> E
3498 static struct demangle_component *
3499 d_expr_primary (struct d_info *di)
3501 struct demangle_component *ret;
3503 if (! d_check_char (di, 'L'))
3505 if (d_peek_char (di) == '_'
3506 /* Workaround for G++ bug; see comment in write_template_arg. */
3507 || d_peek_char (di) == 'Z')
3508 ret = cplus_demangle_mangled_name (di, 0);
3511 struct demangle_component *type;
3512 enum demangle_component_type t;
3515 type = cplus_demangle_type (di);
3519 /* If we have a type we know how to print, we aren't going to
3520 print the type name itself. */
3521 if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
3522 && type->u.s_builtin.type->print != D_PRINT_DEFAULT)
3523 di->expansion -= type->u.s_builtin.type->len;
3525 /* Rather than try to interpret the literal value, we just
3526 collect it as a string. Note that it's possible to have a
3527 floating point literal here. The ABI specifies that the
3528 format of such literals is machine independent. That's fine,
3529 but what's not fine is that versions of g++ up to 3.2 with
3530 -fabi-version=1 used upper case letters in the hex constant,
3531 and dumped out gcc's internal representation. That makes it
3532 hard to tell where the constant ends, and hard to dump the
3533 constant in any readable form anyhow. We don't attempt to
3534 handle these cases. */
3536 t = DEMANGLE_COMPONENT_LITERAL;
3537 if (d_peek_char (di) == 'n')
3539 t = DEMANGLE_COMPONENT_LITERAL_NEG;
3543 while (d_peek_char (di) != 'E')
3545 if (d_peek_char (di) == '\0')
3549 ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s));
3551 if (! d_check_char (di, 'E'))
3556 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3557 ::= Z <(function) encoding> E s [<discriminator>]
3558 ::= Z <(function) encoding> E d [<parameter> number>] _ <entity name>
3561 static struct demangle_component *
3562 d_local_name (struct d_info *di)
3564 struct demangle_component *function;
3566 if (! d_check_char (di, 'Z'))
3569 function = d_encoding (di, 0);
3571 if (! d_check_char (di, 'E'))
3574 if (d_peek_char (di) == 's')
3577 if (! d_discriminator (di))
3579 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function,
3580 d_make_name (di, "string literal",
3581 sizeof "string literal" - 1));
3585 struct demangle_component *name;
3588 if (d_peek_char (di) == 'd')
3590 /* Default argument scope: d <number> _. */
3592 num = d_compact_number (di);
3601 /* Lambdas and unnamed types have internal discriminators. */
3602 case DEMANGLE_COMPONENT_LAMBDA:
3603 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
3606 if (! d_discriminator (di))
3610 name = d_make_default_arg (di, num, name);
3611 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
3615 /* <discriminator> ::= _ <number> # when number < 10
3616 ::= __ <number> _ # when number >= 10
3618 <discriminator> ::= _ <number> # when number >=10
3619 is also accepted to support gcc versions that wrongly mangled that way.
3621 We demangle the discriminator, but we don't print it out. FIXME:
3622 We should print it out in verbose mode. */
3625 d_discriminator (struct d_info *di)
3627 int discrim, num_underscores = 1;
3629 if (d_peek_char (di) != '_')
3632 if (d_peek_char (di) == '_')
3638 discrim = d_number (di);
3641 if (num_underscores > 1 && discrim >= 10)
3643 if (d_peek_char (di) == '_')
3652 /* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */
3654 static struct demangle_component *
3655 d_lambda (struct d_info *di)
3657 struct demangle_component *tl;
3658 struct demangle_component *ret;
3661 if (! d_check_char (di, 'U'))
3663 if (! d_check_char (di, 'l'))
3666 tl = d_parmlist (di);
3670 if (! d_check_char (di, 'E'))
3673 num = d_compact_number (di);
3677 ret = d_make_empty (di);
3680 ret->type = DEMANGLE_COMPONENT_LAMBDA;
3681 ret->u.s_unary_num.sub = tl;
3682 ret->u.s_unary_num.num = num;
3685 if (! d_add_substitution (di, ret))
3691 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
3693 static struct demangle_component *
3694 d_unnamed_type (struct d_info *di)
3696 struct demangle_component *ret;
3699 if (! d_check_char (di, 'U'))
3701 if (! d_check_char (di, 't'))
3704 num = d_compact_number (di);
3708 ret = d_make_empty (di);
3711 ret->type = DEMANGLE_COMPONENT_UNNAMED_TYPE;
3712 ret->u.s_number.number = num;
3715 if (! d_add_substitution (di, ret))
3721 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
3724 static struct demangle_component *
3725 d_clone_suffix (struct d_info *di, struct demangle_component *encoding)
3727 const char *suffix = d_str (di);
3728 const char *pend = suffix;
3729 struct demangle_component *n;
3731 if (*pend == '.' && (IS_LOWER (pend[1]) || pend[1] == '_'))
3734 while (IS_LOWER (*pend) || *pend == '_')
3737 while (*pend == '.' && IS_DIGIT (pend[1]))
3740 while (IS_DIGIT (*pend))
3743 d_advance (di, pend - suffix);
3744 n = d_make_name (di, suffix, pend - suffix);
3745 return d_make_comp (di, DEMANGLE_COMPONENT_CLONE, encoding, n);
3748 /* Add a new substitution. */
3751 d_add_substitution (struct d_info *di, struct demangle_component *dc)
3755 if (di->next_sub >= di->num_subs)
3757 di->subs[di->next_sub] = dc;
3762 /* <substitution> ::= S <seq-id> _
3772 If PREFIX is non-zero, then this type is being used as a prefix in
3773 a qualified name. In this case, for the standard substitutions, we
3774 need to check whether we are being used as a prefix for a
3775 constructor or destructor, and return a full template name.
3776 Otherwise we will get something like std::iostream::~iostream()
3777 which does not correspond particularly well to any function which
3778 actually appears in the source.
3781 static const struct d_standard_sub_info standard_subs[] =
3786 { 'a', NL ("std::allocator"),
3787 NL ("std::allocator"),
3789 { 'b', NL ("std::basic_string"),
3790 NL ("std::basic_string"),
3791 NL ("basic_string") },
3792 { 's', NL ("std::string"),
3793 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
3794 NL ("basic_string") },
3795 { 'i', NL ("std::istream"),
3796 NL ("std::basic_istream<char, std::char_traits<char> >"),
3797 NL ("basic_istream") },
3798 { 'o', NL ("std::ostream"),
3799 NL ("std::basic_ostream<char, std::char_traits<char> >"),
3800 NL ("basic_ostream") },
3801 { 'd', NL ("std::iostream"),
3802 NL ("std::basic_iostream<char, std::char_traits<char> >"),
3803 NL ("basic_iostream") }
3806 static struct demangle_component *
3807 d_substitution (struct d_info *di, int prefix)
3811 if (! d_check_char (di, 'S'))
3814 c = d_next_char (di);
3815 if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
3824 unsigned int new_id;
3827 new_id = id * 36 + c - '0';
3828 else if (IS_UPPER (c))
3829 new_id = id * 36 + c - 'A' + 10;
3835 c = d_next_char (di);
3842 if (id >= (unsigned int) di->next_sub)
3847 return di->subs[id];
3852 const struct d_standard_sub_info *p;
3853 const struct d_standard_sub_info *pend;
3855 verbose = (di->options & DMGL_VERBOSE) != 0;
3856 if (! verbose && prefix)
3860 peek = d_peek_char (di);
3861 if (peek == 'C' || peek == 'D')
3865 pend = (&standard_subs[0]
3866 + sizeof standard_subs / sizeof standard_subs[0]);
3867 for (p = &standard_subs[0]; p < pend; ++p)
3873 struct demangle_component *dc;
3875 if (p->set_last_name != NULL)
3876 di->last_name = d_make_sub (di, p->set_last_name,
3877 p->set_last_name_len);
3880 s = p->full_expansion;
3885 s = p->simple_expansion;
3886 len = p->simple_len;
3888 di->expansion += len;
3889 dc = d_make_sub (di, s, len);
3890 if (d_peek_char (di) == 'B')
3892 /* If there are ABI tags on the abbreviation, it becomes
3893 a substitution candidate. */
3894 dc = d_abi_tags (di, dc);
3895 d_add_substitution (di, dc);
3906 d_checkpoint (struct d_info *di, struct d_info_checkpoint *checkpoint)
3908 checkpoint->n = di->n;
3909 checkpoint->next_comp = di->next_comp;
3910 checkpoint->next_sub = di->next_sub;
3911 checkpoint->did_subs = di->did_subs;
3912 checkpoint->expansion = di->expansion;
3916 d_backtrack (struct d_info *di, struct d_info_checkpoint *checkpoint)
3918 di->n = checkpoint->n;
3919 di->next_comp = checkpoint->next_comp;
3920 di->next_sub = checkpoint->next_sub;
3921 di->did_subs = checkpoint->did_subs;
3922 di->expansion = checkpoint->expansion;
3925 /* Initialize a growable string. */
3928 d_growable_string_init (struct d_growable_string *dgs, size_t estimate)
3933 dgs->allocation_failure = 0;
3936 d_growable_string_resize (dgs, estimate);
3939 /* Grow a growable string to a given size. */
3942 d_growable_string_resize (struct d_growable_string *dgs, size_t need)
3947 if (dgs->allocation_failure)
3950 /* Start allocation at two bytes to avoid any possibility of confusion
3951 with the special value of 1 used as a return in *palc to indicate
3952 allocation failures. */
3953 newalc = dgs->alc > 0 ? dgs->alc : 2;
3954 while (newalc < need)
3957 newbuf = (char *) realloc (dgs->buf, newalc);
3964 dgs->allocation_failure = 1;
3971 /* Append a buffer to a growable string. */
3974 d_growable_string_append_buffer (struct d_growable_string *dgs,
3975 const char *s, size_t l)
3979 need = dgs->len + l + 1;
3980 if (need > dgs->alc)
3981 d_growable_string_resize (dgs, need);
3983 if (dgs->allocation_failure)
3986 memcpy (dgs->buf + dgs->len, s, l);
3987 dgs->buf[dgs->len + l] = '\0';
3991 /* Bridge growable strings to the callback mechanism. */
3994 d_growable_string_callback_adapter (const char *s, size_t l, void *opaque)
3996 struct d_growable_string *dgs = (struct d_growable_string*) opaque;
3998 d_growable_string_append_buffer (dgs, s, l);
4001 /* Walk the tree, counting the number of templates encountered, and
4002 the number of times a scope might be saved. These counts will be
4003 used to allocate data structures for d_print_comp, so the logic
4004 here must mirror the logic d_print_comp will use. It is not
4005 important that the resulting numbers are exact, so long as they
4006 are larger than the actual numbers encountered. */
4009 d_count_templates_scopes (int *num_templates, int *num_scopes,
4010 const struct demangle_component *dc)
4017 case DEMANGLE_COMPONENT_NAME:
4018 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4019 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
4020 case DEMANGLE_COMPONENT_SUB_STD:
4021 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4022 case DEMANGLE_COMPONENT_OPERATOR:
4023 case DEMANGLE_COMPONENT_CHARACTER:
4024 case DEMANGLE_COMPONENT_NUMBER:
4025 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
4028 case DEMANGLE_COMPONENT_TEMPLATE:
4030 goto recurse_left_right;
4032 case DEMANGLE_COMPONENT_REFERENCE:
4033 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
4034 if (d_left (dc)->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
4036 goto recurse_left_right;
4038 case DEMANGLE_COMPONENT_QUAL_NAME:
4039 case DEMANGLE_COMPONENT_LOCAL_NAME:
4040 case DEMANGLE_COMPONENT_TYPED_NAME:
4041 case DEMANGLE_COMPONENT_VTABLE:
4042 case DEMANGLE_COMPONENT_VTT:
4043 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
4044 case DEMANGLE_COMPONENT_TYPEINFO:
4045 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
4046 case DEMANGLE_COMPONENT_TYPEINFO_FN:
4047 case DEMANGLE_COMPONENT_THUNK:
4048 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
4049 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
4050 case DEMANGLE_COMPONENT_JAVA_CLASS:
4051 case DEMANGLE_COMPONENT_GUARD:
4052 case DEMANGLE_COMPONENT_TLS_INIT:
4053 case DEMANGLE_COMPONENT_TLS_WRAPPER:
4054 case DEMANGLE_COMPONENT_REFTEMP:
4055 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
4056 case DEMANGLE_COMPONENT_RESTRICT:
4057 case DEMANGLE_COMPONENT_VOLATILE:
4058 case DEMANGLE_COMPONENT_CONST:
4059 case DEMANGLE_COMPONENT_RESTRICT_THIS:
4060 case DEMANGLE_COMPONENT_VOLATILE_THIS:
4061 case DEMANGLE_COMPONENT_CONST_THIS:
4062 case DEMANGLE_COMPONENT_REFERENCE_THIS:
4063 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
4064 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
4065 case DEMANGLE_COMPONENT_NOEXCEPT:
4066 case DEMANGLE_COMPONENT_THROW_SPEC:
4067 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
4068 case DEMANGLE_COMPONENT_POINTER:
4069 case DEMANGLE_COMPONENT_COMPLEX:
4070 case DEMANGLE_COMPONENT_IMAGINARY:
4071 case DEMANGLE_COMPONENT_VENDOR_TYPE:
4072 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
4073 case DEMANGLE_COMPONENT_ARRAY_TYPE:
4074 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
4075 case DEMANGLE_COMPONENT_VECTOR_TYPE:
4076 case DEMANGLE_COMPONENT_ARGLIST:
4077 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
4078 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
4079 case DEMANGLE_COMPONENT_CAST:
4080 case DEMANGLE_COMPONENT_CONVERSION:
4081 case DEMANGLE_COMPONENT_NULLARY:
4082 case DEMANGLE_COMPONENT_UNARY:
4083 case DEMANGLE_COMPONENT_BINARY:
4084 case DEMANGLE_COMPONENT_BINARY_ARGS:
4085 case DEMANGLE_COMPONENT_TRINARY:
4086 case DEMANGLE_COMPONENT_TRINARY_ARG1:
4087 case DEMANGLE_COMPONENT_TRINARY_ARG2:
4088 case DEMANGLE_COMPONENT_LITERAL:
4089 case DEMANGLE_COMPONENT_LITERAL_NEG:
4090 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
4091 case DEMANGLE_COMPONENT_COMPOUND_NAME:
4092 case DEMANGLE_COMPONENT_DECLTYPE:
4093 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
4094 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
4095 case DEMANGLE_COMPONENT_PACK_EXPANSION:
4096 case DEMANGLE_COMPONENT_TAGGED_NAME:
4097 case DEMANGLE_COMPONENT_CLONE:
4099 d_count_templates_scopes (num_templates, num_scopes,
4101 d_count_templates_scopes (num_templates, num_scopes,
4105 case DEMANGLE_COMPONENT_CTOR:
4106 d_count_templates_scopes (num_templates, num_scopes,
4110 case DEMANGLE_COMPONENT_DTOR:
4111 d_count_templates_scopes (num_templates, num_scopes,
4115 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4116 d_count_templates_scopes (num_templates, num_scopes,
4117 dc->u.s_extended_operator.name);
4120 case DEMANGLE_COMPONENT_FIXED_TYPE:
4121 d_count_templates_scopes (num_templates, num_scopes,
4122 dc->u.s_fixed.length);
4125 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
4126 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
4127 d_count_templates_scopes (num_templates, num_scopes,
4131 case DEMANGLE_COMPONENT_LAMBDA:
4132 case DEMANGLE_COMPONENT_DEFAULT_ARG:
4133 d_count_templates_scopes (num_templates, num_scopes,
4134 dc->u.s_unary_num.sub);
4139 /* Initialize a print information structure. */
4142 d_print_init (struct d_print_info *dpi, demangle_callbackref callback,
4143 void *opaque, const struct demangle_component *dc)
4146 dpi->last_char = '\0';
4147 dpi->templates = NULL;
4148 dpi->modifiers = NULL;
4149 dpi->pack_index = 0;
4150 dpi->flush_count = 0;
4152 dpi->callback = callback;
4153 dpi->opaque = opaque;
4155 dpi->demangle_failure = 0;
4156 dpi->is_lambda_arg = 0;
4158 dpi->component_stack = NULL;
4160 dpi->saved_scopes = NULL;
4161 dpi->next_saved_scope = 0;
4162 dpi->num_saved_scopes = 0;
4164 dpi->copy_templates = NULL;
4165 dpi->next_copy_template = 0;
4166 dpi->num_copy_templates = 0;
4168 d_count_templates_scopes (&dpi->num_copy_templates,
4169 &dpi->num_saved_scopes, dc);
4170 dpi->num_copy_templates *= dpi->num_saved_scopes;
4172 dpi->current_template = NULL;
4175 /* Indicate that an error occurred during printing, and test for error. */
4178 d_print_error (struct d_print_info *dpi)
4180 dpi->demangle_failure = 1;
4184 d_print_saw_error (struct d_print_info *dpi)
4186 return dpi->demangle_failure != 0;
4189 /* Flush buffered characters to the callback. */
4192 d_print_flush (struct d_print_info *dpi)
4194 dpi->buf[dpi->len] = '\0';
4195 dpi->callback (dpi->buf, dpi->len, dpi->opaque);
4200 /* Append characters and buffers for printing. */
4203 d_append_char (struct d_print_info *dpi, char c)
4205 if (dpi->len == sizeof (dpi->buf) - 1)
4206 d_print_flush (dpi);
4208 dpi->buf[dpi->len++] = c;
4213 d_append_buffer (struct d_print_info *dpi, const char *s, size_t l)
4217 for (i = 0; i < l; i++)
4218 d_append_char (dpi, s[i]);
4222 d_append_string (struct d_print_info *dpi, const char *s)
4224 d_append_buffer (dpi, s, strlen (s));
4228 d_append_num (struct d_print_info *dpi, int l)
4231 sprintf (buf,"%d", l);
4232 d_append_string (dpi, buf);
4236 d_last_char (struct d_print_info *dpi)
4238 return dpi->last_char;
4241 /* Turn components into a human readable string. OPTIONS is the
4242 options bits passed to the demangler. DC is the tree to print.
4243 CALLBACK is a function to call to flush demangled string segments
4244 as they fill the intermediate buffer, and OPAQUE is a generalized
4245 callback argument. On success, this returns 1. On failure,
4246 it returns 0, indicating a bad parse. It does not use heap
4247 memory to build an output string, so cannot encounter memory
4248 allocation failure. */
4250 CP_STATIC_IF_GLIBCPP_V3
4252 cplus_demangle_print_callback (int options,
4253 struct demangle_component *dc,
4254 demangle_callbackref callback, void *opaque)
4256 struct d_print_info dpi;
4258 d_print_init (&dpi, callback, opaque, dc);
4261 #ifdef CP_DYNAMIC_ARRAYS
4262 /* Avoid zero-length VLAs, which are prohibited by the C99 standard
4263 and flagged as errors by Address Sanitizer. */
4264 __extension__ struct d_saved_scope scopes[(dpi.num_saved_scopes > 0)
4265 ? dpi.num_saved_scopes : 1];
4266 __extension__ struct d_print_template temps[(dpi.num_copy_templates > 0)
4267 ? dpi.num_copy_templates : 1];
4269 dpi.saved_scopes = scopes;
4270 dpi.copy_templates = temps;
4272 dpi.saved_scopes = alloca (dpi.num_saved_scopes
4273 * sizeof (*dpi.saved_scopes));
4274 dpi.copy_templates = alloca (dpi.num_copy_templates
4275 * sizeof (*dpi.copy_templates));
4278 d_print_comp (&dpi, options, dc);
4281 d_print_flush (&dpi);
4283 return ! d_print_saw_error (&dpi);
4286 /* Turn components into a human readable string. OPTIONS is the
4287 options bits passed to the demangler. DC is the tree to print.
4288 ESTIMATE is a guess at the length of the result. This returns a
4289 string allocated by malloc, or NULL on error. On success, this
4290 sets *PALC to the size of the allocated buffer. On failure, this
4291 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
4294 CP_STATIC_IF_GLIBCPP_V3
4296 cplus_demangle_print (int options, struct demangle_component *dc,
4297 int estimate, size_t *palc)
4299 struct d_growable_string dgs;
4301 d_growable_string_init (&dgs, estimate);
4303 if (! cplus_demangle_print_callback (options, dc,
4304 d_growable_string_callback_adapter,
4312 *palc = dgs.allocation_failure ? 1 : dgs.alc;
4316 /* Returns the I'th element of the template arglist ARGS, or NULL on
4317 failure. If I is negative, return the entire arglist. */
4319 static struct demangle_component *
4320 d_index_template_argument (struct demangle_component *args, int i)
4322 struct demangle_component *a;
4325 /* Print the whole argument pack. */
4332 if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4338 if (i != 0 || a == NULL)
4344 /* Returns the template argument from the current context indicated by DC,
4345 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
4347 static struct demangle_component *
4348 d_lookup_template_argument (struct d_print_info *dpi,
4349 const struct demangle_component *dc)
4351 if (dpi->templates == NULL)
4353 d_print_error (dpi);
4357 return d_index_template_argument
4358 (d_right (dpi->templates->template_decl),
4359 dc->u.s_number.number);
4362 /* Returns a template argument pack used in DC (any will do), or NULL. */
4364 static struct demangle_component *
4365 d_find_pack (struct d_print_info *dpi,
4366 const struct demangle_component *dc)
4368 struct demangle_component *a;
4374 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4375 a = d_lookup_template_argument (dpi, dc);
4376 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4380 case DEMANGLE_COMPONENT_PACK_EXPANSION:
4383 case DEMANGLE_COMPONENT_LAMBDA:
4384 case DEMANGLE_COMPONENT_NAME:
4385 case DEMANGLE_COMPONENT_TAGGED_NAME:
4386 case DEMANGLE_COMPONENT_OPERATOR:
4387 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4388 case DEMANGLE_COMPONENT_SUB_STD:
4389 case DEMANGLE_COMPONENT_CHARACTER:
4390 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
4391 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
4392 case DEMANGLE_COMPONENT_FIXED_TYPE:
4393 case DEMANGLE_COMPONENT_DEFAULT_ARG:
4394 case DEMANGLE_COMPONENT_NUMBER:
4397 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4398 return d_find_pack (dpi, dc->u.s_extended_operator.name);
4399 case DEMANGLE_COMPONENT_CTOR:
4400 return d_find_pack (dpi, dc->u.s_ctor.name);
4401 case DEMANGLE_COMPONENT_DTOR:
4402 return d_find_pack (dpi, dc->u.s_dtor.name);
4405 a = d_find_pack (dpi, d_left (dc));
4408 return d_find_pack (dpi, d_right (dc));
4412 /* Returns the length of the template argument pack DC. */
4415 d_pack_length (const struct demangle_component *dc)
4418 while (dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
4419 && d_left (dc) != NULL)
4427 /* Returns the number of template args in DC, expanding any pack expansions
4431 d_args_length (struct d_print_info *dpi, const struct demangle_component *dc)
4434 for (; dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST;
4437 struct demangle_component *elt = d_left (dc);
4440 if (elt->type == DEMANGLE_COMPONENT_PACK_EXPANSION)
4442 struct demangle_component *a = d_find_pack (dpi, d_left (elt));
4443 count += d_pack_length (a);
4451 /* DC is a component of a mangled expression. Print it, wrapped in parens
4455 d_print_subexpr (struct d_print_info *dpi, int options,
4456 struct demangle_component *dc)
4459 if (dc->type == DEMANGLE_COMPONENT_NAME
4460 || dc->type == DEMANGLE_COMPONENT_QUAL_NAME
4461 || dc->type == DEMANGLE_COMPONENT_INITIALIZER_LIST
4462 || dc->type == DEMANGLE_COMPONENT_FUNCTION_PARAM)
4465 d_append_char (dpi, '(');
4466 d_print_comp (dpi, options, dc);
4468 d_append_char (dpi, ')');
4471 /* Save the current scope. */
4474 d_save_scope (struct d_print_info *dpi,
4475 const struct demangle_component *container)
4477 struct d_saved_scope *scope;
4478 struct d_print_template *src, **link;
4480 if (dpi->next_saved_scope >= dpi->num_saved_scopes)
4482 d_print_error (dpi);
4485 scope = &dpi->saved_scopes[dpi->next_saved_scope];
4486 dpi->next_saved_scope++;
4488 scope->container = container;
4489 link = &scope->templates;
4491 for (src = dpi->templates; src != NULL; src = src->next)
4493 struct d_print_template *dst;
4495 if (dpi->next_copy_template >= dpi->num_copy_templates)
4497 d_print_error (dpi);
4500 dst = &dpi->copy_templates[dpi->next_copy_template];
4501 dpi->next_copy_template++;
4503 dst->template_decl = src->template_decl;
4511 /* Attempt to locate a previously saved scope. Returns NULL if no
4512 corresponding saved scope was found. */
4514 static struct d_saved_scope *
4515 d_get_saved_scope (struct d_print_info *dpi,
4516 const struct demangle_component *container)
4520 for (i = 0; i < dpi->next_saved_scope; i++)
4521 if (dpi->saved_scopes[i].container == container)
4522 return &dpi->saved_scopes[i];
4527 /* If DC is a C++17 fold-expression, print it and return true; otherwise
4531 d_maybe_print_fold_expression (struct d_print_info *dpi, int options,
4532 struct demangle_component *dc)
4534 struct demangle_component *ops, *operator_, *op1, *op2;
4537 const char *fold_code = d_left (dc)->u.s_operator.op->code;
4538 if (fold_code[0] != 'f')
4542 operator_ = d_left (ops);
4543 op1 = d_right (ops);
4545 if (op1->type == DEMANGLE_COMPONENT_TRINARY_ARG2)
4547 op2 = d_right (op1);
4551 /* Print the whole pack. */
4552 save_idx = dpi->pack_index;
4553 dpi->pack_index = -1;
4555 switch (fold_code[1])
4557 /* Unary left fold, (... + X). */
4559 d_append_string (dpi, "(...");
4560 d_print_expr_op (dpi, options, operator_);
4561 d_print_subexpr (dpi, options, op1);
4562 d_append_char (dpi, ')');
4565 /* Unary right fold, (X + ...). */
4567 d_append_char (dpi, '(');
4568 d_print_subexpr (dpi, options, op1);
4569 d_print_expr_op (dpi, options, operator_);
4570 d_append_string (dpi, "...)");
4573 /* Binary left fold, (42 + ... + X). */
4575 /* Binary right fold, (X + ... + 42). */
4577 d_append_char (dpi, '(');
4578 d_print_subexpr (dpi, options, op1);
4579 d_print_expr_op (dpi, options, operator_);
4580 d_append_string (dpi, "...");
4581 d_print_expr_op (dpi, options, operator_);
4582 d_print_subexpr (dpi, options, op2);
4583 d_append_char (dpi, ')');
4587 dpi->pack_index = save_idx;
4591 /* Subroutine to handle components. */
4594 d_print_comp_inner (struct d_print_info *dpi, int options,
4595 struct demangle_component *dc)
4597 /* Magic variable to let reference smashing skip over the next modifier
4598 without needing to modify *dc. */
4599 struct demangle_component *mod_inner = NULL;
4601 /* Variable used to store the current templates while a previously
4602 captured scope is used. */
4603 struct d_print_template *saved_templates;
4605 /* Nonzero if templates have been stored in the above variable. */
4606 int need_template_restore = 0;
4610 d_print_error (dpi);
4613 if (d_print_saw_error (dpi))
4618 case DEMANGLE_COMPONENT_NAME:
4619 if ((options & DMGL_JAVA) == 0)
4620 d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len);
4622 d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
4625 case DEMANGLE_COMPONENT_TAGGED_NAME:
4626 d_print_comp (dpi, options, d_left (dc));
4627 d_append_string (dpi, "[abi:");
4628 d_print_comp (dpi, options, d_right (dc));
4629 d_append_char (dpi, ']');
4632 case DEMANGLE_COMPONENT_QUAL_NAME:
4633 case DEMANGLE_COMPONENT_LOCAL_NAME:
4634 d_print_comp (dpi, options, d_left (dc));
4635 if ((options & DMGL_JAVA) == 0)
4636 d_append_string (dpi, "::");
4638 d_append_char (dpi, '.');
4640 struct demangle_component *local_name = d_right (dc);
4641 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4643 d_append_string (dpi, "{default arg#");
4644 d_append_num (dpi, local_name->u.s_unary_num.num + 1);
4645 d_append_string (dpi, "}::");
4646 local_name = local_name->u.s_unary_num.sub;
4648 d_print_comp (dpi, options, local_name);
4652 case DEMANGLE_COMPONENT_TYPED_NAME:
4654 struct d_print_mod *hold_modifiers;
4655 struct demangle_component *typed_name;
4656 struct d_print_mod adpm[4];
4658 struct d_print_template dpt;
4660 /* Pass the name down to the type so that it can be printed in
4661 the right place for the type. We also have to pass down
4662 any CV-qualifiers, which apply to the this parameter. */
4663 hold_modifiers = dpi->modifiers;
4666 typed_name = d_left (dc);
4667 while (typed_name != NULL)
4669 if (i >= sizeof adpm / sizeof adpm[0])
4671 d_print_error (dpi);
4675 adpm[i].next = dpi->modifiers;
4676 dpi->modifiers = &adpm[i];
4677 adpm[i].mod = typed_name;
4678 adpm[i].printed = 0;
4679 adpm[i].templates = dpi->templates;
4682 if (!is_fnqual_component_type (typed_name->type))
4685 typed_name = d_left (typed_name);
4688 if (typed_name == NULL)
4690 d_print_error (dpi);
4694 /* If typed_name is a template, then it applies to the
4695 function type as well. */
4696 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
4698 dpt.next = dpi->templates;
4699 dpi->templates = &dpt;
4700 dpt.template_decl = typed_name;
4703 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
4704 there may be CV-qualifiers on its right argument which
4705 really apply here; this happens when parsing a class which
4706 is local to a function. */
4707 if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME)
4709 struct demangle_component *local_name;
4711 local_name = d_right (typed_name);
4712 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4713 local_name = local_name->u.s_unary_num.sub;
4714 if (local_name == NULL)
4716 d_print_error (dpi);
4719 while (is_fnqual_component_type (local_name->type))
4721 if (i >= sizeof adpm / sizeof adpm[0])
4723 d_print_error (dpi);
4727 adpm[i] = adpm[i - 1];
4728 adpm[i].next = &adpm[i - 1];
4729 dpi->modifiers = &adpm[i];
4731 adpm[i - 1].mod = local_name;
4732 adpm[i - 1].printed = 0;
4733 adpm[i - 1].templates = dpi->templates;
4736 local_name = d_left (local_name);
4740 d_print_comp (dpi, options, d_right (dc));
4742 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
4743 dpi->templates = dpt.next;
4745 /* If the modifiers didn't get printed by the type, print them
4750 if (! adpm[i].printed)
4752 d_append_char (dpi, ' ');
4753 d_print_mod (dpi, options, adpm[i].mod);
4757 dpi->modifiers = hold_modifiers;
4762 case DEMANGLE_COMPONENT_TEMPLATE:
4764 struct d_print_mod *hold_dpm;
4765 struct demangle_component *dcl;
4766 const struct demangle_component *hold_current;
4768 /* This template may need to be referenced by a cast operator
4769 contained in its subtree. */
4770 hold_current = dpi->current_template;
4771 dpi->current_template = dc;
4773 /* Don't push modifiers into a template definition. Doing so
4774 could give the wrong definition for a template argument.
4775 Instead, treat the template essentially as a name. */
4777 hold_dpm = dpi->modifiers;
4778 dpi->modifiers = NULL;
4782 if ((options & DMGL_JAVA) != 0
4783 && dcl->type == DEMANGLE_COMPONENT_NAME
4784 && dcl->u.s_name.len == 6
4785 && strncmp (dcl->u.s_name.s, "JArray", 6) == 0)
4787 /* Special-case Java arrays, so that JArray<TYPE> appears
4788 instead as TYPE[]. */
4790 d_print_comp (dpi, options, d_right (dc));
4791 d_append_string (dpi, "[]");
4795 d_print_comp (dpi, options, dcl);
4796 if (d_last_char (dpi) == '<')
4797 d_append_char (dpi, ' ');
4798 d_append_char (dpi, '<');
4799 d_print_comp (dpi, options, d_right (dc));
4800 /* Avoid generating two consecutive '>' characters, to avoid
4801 the C++ syntactic ambiguity. */
4802 if (d_last_char (dpi) == '>')
4803 d_append_char (dpi, ' ');
4804 d_append_char (dpi, '>');
4807 dpi->modifiers = hold_dpm;
4808 dpi->current_template = hold_current;
4813 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4814 if (dpi->is_lambda_arg)
4816 /* Show the template parm index, as that's how g++ displays
4817 these, and future proofs us against potential
4818 '[]<typename T> (T *a, T *b) {...}'. */
4819 d_append_buffer (dpi, "auto:", 5);
4820 d_append_num (dpi, dc->u.s_number.number + 1);
4824 struct d_print_template *hold_dpt;
4825 struct demangle_component *a = d_lookup_template_argument (dpi, dc);
4827 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4828 a = d_index_template_argument (a, dpi->pack_index);
4832 d_print_error (dpi);
4836 /* While processing this parameter, we need to pop the list
4837 of templates. This is because the template parameter may
4838 itself be a reference to a parameter of an outer
4841 hold_dpt = dpi->templates;
4842 dpi->templates = hold_dpt->next;
4844 d_print_comp (dpi, options, a);
4846 dpi->templates = hold_dpt;
4850 case DEMANGLE_COMPONENT_CTOR:
4851 d_print_comp (dpi, options, dc->u.s_ctor.name);
4854 case DEMANGLE_COMPONENT_DTOR:
4855 d_append_char (dpi, '~');
4856 d_print_comp (dpi, options, dc->u.s_dtor.name);
4859 case DEMANGLE_COMPONENT_VTABLE:
4860 d_append_string (dpi, "vtable for ");
4861 d_print_comp (dpi, options, d_left (dc));
4864 case DEMANGLE_COMPONENT_VTT:
4865 d_append_string (dpi, "VTT for ");
4866 d_print_comp (dpi, options, d_left (dc));
4869 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
4870 d_append_string (dpi, "construction vtable for ");
4871 d_print_comp (dpi, options, d_left (dc));
4872 d_append_string (dpi, "-in-");
4873 d_print_comp (dpi, options, d_right (dc));
4876 case DEMANGLE_COMPONENT_TYPEINFO:
4877 d_append_string (dpi, "typeinfo for ");
4878 d_print_comp (dpi, options, d_left (dc));
4881 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
4882 d_append_string (dpi, "typeinfo name for ");
4883 d_print_comp (dpi, options, d_left (dc));
4886 case DEMANGLE_COMPONENT_TYPEINFO_FN:
4887 d_append_string (dpi, "typeinfo fn for ");
4888 d_print_comp (dpi, options, d_left (dc));
4891 case DEMANGLE_COMPONENT_THUNK:
4892 d_append_string (dpi, "non-virtual thunk to ");
4893 d_print_comp (dpi, options, d_left (dc));
4896 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
4897 d_append_string (dpi, "virtual thunk to ");
4898 d_print_comp (dpi, options, d_left (dc));
4901 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
4902 d_append_string (dpi, "covariant return thunk to ");
4903 d_print_comp (dpi, options, d_left (dc));
4906 case DEMANGLE_COMPONENT_JAVA_CLASS:
4907 d_append_string (dpi, "java Class for ");
4908 d_print_comp (dpi, options, d_left (dc));
4911 case DEMANGLE_COMPONENT_GUARD:
4912 d_append_string (dpi, "guard variable for ");
4913 d_print_comp (dpi, options, d_left (dc));
4916 case DEMANGLE_COMPONENT_TLS_INIT:
4917 d_append_string (dpi, "TLS init function for ");
4918 d_print_comp (dpi, options, d_left (dc));
4921 case DEMANGLE_COMPONENT_TLS_WRAPPER:
4922 d_append_string (dpi, "TLS wrapper function for ");
4923 d_print_comp (dpi, options, d_left (dc));
4926 case DEMANGLE_COMPONENT_REFTEMP:
4927 d_append_string (dpi, "reference temporary #");
4928 d_print_comp (dpi, options, d_right (dc));
4929 d_append_string (dpi, " for ");
4930 d_print_comp (dpi, options, d_left (dc));
4933 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
4934 d_append_string (dpi, "hidden alias for ");
4935 d_print_comp (dpi, options, d_left (dc));
4938 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
4939 d_append_string (dpi, "transaction clone for ");
4940 d_print_comp (dpi, options, d_left (dc));
4943 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
4944 d_append_string (dpi, "non-transaction clone for ");
4945 d_print_comp (dpi, options, d_left (dc));
4948 case DEMANGLE_COMPONENT_SUB_STD:
4949 d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len);
4952 case DEMANGLE_COMPONENT_RESTRICT:
4953 case DEMANGLE_COMPONENT_VOLATILE:
4954 case DEMANGLE_COMPONENT_CONST:
4956 struct d_print_mod *pdpm;
4958 /* When printing arrays, it's possible to have cases where the
4959 same CV-qualifier gets pushed on the stack multiple times.
4960 We only need to print it once. */
4962 for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next)
4964 if (! pdpm->printed)
4966 if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT
4967 && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE
4968 && pdpm->mod->type != DEMANGLE_COMPONENT_CONST)
4970 if (pdpm->mod->type == dc->type)
4972 d_print_comp (dpi, options, d_left (dc));
4980 case DEMANGLE_COMPONENT_REFERENCE:
4981 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
4983 /* Handle reference smashing: & + && = &. */
4984 struct demangle_component *sub = d_left (dc);
4985 if (!dpi->is_lambda_arg
4986 && sub->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
4988 struct d_saved_scope *scope = d_get_saved_scope (dpi, sub);
4989 struct demangle_component *a;
4993 /* This is the first time SUB has been traversed.
4994 We need to capture the current templates so
4995 they can be restored if SUB is reentered as a
4997 d_save_scope (dpi, sub);
4998 if (d_print_saw_error (dpi))
5003 const struct d_component_stack *dcse;
5004 int found_self_or_parent = 0;
5006 /* This traversal is reentering SUB as a substition.
5007 If we are not beneath SUB or DC in the tree then we
5008 need to restore SUB's template stack temporarily. */
5009 for (dcse = dpi->component_stack; dcse != NULL;
5010 dcse = dcse->parent)
5014 && dcse != dpi->component_stack))
5016 found_self_or_parent = 1;
5021 if (!found_self_or_parent)
5023 saved_templates = dpi->templates;
5024 dpi->templates = scope->templates;
5025 need_template_restore = 1;
5029 a = d_lookup_template_argument (dpi, sub);
5030 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
5031 a = d_index_template_argument (a, dpi->pack_index);
5035 if (need_template_restore)
5036 dpi->templates = saved_templates;
5038 d_print_error (dpi);
5045 if (sub->type == DEMANGLE_COMPONENT_REFERENCE
5046 || sub->type == dc->type)
5048 else if (sub->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE)
5049 mod_inner = d_left (sub);
5053 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5054 case DEMANGLE_COMPONENT_POINTER:
5055 case DEMANGLE_COMPONENT_COMPLEX:
5056 case DEMANGLE_COMPONENT_IMAGINARY:
5057 FNQUAL_COMPONENT_CASE:
5060 /* We keep a list of modifiers on the stack. */
5061 struct d_print_mod dpm;
5063 dpm.next = dpi->modifiers;
5064 dpi->modifiers = &dpm;
5067 dpm.templates = dpi->templates;
5070 mod_inner = d_left (dc);
5072 d_print_comp (dpi, options, mod_inner);
5074 /* If the modifier didn't get printed by the type, print it
5077 d_print_mod (dpi, options, dc);
5079 dpi->modifiers = dpm.next;
5081 if (need_template_restore)
5082 dpi->templates = saved_templates;
5087 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
5088 if ((options & DMGL_JAVA) == 0)
5089 d_append_buffer (dpi, dc->u.s_builtin.type->name,
5090 dc->u.s_builtin.type->len);
5092 d_append_buffer (dpi, dc->u.s_builtin.type->java_name,
5093 dc->u.s_builtin.type->java_len);
5096 case DEMANGLE_COMPONENT_VENDOR_TYPE:
5097 d_print_comp (dpi, options, d_left (dc));
5100 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
5102 if ((options & DMGL_RET_POSTFIX) != 0)
5103 d_print_function_type (dpi,
5104 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5105 dc, dpi->modifiers);
5107 /* Print return type if present */
5108 if (d_left (dc) != NULL && (options & DMGL_RET_POSTFIX) != 0)
5109 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5111 else if (d_left (dc) != NULL && (options & DMGL_RET_DROP) == 0)
5113 struct d_print_mod dpm;
5115 /* We must pass this type down as a modifier in order to
5116 print it in the right location. */
5117 dpm.next = dpi->modifiers;
5118 dpi->modifiers = &dpm;
5121 dpm.templates = dpi->templates;
5123 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5126 dpi->modifiers = dpm.next;
5131 /* In standard prefix notation, there is a space between the
5132 return type and the function signature. */
5133 if ((options & DMGL_RET_POSTFIX) == 0)
5134 d_append_char (dpi, ' ');
5137 if ((options & DMGL_RET_POSTFIX) == 0)
5138 d_print_function_type (dpi,
5139 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5140 dc, dpi->modifiers);
5145 case DEMANGLE_COMPONENT_ARRAY_TYPE:
5147 struct d_print_mod *hold_modifiers;
5148 struct d_print_mod adpm[4];
5150 struct d_print_mod *pdpm;
5152 /* We must pass this type down as a modifier in order to print
5153 multi-dimensional arrays correctly. If the array itself is
5154 CV-qualified, we act as though the element type were
5155 CV-qualified. We do this by copying the modifiers down
5156 rather than fiddling pointers, so that we don't wind up
5157 with a d_print_mod higher on the stack pointing into our
5158 stack frame after we return. */
5160 hold_modifiers = dpi->modifiers;
5162 adpm[0].next = hold_modifiers;
5163 dpi->modifiers = &adpm[0];
5165 adpm[0].printed = 0;
5166 adpm[0].templates = dpi->templates;
5169 pdpm = hold_modifiers;
5171 && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT
5172 || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE
5173 || pdpm->mod->type == DEMANGLE_COMPONENT_CONST))
5175 if (! pdpm->printed)
5177 if (i >= sizeof adpm / sizeof adpm[0])
5179 d_print_error (dpi);
5184 adpm[i].next = dpi->modifiers;
5185 dpi->modifiers = &adpm[i];
5193 d_print_comp (dpi, options, d_right (dc));
5195 dpi->modifiers = hold_modifiers;
5197 if (adpm[0].printed)
5203 d_print_mod (dpi, options, adpm[i].mod);
5206 d_print_array_type (dpi, options, dc, dpi->modifiers);
5211 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5212 case DEMANGLE_COMPONENT_VECTOR_TYPE:
5214 struct d_print_mod dpm;
5216 dpm.next = dpi->modifiers;
5217 dpi->modifiers = &dpm;
5220 dpm.templates = dpi->templates;
5222 d_print_comp (dpi, options, d_right (dc));
5224 /* If the modifier didn't get printed by the type, print it
5227 d_print_mod (dpi, options, dc);
5229 dpi->modifiers = dpm.next;
5234 case DEMANGLE_COMPONENT_FIXED_TYPE:
5235 if (dc->u.s_fixed.sat)
5236 d_append_string (dpi, "_Sat ");
5237 /* Don't print "int _Accum". */
5238 if (dc->u.s_fixed.length->u.s_builtin.type
5239 != &cplus_demangle_builtin_types['i'-'a'])
5241 d_print_comp (dpi, options, dc->u.s_fixed.length);
5242 d_append_char (dpi, ' ');
5244 if (dc->u.s_fixed.accum)
5245 d_append_string (dpi, "_Accum");
5247 d_append_string (dpi, "_Fract");
5250 case DEMANGLE_COMPONENT_ARGLIST:
5251 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
5252 if (d_left (dc) != NULL)
5253 d_print_comp (dpi, options, d_left (dc));
5254 if (d_right (dc) != NULL)
5257 unsigned long int flush_count;
5258 /* Make sure ", " isn't flushed by d_append_string, otherwise
5259 dpi->len -= 2 wouldn't work. */
5260 if (dpi->len >= sizeof (dpi->buf) - 2)
5261 d_print_flush (dpi);
5262 d_append_string (dpi, ", ");
5264 flush_count = dpi->flush_count;
5265 d_print_comp (dpi, options, d_right (dc));
5266 /* If that didn't print anything (which can happen with empty
5267 template argument packs), remove the comma and space. */
5268 if (dpi->flush_count == flush_count && dpi->len == len)
5273 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
5275 struct demangle_component *type = d_left (dc);
5276 struct demangle_component *list = d_right (dc);
5279 d_print_comp (dpi, options, type);
5280 d_append_char (dpi, '{');
5281 d_print_comp (dpi, options, list);
5282 d_append_char (dpi, '}');
5286 case DEMANGLE_COMPONENT_OPERATOR:
5288 const struct demangle_operator_info *op = dc->u.s_operator.op;
5291 d_append_string (dpi, "operator");
5292 /* Add a space before new/delete. */
5293 if (IS_LOWER (op->name[0]))
5294 d_append_char (dpi, ' ');
5295 /* Omit a trailing space. */
5296 if (op->name[len-1] == ' ')
5298 d_append_buffer (dpi, op->name, len);
5302 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
5303 d_append_string (dpi, "operator ");
5304 d_print_comp (dpi, options, dc->u.s_extended_operator.name);
5307 case DEMANGLE_COMPONENT_CONVERSION:
5308 d_append_string (dpi, "operator ");
5309 d_print_conversion (dpi, options, dc);
5312 case DEMANGLE_COMPONENT_NULLARY:
5313 d_print_expr_op (dpi, options, d_left (dc));
5316 case DEMANGLE_COMPONENT_UNARY:
5318 struct demangle_component *op = d_left (dc);
5319 struct demangle_component *operand = d_right (dc);
5320 const char *code = NULL;
5322 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
5324 code = op->u.s_operator.op->code;
5325 if (!strcmp (code, "ad"))
5327 /* Don't print the argument list for the address of a
5329 if (operand->type == DEMANGLE_COMPONENT_TYPED_NAME
5330 && d_left (operand)->type == DEMANGLE_COMPONENT_QUAL_NAME
5331 && d_right (operand)->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
5332 operand = d_left (operand);
5334 if (operand->type == DEMANGLE_COMPONENT_BINARY_ARGS)
5336 /* This indicates a suffix operator. */
5337 operand = d_left (operand);
5338 d_print_subexpr (dpi, options, operand);
5339 d_print_expr_op (dpi, options, op);
5344 /* For sizeof..., just print the pack length. */
5345 if (code && !strcmp (code, "sZ"))
5347 struct demangle_component *a = d_find_pack (dpi, operand);
5348 int len = d_pack_length (a);
5349 d_append_num (dpi, len);
5352 else if (code && !strcmp (code, "sP"))
5354 int len = d_args_length (dpi, operand);
5355 d_append_num (dpi, len);
5359 if (op->type != DEMANGLE_COMPONENT_CAST)
5360 d_print_expr_op (dpi, options, op);
5363 d_append_char (dpi, '(');
5364 d_print_cast (dpi, options, op);
5365 d_append_char (dpi, ')');
5367 if (code && !strcmp (code, "gs"))
5368 /* Avoid parens after '::'. */
5369 d_print_comp (dpi, options, operand);
5370 else if (code && !strcmp (code, "st"))
5371 /* Always print parens for sizeof (type). */
5373 d_append_char (dpi, '(');
5374 d_print_comp (dpi, options, operand);
5375 d_append_char (dpi, ')');
5378 d_print_subexpr (dpi, options, operand);
5382 case DEMANGLE_COMPONENT_BINARY:
5383 if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS)
5385 d_print_error (dpi);
5389 if (op_is_new_cast (d_left (dc)))
5391 d_print_expr_op (dpi, options, d_left (dc));
5392 d_append_char (dpi, '<');
5393 d_print_comp (dpi, options, d_left (d_right (dc)));
5394 d_append_string (dpi, ">(");
5395 d_print_comp (dpi, options, d_right (d_right (dc)));
5396 d_append_char (dpi, ')');
5400 if (d_maybe_print_fold_expression (dpi, options, dc))
5403 /* We wrap an expression which uses the greater-than operator in
5404 an extra layer of parens so that it does not get confused
5405 with the '>' which ends the template parameters. */
5406 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
5407 && d_left (dc)->u.s_operator.op->len == 1
5408 && d_left (dc)->u.s_operator.op->name[0] == '>')
5409 d_append_char (dpi, '(');
5411 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") == 0
5412 && d_left (d_right (dc))->type == DEMANGLE_COMPONENT_TYPED_NAME)
5414 /* Function call used in an expression should not have printed types
5415 of the function arguments. Values of the function arguments still
5416 get printed below. */
5418 const struct demangle_component *func = d_left (d_right (dc));
5420 if (d_right (func)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
5421 d_print_error (dpi);
5422 d_print_subexpr (dpi, options, d_left (func));
5425 d_print_subexpr (dpi, options, d_left (d_right (dc)));
5426 if (strcmp (d_left (dc)->u.s_operator.op->code, "ix") == 0)
5428 d_append_char (dpi, '[');
5429 d_print_comp (dpi, options, d_right (d_right (dc)));
5430 d_append_char (dpi, ']');
5434 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") != 0)
5435 d_print_expr_op (dpi, options, d_left (dc));
5436 d_print_subexpr (dpi, options, d_right (d_right (dc)));
5439 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
5440 && d_left (dc)->u.s_operator.op->len == 1
5441 && d_left (dc)->u.s_operator.op->name[0] == '>')
5442 d_append_char (dpi, ')');
5446 case DEMANGLE_COMPONENT_BINARY_ARGS:
5447 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
5448 d_print_error (dpi);
5451 case DEMANGLE_COMPONENT_TRINARY:
5452 if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1
5453 || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2)
5455 d_print_error (dpi);
5458 if (d_maybe_print_fold_expression (dpi, options, dc))
5461 struct demangle_component *op = d_left (dc);
5462 struct demangle_component *first = d_left (d_right (dc));
5463 struct demangle_component *second = d_left (d_right (d_right (dc)));
5464 struct demangle_component *third = d_right (d_right (d_right (dc)));
5466 if (!strcmp (op->u.s_operator.op->code, "qu"))
5468 d_print_subexpr (dpi, options, first);
5469 d_print_expr_op (dpi, options, op);
5470 d_print_subexpr (dpi, options, second);
5471 d_append_string (dpi, " : ");
5472 d_print_subexpr (dpi, options, third);
5476 d_append_string (dpi, "new ");
5477 if (d_left (first) != NULL)
5479 d_print_subexpr (dpi, options, first);
5480 d_append_char (dpi, ' ');
5482 d_print_comp (dpi, options, second);
5484 d_print_subexpr (dpi, options, third);
5489 case DEMANGLE_COMPONENT_TRINARY_ARG1:
5490 case DEMANGLE_COMPONENT_TRINARY_ARG2:
5491 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
5492 d_print_error (dpi);
5495 case DEMANGLE_COMPONENT_LITERAL:
5496 case DEMANGLE_COMPONENT_LITERAL_NEG:
5498 enum d_builtin_type_print tp;
5500 /* For some builtin types, produce simpler output. */
5501 tp = D_PRINT_DEFAULT;
5502 if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE)
5504 tp = d_left (dc)->u.s_builtin.type->print;
5508 case D_PRINT_UNSIGNED:
5510 case D_PRINT_UNSIGNED_LONG:
5511 case D_PRINT_LONG_LONG:
5512 case D_PRINT_UNSIGNED_LONG_LONG:
5513 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME)
5515 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
5516 d_append_char (dpi, '-');
5517 d_print_comp (dpi, options, d_right (dc));
5522 case D_PRINT_UNSIGNED:
5523 d_append_char (dpi, 'u');
5526 d_append_char (dpi, 'l');
5528 case D_PRINT_UNSIGNED_LONG:
5529 d_append_string (dpi, "ul");
5531 case D_PRINT_LONG_LONG:
5532 d_append_string (dpi, "ll");
5534 case D_PRINT_UNSIGNED_LONG_LONG:
5535 d_append_string (dpi, "ull");
5543 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME
5544 && d_right (dc)->u.s_name.len == 1
5545 && dc->type == DEMANGLE_COMPONENT_LITERAL)
5547 switch (d_right (dc)->u.s_name.s[0])
5550 d_append_string (dpi, "false");
5553 d_append_string (dpi, "true");
5566 d_append_char (dpi, '(');
5567 d_print_comp (dpi, options, d_left (dc));
5568 d_append_char (dpi, ')');
5569 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
5570 d_append_char (dpi, '-');
5571 if (tp == D_PRINT_FLOAT)
5572 d_append_char (dpi, '[');
5573 d_print_comp (dpi, options, d_right (dc));
5574 if (tp == D_PRINT_FLOAT)
5575 d_append_char (dpi, ']');
5579 case DEMANGLE_COMPONENT_NUMBER:
5580 d_append_num (dpi, dc->u.s_number.number);
5583 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
5584 d_append_string (dpi, "java resource ");
5585 d_print_comp (dpi, options, d_left (dc));
5588 case DEMANGLE_COMPONENT_COMPOUND_NAME:
5589 d_print_comp (dpi, options, d_left (dc));
5590 d_print_comp (dpi, options, d_right (dc));
5593 case DEMANGLE_COMPONENT_CHARACTER:
5594 d_append_char (dpi, dc->u.s_character.character);
5597 case DEMANGLE_COMPONENT_DECLTYPE:
5598 d_append_string (dpi, "decltype (");
5599 d_print_comp (dpi, options, d_left (dc));
5600 d_append_char (dpi, ')');
5603 case DEMANGLE_COMPONENT_PACK_EXPANSION:
5607 struct demangle_component *a = d_find_pack (dpi, d_left (dc));
5610 /* d_find_pack won't find anything if the only packs involved
5611 in this expansion are function parameter packs; in that
5612 case, just print the pattern and "...". */
5613 d_print_subexpr (dpi, options, d_left (dc));
5614 d_append_string (dpi, "...");
5618 len = d_pack_length (a);
5620 for (i = 0; i < len; ++i)
5622 dpi->pack_index = i;
5623 d_print_comp (dpi, options, dc);
5625 d_append_string (dpi, ", ");
5630 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
5632 long num = dc->u.s_number.number;
5634 d_append_string (dpi, "this");
5637 d_append_string (dpi, "{parm#");
5638 d_append_num (dpi, num);
5639 d_append_char (dpi, '}');
5644 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
5645 d_append_string (dpi, "global constructors keyed to ");
5646 d_print_comp (dpi, options, dc->u.s_binary.left);
5649 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
5650 d_append_string (dpi, "global destructors keyed to ");
5651 d_print_comp (dpi, options, dc->u.s_binary.left);
5654 case DEMANGLE_COMPONENT_LAMBDA:
5655 d_append_string (dpi, "{lambda(");
5656 /* Generic lambda auto parms are mangled as the template type
5658 dpi->is_lambda_arg++;
5659 d_print_comp (dpi, options, dc->u.s_unary_num.sub);
5660 dpi->is_lambda_arg--;
5661 d_append_string (dpi, ")#");
5662 d_append_num (dpi, dc->u.s_unary_num.num + 1);
5663 d_append_char (dpi, '}');
5666 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
5667 d_append_string (dpi, "{unnamed type#");
5668 d_append_num (dpi, dc->u.s_number.number + 1);
5669 d_append_char (dpi, '}');
5672 case DEMANGLE_COMPONENT_CLONE:
5673 d_print_comp (dpi, options, d_left (dc));
5674 d_append_string (dpi, " [clone ");
5675 d_print_comp (dpi, options, d_right (dc));
5676 d_append_char (dpi, ']');
5680 d_print_error (dpi);
5686 d_print_comp (struct d_print_info *dpi, int options,
5687 struct demangle_component *dc)
5689 struct d_component_stack self;
5690 if (dc == NULL || dc->d_printing > 1)
5692 d_print_error (dpi);
5699 self.parent = dpi->component_stack;
5700 dpi->component_stack = &self;
5702 d_print_comp_inner (dpi, options, dc);
5704 dpi->component_stack = self.parent;
5708 /* Print a Java dentifier. For Java we try to handle encoded extended
5709 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
5710 so we don't it for C++. Characters are encoded as
5714 d_print_java_identifier (struct d_print_info *dpi, const char *name, int len)
5720 for (p = name; p < end; ++p)
5731 for (q = p + 3; q < end; ++q)
5737 else if (*q >= 'A' && *q <= 'F')
5738 dig = *q - 'A' + 10;
5739 else if (*q >= 'a' && *q <= 'f')
5740 dig = *q - 'a' + 10;
5746 /* If the Unicode character is larger than 256, we don't try
5747 to deal with it here. FIXME. */
5748 if (q < end && *q == '_' && c < 256)
5750 d_append_char (dpi, c);
5756 d_append_char (dpi, *p);
5760 /* Print a list of modifiers. SUFFIX is 1 if we are printing
5761 qualifiers on this after printing a function. */
5764 d_print_mod_list (struct d_print_info *dpi, int options,
5765 struct d_print_mod *mods, int suffix)
5767 struct d_print_template *hold_dpt;
5769 if (mods == NULL || d_print_saw_error (dpi))
5774 && (is_fnqual_component_type (mods->mod->type))))
5776 d_print_mod_list (dpi, options, mods->next, suffix);
5782 hold_dpt = dpi->templates;
5783 dpi->templates = mods->templates;
5785 if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
5787 d_print_function_type (dpi, options, mods->mod, mods->next);
5788 dpi->templates = hold_dpt;
5791 else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
5793 d_print_array_type (dpi, options, mods->mod, mods->next);
5794 dpi->templates = hold_dpt;
5797 else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME)
5799 struct d_print_mod *hold_modifiers;
5800 struct demangle_component *dc;
5802 /* When this is on the modifier stack, we have pulled any
5803 qualifiers off the right argument already. Otherwise, we
5804 print it as usual, but don't let the left argument see any
5807 hold_modifiers = dpi->modifiers;
5808 dpi->modifiers = NULL;
5809 d_print_comp (dpi, options, d_left (mods->mod));
5810 dpi->modifiers = hold_modifiers;
5812 if ((options & DMGL_JAVA) == 0)
5813 d_append_string (dpi, "::");
5815 d_append_char (dpi, '.');
5817 dc = d_right (mods->mod);
5819 if (dc->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
5821 d_append_string (dpi, "{default arg#");
5822 d_append_num (dpi, dc->u.s_unary_num.num + 1);
5823 d_append_string (dpi, "}::");
5824 dc = dc->u.s_unary_num.sub;
5827 while (is_fnqual_component_type (dc->type))
5830 d_print_comp (dpi, options, dc);
5832 dpi->templates = hold_dpt;
5836 d_print_mod (dpi, options, mods->mod);
5838 dpi->templates = hold_dpt;
5840 d_print_mod_list (dpi, options, mods->next, suffix);
5843 /* Print a modifier. */
5846 d_print_mod (struct d_print_info *dpi, int options,
5847 struct demangle_component *mod)
5851 case DEMANGLE_COMPONENT_RESTRICT:
5852 case DEMANGLE_COMPONENT_RESTRICT_THIS:
5853 d_append_string (dpi, " restrict");
5855 case DEMANGLE_COMPONENT_VOLATILE:
5856 case DEMANGLE_COMPONENT_VOLATILE_THIS:
5857 d_append_string (dpi, " volatile");
5859 case DEMANGLE_COMPONENT_CONST:
5860 case DEMANGLE_COMPONENT_CONST_THIS:
5861 d_append_string (dpi, " const");
5863 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
5864 d_append_string (dpi, " transaction_safe");
5866 case DEMANGLE_COMPONENT_NOEXCEPT:
5867 d_append_string (dpi, " noexcept");
5870 d_append_char (dpi, '(');
5871 d_print_comp (dpi, options, d_right (mod));
5872 d_append_char (dpi, ')');
5875 case DEMANGLE_COMPONENT_THROW_SPEC:
5876 d_append_string (dpi, " throw");
5879 d_append_char (dpi, '(');
5880 d_print_comp (dpi, options, d_right (mod));
5881 d_append_char (dpi, ')');
5884 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5885 d_append_char (dpi, ' ');
5886 d_print_comp (dpi, options, d_right (mod));
5888 case DEMANGLE_COMPONENT_POINTER:
5889 /* There is no pointer symbol in Java. */
5890 if ((options & DMGL_JAVA) == 0)
5891 d_append_char (dpi, '*');
5893 case DEMANGLE_COMPONENT_REFERENCE_THIS:
5894 /* For the ref-qualifier, put a space before the &. */
5895 d_append_char (dpi, ' ');
5897 case DEMANGLE_COMPONENT_REFERENCE:
5898 d_append_char (dpi, '&');
5900 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
5901 d_append_char (dpi, ' ');
5903 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5904 d_append_string (dpi, "&&");
5906 case DEMANGLE_COMPONENT_COMPLEX:
5907 d_append_string (dpi, "complex ");
5909 case DEMANGLE_COMPONENT_IMAGINARY:
5910 d_append_string (dpi, "imaginary ");
5912 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5913 if (d_last_char (dpi) != '(')
5914 d_append_char (dpi, ' ');
5915 d_print_comp (dpi, options, d_left (mod));
5916 d_append_string (dpi, "::*");
5918 case DEMANGLE_COMPONENT_TYPED_NAME:
5919 d_print_comp (dpi, options, d_left (mod));
5921 case DEMANGLE_COMPONENT_VECTOR_TYPE:
5922 d_append_string (dpi, " __vector(");
5923 d_print_comp (dpi, options, d_left (mod));
5924 d_append_char (dpi, ')');
5928 /* Otherwise, we have something that won't go back on the
5929 modifier stack, so we can just print it. */
5930 d_print_comp (dpi, options, mod);
5935 /* Print a function type, except for the return type. */
5938 d_print_function_type (struct d_print_info *dpi, int options,
5939 struct demangle_component *dc,
5940 struct d_print_mod *mods)
5944 struct d_print_mod *p;
5945 struct d_print_mod *hold_modifiers;
5949 for (p = mods; p != NULL; p = p->next)
5954 switch (p->mod->type)
5956 case DEMANGLE_COMPONENT_POINTER:
5957 case DEMANGLE_COMPONENT_REFERENCE:
5958 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5961 case DEMANGLE_COMPONENT_RESTRICT:
5962 case DEMANGLE_COMPONENT_VOLATILE:
5963 case DEMANGLE_COMPONENT_CONST:
5964 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5965 case DEMANGLE_COMPONENT_COMPLEX:
5966 case DEMANGLE_COMPONENT_IMAGINARY:
5967 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5971 FNQUAL_COMPONENT_CASE:
5984 if (d_last_char (dpi) != '('
5985 && d_last_char (dpi) != '*')
5988 if (need_space && d_last_char (dpi) != ' ')
5989 d_append_char (dpi, ' ');
5990 d_append_char (dpi, '(');
5993 hold_modifiers = dpi->modifiers;
5994 dpi->modifiers = NULL;
5996 d_print_mod_list (dpi, options, mods, 0);
5999 d_append_char (dpi, ')');
6001 d_append_char (dpi, '(');
6003 if (d_right (dc) != NULL)
6004 d_print_comp (dpi, options, d_right (dc));
6006 d_append_char (dpi, ')');
6008 d_print_mod_list (dpi, options, mods, 1);
6010 dpi->modifiers = hold_modifiers;
6013 /* Print an array type, except for the element type. */
6016 d_print_array_type (struct d_print_info *dpi, int options,
6017 struct demangle_component *dc,
6018 struct d_print_mod *mods)
6026 struct d_print_mod *p;
6029 for (p = mods; p != NULL; p = p->next)
6033 if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
6048 d_append_string (dpi, " (");
6050 d_print_mod_list (dpi, options, mods, 0);
6053 d_append_char (dpi, ')');
6057 d_append_char (dpi, ' ');
6059 d_append_char (dpi, '[');
6061 if (d_left (dc) != NULL)
6062 d_print_comp (dpi, options, d_left (dc));
6064 d_append_char (dpi, ']');
6067 /* Print an operator in an expression. */
6070 d_print_expr_op (struct d_print_info *dpi, int options,
6071 struct demangle_component *dc)
6073 if (dc->type == DEMANGLE_COMPONENT_OPERATOR)
6074 d_append_buffer (dpi, dc->u.s_operator.op->name,
6075 dc->u.s_operator.op->len);
6077 d_print_comp (dpi, options, dc);
6083 d_print_cast (struct d_print_info *dpi, int options,
6084 struct demangle_component *dc)
6086 d_print_comp (dpi, options, d_left (dc));
6089 /* Print a conversion operator. */
6092 d_print_conversion (struct d_print_info *dpi, int options,
6093 struct demangle_component *dc)
6095 struct d_print_template dpt;
6097 /* For a conversion operator, we need the template parameters from
6098 the enclosing template in scope for processing the type. */
6099 if (dpi->current_template != NULL)
6101 dpt.next = dpi->templates;
6102 dpi->templates = &dpt;
6103 dpt.template_decl = dpi->current_template;
6106 if (d_left (dc)->type != DEMANGLE_COMPONENT_TEMPLATE)
6108 d_print_comp (dpi, options, d_left (dc));
6109 if (dpi->current_template != NULL)
6110 dpi->templates = dpt.next;
6114 d_print_comp (dpi, options, d_left (d_left (dc)));
6116 /* For a templated cast operator, we need to remove the template
6117 parameters from scope after printing the operator name,
6118 so we need to handle the template printing here. */
6119 if (dpi->current_template != NULL)
6120 dpi->templates = dpt.next;
6122 if (d_last_char (dpi) == '<')
6123 d_append_char (dpi, ' ');
6124 d_append_char (dpi, '<');
6125 d_print_comp (dpi, options, d_right (d_left (dc)));
6126 /* Avoid generating two consecutive '>' characters, to avoid
6127 the C++ syntactic ambiguity. */
6128 if (d_last_char (dpi) == '>')
6129 d_append_char (dpi, ' ');
6130 d_append_char (dpi, '>');
6134 /* Initialize the information structure we use to pass around
6137 CP_STATIC_IF_GLIBCPP_V3
6139 cplus_demangle_init_info (const char *mangled, int options, size_t len,
6143 di->send = mangled + len;
6144 di->options = options;
6148 /* We can not need more components than twice the number of chars in
6149 the mangled string. Most components correspond directly to
6150 chars, but the ARGLIST types are exceptions. */
6151 di->num_comps = 2 * len;
6154 /* Similarly, we can not need more substitutions than there are
6155 chars in the mangled string. */
6160 di->last_name = NULL;
6163 di->is_expression = 0;
6164 di->is_conversion = 0;
6167 /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
6168 mangled name, return strings in repeated callback giving the demangled
6169 name. OPTIONS is the usual libiberty demangler options. On success,
6170 this returns 1. On failure, returns 0. */
6173 d_demangle_callback (const char *mangled, int options,
6174 demangle_callbackref callback, void *opaque)
6185 struct demangle_component *dc;
6188 if (mangled[0] == '_' && mangled[1] == 'Z')
6190 else if (strncmp (mangled, "_GLOBAL_", 8) == 0
6191 && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
6192 && (mangled[9] == 'D' || mangled[9] == 'I')
6193 && mangled[10] == '_')
6194 type = mangled[9] == 'I' ? DCT_GLOBAL_CTORS : DCT_GLOBAL_DTORS;
6197 if ((options & DMGL_TYPES) == 0)
6202 cplus_demangle_init_info (mangled, options, strlen (mangled), &di);
6205 #ifdef CP_DYNAMIC_ARRAYS
6206 __extension__ struct demangle_component comps[di.num_comps];
6207 __extension__ struct demangle_component *subs[di.num_subs];
6212 di.comps = alloca (di.num_comps * sizeof (*di.comps));
6213 di.subs = alloca (di.num_subs * sizeof (*di.subs));
6219 dc = cplus_demangle_type (&di);
6222 dc = cplus_demangle_mangled_name (&di, 1);
6224 case DCT_GLOBAL_CTORS:
6225 case DCT_GLOBAL_DTORS:
6226 d_advance (&di, 11);
6227 dc = d_make_comp (&di,
6228 (type == DCT_GLOBAL_CTORS
6229 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
6230 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS),
6231 d_make_demangle_mangled_name (&di, d_str (&di)),
6233 d_advance (&di, strlen (d_str (&di)));
6236 abort (); /* We have listed all the cases. */
6239 /* If DMGL_PARAMS is set, then if we didn't consume the entire
6240 mangled string, then we didn't successfully demangle it. If
6241 DMGL_PARAMS is not set, we didn't look at the trailing
6243 if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0')
6246 #ifdef CP_DEMANGLE_DEBUG
6250 status = (dc != NULL)
6251 ? cplus_demangle_print_callback (options, dc, callback, opaque)
6258 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
6259 name, return a buffer allocated with malloc holding the demangled
6260 name. OPTIONS is the usual libiberty demangler options. On
6261 success, this sets *PALC to the allocated size of the returned
6262 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
6263 a memory allocation failure, and returns NULL. */
6266 d_demangle (const char *mangled, int options, size_t *palc)
6268 struct d_growable_string dgs;
6271 d_growable_string_init (&dgs, 0);
6273 status = d_demangle_callback (mangled, options,
6274 d_growable_string_callback_adapter, &dgs);
6282 *palc = dgs.allocation_failure ? 1 : dgs.alc;
6286 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
6288 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
6290 /* ia64 ABI-mandated entry point in the C++ runtime library for
6291 performing demangling. MANGLED_NAME is a NUL-terminated character
6292 string containing the name to be demangled.
6294 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
6295 *LENGTH bytes, into which the demangled name is stored. If
6296 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
6297 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
6298 is placed in a region of memory allocated with malloc.
6300 If LENGTH is non-NULL, the length of the buffer containing the
6301 demangled name, is placed in *LENGTH.
6303 The return value is a pointer to the start of the NUL-terminated
6304 demangled name, or NULL if the demangling fails. The caller is
6305 responsible for deallocating this memory using free.
6307 *STATUS is set to one of the following values:
6308 0: The demangling operation succeeded.
6309 -1: A memory allocation failure occurred.
6310 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6311 -3: One of the arguments is invalid.
6313 The demangling is performed using the C++ ABI mangling rules, with
6317 __cxa_demangle (const char *mangled_name, char *output_buffer,
6318 size_t *length, int *status)
6323 if (mangled_name == NULL)
6330 if (output_buffer != NULL && length == NULL)
6337 demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc);
6339 if (demangled == NULL)
6351 if (output_buffer == NULL)
6358 if (strlen (demangled) < *length)
6360 strcpy (output_buffer, demangled);
6362 demangled = output_buffer;
6366 free (output_buffer);
6377 extern int __gcclibcxx_demangle_callback (const char *,
6379 (const char *, size_t, void *),
6382 /* Alternative, allocationless entry point in the C++ runtime library
6383 for performing demangling. MANGLED_NAME is a NUL-terminated character
6384 string containing the name to be demangled.
6386 CALLBACK is a callback function, called with demangled string
6387 segments as demangling progresses; it is called at least once,
6388 but may be called more than once. OPAQUE is a generalized pointer
6389 used as a callback argument.
6391 The return code is one of the following values, equivalent to
6392 the STATUS values of __cxa_demangle() (excluding -1, since this
6393 function performs no memory allocations):
6394 0: The demangling operation succeeded.
6395 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6396 -3: One of the arguments is invalid.
6398 The demangling is performed using the C++ ABI mangling rules, with
6402 __gcclibcxx_demangle_callback (const char *mangled_name,
6403 void (*callback) (const char *, size_t, void *),
6408 if (mangled_name == NULL || callback == NULL)
6411 status = d_demangle_callback (mangled_name, DMGL_PARAMS | DMGL_TYPES,
6419 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
6421 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
6422 mangled name, return a buffer allocated with malloc holding the
6423 demangled name. Otherwise, return NULL. */
6426 cplus_demangle_v3 (const char *mangled, int options)
6430 return d_demangle (mangled, options, &alc);
6434 cplus_demangle_v3_callback (const char *mangled, int options,
6435 demangle_callbackref callback, void *opaque)
6437 return d_demangle_callback (mangled, options, callback, opaque);
6440 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
6441 conventions, but the output formatting is a little different.
6442 This instructs the C++ demangler not to emit pointer characters ("*"), to
6443 use Java's namespace separator symbol ("." instead of "::"), and to output
6444 JArray<TYPE> as TYPE[]. */
6447 java_demangle_v3 (const char *mangled)
6451 return d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, &alc);
6455 java_demangle_v3_callback (const char *mangled,
6456 demangle_callbackref callback, void *opaque)
6458 return d_demangle_callback (mangled,
6459 DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX,
6463 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
6465 #ifndef IN_GLIBCPP_V3
6467 /* Demangle a string in order to find out whether it is a constructor
6468 or destructor. Return non-zero on success. Set *CTOR_KIND and
6469 *DTOR_KIND appropriately. */
6472 is_ctor_or_dtor (const char *mangled,
6473 enum gnu_v3_ctor_kinds *ctor_kind,
6474 enum gnu_v3_dtor_kinds *dtor_kind)
6477 struct demangle_component *dc;
6480 *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
6481 *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
6483 cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di);
6486 #ifdef CP_DYNAMIC_ARRAYS
6487 __extension__ struct demangle_component comps[di.num_comps];
6488 __extension__ struct demangle_component *subs[di.num_subs];
6493 di.comps = alloca (di.num_comps * sizeof (*di.comps));
6494 di.subs = alloca (di.num_subs * sizeof (*di.subs));
6497 dc = cplus_demangle_mangled_name (&di, 1);
6499 /* Note that because we did not pass DMGL_PARAMS, we don't expect
6500 to demangle the entire string. */
6507 /* These cannot appear on a constructor or destructor. */
6508 case DEMANGLE_COMPONENT_RESTRICT_THIS:
6509 case DEMANGLE_COMPONENT_VOLATILE_THIS:
6510 case DEMANGLE_COMPONENT_CONST_THIS:
6511 case DEMANGLE_COMPONENT_REFERENCE_THIS:
6512 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
6516 case DEMANGLE_COMPONENT_TYPED_NAME:
6517 case DEMANGLE_COMPONENT_TEMPLATE:
6520 case DEMANGLE_COMPONENT_QUAL_NAME:
6521 case DEMANGLE_COMPONENT_LOCAL_NAME:
6524 case DEMANGLE_COMPONENT_CTOR:
6525 *ctor_kind = dc->u.s_ctor.kind;
6529 case DEMANGLE_COMPONENT_DTOR:
6530 *dtor_kind = dc->u.s_dtor.kind;
6541 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
6542 name. A non-zero return indicates the type of constructor. */
6544 enum gnu_v3_ctor_kinds
6545 is_gnu_v3_mangled_ctor (const char *name)
6547 enum gnu_v3_ctor_kinds ctor_kind;
6548 enum gnu_v3_dtor_kinds dtor_kind;
6550 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
6551 return (enum gnu_v3_ctor_kinds) 0;
6556 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
6557 name. A non-zero return indicates the type of destructor. */
6559 enum gnu_v3_dtor_kinds
6560 is_gnu_v3_mangled_dtor (const char *name)
6562 enum gnu_v3_ctor_kinds ctor_kind;
6563 enum gnu_v3_dtor_kinds dtor_kind;
6565 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
6566 return (enum gnu_v3_dtor_kinds) 0;
6570 #endif /* IN_GLIBCPP_V3 */
6572 #ifdef STANDALONE_DEMANGLER
6575 #include "dyn-string.h"
6577 static void print_usage (FILE* fp, int exit_value);
6579 #define IS_ALPHA(CHAR) \
6580 (((CHAR) >= 'a' && (CHAR) <= 'z') \
6581 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
6583 /* Non-zero if CHAR is a character than can occur in a mangled name. */
6584 #define is_mangled_char(CHAR) \
6585 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
6586 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
6588 /* The name of this program, as invoked. */
6589 const char* program_name;
6591 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
6594 print_usage (FILE* fp, int exit_value)
6596 fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
6597 fprintf (fp, "Options:\n");
6598 fprintf (fp, " -h,--help Display this message.\n");
6599 fprintf (fp, " -p,--no-params Don't display function parameters\n");
6600 fprintf (fp, " -v,--verbose Produce verbose demanglings.\n");
6601 fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n");
6606 /* Option specification for getopt_long. */
6607 static const struct option long_options[] =
6609 { "help", no_argument, NULL, 'h' },
6610 { "no-params", no_argument, NULL, 'p' },
6611 { "verbose", no_argument, NULL, 'v' },
6612 { NULL, no_argument, NULL, 0 },
6615 /* Main entry for a demangling filter executable. It will demangle
6616 its command line arguments, if any. If none are provided, it will
6617 filter stdin to stdout, replacing any recognized mangled C++ names
6618 with their demangled equivalents. */
6621 main (int argc, char *argv[])
6625 int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
6627 /* Use the program name of this program, as invoked. */
6628 program_name = argv[0];
6630 /* Parse options. */
6633 opt_char = getopt_long (argc, argv, "hpv", long_options, NULL);
6636 case '?': /* Unrecognized option. */
6637 print_usage (stderr, 1);
6641 print_usage (stdout, 0);
6645 options &= ~ DMGL_PARAMS;
6649 options |= DMGL_VERBOSE;
6653 while (opt_char != -1);
6656 /* No command line arguments were provided. Filter stdin. */
6658 dyn_string_t mangled = dyn_string_new (3);
6661 /* Read all of input. */
6662 while (!feof (stdin))
6666 /* Pile characters into mangled until we hit one that can't
6667 occur in a mangled name. */
6669 while (!feof (stdin) && is_mangled_char (c))
6671 dyn_string_append_char (mangled, c);
6677 if (dyn_string_length (mangled) > 0)
6679 #ifdef IN_GLIBCPP_V3
6680 s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL);
6682 s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
6692 /* It might not have been a mangled name. Print the
6694 fputs (dyn_string_buf (mangled), stdout);
6697 dyn_string_clear (mangled);
6700 /* If we haven't hit EOF yet, we've read one character that
6701 can't occur in a mangled name, so print it out. */
6706 dyn_string_delete (mangled);
6709 /* Demangle command line arguments. */
6711 /* Loop over command line arguments. */
6712 for (i = optind; i < argc; ++i)
6715 #ifdef IN_GLIBCPP_V3
6719 /* Attempt to demangle. */
6720 #ifdef IN_GLIBCPP_V3
6721 s = __cxa_demangle (argv[i], NULL, NULL, &status);
6723 s = cplus_demangle_v3 (argv[i], options);
6726 /* If it worked, print the demangled name. */
6734 #ifdef IN_GLIBCPP_V3
6735 fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status);
6737 fprintf (stderr, "Failed: %s\n", argv[i]);
6746 #endif /* STANDALONE_DEMANGLER */