1 /* Demangler for g++ V3 ABI.
2 Copyright (C) 2003-2023 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 https://itanium-cxx-abi.github.io/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 && !__STDC_NO_VLA__
196 #define CP_DYNAMIC_ARRAYS
197 #endif /* __STDC_VERSION__ >= 199901L && !__STDC_NO_VLA__ */
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
322 /* Maximum number of times d_print_comp may be called recursively. */
323 #define MAX_RECURSION_COUNT 1024
325 enum { D_PRINT_BUFFER_LENGTH
= 256 };
328 /* Fixed-length allocated buffer for demangled data, flushed to the
329 callback with a NUL termination once full. */
330 char buf
[D_PRINT_BUFFER_LENGTH
];
331 /* Current length of data in buffer. */
333 /* The last character printed, saved individually so that it survives
336 /* Callback function to handle demangled buffer flush. */
337 demangle_callbackref callback
;
338 /* Opaque callback argument. */
340 /* The current list of templates, if any. */
341 struct d_print_template
*templates
;
342 /* The current list of modifiers (e.g., pointer, reference, etc.),
344 struct d_print_mod
*modifiers
;
345 /* Set to 1 if we saw a demangling error. */
346 int demangle_failure
;
347 /* Number of times d_print_comp was recursively called. Should not
348 be bigger than MAX_RECURSION_COUNT. */
350 /* 1 more than the number of explicit template parms of a lambda. Template
351 parm references >= are actually 'auto'. */
352 int lambda_tpl_parms
;
353 /* The current index into any template argument packs we are using
354 for printing, or -1 to print the whole pack. */
356 /* Number of d_print_flush calls so far. */
357 unsigned long int flush_count
;
358 /* Stack of components, innermost first, used to avoid loops. */
359 const struct d_component_stack
*component_stack
;
360 /* Array of saved scopes for evaluating substitutions. */
361 struct d_saved_scope
*saved_scopes
;
362 /* Index of the next unused saved scope in the above array. */
363 int next_saved_scope
;
364 /* Number of saved scopes in the above array. */
365 int num_saved_scopes
;
366 /* Array of templates for saving into scopes. */
367 struct d_print_template
*copy_templates
;
368 /* Index of the next unused copy template in the above array. */
369 int next_copy_template
;
370 /* Number of copy templates in the above array. */
371 int num_copy_templates
;
372 /* The nearest enclosing template, if any. */
373 const struct demangle_component
*current_template
;
376 #ifdef CP_DEMANGLE_DEBUG
377 static void d_dump (struct demangle_component
*, int);
380 static struct demangle_component
*
381 d_make_empty (struct d_info
*);
383 static struct demangle_component
*
384 d_make_comp (struct d_info
*, enum demangle_component_type
,
385 struct demangle_component
*,
386 struct demangle_component
*);
388 static struct demangle_component
*
389 d_make_name (struct d_info
*, const char *, int);
391 static struct demangle_component
*
392 d_make_demangle_mangled_name (struct d_info
*, const char *);
394 static struct demangle_component
*
395 d_make_builtin_type (struct d_info
*,
396 const struct demangle_builtin_type_info
*);
398 static struct demangle_component
*
399 d_make_operator (struct d_info
*,
400 const struct demangle_operator_info
*);
402 static struct demangle_component
*
403 d_make_extended_operator (struct d_info
*, int,
404 struct demangle_component
*);
406 static struct demangle_component
*
407 d_make_ctor (struct d_info
*, enum gnu_v3_ctor_kinds
,
408 struct demangle_component
*);
410 static struct demangle_component
*
411 d_make_dtor (struct d_info
*, enum gnu_v3_dtor_kinds
,
412 struct demangle_component
*);
414 static struct demangle_component
*
415 d_make_template_param (struct d_info
*, int);
417 static struct demangle_component
*
418 d_make_sub (struct d_info
*, const char *, int);
421 has_return_type (struct demangle_component
*);
424 is_ctor_dtor_or_conversion (struct demangle_component
*);
426 static struct demangle_component
*d_encoding (struct d_info
*, int);
428 static struct demangle_component
*d_name (struct d_info
*, int substable
);
430 static struct demangle_component
*d_nested_name (struct d_info
*);
432 static int d_maybe_module_name (struct d_info
*, struct demangle_component
**);
434 static struct demangle_component
*d_prefix (struct d_info
*, int);
436 static struct demangle_component
*d_unqualified_name (struct d_info
*,
437 struct demangle_component
*scope
, struct demangle_component
*module
);
439 static struct demangle_component
*d_source_name (struct d_info
*);
441 static int d_number (struct d_info
*);
443 static struct demangle_component
*d_identifier (struct d_info
*, int);
445 static struct demangle_component
*d_operator_name (struct d_info
*);
447 static struct demangle_component
*d_special_name (struct d_info
*);
449 static struct demangle_component
*d_parmlist (struct d_info
*);
451 static int d_call_offset (struct d_info
*, int);
453 static struct demangle_component
*d_ctor_dtor_name (struct d_info
*);
455 static struct demangle_component
**
456 d_cv_qualifiers (struct d_info
*, struct demangle_component
**, int);
458 static struct demangle_component
*
459 d_ref_qualifier (struct d_info
*, struct demangle_component
*);
461 static struct demangle_component
*
462 d_function_type (struct d_info
*);
464 static struct demangle_component
*
465 d_bare_function_type (struct d_info
*, int);
467 static struct demangle_component
*
468 d_class_enum_type (struct d_info
*, int);
470 static struct demangle_component
*d_array_type (struct d_info
*);
472 static struct demangle_component
*d_vector_type (struct d_info
*);
474 static struct demangle_component
*
475 d_pointer_to_member_type (struct d_info
*);
477 static struct demangle_component
*
478 d_template_param (struct d_info
*);
480 static struct demangle_component
*d_template_args (struct d_info
*);
481 static struct demangle_component
*d_template_args_1 (struct d_info
*);
483 static struct demangle_component
*
484 d_template_arg (struct d_info
*);
486 static struct demangle_component
*d_expression (struct d_info
*);
488 static struct demangle_component
*d_expr_primary (struct d_info
*);
490 static struct demangle_component
*d_local_name (struct d_info
*);
492 static int d_discriminator (struct d_info
*);
494 static struct demangle_component
*d_template_parm (struct d_info
*, int *bad
);
496 static struct demangle_component
*d_template_head (struct d_info
*, int *bad
);
498 static struct demangle_component
*d_lambda (struct d_info
*);
500 static struct demangle_component
*d_unnamed_type (struct d_info
*);
502 static struct demangle_component
*
503 d_clone_suffix (struct d_info
*, struct demangle_component
*);
506 d_add_substitution (struct d_info
*, struct demangle_component
*);
508 static struct demangle_component
*d_substitution (struct d_info
*, int);
510 static void d_checkpoint (struct d_info
*, struct d_info_checkpoint
*);
512 static void d_backtrack (struct d_info
*, struct d_info_checkpoint
*);
514 static void d_growable_string_init (struct d_growable_string
*, size_t);
517 d_growable_string_resize (struct d_growable_string
*, size_t);
520 d_growable_string_append_buffer (struct d_growable_string
*,
521 const char *, size_t);
523 d_growable_string_callback_adapter (const char *, size_t, void *);
526 d_print_init (struct d_print_info
*, demangle_callbackref
, void *,
527 struct demangle_component
*);
529 static inline void d_print_error (struct d_print_info
*);
531 static inline int d_print_saw_error (struct d_print_info
*);
533 static inline void d_print_flush (struct d_print_info
*);
535 static inline void d_append_char (struct d_print_info
*, char);
537 static inline void d_append_buffer (struct d_print_info
*,
538 const char *, size_t);
540 static inline void d_append_string (struct d_print_info
*, const char *);
542 static inline char d_last_char (struct d_print_info
*);
545 d_print_comp (struct d_print_info
*, int, struct demangle_component
*);
548 d_print_java_identifier (struct d_print_info
*, const char *, int);
551 d_print_mod_list (struct d_print_info
*, int, struct d_print_mod
*, int);
554 d_print_mod (struct d_print_info
*, int, struct demangle_component
*);
557 d_print_function_type (struct d_print_info
*, int,
558 struct demangle_component
*,
559 struct d_print_mod
*);
562 d_print_array_type (struct d_print_info
*, int,
563 struct demangle_component
*,
564 struct d_print_mod
*);
567 d_print_expr_op (struct d_print_info
*, int, struct demangle_component
*);
569 static void d_print_cast (struct d_print_info
*, int,
570 struct demangle_component
*);
571 static void d_print_conversion (struct d_print_info
*, int,
572 struct demangle_component
*);
574 static int d_demangle_callback (const char *, int,
575 demangle_callbackref
, void *);
576 static char *d_demangle (const char *, int, size_t *);
578 #define FNQUAL_COMPONENT_CASE \
579 case DEMANGLE_COMPONENT_RESTRICT_THIS: \
580 case DEMANGLE_COMPONENT_VOLATILE_THIS: \
581 case DEMANGLE_COMPONENT_CONST_THIS: \
582 case DEMANGLE_COMPONENT_REFERENCE_THIS: \
583 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS: \
584 case DEMANGLE_COMPONENT_TRANSACTION_SAFE: \
585 case DEMANGLE_COMPONENT_NOEXCEPT: \
586 case DEMANGLE_COMPONENT_THROW_SPEC
588 /* True iff TYPE is a demangling component representing a
589 function-type-qualifier. */
592 is_fnqual_component_type (enum demangle_component_type type
)
596 FNQUAL_COMPONENT_CASE
:
605 #ifdef CP_DEMANGLE_DEBUG
608 d_dump (struct demangle_component
*dc
, int indent
)
615 printf ("failed demangling\n");
619 for (i
= 0; i
< indent
; ++i
)
624 case DEMANGLE_COMPONENT_NAME
:
625 printf ("name '%.*s'\n", dc
->u
.s_name
.len
, dc
->u
.s_name
.s
);
627 case DEMANGLE_COMPONENT_TAGGED_NAME
:
628 printf ("tagged name\n");
629 d_dump (dc
->u
.s_binary
.left
, indent
+ 2);
630 d_dump (dc
->u
.s_binary
.right
, indent
+ 2);
632 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
633 printf ("template parameter %ld\n", dc
->u
.s_number
.number
);
635 case DEMANGLE_COMPONENT_TPARM_OBJ
:
636 printf ("template parameter object\n");
638 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
639 printf ("function parameter %ld\n", dc
->u
.s_number
.number
);
641 case DEMANGLE_COMPONENT_CTOR
:
642 printf ("constructor %d\n", (int) dc
->u
.s_ctor
.kind
);
643 d_dump (dc
->u
.s_ctor
.name
, indent
+ 2);
645 case DEMANGLE_COMPONENT_DTOR
:
646 printf ("destructor %d\n", (int) dc
->u
.s_dtor
.kind
);
647 d_dump (dc
->u
.s_dtor
.name
, indent
+ 2);
649 case DEMANGLE_COMPONENT_SUB_STD
:
650 printf ("standard substitution %s\n", dc
->u
.s_string
.string
);
652 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
653 printf ("builtin type %s\n", dc
->u
.s_builtin
.type
->name
);
655 case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE
:
657 char suffix
[2] = { dc
->u
.s_extended_builtin
.type
->suffix
, 0 };
658 printf ("builtin type %s%d%s\n", dc
->u
.s_extended_builtin
.type
->name
,
659 dc
->u
.s_extended_builtin
.type
->arg
, suffix
);
662 case DEMANGLE_COMPONENT_OPERATOR
:
663 printf ("operator %s\n", dc
->u
.s_operator
.op
->name
);
665 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
666 printf ("extended operator with %d args\n",
667 dc
->u
.s_extended_operator
.args
);
668 d_dump (dc
->u
.s_extended_operator
.name
, indent
+ 2);
671 case DEMANGLE_COMPONENT_QUAL_NAME
:
672 printf ("qualified name\n");
674 case DEMANGLE_COMPONENT_LOCAL_NAME
:
675 printf ("local name\n");
677 case DEMANGLE_COMPONENT_TYPED_NAME
:
678 printf ("typed name\n");
680 case DEMANGLE_COMPONENT_TEMPLATE
:
681 printf ("template\n");
683 case DEMANGLE_COMPONENT_VTABLE
:
686 case DEMANGLE_COMPONENT_VTT
:
689 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
690 printf ("construction vtable\n");
692 case DEMANGLE_COMPONENT_TYPEINFO
:
693 printf ("typeinfo\n");
695 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
696 printf ("typeinfo name\n");
698 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
699 printf ("typeinfo function\n");
701 case DEMANGLE_COMPONENT_THUNK
:
704 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
705 printf ("virtual thunk\n");
707 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
708 printf ("covariant thunk\n");
710 case DEMANGLE_COMPONENT_JAVA_CLASS
:
711 printf ("java class\n");
713 case DEMANGLE_COMPONENT_GUARD
:
716 case DEMANGLE_COMPONENT_REFTEMP
:
717 printf ("reference temporary\n");
719 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
720 printf ("hidden alias\n");
722 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
723 printf ("transaction clone\n");
725 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
726 printf ("non-transaction clone\n");
728 case DEMANGLE_COMPONENT_RESTRICT
:
729 printf ("restrict\n");
731 case DEMANGLE_COMPONENT_VOLATILE
:
732 printf ("volatile\n");
734 case DEMANGLE_COMPONENT_CONST
:
737 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
738 printf ("restrict this\n");
740 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
741 printf ("volatile this\n");
743 case DEMANGLE_COMPONENT_CONST_THIS
:
744 printf ("const this\n");
746 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
747 printf ("reference this\n");
749 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
750 printf ("rvalue reference this\n");
752 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
753 printf ("transaction_safe this\n");
755 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
756 printf ("vendor type qualifier\n");
758 case DEMANGLE_COMPONENT_POINTER
:
759 printf ("pointer\n");
761 case DEMANGLE_COMPONENT_REFERENCE
:
762 printf ("reference\n");
764 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
765 printf ("rvalue reference\n");
767 case DEMANGLE_COMPONENT_COMPLEX
:
768 printf ("complex\n");
770 case DEMANGLE_COMPONENT_IMAGINARY
:
771 printf ("imaginary\n");
773 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
774 printf ("vendor type\n");
776 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
777 printf ("function type\n");
779 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
780 printf ("array type\n");
782 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
783 printf ("pointer to member type\n");
785 case DEMANGLE_COMPONENT_ARGLIST
:
786 printf ("argument list\n");
788 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
789 printf ("template argument list\n");
791 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
792 printf ("initializer list\n");
794 case DEMANGLE_COMPONENT_CAST
:
797 case DEMANGLE_COMPONENT_CONVERSION
:
798 printf ("conversion operator\n");
800 case DEMANGLE_COMPONENT_NULLARY
:
801 printf ("nullary operator\n");
803 case DEMANGLE_COMPONENT_UNARY
:
804 printf ("unary operator\n");
806 case DEMANGLE_COMPONENT_BINARY
:
807 printf ("binary operator\n");
809 case DEMANGLE_COMPONENT_BINARY_ARGS
:
810 printf ("binary operator arguments\n");
812 case DEMANGLE_COMPONENT_TRINARY
:
813 printf ("trinary operator\n");
815 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
816 printf ("trinary operator arguments 1\n");
818 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
819 printf ("trinary operator arguments 1\n");
821 case DEMANGLE_COMPONENT_LITERAL
:
822 printf ("literal\n");
824 case DEMANGLE_COMPONENT_LITERAL_NEG
:
825 printf ("negative literal\n");
827 case DEMANGLE_COMPONENT_VENDOR_EXPR
:
828 printf ("vendor expression\n");
830 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
831 printf ("java resource\n");
833 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
834 printf ("compound name\n");
836 case DEMANGLE_COMPONENT_CHARACTER
:
837 printf ("character '%c'\n", dc
->u
.s_character
.character
);
839 case DEMANGLE_COMPONENT_NUMBER
:
840 printf ("number %ld\n", dc
->u
.s_number
.number
);
842 case DEMANGLE_COMPONENT_DECLTYPE
:
843 printf ("decltype\n");
845 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
846 printf ("pack expansion\n");
848 case DEMANGLE_COMPONENT_TLS_INIT
:
849 printf ("tls init function\n");
851 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
852 printf ("tls wrapper function\n");
854 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
855 printf ("default argument %d\n", dc
->u
.s_unary_num
.num
);
856 d_dump (dc
->u
.s_unary_num
.sub
, indent
+2);
858 case DEMANGLE_COMPONENT_LAMBDA
:
859 printf ("lambda %d\n", dc
->u
.s_unary_num
.num
);
860 d_dump (dc
->u
.s_unary_num
.sub
, indent
+2);
864 d_dump (d_left (dc
), indent
+ 2);
865 d_dump (d_right (dc
), indent
+ 2);
868 #endif /* CP_DEMANGLE_DEBUG */
870 /* Fill in a DEMANGLE_COMPONENT_NAME. */
872 CP_STATIC_IF_GLIBCPP_V3
874 cplus_demangle_fill_name (struct demangle_component
*p
, const char *s
, int len
)
876 if (p
== NULL
|| s
== NULL
|| len
<= 0)
880 p
->type
= DEMANGLE_COMPONENT_NAME
;
882 p
->u
.s_name
.len
= len
;
886 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
888 CP_STATIC_IF_GLIBCPP_V3
890 cplus_demangle_fill_extended_operator (struct demangle_component
*p
, int args
,
891 struct demangle_component
*name
)
893 if (p
== NULL
|| args
< 0 || name
== NULL
)
897 p
->type
= DEMANGLE_COMPONENT_EXTENDED_OPERATOR
;
898 p
->u
.s_extended_operator
.args
= args
;
899 p
->u
.s_extended_operator
.name
= name
;
903 /* Fill in a DEMANGLE_COMPONENT_CTOR. */
905 CP_STATIC_IF_GLIBCPP_V3
907 cplus_demangle_fill_ctor (struct demangle_component
*p
,
908 enum gnu_v3_ctor_kinds kind
,
909 struct demangle_component
*name
)
913 || (int) kind
< gnu_v3_complete_object_ctor
914 || (int) kind
> gnu_v3_object_ctor_group
)
918 p
->type
= DEMANGLE_COMPONENT_CTOR
;
919 p
->u
.s_ctor
.kind
= kind
;
920 p
->u
.s_ctor
.name
= name
;
924 /* Fill in a DEMANGLE_COMPONENT_DTOR. */
926 CP_STATIC_IF_GLIBCPP_V3
928 cplus_demangle_fill_dtor (struct demangle_component
*p
,
929 enum gnu_v3_dtor_kinds kind
,
930 struct demangle_component
*name
)
934 || (int) kind
< gnu_v3_deleting_dtor
935 || (int) kind
> gnu_v3_object_dtor_group
)
939 p
->type
= DEMANGLE_COMPONENT_DTOR
;
940 p
->u
.s_dtor
.kind
= kind
;
941 p
->u
.s_dtor
.name
= name
;
945 /* Add a new component. */
947 static struct demangle_component
*
948 d_make_empty (struct d_info
*di
)
950 struct demangle_component
*p
;
952 if (di
->next_comp
>= di
->num_comps
)
954 p
= &di
->comps
[di
->next_comp
];
961 /* Add a new generic component. */
963 static struct demangle_component
*
964 d_make_comp (struct d_info
*di
, enum demangle_component_type type
,
965 struct demangle_component
*left
,
966 struct demangle_component
*right
)
968 struct demangle_component
*p
;
970 /* We check for errors here. A typical error would be a NULL return
971 from a subroutine. We catch those here, and return NULL
975 /* These types require two parameters. */
976 case DEMANGLE_COMPONENT_QUAL_NAME
:
977 case DEMANGLE_COMPONENT_LOCAL_NAME
:
978 case DEMANGLE_COMPONENT_TYPED_NAME
:
979 case DEMANGLE_COMPONENT_TAGGED_NAME
:
980 case DEMANGLE_COMPONENT_TEMPLATE
:
981 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
982 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
983 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
984 case DEMANGLE_COMPONENT_UNARY
:
985 case DEMANGLE_COMPONENT_BINARY
:
986 case DEMANGLE_COMPONENT_BINARY_ARGS
:
987 case DEMANGLE_COMPONENT_TRINARY
:
988 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
989 case DEMANGLE_COMPONENT_LITERAL
:
990 case DEMANGLE_COMPONENT_LITERAL_NEG
:
991 case DEMANGLE_COMPONENT_VENDOR_EXPR
:
992 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
993 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
994 case DEMANGLE_COMPONENT_CLONE
:
995 case DEMANGLE_COMPONENT_MODULE_ENTITY
:
996 if (left
== NULL
|| right
== NULL
)
1000 /* These types only require one parameter. */
1001 case DEMANGLE_COMPONENT_VTABLE
:
1002 case DEMANGLE_COMPONENT_VTT
:
1003 case DEMANGLE_COMPONENT_TYPEINFO
:
1004 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
1005 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
1006 case DEMANGLE_COMPONENT_THUNK
:
1007 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
1008 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
1009 case DEMANGLE_COMPONENT_JAVA_CLASS
:
1010 case DEMANGLE_COMPONENT_GUARD
:
1011 case DEMANGLE_COMPONENT_TLS_INIT
:
1012 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
1013 case DEMANGLE_COMPONENT_REFTEMP
:
1014 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
1015 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
1016 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
1017 case DEMANGLE_COMPONENT_POINTER
:
1018 case DEMANGLE_COMPONENT_REFERENCE
:
1019 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
1020 case DEMANGLE_COMPONENT_COMPLEX
:
1021 case DEMANGLE_COMPONENT_IMAGINARY
:
1022 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
1023 case DEMANGLE_COMPONENT_CAST
:
1024 case DEMANGLE_COMPONENT_CONVERSION
:
1025 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
1026 case DEMANGLE_COMPONENT_DECLTYPE
:
1027 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
1028 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
1029 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
1030 case DEMANGLE_COMPONENT_NULLARY
:
1031 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
1032 case DEMANGLE_COMPONENT_TPARM_OBJ
:
1033 case DEMANGLE_COMPONENT_STRUCTURED_BINDING
:
1034 case DEMANGLE_COMPONENT_MODULE_INIT
:
1035 case DEMANGLE_COMPONENT_TEMPLATE_HEAD
:
1036 case DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM
:
1037 case DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM
:
1038 case DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM
:
1043 /* This needs a right parameter, but the left parameter can be
1045 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
1046 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
1047 case DEMANGLE_COMPONENT_MODULE_NAME
:
1048 case DEMANGLE_COMPONENT_MODULE_PARTITION
:
1053 /* These are allowed to have no parameters--in some cases they
1054 will be filled in later. */
1055 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
1056 case DEMANGLE_COMPONENT_RESTRICT
:
1057 case DEMANGLE_COMPONENT_VOLATILE
:
1058 case DEMANGLE_COMPONENT_CONST
:
1059 case DEMANGLE_COMPONENT_ARGLIST
:
1060 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
1061 case DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM
:
1062 FNQUAL_COMPONENT_CASE
:
1065 /* Other types should not be seen here. */
1070 p
= d_make_empty (di
);
1074 p
->u
.s_binary
.left
= left
;
1075 p
->u
.s_binary
.right
= right
;
1080 /* Add a new demangle mangled name component. */
1082 static struct demangle_component
*
1083 d_make_demangle_mangled_name (struct d_info
*di
, const char *s
)
1085 if (d_peek_char (di
) != '_' || d_peek_next_char (di
) != 'Z')
1086 return d_make_name (di
, s
, strlen (s
));
1088 return d_encoding (di
, 0);
1091 /* Add a new name component. */
1093 static struct demangle_component
*
1094 d_make_name (struct d_info
*di
, const char *s
, int len
)
1096 struct demangle_component
*p
;
1098 p
= d_make_empty (di
);
1099 if (! cplus_demangle_fill_name (p
, s
, len
))
1104 /* Add a new builtin type component. */
1106 static struct demangle_component
*
1107 d_make_builtin_type (struct d_info
*di
,
1108 const struct demangle_builtin_type_info
*type
)
1110 struct demangle_component
*p
;
1114 p
= d_make_empty (di
);
1117 p
->type
= DEMANGLE_COMPONENT_BUILTIN_TYPE
;
1118 p
->u
.s_builtin
.type
= type
;
1123 /* Add a new extended builtin type component. */
1125 static struct demangle_component
*
1126 d_make_extended_builtin_type (struct d_info
*di
,
1127 const struct demangle_builtin_type_info
*type
,
1128 short arg
, char suffix
)
1130 struct demangle_component
*p
;
1134 p
= d_make_empty (di
);
1137 p
->type
= DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE
;
1138 p
->u
.s_extended_builtin
.type
= type
;
1139 p
->u
.s_extended_builtin
.arg
= arg
;
1140 p
->u
.s_extended_builtin
.suffix
= suffix
;
1145 /* Add a new operator component. */
1147 static struct demangle_component
*
1148 d_make_operator (struct d_info
*di
, const struct demangle_operator_info
*op
)
1150 struct demangle_component
*p
;
1152 p
= d_make_empty (di
);
1155 p
->type
= DEMANGLE_COMPONENT_OPERATOR
;
1156 p
->u
.s_operator
.op
= op
;
1161 /* Add a new extended operator component. */
1163 static struct demangle_component
*
1164 d_make_extended_operator (struct d_info
*di
, int args
,
1165 struct demangle_component
*name
)
1167 struct demangle_component
*p
;
1169 p
= d_make_empty (di
);
1170 if (! cplus_demangle_fill_extended_operator (p
, args
, name
))
1175 static struct demangle_component
*
1176 d_make_default_arg (struct d_info
*di
, int num
,
1177 struct demangle_component
*sub
)
1179 struct demangle_component
*p
= d_make_empty (di
);
1182 p
->type
= DEMANGLE_COMPONENT_DEFAULT_ARG
;
1183 p
->u
.s_unary_num
.num
= num
;
1184 p
->u
.s_unary_num
.sub
= sub
;
1189 /* Add a new constructor component. */
1191 static struct demangle_component
*
1192 d_make_ctor (struct d_info
*di
, enum gnu_v3_ctor_kinds kind
,
1193 struct demangle_component
*name
)
1195 struct demangle_component
*p
;
1197 p
= d_make_empty (di
);
1198 if (! cplus_demangle_fill_ctor (p
, kind
, name
))
1203 /* Add a new destructor component. */
1205 static struct demangle_component
*
1206 d_make_dtor (struct d_info
*di
, enum gnu_v3_dtor_kinds kind
,
1207 struct demangle_component
*name
)
1209 struct demangle_component
*p
;
1211 p
= d_make_empty (di
);
1212 if (! cplus_demangle_fill_dtor (p
, kind
, name
))
1217 /* Add a new template parameter. */
1219 static struct demangle_component
*
1220 d_make_template_param (struct d_info
*di
, int i
)
1222 struct demangle_component
*p
;
1224 p
= d_make_empty (di
);
1227 p
->type
= DEMANGLE_COMPONENT_TEMPLATE_PARAM
;
1228 p
->u
.s_number
.number
= i
;
1233 /* Add a new function parameter. */
1235 static struct demangle_component
*
1236 d_make_function_param (struct d_info
*di
, int i
)
1238 struct demangle_component
*p
;
1240 p
= d_make_empty (di
);
1243 p
->type
= DEMANGLE_COMPONENT_FUNCTION_PARAM
;
1244 p
->u
.s_number
.number
= i
;
1249 /* Add a new standard substitution component. */
1251 static struct demangle_component
*
1252 d_make_sub (struct d_info
*di
, const char *name
, int len
)
1254 struct demangle_component
*p
;
1256 p
= d_make_empty (di
);
1259 p
->type
= DEMANGLE_COMPONENT_SUB_STD
;
1260 p
->u
.s_string
.string
= name
;
1261 p
->u
.s_string
.len
= len
;
1266 /* <mangled-name> ::= _Z <encoding> [<clone-suffix>]*
1268 TOP_LEVEL is non-zero when called at the top level. */
1270 CP_STATIC_IF_GLIBCPP_V3
1271 struct demangle_component
*
1272 cplus_demangle_mangled_name (struct d_info
*di
, int top_level
)
1274 struct demangle_component
*p
;
1276 if (! d_check_char (di
, '_')
1277 /* Allow missing _ if not at toplevel to work around a
1278 bug in G++ abi-version=2 mangling; see the comment in
1279 write_template_arg. */
1282 if (! d_check_char (di
, 'Z'))
1284 p
= d_encoding (di
, top_level
);
1286 /* If at top level and parsing parameters, check for a clone
1288 if (top_level
&& (di
->options
& DMGL_PARAMS
) != 0)
1289 while (d_peek_char (di
) == '.'
1290 && (IS_LOWER (d_peek_next_char (di
))
1291 || d_peek_next_char (di
) == '_'
1292 || IS_DIGIT (d_peek_next_char (di
))))
1293 p
= d_clone_suffix (di
, p
);
1298 /* Return whether a function should have a return type. The argument
1299 is the function name, which may be qualified in various ways. The
1300 rules are that template functions have return types with some
1301 exceptions, function types which are not part of a function name
1302 mangling have return types with some exceptions, and non-template
1303 function names do not have return types. The exceptions are that
1304 constructors, destructors, and conversion operators do not have
1308 has_return_type (struct demangle_component
*dc
)
1316 case DEMANGLE_COMPONENT_LOCAL_NAME
:
1317 return has_return_type (d_right (dc
));
1318 case DEMANGLE_COMPONENT_TEMPLATE
:
1319 return ! is_ctor_dtor_or_conversion (d_left (dc
));
1320 FNQUAL_COMPONENT_CASE
:
1321 return has_return_type (d_left (dc
));
1325 /* Return whether a name is a constructor, a destructor, or a
1326 conversion operator. */
1329 is_ctor_dtor_or_conversion (struct demangle_component
*dc
)
1337 case DEMANGLE_COMPONENT_QUAL_NAME
:
1338 case DEMANGLE_COMPONENT_LOCAL_NAME
:
1339 return is_ctor_dtor_or_conversion (d_right (dc
));
1340 case DEMANGLE_COMPONENT_CTOR
:
1341 case DEMANGLE_COMPONENT_DTOR
:
1342 case DEMANGLE_COMPONENT_CONVERSION
:
1347 /* <encoding> ::= <(function) name> <bare-function-type>
1351 TOP_LEVEL is non-zero when called at the top level, in which case
1352 if DMGL_PARAMS is not set we do not demangle the function
1353 parameters. We only set this at the top level, because otherwise
1354 we would not correctly demangle names in local scopes. */
1356 static struct demangle_component
*
1357 d_encoding (struct d_info
*di
, int top_level
)
1359 char peek
= d_peek_char (di
);
1360 struct demangle_component
*dc
;
1362 if (peek
== 'G' || peek
== 'T')
1363 dc
= d_special_name (di
);
1366 dc
= d_name (di
, 0);
1369 /* Failed already. */;
1370 else if (top_level
&& (di
->options
& DMGL_PARAMS
) == 0)
1372 /* Strip off any initial CV-qualifiers, as they really apply
1373 to the `this' parameter, and they were not output by the
1374 v2 demangler without DMGL_PARAMS. */
1375 while (is_fnqual_component_type (dc
->type
))
1378 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1379 there may be function-qualifiers on its right argument which
1380 really apply here; this happens when parsing a class
1381 which is local to a function. */
1382 if (dc
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
1384 while (d_right (dc
) != NULL
1385 && is_fnqual_component_type (d_right (dc
)->type
))
1386 d_right (dc
) = d_left (d_right (dc
));
1388 if (d_right (dc
) == NULL
)
1394 peek
= d_peek_char (di
);
1395 if (peek
!= '\0' && peek
!= 'E')
1397 struct demangle_component
*ftype
;
1399 ftype
= d_bare_function_type (di
, has_return_type (dc
));
1402 /* If this is a non-top-level local-name, clear the
1403 return type, so it doesn't confuse the user by
1404 being confused with the return type of whaever
1405 this is nested within. */
1406 if (!top_level
&& dc
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
1407 && ftype
->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
1408 d_left (ftype
) = NULL
;
1410 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TYPED_NAME
,
1422 /* <tagged-name> ::= <name> B <source-name> */
1424 static struct demangle_component
*
1425 d_abi_tags (struct d_info
*di
, struct demangle_component
*dc
)
1427 struct demangle_component
*hold_last_name
;
1430 /* Preserve the last name, so the ABI tag doesn't clobber it. */
1431 hold_last_name
= di
->last_name
;
1433 while (peek
= d_peek_char (di
),
1436 struct demangle_component
*tag
;
1438 tag
= d_source_name (di
);
1439 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TAGGED_NAME
, dc
, tag
);
1442 di
->last_name
= hold_last_name
;
1447 /* <name> ::= <nested-name>
1449 ::= <unscoped-template-name> <template-args>
1452 <unscoped-name> ::= <unqualified-name>
1453 ::= St <unqualified-name>
1455 <unscoped-template-name> ::= <unscoped-name>
1459 static struct demangle_component
*
1460 d_name (struct d_info
*di
, int substable
)
1462 char peek
= d_peek_char (di
);
1463 struct demangle_component
*dc
= NULL
;
1464 struct demangle_component
*module
= NULL
;
1470 dc
= d_nested_name (di
);
1474 dc
= d_local_name (di
);
1478 dc
= d_unqualified_name (di
, NULL
, NULL
);
1483 if (d_peek_next_char (di
) == 't')
1486 dc
= d_make_name (di
, "std", 3);
1490 if (d_peek_char (di
) == 'S')
1492 module
= d_substitution (di
, 0);
1495 if (!(module
->type
== DEMANGLE_COMPONENT_MODULE_NAME
1496 || module
->type
== DEMANGLE_COMPONENT_MODULE_PARTITION
))
1511 dc
= d_unqualified_name (di
, dc
, module
);
1512 if (d_peek_char (di
) == 'I')
1514 /* This is <template-args>, which means that we just saw
1515 <unscoped-template-name>, which is a substitution
1517 if (!subst
&& !d_add_substitution (di
, dc
))
1519 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, dc
,
1520 d_template_args (di
));
1525 if (substable
&& !subst
&& !d_add_substitution (di
, dc
))
1530 /* <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
1531 ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
1534 static struct demangle_component
*
1535 d_nested_name (struct d_info
*di
)
1537 struct demangle_component
*ret
;
1538 struct demangle_component
**pret
;
1539 struct demangle_component
*rqual
;
1541 if (! d_check_char (di
, 'N'))
1544 pret
= d_cv_qualifiers (di
, &ret
, 1);
1548 /* Parse the ref-qualifier now and then attach it
1549 once we have something to attach it to. */
1550 rqual
= d_ref_qualifier (di
, NULL
);
1552 *pret
= d_prefix (di
, 1);
1558 d_left (rqual
) = ret
;
1562 if (! d_check_char (di
, 'E'))
1568 /* <prefix> ::= <prefix> <unqualified-name>
1569 ::= <template-prefix> <template-args>
1570 ::= <template-param>
1575 <template-prefix> ::= <prefix> <(template) unqualified-name>
1576 ::= <template-param>
1579 SUBST is true if we should add substitutions (as normal), false
1580 if not (in an unresolved-name). */
1582 static struct demangle_component
*
1583 d_prefix (struct d_info
*di
, int substable
)
1585 struct demangle_component
*ret
= NULL
;
1589 char peek
= d_peek_char (di
);
1591 /* The older code accepts a <local-name> here, but I don't see
1592 that in the grammar. The older code does not accept a
1593 <template-param> here. */
1596 && (d_peek_next_char (di
) == 'T'
1597 || d_peek_next_char (di
) == 't'))
1602 ret
= cplus_demangle_type (di
);
1604 else if (peek
== 'I')
1608 struct demangle_component
*dc
= d_template_args (di
);
1611 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
, dc
);
1613 else if (peek
== 'T')
1617 ret
= d_template_param (di
);
1619 else if (peek
== 'M')
1621 /* Initializer scope for a lambda. We already added it as a
1622 substitution candidate, don't do that again. */
1628 struct demangle_component
*module
= NULL
;
1631 module
= d_substitution (di
, 1);
1634 if (!(module
->type
== DEMANGLE_COMPONENT_MODULE_NAME
1635 || module
->type
== DEMANGLE_COMPONENT_MODULE_PARTITION
))
1643 ret
= d_unqualified_name (di
, ret
, module
);
1649 if (d_peek_char (di
) == 'E')
1652 if (substable
&& !d_add_substitution (di
, ret
))
1660 d_maybe_module_name (struct d_info
*di
, struct demangle_component
**name
)
1662 while (d_peek_char (di
) == 'W')
1665 enum demangle_component_type code
= DEMANGLE_COMPONENT_MODULE_NAME
;
1666 if (d_peek_char (di
) == 'P')
1668 code
= DEMANGLE_COMPONENT_MODULE_PARTITION
;
1672 *name
= d_make_comp (di
, code
, *name
, d_source_name (di
));
1675 if (!d_add_substitution (di
, *name
))
1681 /* <unqualified-name> ::= [<module-name>] <operator-name> [<abi-tags>]
1682 ::= [<module-name>] <ctor-dtor-name> [<abi-tags>]
1683 ::= [<module-name>] <source-name> [<abi-tags>]
1684 ::= [<module-name>] <local-source-name> [<abi-tags>]
1685 ::= [<module-name>] DC <source-name>+ E [<abi-tags>]
1686 <local-source-name> ::= L <source-name> <discriminator> [<abi-tags>]
1689 static struct demangle_component
*
1690 d_unqualified_name (struct d_info
*di
, struct demangle_component
*scope
,
1691 struct demangle_component
*module
)
1693 struct demangle_component
*ret
;
1696 if (!d_maybe_module_name (di
, &module
))
1699 peek
= d_peek_char (di
);
1700 if (IS_DIGIT (peek
))
1701 ret
= d_source_name (di
);
1702 else if (IS_LOWER (peek
))
1704 int was_expr
= di
->is_expression
;
1705 if (peek
== 'o' && d_peek_next_char (di
) == 'n')
1708 /* Treat cv as naming a conversion operator. */
1709 di
->is_expression
= 0;
1711 ret
= d_operator_name (di
);
1712 di
->is_expression
= was_expr
;
1713 if (ret
!= NULL
&& ret
->type
== DEMANGLE_COMPONENT_OPERATOR
)
1715 di
->expansion
+= sizeof "operator" + ret
->u
.s_operator
.op
->len
- 2;
1716 if (!strcmp (ret
->u
.s_operator
.op
->code
, "li"))
1717 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, ret
,
1718 d_source_name (di
));
1721 else if (peek
== 'D' && d_peek_next_char (di
) == 'C')
1723 // structured binding
1725 struct demangle_component
*prev
= NULL
;
1728 struct demangle_component
*next
=
1729 d_make_comp (di
, DEMANGLE_COMPONENT_STRUCTURED_BINDING
,
1730 d_source_name (di
), NULL
);
1732 d_right (prev
) = next
;
1737 while (prev
&& d_peek_char (di
) != 'E');
1743 else if (peek
== 'C' || peek
== 'D')
1744 ret
= d_ctor_dtor_name (di
);
1745 else if (peek
== 'L')
1749 ret
= d_source_name (di
);
1752 if (! d_discriminator (di
))
1755 else if (peek
== 'U')
1757 switch (d_peek_next_char (di
))
1760 ret
= d_lambda (di
);
1763 ret
= d_unnamed_type (di
);
1773 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_MODULE_ENTITY
, ret
, module
);
1774 if (d_peek_char (di
) == 'B')
1775 ret
= d_abi_tags (di
, ret
);
1777 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_QUAL_NAME
, scope
, ret
);
1782 /* <source-name> ::= <(positive length) number> <identifier> */
1784 static struct demangle_component
*
1785 d_source_name (struct d_info
*di
)
1788 struct demangle_component
*ret
;
1790 len
= d_number (di
);
1793 ret
= d_identifier (di
, len
);
1794 di
->last_name
= ret
;
1798 /* number ::= [n] <(non-negative decimal integer)> */
1801 d_number (struct d_info
*di
)
1808 peek
= d_peek_char (di
);
1813 peek
= d_peek_char (di
);
1819 if (! IS_DIGIT (peek
))
1825 if (ret
> ((INT_MAX
- (peek
- '0')) / 10))
1827 ret
= ret
* 10 + (peek
- '0');
1829 peek
= d_peek_char (di
);
1833 /* Like d_number, but returns a demangle_component. */
1835 static struct demangle_component
*
1836 d_number_component (struct d_info
*di
)
1838 struct demangle_component
*ret
= d_make_empty (di
);
1841 ret
->type
= DEMANGLE_COMPONENT_NUMBER
;
1842 ret
->u
.s_number
.number
= d_number (di
);
1847 /* identifier ::= <(unqualified source code identifier)> */
1849 static struct demangle_component
*
1850 d_identifier (struct d_info
*di
, int len
)
1856 if (di
->send
- name
< len
)
1859 d_advance (di
, len
);
1861 /* A Java mangled name may have a trailing '$' if it is a C++
1862 keyword. This '$' is not included in the length count. We just
1864 if ((di
->options
& DMGL_JAVA
) != 0
1865 && d_peek_char (di
) == '$')
1868 /* Look for something which looks like a gcc encoding of an
1869 anonymous namespace, and replace it with a more user friendly
1871 if (len
>= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN
+ 2
1872 && memcmp (name
, ANONYMOUS_NAMESPACE_PREFIX
,
1873 ANONYMOUS_NAMESPACE_PREFIX_LEN
) == 0)
1877 s
= name
+ ANONYMOUS_NAMESPACE_PREFIX_LEN
;
1878 if ((*s
== '.' || *s
== '_' || *s
== '$')
1881 di
->expansion
-= len
- sizeof "(anonymous namespace)";
1882 return d_make_name (di
, "(anonymous namespace)",
1883 sizeof "(anonymous namespace)" - 1);
1887 return d_make_name (di
, name
, len
);
1890 /* operator_name ::= many different two character encodings.
1892 ::= v <digit> <source-name>
1894 This list is sorted for binary search. */
1896 #define NL(s) s, (sizeof s) - 1
1898 CP_STATIC_IF_GLIBCPP_V3
1899 const struct demangle_operator_info cplus_demangle_operators
[] =
1901 { "aN", NL ("&="), 2 },
1902 { "aS", NL ("="), 2 },
1903 { "aa", NL ("&&"), 2 },
1904 { "ad", NL ("&"), 1 },
1905 { "an", NL ("&"), 2 },
1906 { "at", NL ("alignof "), 1 },
1907 { "aw", NL ("co_await "), 1 },
1908 { "az", NL ("alignof "), 1 },
1909 { "cc", NL ("const_cast"), 2 },
1910 { "cl", NL ("()"), 2 },
1911 { "cm", NL (","), 2 },
1912 { "co", NL ("~"), 1 },
1913 { "dV", NL ("/="), 2 },
1914 { "dX", NL ("[...]="), 3 }, /* [expr...expr] = expr */
1915 { "da", NL ("delete[] "), 1 },
1916 { "dc", NL ("dynamic_cast"), 2 },
1917 { "de", NL ("*"), 1 },
1918 { "di", NL ("="), 2 }, /* .name = expr */
1919 { "dl", NL ("delete "), 1 },
1920 { "ds", NL (".*"), 2 },
1921 { "dt", NL ("."), 2 },
1922 { "dv", NL ("/"), 2 },
1923 { "dx", NL ("]="), 2 }, /* [expr] = expr */
1924 { "eO", NL ("^="), 2 },
1925 { "eo", NL ("^"), 2 },
1926 { "eq", NL ("=="), 2 },
1927 { "fL", NL ("..."), 3 },
1928 { "fR", NL ("..."), 3 },
1929 { "fl", NL ("..."), 2 },
1930 { "fr", NL ("..."), 2 },
1931 { "ge", NL (">="), 2 },
1932 { "gs", NL ("::"), 1 },
1933 { "gt", NL (">"), 2 },
1934 { "ix", NL ("[]"), 2 },
1935 { "lS", NL ("<<="), 2 },
1936 { "le", NL ("<="), 2 },
1937 { "li", NL ("operator\"\" "), 1 },
1938 { "ls", NL ("<<"), 2 },
1939 { "lt", NL ("<"), 2 },
1940 { "mI", NL ("-="), 2 },
1941 { "mL", NL ("*="), 2 },
1942 { "mi", NL ("-"), 2 },
1943 { "ml", NL ("*"), 2 },
1944 { "mm", NL ("--"), 1 },
1945 { "na", NL ("new[]"), 3 },
1946 { "ne", NL ("!="), 2 },
1947 { "ng", NL ("-"), 1 },
1948 { "nt", NL ("!"), 1 },
1949 { "nw", NL ("new"), 3 },
1950 { "oR", NL ("|="), 2 },
1951 { "oo", NL ("||"), 2 },
1952 { "or", NL ("|"), 2 },
1953 { "pL", NL ("+="), 2 },
1954 { "pl", NL ("+"), 2 },
1955 { "pm", NL ("->*"), 2 },
1956 { "pp", NL ("++"), 1 },
1957 { "ps", NL ("+"), 1 },
1958 { "pt", NL ("->"), 2 },
1959 { "qu", NL ("?"), 3 },
1960 { "rM", NL ("%="), 2 },
1961 { "rS", NL (">>="), 2 },
1962 { "rc", NL ("reinterpret_cast"), 2 },
1963 { "rm", NL ("%"), 2 },
1964 { "rs", NL (">>"), 2 },
1965 { "sP", NL ("sizeof..."), 1 },
1966 { "sZ", NL ("sizeof..."), 1 },
1967 { "sc", NL ("static_cast"), 2 },
1968 { "ss", NL ("<=>"), 2 },
1969 { "st", NL ("sizeof "), 1 },
1970 { "sz", NL ("sizeof "), 1 },
1971 { "tr", NL ("throw"), 0 },
1972 { "tw", NL ("throw "), 1 },
1973 { NULL
, NULL
, 0, 0 }
1976 static struct demangle_component
*
1977 d_operator_name (struct d_info
*di
)
1982 c1
= d_next_char (di
);
1983 c2
= d_next_char (di
);
1984 if (c1
== 'v' && IS_DIGIT (c2
))
1985 return d_make_extended_operator (di
, c2
- '0', d_source_name (di
));
1986 else if (c1
== 'c' && c2
== 'v')
1988 struct demangle_component
*type
;
1989 int was_conversion
= di
->is_conversion
;
1990 struct demangle_component
*res
;
1992 di
->is_conversion
= ! di
->is_expression
;
1993 type
= cplus_demangle_type (di
);
1994 if (di
->is_conversion
)
1995 res
= d_make_comp (di
, DEMANGLE_COMPONENT_CONVERSION
, type
, NULL
);
1997 res
= d_make_comp (di
, DEMANGLE_COMPONENT_CAST
, type
, NULL
);
1998 di
->is_conversion
= was_conversion
;
2003 /* LOW is the inclusive lower bound. */
2005 /* HIGH is the exclusive upper bound. We subtract one to ignore
2006 the sentinel at the end of the array. */
2007 int high
= ((sizeof (cplus_demangle_operators
)
2008 / sizeof (cplus_demangle_operators
[0]))
2014 const struct demangle_operator_info
*p
;
2016 i
= low
+ (high
- low
) / 2;
2017 p
= cplus_demangle_operators
+ i
;
2019 if (c1
== p
->code
[0] && c2
== p
->code
[1])
2020 return d_make_operator (di
, p
);
2022 if (c1
< p
->code
[0] || (c1
== p
->code
[0] && c2
< p
->code
[1]))
2032 static struct demangle_component
*
2033 d_make_character (struct d_info
*di
, int c
)
2035 struct demangle_component
*p
;
2036 p
= d_make_empty (di
);
2039 p
->type
= DEMANGLE_COMPONENT_CHARACTER
;
2040 p
->u
.s_character
.character
= c
;
2045 static struct demangle_component
*
2046 d_java_resource (struct d_info
*di
)
2048 struct demangle_component
*p
= NULL
;
2049 struct demangle_component
*next
= NULL
;
2054 len
= d_number (di
);
2058 /* Eat the leading '_'. */
2059 if (d_next_char (di
) != '_')
2072 /* Each chunk is either a '$' escape... */
2090 next
= d_make_character (di
, c
);
2098 /* ... or a sequence of characters. */
2101 while (i
< len
&& str
[i
] && str
[i
] != '$')
2104 next
= d_make_name (di
, str
, i
);
2117 p
= d_make_comp (di
, DEMANGLE_COMPONENT_COMPOUND_NAME
, p
, next
);
2123 p
= d_make_comp (di
, DEMANGLE_COMPONENT_JAVA_RESOURCE
, p
, NULL
);
2128 /* <special-name> ::= TV <type>
2132 ::= TA <template-arg>
2133 ::= GV <(object) name>
2134 ::= T <call-offset> <(base) encoding>
2135 ::= Tc <call-offset> <call-offset> <(base) encoding>
2136 Also g++ extensions:
2137 ::= TC <type> <(offset) number> _ <(base) type>
2142 ::= Gr <resource name>
2147 static struct demangle_component
*
2148 d_special_name (struct d_info
*di
)
2150 di
->expansion
+= 20;
2151 if (d_check_char (di
, 'T'))
2153 switch (d_next_char (di
))
2157 return d_make_comp (di
, DEMANGLE_COMPONENT_VTABLE
,
2158 cplus_demangle_type (di
), NULL
);
2160 di
->expansion
-= 10;
2161 return d_make_comp (di
, DEMANGLE_COMPONENT_VTT
,
2162 cplus_demangle_type (di
), NULL
);
2164 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO
,
2165 cplus_demangle_type (di
), NULL
);
2167 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO_NAME
,
2168 cplus_demangle_type (di
), NULL
);
2171 if (! d_call_offset (di
, 'h'))
2173 return d_make_comp (di
, DEMANGLE_COMPONENT_THUNK
,
2174 d_encoding (di
, 0), NULL
);
2177 if (! d_call_offset (di
, 'v'))
2179 return d_make_comp (di
, DEMANGLE_COMPONENT_VIRTUAL_THUNK
,
2180 d_encoding (di
, 0), NULL
);
2183 if (! d_call_offset (di
, '\0'))
2185 if (! d_call_offset (di
, '\0'))
2187 return d_make_comp (di
, DEMANGLE_COMPONENT_COVARIANT_THUNK
,
2188 d_encoding (di
, 0), NULL
);
2192 struct demangle_component
*derived_type
;
2194 struct demangle_component
*base_type
;
2196 derived_type
= cplus_demangle_type (di
);
2197 offset
= d_number (di
);
2200 if (! d_check_char (di
, '_'))
2202 base_type
= cplus_demangle_type (di
);
2203 /* We don't display the offset. FIXME: We should display
2204 it in verbose mode. */
2206 return d_make_comp (di
, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
,
2207 base_type
, derived_type
);
2211 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO_FN
,
2212 cplus_demangle_type (di
), NULL
);
2214 return d_make_comp (di
, DEMANGLE_COMPONENT_JAVA_CLASS
,
2215 cplus_demangle_type (di
), NULL
);
2218 return d_make_comp (di
, DEMANGLE_COMPONENT_TLS_INIT
,
2219 d_name (di
, 0), NULL
);
2222 return d_make_comp (di
, DEMANGLE_COMPONENT_TLS_WRAPPER
,
2223 d_name (di
, 0), NULL
);
2226 return d_make_comp (di
, DEMANGLE_COMPONENT_TPARM_OBJ
,
2227 d_template_arg (di
), NULL
);
2233 else if (d_check_char (di
, 'G'))
2235 switch (d_next_char (di
))
2238 return d_make_comp (di
, DEMANGLE_COMPONENT_GUARD
,
2239 d_name (di
, 0), NULL
);
2243 struct demangle_component
*name
= d_name (di
, 0);
2244 return d_make_comp (di
, DEMANGLE_COMPONENT_REFTEMP
, name
,
2245 d_number_component (di
));
2249 return d_make_comp (di
, DEMANGLE_COMPONENT_HIDDEN_ALIAS
,
2250 d_encoding (di
, 0), NULL
);
2254 struct demangle_component
*module
= NULL
;
2255 if (!d_maybe_module_name (di
, &module
) || !module
)
2257 return d_make_comp (di
, DEMANGLE_COMPONENT_MODULE_INIT
,
2261 switch (d_next_char (di
))
2264 return d_make_comp (di
, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
,
2265 d_encoding (di
, 0), NULL
);
2267 /* ??? The proposal is that other letters (such as 'h') stand
2268 for different variants of transaction cloning, such as
2269 compiling directly for hardware transaction support. But
2270 they still should all be transactional clones of some sort
2271 so go ahead and call them that. */
2273 return d_make_comp (di
, DEMANGLE_COMPONENT_TRANSACTION_CLONE
,
2274 d_encoding (di
, 0), NULL
);
2278 return d_java_resource (di
);
2288 /* <call-offset> ::= h <nv-offset> _
2291 <nv-offset> ::= <(offset) number>
2293 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
2295 The C parameter, if not '\0', is a character we just read which is
2296 the start of the <call-offset>.
2298 We don't display the offset information anywhere. FIXME: We should
2299 display it in verbose mode. */
2302 d_call_offset (struct d_info
*di
, int c
)
2305 c
= d_next_char (di
);
2312 if (! d_check_char (di
, '_'))
2319 if (! d_check_char (di
, '_'))
2325 /* <ctor-dtor-name> ::= C1
2333 static struct demangle_component
*
2334 d_ctor_dtor_name (struct d_info
*di
)
2336 if (di
->last_name
!= NULL
)
2338 if (di
->last_name
->type
== DEMANGLE_COMPONENT_NAME
)
2339 di
->expansion
+= di
->last_name
->u
.s_name
.len
;
2340 else if (di
->last_name
->type
== DEMANGLE_COMPONENT_SUB_STD
)
2341 di
->expansion
+= di
->last_name
->u
.s_string
.len
;
2343 switch (d_peek_char (di
))
2347 enum gnu_v3_ctor_kinds kind
;
2350 if (d_peek_next_char (di
) == 'I')
2356 switch (d_peek_next_char (di
))
2359 kind
= gnu_v3_complete_object_ctor
;
2362 kind
= gnu_v3_base_object_ctor
;
2365 kind
= gnu_v3_complete_object_allocating_ctor
;
2368 kind
= gnu_v3_unified_ctor
;
2371 kind
= gnu_v3_object_ctor_group
;
2380 cplus_demangle_type (di
);
2382 return d_make_ctor (di
, kind
, di
->last_name
);
2387 enum gnu_v3_dtor_kinds kind
;
2389 switch (d_peek_next_char (di
))
2392 kind
= gnu_v3_deleting_dtor
;
2395 kind
= gnu_v3_complete_object_dtor
;
2398 kind
= gnu_v3_base_object_dtor
;
2400 /* digit '3' is not used */
2402 kind
= gnu_v3_unified_dtor
;
2405 kind
= gnu_v3_object_dtor_group
;
2411 return d_make_dtor (di
, kind
, di
->last_name
);
2419 /* True iff we're looking at an order-insensitive type-qualifier, including
2420 function-type-qualifiers. */
2423 next_is_type_qual (struct d_info
*di
)
2425 char peek
= d_peek_char (di
);
2426 if (peek
== 'r' || peek
== 'V' || peek
== 'K')
2430 peek
= d_peek_next_char (di
);
2431 if (peek
== 'x' || peek
== 'o' || peek
== 'O' || peek
== 'w')
2437 /* <type> ::= <builtin-type>
2439 ::= <class-enum-type>
2441 ::= <pointer-to-member-type>
2442 ::= <template-param>
2443 ::= <template-template-param> <template-args>
2445 ::= <CV-qualifiers> <type>
2448 ::= O <type> (C++0x)
2451 ::= U <source-name> <type>
2453 <builtin-type> ::= various one letter codes
2457 CP_STATIC_IF_GLIBCPP_V3
2458 const struct demangle_builtin_type_info
2459 cplus_demangle_builtin_types
[D_BUILTIN_TYPE_COUNT
] =
2461 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT
},
2462 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL
},
2463 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT
},
2464 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT
},
2465 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT
},
2466 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT
},
2467 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT
},
2468 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT
},
2469 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT
},
2470 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED
},
2471 /* k */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2472 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG
},
2473 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG
},
2474 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT
},
2475 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2477 /* p */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2478 /* q */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2479 /* r */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2480 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT
},
2481 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT
},
2482 /* u */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2483 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID
},
2484 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT
},
2485 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG
},
2486 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2487 D_PRINT_UNSIGNED_LONG_LONG
},
2488 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT
},
2489 /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT
},
2490 /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT
},
2491 /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT
},
2492 /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT
},
2493 /* 30 */ { NL ("char8_t"), NL ("char8_t"), D_PRINT_DEFAULT
},
2494 /* 31 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT
},
2495 /* 32 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT
},
2496 /* 33 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"),
2498 /* 34 */ { NL ("_Float"), NL ("_Float"), D_PRINT_FLOAT
},
2499 /* 35 */ { NL ("std::bfloat16_t"), NL ("std::bfloat16_t"), D_PRINT_FLOAT
},
2502 CP_STATIC_IF_GLIBCPP_V3
2503 struct demangle_component
*
2504 cplus_demangle_type (struct d_info
*di
)
2507 struct demangle_component
*ret
;
2510 /* The ABI specifies that when CV-qualifiers are used, the base type
2511 is substitutable, and the fully qualified type is substitutable,
2512 but the base type with a strict subset of the CV-qualifiers is
2513 not substitutable. The natural recursive implementation of the
2514 CV-qualifiers would cause subsets to be substitutable, so instead
2515 we pull them all off now.
2517 FIXME: The ABI says that order-insensitive vendor qualifiers
2518 should be handled in the same way, but we have no way to tell
2519 which vendor qualifiers are order-insensitive and which are
2520 order-sensitive. So we just assume that they are all
2521 order-sensitive. g++ 3.4 supports only one vendor qualifier,
2522 __vector, and it treats it as order-sensitive when mangling
2525 if (next_is_type_qual (di
))
2527 struct demangle_component
**pret
;
2529 pret
= d_cv_qualifiers (di
, &ret
, 0);
2532 if (d_peek_char (di
) == 'F')
2534 /* cv-qualifiers before a function type apply to 'this',
2535 so avoid adding the unqualified function type to
2536 the substitution list. */
2537 *pret
= d_function_type (di
);
2540 *pret
= cplus_demangle_type (di
);
2543 if ((*pret
)->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
2544 || (*pret
)->type
== DEMANGLE_COMPONENT_REFERENCE_THIS
)
2546 /* Move the ref-qualifier outside the cv-qualifiers so that
2547 they are printed in the right order. */
2548 struct demangle_component
*fn
= d_left (*pret
);
2549 d_left (*pret
) = ret
;
2553 if (! d_add_substitution (di
, ret
))
2560 peek
= d_peek_char (di
);
2563 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2564 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
2565 case 'o': case 's': case 't':
2566 case 'v': case 'w': case 'x': case 'y': case 'z':
2567 ret
= d_make_builtin_type (di
,
2568 &cplus_demangle_builtin_types
[peek
- 'a']);
2569 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2576 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_VENDOR_TYPE
,
2577 d_source_name (di
), NULL
);
2581 ret
= d_function_type (di
);
2585 ret
= d_array_type (di
);
2589 ret
= d_pointer_to_member_type (di
);
2593 ret
= d_template_param (di
);
2594 if (d_peek_char (di
) == 'I')
2596 /* This may be <template-template-param> <template-args>.
2597 If this is the type for a conversion operator, we can
2598 have a <template-template-param> here only by following
2599 a derivation like this:
2602 -> <template-prefix> <template-args>
2603 -> <prefix> <template-unqualified-name> <template-args>
2604 -> <unqualified-name> <template-unqualified-name> <template-args>
2605 -> <source-name> <template-unqualified-name> <template-args>
2606 -> <source-name> <operator-name> <template-args>
2607 -> <source-name> cv <type> <template-args>
2608 -> <source-name> cv <template-template-param> <template-args> <template-args>
2610 where the <template-args> is followed by another.
2611 Otherwise, we must have a derivation like this:
2614 -> <template-prefix> <template-args>
2615 -> <prefix> <template-unqualified-name> <template-args>
2616 -> <unqualified-name> <template-unqualified-name> <template-args>
2617 -> <source-name> <template-unqualified-name> <template-args>
2618 -> <source-name> <operator-name> <template-args>
2619 -> <source-name> cv <type> <template-args>
2620 -> <source-name> cv <template-param> <template-args>
2622 where we need to leave the <template-args> to be processed
2623 by d_prefix (following the <template-prefix>).
2625 The <template-template-param> part is a substitution
2627 if (! di
->is_conversion
)
2629 if (! d_add_substitution (di
, ret
))
2631 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2632 d_template_args (di
));
2636 struct demangle_component
*args
;
2637 struct d_info_checkpoint checkpoint
;
2639 d_checkpoint (di
, &checkpoint
);
2640 args
= d_template_args (di
);
2641 if (d_peek_char (di
) == 'I')
2643 if (! d_add_substitution (di
, ret
))
2645 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2649 d_backtrack (di
, &checkpoint
);
2656 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_RVALUE_REFERENCE
,
2657 cplus_demangle_type (di
), NULL
);
2662 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_POINTER
,
2663 cplus_demangle_type (di
), NULL
);
2668 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_REFERENCE
,
2669 cplus_demangle_type (di
), NULL
);
2674 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_COMPLEX
,
2675 cplus_demangle_type (di
), NULL
);
2680 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_IMAGINARY
,
2681 cplus_demangle_type (di
), NULL
);
2686 ret
= d_source_name (di
);
2687 if (d_peek_char (di
) == 'I')
2688 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2689 d_template_args (di
));
2690 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
,
2691 cplus_demangle_type (di
), ret
);
2697 peek
= d_next_char (di
);
2702 /* decltype (expression) */
2703 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_DECLTYPE
,
2704 d_expression (di
), NULL
);
2705 if (ret
&& d_next_char (di
) != 'E')
2711 /* Pack expansion. */
2712 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_PACK_EXPANSION
,
2713 cplus_demangle_type (di
), NULL
);
2719 ret
= d_make_name (di
, "auto", 4);
2722 /* decltype(auto) */
2723 ret
= d_make_name (di
, "decltype(auto)", 14);
2727 /* 32-bit decimal floating point */
2728 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[26]);
2729 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2733 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[27]);
2734 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2738 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[28]);
2739 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2742 /* 16-bit half-precision FP */
2743 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[29]);
2744 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2748 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[30]);
2749 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2753 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[31]);
2754 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2758 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[32]);
2759 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2763 /* DF<number>_ - _Float<number>.
2764 DF<number>x - _Float<number>x
2765 DF16b - std::bfloat16_t. */
2767 int arg
= d_number (di
);
2770 if (d_peek_char (di
) == 'b')
2775 ret
= d_make_builtin_type (di
,
2776 &cplus_demangle_builtin_types
[35]);
2777 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2780 if (d_peek_char (di
) == 'x')
2782 if (!suffix
&& d_peek_char (di
) != '_')
2785 = d_make_extended_builtin_type (di
,
2786 &cplus_demangle_builtin_types
[34],
2789 sprintf (buf
, "%d", arg
);
2790 di
->expansion
+= ret
->u
.s_extended_builtin
.type
->len
2791 + strlen (buf
) + (suffix
!= 0);
2796 ret
= d_vector_type (di
);
2801 /* decltype(nullptr) */
2802 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[33]);
2803 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2812 return d_class_enum_type (di
, 1);
2817 if (! d_add_substitution (di
, ret
))
2824 /* <CV-qualifiers> ::= [r] [V] [K] [Dx] */
2826 static struct demangle_component
**
2827 d_cv_qualifiers (struct d_info
*di
,
2828 struct demangle_component
**pret
, int member_fn
)
2830 struct demangle_component
**pstart
;
2834 peek
= d_peek_char (di
);
2835 while (next_is_type_qual (di
))
2837 enum demangle_component_type t
;
2838 struct demangle_component
*right
= NULL
;
2844 ? DEMANGLE_COMPONENT_RESTRICT_THIS
2845 : DEMANGLE_COMPONENT_RESTRICT
);
2846 di
->expansion
+= sizeof "restrict";
2848 else if (peek
== 'V')
2851 ? DEMANGLE_COMPONENT_VOLATILE_THIS
2852 : DEMANGLE_COMPONENT_VOLATILE
);
2853 di
->expansion
+= sizeof "volatile";
2855 else if (peek
== 'K')
2858 ? DEMANGLE_COMPONENT_CONST_THIS
2859 : DEMANGLE_COMPONENT_CONST
);
2860 di
->expansion
+= sizeof "const";
2864 peek
= d_next_char (di
);
2867 t
= DEMANGLE_COMPONENT_TRANSACTION_SAFE
;
2868 di
->expansion
+= sizeof "transaction_safe";
2870 else if (peek
== 'o'
2873 t
= DEMANGLE_COMPONENT_NOEXCEPT
;
2874 di
->expansion
+= sizeof "noexcept";
2877 right
= d_expression (di
);
2880 if (! d_check_char (di
, 'E'))
2884 else if (peek
== 'w')
2886 t
= DEMANGLE_COMPONENT_THROW_SPEC
;
2887 di
->expansion
+= sizeof "throw";
2888 right
= d_parmlist (di
);
2891 if (! d_check_char (di
, 'E'))
2898 *pret
= d_make_comp (di
, t
, NULL
, right
);
2901 pret
= &d_left (*pret
);
2903 peek
= d_peek_char (di
);
2906 if (!member_fn
&& peek
== 'F')
2908 while (pstart
!= pret
)
2910 switch ((*pstart
)->type
)
2912 case DEMANGLE_COMPONENT_RESTRICT
:
2913 (*pstart
)->type
= DEMANGLE_COMPONENT_RESTRICT_THIS
;
2915 case DEMANGLE_COMPONENT_VOLATILE
:
2916 (*pstart
)->type
= DEMANGLE_COMPONENT_VOLATILE_THIS
;
2918 case DEMANGLE_COMPONENT_CONST
:
2919 (*pstart
)->type
= DEMANGLE_COMPONENT_CONST_THIS
;
2924 pstart
= &d_left (*pstart
);
2931 /* <ref-qualifier> ::= R
2934 static struct demangle_component
*
2935 d_ref_qualifier (struct d_info
*di
, struct demangle_component
*sub
)
2937 struct demangle_component
*ret
= sub
;
2940 peek
= d_peek_char (di
);
2941 if (peek
== 'R' || peek
== 'O')
2943 enum demangle_component_type t
;
2946 t
= DEMANGLE_COMPONENT_REFERENCE_THIS
;
2947 di
->expansion
+= sizeof "&";
2951 t
= DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
;
2952 di
->expansion
+= sizeof "&&";
2956 ret
= d_make_comp (di
, t
, ret
, NULL
);
2962 /* <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] [T] E */
2964 static struct demangle_component
*
2965 d_function_type (struct d_info
*di
)
2967 struct demangle_component
*ret
= NULL
;
2969 if ((di
->options
& DMGL_NO_RECURSE_LIMIT
) == 0)
2971 if (di
->recursion_level
> DEMANGLE_RECURSION_LIMIT
)
2972 /* FIXME: There ought to be a way to report
2973 that the recursion limit has been reached. */
2976 di
->recursion_level
++;
2979 if (d_check_char (di
, 'F'))
2981 if (d_peek_char (di
) == 'Y')
2983 /* Function has C linkage. We don't print this information.
2984 FIXME: We should print it in verbose mode. */
2987 ret
= d_bare_function_type (di
, 1);
2988 ret
= d_ref_qualifier (di
, ret
);
2990 if (! d_check_char (di
, 'E'))
2994 if ((di
->options
& DMGL_NO_RECURSE_LIMIT
) == 0)
2995 di
->recursion_level
--;
3001 static struct demangle_component
*
3002 d_parmlist (struct d_info
*di
)
3004 struct demangle_component
*tl
;
3005 struct demangle_component
**ptl
;
3011 struct demangle_component
*type
;
3013 char peek
= d_peek_char (di
);
3014 if (peek
== '\0' || peek
== 'E' || peek
== '.')
3016 if ((peek
== 'R' || peek
== 'O')
3017 && d_peek_next_char (di
) == 'E')
3018 /* Function ref-qualifier, not a ref prefix for a parameter type. */
3020 type
= cplus_demangle_type (di
);
3023 *ptl
= d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, type
, NULL
);
3026 ptl
= &d_right (*ptl
);
3029 /* There should be at least one parameter type besides the optional
3030 return type. A function which takes no arguments will have a
3031 single parameter type void. */
3035 /* If we have a single parameter type void, omit it. */
3036 if (d_right (tl
) == NULL
3037 && d_left (tl
)->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
3038 && d_left (tl
)->u
.s_builtin
.type
->print
== D_PRINT_VOID
)
3040 di
->expansion
-= d_left (tl
)->u
.s_builtin
.type
->len
;
3047 /* <bare-function-type> ::= [J]<type>+ */
3049 static struct demangle_component
*
3050 d_bare_function_type (struct d_info
*di
, int has_return_type
)
3052 struct demangle_component
*return_type
;
3053 struct demangle_component
*tl
;
3056 /* Detect special qualifier indicating that the first argument
3057 is the return type. */
3058 peek
= d_peek_char (di
);
3062 has_return_type
= 1;
3065 if (has_return_type
)
3067 return_type
= cplus_demangle_type (di
);
3068 if (return_type
== NULL
)
3074 tl
= d_parmlist (di
);
3078 return d_make_comp (di
, DEMANGLE_COMPONENT_FUNCTION_TYPE
,
3082 /* <class-enum-type> ::= <name> */
3084 static struct demangle_component
*
3085 d_class_enum_type (struct d_info
*di
, int substable
)
3087 return d_name (di
, substable
);
3090 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
3091 ::= A [<(dimension) expression>] _ <(element) type>
3094 static struct demangle_component
*
3095 d_array_type (struct d_info
*di
)
3098 struct demangle_component
*dim
;
3100 if (! d_check_char (di
, 'A'))
3103 peek
= d_peek_char (di
);
3106 else if (IS_DIGIT (peek
))
3114 peek
= d_peek_char (di
);
3116 while (IS_DIGIT (peek
));
3117 dim
= d_make_name (di
, s
, d_str (di
) - s
);
3123 dim
= d_expression (di
);
3128 if (! d_check_char (di
, '_'))
3131 return d_make_comp (di
, DEMANGLE_COMPONENT_ARRAY_TYPE
, dim
,
3132 cplus_demangle_type (di
));
3135 /* <vector-type> ::= Dv <number> _ <type>
3136 ::= Dv _ <expression> _ <type> */
3138 static struct demangle_component
*
3139 d_vector_type (struct d_info
*di
)
3142 struct demangle_component
*dim
;
3144 peek
= d_peek_char (di
);
3148 dim
= d_expression (di
);
3151 dim
= d_number_component (di
);
3156 if (! d_check_char (di
, '_'))
3159 return d_make_comp (di
, DEMANGLE_COMPONENT_VECTOR_TYPE
, dim
,
3160 cplus_demangle_type (di
));
3163 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
3165 static struct demangle_component
*
3166 d_pointer_to_member_type (struct d_info
*di
)
3168 struct demangle_component
*cl
;
3169 struct demangle_component
*mem
;
3171 if (! d_check_char (di
, 'M'))
3174 cl
= cplus_demangle_type (di
);
3178 /* The ABI says, "The type of a non-static member function is considered
3179 to be different, for the purposes of substitution, from the type of a
3180 namespace-scope or static member function whose type appears
3181 similar. The types of two non-static member functions are considered
3182 to be different, for the purposes of substitution, if the functions
3183 are members of different classes. In other words, for the purposes of
3184 substitution, the class of which the function is a member is
3185 considered part of the type of function."
3187 For a pointer to member function, this call to cplus_demangle_type
3188 will end up adding a (possibly qualified) non-member function type to
3189 the substitution table, which is not correct; however, the member
3190 function type will never be used in a substitution, so putting the
3191 wrong type in the substitution table is harmless. */
3193 mem
= cplus_demangle_type (di
);
3197 return d_make_comp (di
, DEMANGLE_COMPONENT_PTRMEM_TYPE
, cl
, mem
);
3200 /* <non-negative number> _ */
3203 d_compact_number (struct d_info
*di
)
3206 if (d_peek_char (di
) == '_')
3208 else if (d_peek_char (di
) == 'n')
3211 num
= d_number (di
) + 1;
3213 if (num
< 0 || ! d_check_char (di
, '_'))
3218 /* <template-param> ::= T_
3219 ::= T <(parameter-2 non-negative) number> _
3222 static struct demangle_component
*
3223 d_template_param (struct d_info
*di
)
3227 if (! d_check_char (di
, 'T'))
3230 param
= d_compact_number (di
);
3234 return d_make_template_param (di
, param
);
3237 /* <template-args> ::= I <template-arg>+ E */
3239 static struct demangle_component
*
3240 d_template_args (struct d_info
*di
)
3242 if (d_peek_char (di
) != 'I'
3243 && d_peek_char (di
) != 'J')
3247 return d_template_args_1 (di
);
3250 /* <template-arg>* E */
3252 static struct demangle_component
*
3253 d_template_args_1 (struct d_info
*di
)
3255 struct demangle_component
*hold_last_name
;
3256 struct demangle_component
*al
;
3257 struct demangle_component
**pal
;
3259 /* Preserve the last name we saw--don't let the template arguments
3260 clobber it, as that would give us the wrong name for a subsequent
3261 constructor or destructor. */
3262 hold_last_name
= di
->last_name
;
3264 if (d_peek_char (di
) == 'E')
3266 /* An argument pack can be empty. */
3268 return d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
, NULL
, NULL
);
3275 struct demangle_component
*a
;
3277 a
= d_template_arg (di
);
3281 *pal
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
, a
, NULL
);
3284 pal
= &d_right (*pal
);
3286 if (d_peek_char (di
) == 'E')
3293 di
->last_name
= hold_last_name
;
3298 /* <template-arg> ::= <type>
3299 ::= X <expression> E
3303 static struct demangle_component
*
3304 d_template_arg (struct d_info
*di
)
3306 struct demangle_component
*ret
;
3308 switch (d_peek_char (di
))
3312 ret
= d_expression (di
);
3313 if (! d_check_char (di
, 'E'))
3318 return d_expr_primary (di
);
3322 /* An argument pack. */
3323 return d_template_args (di
);
3326 return cplus_demangle_type (di
);
3330 /* Parse a sequence of expressions until we hit the terminator
3333 static struct demangle_component
*
3334 d_exprlist (struct d_info
*di
, char terminator
)
3336 struct demangle_component
*list
= NULL
;
3337 struct demangle_component
**p
= &list
;
3339 if (d_peek_char (di
) == terminator
)
3342 return d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, NULL
, NULL
);
3347 struct demangle_component
*arg
= d_expression (di
);
3351 *p
= d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, arg
, NULL
);
3356 if (d_peek_char (di
) == terminator
)
3366 /* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
3367 dynamic_cast, static_cast or reinterpret_cast. */
3370 op_is_new_cast (struct demangle_component
*op
)
3372 const char *code
= op
->u
.s_operator
.op
->code
;
3373 return (code
[1] == 'c'
3374 && (code
[0] == 's' || code
[0] == 'd'
3375 || code
[0] == 'c' || code
[0] == 'r'));
3378 /* <unresolved-name> ::= [gs] <base-unresolved-name> # x or (with "gs") ::x
3379 ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x
3380 # T::N::x /decltype(p)::N::x
3381 ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name>
3382 # A::x, N::y, A<T>::z; "gs" means leading "::"
3383 ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name>
3385 "gs" is handled elsewhere, as a unary operator. */
3387 static struct demangle_component
*
3388 d_unresolved_name (struct d_info
*di
)
3390 struct demangle_component
*type
;
3391 struct demangle_component
*name
;
3394 /* Consume the "sr". */
3397 peek
= d_peek_char (di
);
3398 if (di
->unresolved_name_state
3405 /* The third production is ambiguous with the old unresolved-name syntax
3406 of <type> <base-unresolved-name>; in the old mangling, A::x was mangled
3407 as sr1A1x, now sr1AE1x. So we first try to demangle using the new
3408 mangling, then with the old if that fails. */
3409 di
->unresolved_name_state
= -1;
3410 type
= d_prefix (di
, 0);
3411 if (d_peek_char (di
) == 'E')
3415 type
= cplus_demangle_type (di
);
3416 name
= d_unqualified_name (di
, type
, NULL
);
3417 if (d_peek_char (di
) == 'I')
3418 name
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, name
,
3419 d_template_args (di
));
3423 /* <expression> ::= <(unary) operator-name> <expression>
3424 ::= <(binary) operator-name> <expression> <expression>
3425 ::= <(trinary) operator-name> <expression> <expression> <expression>
3426 ::= cl <expression>+ E
3428 ::= <template-param>
3429 ::= u <source-name> <template-arg>* E # vendor extended expression
3430 ::= <unresolved-name>
3433 <braced-expression> ::= <expression>
3434 ::= di <field source-name> <braced-expression> # .name = expr
3435 ::= dx <index expression> <braced-expression> # [expr] = expr
3436 ::= dX <range begin expression> <range end expression> <braced-expression>
3437 # [expr ... expr] = expr
3440 static struct demangle_component
*
3441 d_expression_1 (struct d_info
*di
)
3445 peek
= d_peek_char (di
);
3447 return d_expr_primary (di
);
3448 else if (peek
== 'T')
3449 return d_template_param (di
);
3450 else if (peek
== 's' && d_peek_next_char (di
) == 'r')
3451 return d_unresolved_name (di
);
3452 else if (peek
== 's' && d_peek_next_char (di
) == 'p')
3455 return d_make_comp (di
, DEMANGLE_COMPONENT_PACK_EXPANSION
,
3456 d_expression_1 (di
), NULL
);
3458 else if (peek
== 'f' && d_peek_next_char (di
) == 'p')
3460 /* Function parameter used in a late-specified return type. */
3463 if (d_peek_char (di
) == 'T')
3465 /* 'this' parameter. */
3471 index
= d_compact_number (di
);
3472 if (index
== INT_MAX
|| index
== -1)
3476 return d_make_function_param (di
, index
);
3478 else if (IS_DIGIT (peek
)
3479 || (peek
== 'o' && d_peek_next_char (di
) == 'n'))
3481 /* We can get an unqualified name as an expression in the case of
3482 a dependent function call, i.e. decltype(f(t)). */
3483 struct demangle_component
*name
;
3486 /* operator-function-id, i.e. operator+(t). */
3489 name
= d_unqualified_name (di
, NULL
, NULL
);
3492 if (d_peek_char (di
) == 'I')
3493 return d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, name
,
3494 d_template_args (di
));
3498 else if ((peek
== 'i' || peek
== 't')
3499 && d_peek_next_char (di
) == 'l')
3501 /* Brace-enclosed initializer list, untyped or typed. */
3502 struct demangle_component
*type
= NULL
;
3505 type
= cplus_demangle_type (di
);
3506 if (!d_peek_char (di
) || !d_peek_next_char (di
))
3508 return d_make_comp (di
, DEMANGLE_COMPONENT_INITIALIZER_LIST
,
3509 type
, d_exprlist (di
, 'E'));
3511 else if (peek
== 'u')
3513 /* A vendor extended expression. */
3514 struct demangle_component
*name
, *args
;
3516 name
= d_source_name (di
);
3517 args
= d_template_args_1 (di
);
3518 return d_make_comp (di
, DEMANGLE_COMPONENT_VENDOR_EXPR
, name
, args
);
3522 struct demangle_component
*op
;
3523 const char *code
= NULL
;
3526 op
= d_operator_name (di
);
3530 if (op
->type
== DEMANGLE_COMPONENT_OPERATOR
)
3532 code
= op
->u
.s_operator
.op
->code
;
3533 di
->expansion
+= op
->u
.s_operator
.op
->len
- 2;
3534 if (strcmp (code
, "st") == 0)
3535 return d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, op
,
3536 cplus_demangle_type (di
));
3543 case DEMANGLE_COMPONENT_OPERATOR
:
3544 args
= op
->u
.s_operator
.op
->args
;
3546 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
3547 args
= op
->u
.s_extended_operator
.args
;
3549 case DEMANGLE_COMPONENT_CAST
:
3557 return d_make_comp (di
, DEMANGLE_COMPONENT_NULLARY
, op
, NULL
);
3561 struct demangle_component
*operand
;
3564 if (code
&& (code
[0] == 'p' || code
[0] == 'm')
3565 && code
[1] == code
[0])
3566 /* pp_ and mm_ are the prefix variants. */
3567 suffix
= !d_check_char (di
, '_');
3569 if (op
->type
== DEMANGLE_COMPONENT_CAST
3570 && d_check_char (di
, '_'))
3571 operand
= d_exprlist (di
, 'E');
3572 else if (code
&& !strcmp (code
, "sP"))
3573 operand
= d_template_args_1 (di
);
3575 operand
= d_expression_1 (di
);
3578 /* Indicate the suffix variant for d_print_comp. */
3579 operand
= d_make_comp (di
, DEMANGLE_COMPONENT_BINARY_ARGS
,
3582 return d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, op
, operand
);
3586 struct demangle_component
*left
;
3587 struct demangle_component
*right
;
3591 if (op_is_new_cast (op
))
3592 left
= cplus_demangle_type (di
);
3593 else if (code
[0] == 'f')
3594 /* fold-expression. */
3595 left
= d_operator_name (di
);
3596 else if (!strcmp (code
, "di"))
3597 left
= d_unqualified_name (di
, NULL
, NULL
);
3599 left
= d_expression_1 (di
);
3600 if (!strcmp (code
, "cl"))
3601 right
= d_exprlist (di
, 'E');
3602 else if (!strcmp (code
, "dt") || !strcmp (code
, "pt"))
3604 peek
= d_peek_char (di
);
3605 /* These codes start a qualified name. */
3606 if ((peek
== 'g' && d_peek_next_char (di
) == 's')
3607 || (peek
== 's' && d_peek_next_char (di
) == 'r'))
3608 right
= d_expression_1 (di
);
3611 /* Otherwise it's an unqualified name. We use
3612 d_unqualified_name rather than d_expression_1 here for
3613 old mangled names that didn't add 'on' before operator
3615 right
= d_unqualified_name (di
, NULL
, NULL
);
3616 if (d_peek_char (di
) == 'I')
3617 right
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
,
3618 right
, d_template_args (di
));
3622 right
= d_expression_1 (di
);
3624 return d_make_comp (di
, DEMANGLE_COMPONENT_BINARY
, op
,
3626 DEMANGLE_COMPONENT_BINARY_ARGS
,
3631 struct demangle_component
*first
;
3632 struct demangle_component
*second
;
3633 struct demangle_component
*third
;
3637 else if (!strcmp (code
, "qu")
3638 || !strcmp (code
, "dX"))
3640 /* ?: expression. */
3641 first
= d_expression_1 (di
);
3642 second
= d_expression_1 (di
);
3643 third
= d_expression_1 (di
);
3647 else if (code
[0] == 'f')
3649 /* fold-expression. */
3650 first
= d_operator_name (di
);
3651 second
= d_expression_1 (di
);
3652 third
= d_expression_1 (di
);
3656 else if (code
[0] == 'n')
3658 /* new-expression. */
3659 if (code
[1] != 'w' && code
[1] != 'a')
3661 first
= d_exprlist (di
, '_');
3662 second
= cplus_demangle_type (di
);
3663 if (d_peek_char (di
) == 'E')
3668 else if (d_peek_char (di
) == 'p'
3669 && d_peek_next_char (di
) == 'i')
3671 /* Parenthesized initializer. */
3673 third
= d_exprlist (di
, 'E');
3675 else if (d_peek_char (di
) == 'i'
3676 && d_peek_next_char (di
) == 'l')
3677 /* initializer-list. */
3678 third
= d_expression_1 (di
);
3684 return d_make_comp (di
, DEMANGLE_COMPONENT_TRINARY
, op
,
3686 DEMANGLE_COMPONENT_TRINARY_ARG1
,
3689 DEMANGLE_COMPONENT_TRINARY_ARG2
,
3698 static struct demangle_component
*
3699 d_expression (struct d_info
*di
)
3701 struct demangle_component
*ret
;
3702 int was_expression
= di
->is_expression
;
3704 di
->is_expression
= 1;
3705 ret
= d_expression_1 (di
);
3706 di
->is_expression
= was_expression
;
3710 /* <expr-primary> ::= L <type> <(value) number> E
3711 ::= L <type> <(value) float> E
3712 ::= L <mangled-name> E
3715 static struct demangle_component
*
3716 d_expr_primary (struct d_info
*di
)
3718 struct demangle_component
*ret
;
3720 if (! d_check_char (di
, 'L'))
3722 if (d_peek_char (di
) == '_'
3723 /* Workaround for G++ bug; see comment in write_template_arg. */
3724 || d_peek_char (di
) == 'Z')
3725 ret
= cplus_demangle_mangled_name (di
, 0);
3728 struct demangle_component
*type
;
3729 enum demangle_component_type t
;
3732 type
= cplus_demangle_type (di
);
3736 /* If we have a type we know how to print, we aren't going to
3737 print the type name itself. */
3738 if (type
->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
3739 && type
->u
.s_builtin
.type
->print
!= D_PRINT_DEFAULT
)
3740 di
->expansion
-= type
->u
.s_builtin
.type
->len
;
3742 if (type
->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
3743 && strcmp (type
->u
.s_builtin
.type
->name
,
3744 cplus_demangle_builtin_types
[33].name
) == 0)
3746 if (d_peek_char (di
) == 'E')
3753 /* Rather than try to interpret the literal value, we just
3754 collect it as a string. Note that it's possible to have a
3755 floating point literal here. The ABI specifies that the
3756 format of such literals is machine independent. That's fine,
3757 but what's not fine is that versions of g++ up to 3.2 with
3758 -fabi-version=1 used upper case letters in the hex constant,
3759 and dumped out gcc's internal representation. That makes it
3760 hard to tell where the constant ends, and hard to dump the
3761 constant in any readable form anyhow. We don't attempt to
3762 handle these cases. */
3764 t
= DEMANGLE_COMPONENT_LITERAL
;
3765 if (d_peek_char (di
) == 'n')
3767 t
= DEMANGLE_COMPONENT_LITERAL_NEG
;
3771 while (d_peek_char (di
) != 'E')
3773 if (d_peek_char (di
) == '\0')
3777 ret
= d_make_comp (di
, t
, type
, d_make_name (di
, s
, d_str (di
) - s
));
3779 if (! d_check_char (di
, 'E'))
3784 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3785 ::= Z <(function) encoding> E s [<discriminator>]
3786 ::= Z <(function) encoding> E d [<parameter> number>] _ <entity name>
3789 static struct demangle_component
*
3790 d_local_name (struct d_info
*di
)
3792 struct demangle_component
*function
;
3793 struct demangle_component
*name
;
3795 if (! d_check_char (di
, 'Z'))
3798 function
= d_encoding (di
, 0);
3802 if (! d_check_char (di
, 'E'))
3805 if (d_peek_char (di
) == 's')
3808 if (! d_discriminator (di
))
3810 name
= d_make_name (di
, "string literal", sizeof "string literal" - 1);
3816 if (d_peek_char (di
) == 'd')
3818 /* Default argument scope: d <number> _. */
3820 num
= d_compact_number (di
);
3825 name
= d_name (di
, 0);
3828 /* Lambdas and unnamed types have internal discriminators
3829 and are not functions. */
3830 && name
->type
!= DEMANGLE_COMPONENT_LAMBDA
3831 && name
->type
!= DEMANGLE_COMPONENT_UNNAMED_TYPE
)
3833 /* Read and ignore an optional discriminator. */
3834 if (! d_discriminator (di
))
3839 name
= d_make_default_arg (di
, num
, name
);
3842 /* Elide the return type of the containing function so as to not
3843 confuse the user thinking it is the return type of whatever local
3844 function we might be containing. */
3845 if (function
->type
== DEMANGLE_COMPONENT_TYPED_NAME
3846 && d_right (function
)->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
3847 d_left (d_right (function
)) = NULL
;
3849 return d_make_comp (di
, DEMANGLE_COMPONENT_LOCAL_NAME
, function
, name
);
3852 /* <discriminator> ::= _ <number> # when number < 10
3853 ::= __ <number> _ # when number >= 10
3855 <discriminator> ::= _ <number> # when number >=10
3856 is also accepted to support gcc versions that wrongly mangled that way.
3858 We demangle the discriminator, but we don't print it out. FIXME:
3859 We should print it out in verbose mode. */
3862 d_discriminator (struct d_info
*di
)
3864 int discrim
, num_underscores
= 1;
3866 if (d_peek_char (di
) != '_')
3869 if (d_peek_char (di
) == '_')
3875 discrim
= d_number (di
);
3878 if (num_underscores
> 1 && discrim
>= 10)
3880 if (d_peek_char (di
) == '_')
3889 /* <template-parm> ::= Ty
3891 ::= Tt <template-head> E
3892 ::= Tp <template-parm> */
3894 static struct demangle_component
*
3895 d_template_parm (struct d_info
*di
, int *bad
)
3897 if (d_peek_char (di
) != 'T')
3900 struct demangle_component
*op
;
3901 enum demangle_component_type kind
;
3902 switch (d_peek_next_char (di
))
3907 case 'p': /* Pack */
3909 op
= d_template_parm (di
, bad
);
3910 kind
= DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM
;
3918 case 'y': /* Typename */
3921 kind
= DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM
;
3924 case 'n': /* Non-Type */
3926 op
= cplus_demangle_type (di
);
3927 kind
= DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM
;
3935 case 't': /* Template */
3937 op
= d_template_head (di
, bad
);
3938 kind
= DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM
;
3939 if (!op
|| !d_check_char (di
, 'E'))
3946 return d_make_comp (di
, kind
, op
, NULL
);
3949 /* <template-head> ::= <template-head>? <template-parm> */
3951 static struct demangle_component
*
3952 d_template_head (struct d_info
*di
, int *bad
)
3954 struct demangle_component
*res
= NULL
, **slot
= &res
;
3955 struct demangle_component
*op
;
3957 while ((op
= d_template_parm (di
, bad
)))
3960 slot
= &d_right (op
);
3963 /* Wrap it in a template head, to make concatenating with any parm list, and
3964 printing simpler. */
3966 res
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE_HEAD
, res
, NULL
);
3971 /* <closure-type-name> ::= Ul <template-head>? <lambda-sig> E [ <nonnegative number> ] _ */
3973 static struct demangle_component
*
3974 d_lambda (struct d_info
*di
)
3976 if (! d_check_char (di
, 'U'))
3978 if (! d_check_char (di
, 'l'))
3982 struct demangle_component
*head
= d_template_head (di
, &bad
);
3986 struct demangle_component
*tl
= d_parmlist (di
);
3991 d_right (head
) = tl
;
3995 if (! d_check_char (di
, 'E'))
3998 int num
= d_compact_number (di
);
4002 struct demangle_component
*ret
= d_make_empty (di
);
4005 ret
->type
= DEMANGLE_COMPONENT_LAMBDA
;
4006 ret
->u
.s_unary_num
.sub
= tl
;
4007 ret
->u
.s_unary_num
.num
= num
;
4013 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
4015 static struct demangle_component
*
4016 d_unnamed_type (struct d_info
*di
)
4018 struct demangle_component
*ret
;
4021 if (! d_check_char (di
, 'U'))
4023 if (! d_check_char (di
, 't'))
4026 num
= d_compact_number (di
);
4030 ret
= d_make_empty (di
);
4033 ret
->type
= DEMANGLE_COMPONENT_UNNAMED_TYPE
;
4034 ret
->u
.s_number
.number
= num
;
4037 if (! d_add_substitution (di
, ret
))
4043 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
4046 static struct demangle_component
*
4047 d_clone_suffix (struct d_info
*di
, struct demangle_component
*encoding
)
4049 const char *suffix
= d_str (di
);
4050 const char *pend
= suffix
;
4051 struct demangle_component
*n
;
4053 if (*pend
== '.' && (IS_LOWER (pend
[1]) || IS_DIGIT (pend
[1])
4057 while (IS_LOWER (*pend
) || IS_DIGIT (*pend
) || *pend
== '_')
4060 while (*pend
== '.' && IS_DIGIT (pend
[1]))
4063 while (IS_DIGIT (*pend
))
4066 d_advance (di
, pend
- suffix
);
4067 n
= d_make_name (di
, suffix
, pend
- suffix
);
4068 return d_make_comp (di
, DEMANGLE_COMPONENT_CLONE
, encoding
, n
);
4071 /* Add a new substitution. */
4074 d_add_substitution (struct d_info
*di
, struct demangle_component
*dc
)
4078 if (di
->next_sub
>= di
->num_subs
)
4080 di
->subs
[di
->next_sub
] = dc
;
4085 /* <substitution> ::= S <seq-id> _
4095 If PREFIX is non-zero, then this type is being used as a prefix in
4096 a qualified name. In this case, for the standard substitutions, we
4097 need to check whether we are being used as a prefix for a
4098 constructor or destructor, and return a full template name.
4099 Otherwise we will get something like std::iostream::~iostream()
4100 which does not correspond particularly well to any function which
4101 actually appears in the source.
4104 static const struct d_standard_sub_info standard_subs
[] =
4109 { 'a', NL ("std::allocator"),
4110 NL ("std::allocator"),
4112 { 'b', NL ("std::basic_string"),
4113 NL ("std::basic_string"),
4114 NL ("basic_string") },
4115 { 's', NL ("std::string"),
4116 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
4117 NL ("basic_string") },
4118 { 'i', NL ("std::istream"),
4119 NL ("std::basic_istream<char, std::char_traits<char> >"),
4120 NL ("basic_istream") },
4121 { 'o', NL ("std::ostream"),
4122 NL ("std::basic_ostream<char, std::char_traits<char> >"),
4123 NL ("basic_ostream") },
4124 { 'd', NL ("std::iostream"),
4125 NL ("std::basic_iostream<char, std::char_traits<char> >"),
4126 NL ("basic_iostream") }
4129 static struct demangle_component
*
4130 d_substitution (struct d_info
*di
, int prefix
)
4134 if (! d_check_char (di
, 'S'))
4137 c
= d_next_char (di
);
4138 if (c
== '_' || IS_DIGIT (c
) || IS_UPPER (c
))
4147 unsigned int new_id
;
4150 new_id
= id
* 36 + c
- '0';
4151 else if (IS_UPPER (c
))
4152 new_id
= id
* 36 + c
- 'A' + 10;
4158 c
= d_next_char (di
);
4165 if (id
>= (unsigned int) di
->next_sub
)
4168 return di
->subs
[id
];
4173 const struct d_standard_sub_info
*p
;
4174 const struct d_standard_sub_info
*pend
;
4176 verbose
= (di
->options
& DMGL_VERBOSE
) != 0;
4177 if (! verbose
&& prefix
)
4181 peek
= d_peek_char (di
);
4182 if (peek
== 'C' || peek
== 'D')
4186 pend
= (&standard_subs
[0]
4187 + sizeof standard_subs
/ sizeof standard_subs
[0]);
4188 for (p
= &standard_subs
[0]; p
< pend
; ++p
)
4194 struct demangle_component
*dc
;
4196 if (p
->set_last_name
!= NULL
)
4197 di
->last_name
= d_make_sub (di
, p
->set_last_name
,
4198 p
->set_last_name_len
);
4201 s
= p
->full_expansion
;
4206 s
= p
->simple_expansion
;
4207 len
= p
->simple_len
;
4209 di
->expansion
+= len
;
4210 dc
= d_make_sub (di
, s
, len
);
4211 if (d_peek_char (di
) == 'B')
4213 /* If there are ABI tags on the abbreviation, it becomes
4214 a substitution candidate. */
4215 dc
= d_abi_tags (di
, dc
);
4216 if (! d_add_substitution (di
, dc
))
4228 d_checkpoint (struct d_info
*di
, struct d_info_checkpoint
*checkpoint
)
4230 checkpoint
->n
= di
->n
;
4231 checkpoint
->next_comp
= di
->next_comp
;
4232 checkpoint
->next_sub
= di
->next_sub
;
4233 checkpoint
->expansion
= di
->expansion
;
4237 d_backtrack (struct d_info
*di
, struct d_info_checkpoint
*checkpoint
)
4239 di
->n
= checkpoint
->n
;
4240 di
->next_comp
= checkpoint
->next_comp
;
4241 di
->next_sub
= checkpoint
->next_sub
;
4242 di
->expansion
= checkpoint
->expansion
;
4245 /* Initialize a growable string. */
4248 d_growable_string_init (struct d_growable_string
*dgs
, size_t estimate
)
4253 dgs
->allocation_failure
= 0;
4256 d_growable_string_resize (dgs
, estimate
);
4259 /* Grow a growable string to a given size. */
4262 d_growable_string_resize (struct d_growable_string
*dgs
, size_t need
)
4267 if (dgs
->allocation_failure
)
4270 /* Start allocation at two bytes to avoid any possibility of confusion
4271 with the special value of 1 used as a return in *palc to indicate
4272 allocation failures. */
4273 newalc
= dgs
->alc
> 0 ? dgs
->alc
: 2;
4274 while (newalc
< need
)
4277 newbuf
= (char *) realloc (dgs
->buf
, newalc
);
4284 dgs
->allocation_failure
= 1;
4291 /* Append a buffer to a growable string. */
4294 d_growable_string_append_buffer (struct d_growable_string
*dgs
,
4295 const char *s
, size_t l
)
4299 need
= dgs
->len
+ l
+ 1;
4300 if (need
> dgs
->alc
)
4301 d_growable_string_resize (dgs
, need
);
4303 if (dgs
->allocation_failure
)
4306 memcpy (dgs
->buf
+ dgs
->len
, s
, l
);
4307 dgs
->buf
[dgs
->len
+ l
] = '\0';
4311 /* Bridge growable strings to the callback mechanism. */
4314 d_growable_string_callback_adapter (const char *s
, size_t l
, void *opaque
)
4316 struct d_growable_string
*dgs
= (struct d_growable_string
*) opaque
;
4318 d_growable_string_append_buffer (dgs
, s
, l
);
4321 /* Walk the tree, counting the number of templates encountered, and
4322 the number of times a scope might be saved. These counts will be
4323 used to allocate data structures for d_print_comp, so the logic
4324 here must mirror the logic d_print_comp will use. It is not
4325 important that the resulting numbers are exact, so long as they
4326 are larger than the actual numbers encountered. */
4329 d_count_templates_scopes (struct d_print_info
*dpi
,
4330 struct demangle_component
*dc
)
4332 if (dc
== NULL
|| dc
->d_counting
> 1 || dpi
->recursion
> MAX_RECURSION_COUNT
)
4339 case DEMANGLE_COMPONENT_NAME
:
4340 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
4341 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
4342 case DEMANGLE_COMPONENT_SUB_STD
:
4343 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
4344 case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE
:
4345 case DEMANGLE_COMPONENT_OPERATOR
:
4346 case DEMANGLE_COMPONENT_CHARACTER
:
4347 case DEMANGLE_COMPONENT_NUMBER
:
4348 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
4349 case DEMANGLE_COMPONENT_STRUCTURED_BINDING
:
4350 case DEMANGLE_COMPONENT_MODULE_NAME
:
4351 case DEMANGLE_COMPONENT_MODULE_PARTITION
:
4352 case DEMANGLE_COMPONENT_MODULE_INIT
:
4353 case DEMANGLE_COMPONENT_FIXED_TYPE
:
4354 case DEMANGLE_COMPONENT_TEMPLATE_HEAD
:
4355 case DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM
:
4356 case DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM
:
4357 case DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM
:
4358 case DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM
:
4361 case DEMANGLE_COMPONENT_TEMPLATE
:
4362 dpi
->num_copy_templates
++;
4363 goto recurse_left_right
;
4365 case DEMANGLE_COMPONENT_REFERENCE
:
4366 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
4367 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_TEMPLATE_PARAM
)
4368 dpi
->num_saved_scopes
++;
4369 goto recurse_left_right
;
4371 case DEMANGLE_COMPONENT_QUAL_NAME
:
4372 case DEMANGLE_COMPONENT_LOCAL_NAME
:
4373 case DEMANGLE_COMPONENT_TYPED_NAME
:
4374 case DEMANGLE_COMPONENT_VTABLE
:
4375 case DEMANGLE_COMPONENT_VTT
:
4376 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
4377 case DEMANGLE_COMPONENT_TYPEINFO
:
4378 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
4379 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
4380 case DEMANGLE_COMPONENT_THUNK
:
4381 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
4382 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
4383 case DEMANGLE_COMPONENT_JAVA_CLASS
:
4384 case DEMANGLE_COMPONENT_GUARD
:
4385 case DEMANGLE_COMPONENT_TLS_INIT
:
4386 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
4387 case DEMANGLE_COMPONENT_REFTEMP
:
4388 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
4389 case DEMANGLE_COMPONENT_RESTRICT
:
4390 case DEMANGLE_COMPONENT_VOLATILE
:
4391 case DEMANGLE_COMPONENT_CONST
:
4392 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
4393 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
4394 case DEMANGLE_COMPONENT_CONST_THIS
:
4395 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
4396 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
4397 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
4398 case DEMANGLE_COMPONENT_NOEXCEPT
:
4399 case DEMANGLE_COMPONENT_THROW_SPEC
:
4400 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
4401 case DEMANGLE_COMPONENT_POINTER
:
4402 case DEMANGLE_COMPONENT_COMPLEX
:
4403 case DEMANGLE_COMPONENT_IMAGINARY
:
4404 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
4405 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
4406 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
4407 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
4408 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
4409 case DEMANGLE_COMPONENT_ARGLIST
:
4410 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
4411 case DEMANGLE_COMPONENT_TPARM_OBJ
:
4412 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
4413 case DEMANGLE_COMPONENT_CAST
:
4414 case DEMANGLE_COMPONENT_CONVERSION
:
4415 case DEMANGLE_COMPONENT_NULLARY
:
4416 case DEMANGLE_COMPONENT_UNARY
:
4417 case DEMANGLE_COMPONENT_BINARY
:
4418 case DEMANGLE_COMPONENT_BINARY_ARGS
:
4419 case DEMANGLE_COMPONENT_TRINARY
:
4420 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
4421 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
4422 case DEMANGLE_COMPONENT_LITERAL
:
4423 case DEMANGLE_COMPONENT_LITERAL_NEG
:
4424 case DEMANGLE_COMPONENT_VENDOR_EXPR
:
4425 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
4426 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
4427 case DEMANGLE_COMPONENT_DECLTYPE
:
4428 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
4429 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
4430 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
4431 case DEMANGLE_COMPONENT_TAGGED_NAME
:
4432 case DEMANGLE_COMPONENT_CLONE
:
4434 /* PR 89394 - Check for too much recursion. */
4435 if (dpi
->recursion
> DEMANGLE_RECURSION_LIMIT
)
4436 /* FIXME: There ought to be a way to report to the
4437 user that the recursion limit has been reached. */
4441 d_count_templates_scopes (dpi
, d_left (dc
));
4442 d_count_templates_scopes (dpi
, d_right (dc
));
4446 case DEMANGLE_COMPONENT_CTOR
:
4447 d_count_templates_scopes (dpi
, dc
->u
.s_ctor
.name
);
4450 case DEMANGLE_COMPONENT_DTOR
:
4451 d_count_templates_scopes (dpi
, dc
->u
.s_dtor
.name
);
4454 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
4455 d_count_templates_scopes (dpi
, dc
->u
.s_extended_operator
.name
);
4458 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
4459 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
4460 case DEMANGLE_COMPONENT_MODULE_ENTITY
:
4461 d_count_templates_scopes (dpi
, d_left (dc
));
4464 case DEMANGLE_COMPONENT_LAMBDA
:
4465 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
4466 d_count_templates_scopes (dpi
, dc
->u
.s_unary_num
.sub
);
4471 /* Initialize a print information structure. */
4474 d_print_init (struct d_print_info
*dpi
, demangle_callbackref callback
,
4475 void *opaque
, struct demangle_component
*dc
)
4478 dpi
->last_char
= '\0';
4479 dpi
->templates
= NULL
;
4480 dpi
->modifiers
= NULL
;
4481 dpi
->pack_index
= 0;
4482 dpi
->flush_count
= 0;
4484 dpi
->callback
= callback
;
4485 dpi
->opaque
= opaque
;
4487 dpi
->demangle_failure
= 0;
4489 dpi
->lambda_tpl_parms
= 0;
4491 dpi
->component_stack
= NULL
;
4493 dpi
->saved_scopes
= NULL
;
4494 dpi
->next_saved_scope
= 0;
4495 dpi
->num_saved_scopes
= 0;
4497 dpi
->copy_templates
= NULL
;
4498 dpi
->next_copy_template
= 0;
4499 dpi
->num_copy_templates
= 0;
4501 d_count_templates_scopes (dpi
, dc
);
4502 /* If we did not reach the recursion limit, then reset the
4503 current recursion value back to 0, so that we can print
4505 if (dpi
->recursion
< DEMANGLE_RECURSION_LIMIT
)
4507 dpi
->num_copy_templates
*= dpi
->num_saved_scopes
;
4509 dpi
->current_template
= NULL
;
4512 /* Indicate that an error occurred during printing, and test for error. */
4515 d_print_error (struct d_print_info
*dpi
)
4517 dpi
->demangle_failure
= 1;
4521 d_print_saw_error (struct d_print_info
*dpi
)
4523 return dpi
->demangle_failure
!= 0;
4526 /* Flush buffered characters to the callback. */
4529 d_print_flush (struct d_print_info
*dpi
)
4531 dpi
->buf
[dpi
->len
] = '\0';
4532 dpi
->callback (dpi
->buf
, dpi
->len
, dpi
->opaque
);
4537 /* Append characters and buffers for printing. */
4540 d_append_char (struct d_print_info
*dpi
, char c
)
4542 if (dpi
->len
== sizeof (dpi
->buf
) - 1)
4543 d_print_flush (dpi
);
4545 dpi
->buf
[dpi
->len
++] = c
;
4550 d_append_buffer (struct d_print_info
*dpi
, const char *s
, size_t l
)
4554 for (i
= 0; i
< l
; i
++)
4555 d_append_char (dpi
, s
[i
]);
4559 d_append_string (struct d_print_info
*dpi
, const char *s
)
4561 d_append_buffer (dpi
, s
, strlen (s
));
4565 d_append_num (struct d_print_info
*dpi
, int l
)
4568 sprintf (buf
,"%d", l
);
4569 d_append_string (dpi
, buf
);
4573 d_last_char (struct d_print_info
*dpi
)
4575 return dpi
->last_char
;
4578 /* Turn components into a human readable string. OPTIONS is the
4579 options bits passed to the demangler. DC is the tree to print.
4580 CALLBACK is a function to call to flush demangled string segments
4581 as they fill the intermediate buffer, and OPAQUE is a generalized
4582 callback argument. On success, this returns 1. On failure,
4583 it returns 0, indicating a bad parse. It does not use heap
4584 memory to build an output string, so cannot encounter memory
4585 allocation failure. */
4587 CP_STATIC_IF_GLIBCPP_V3
4589 cplus_demangle_print_callback (int options
,
4590 struct demangle_component
*dc
,
4591 demangle_callbackref callback
, void *opaque
)
4593 struct d_print_info dpi
;
4595 d_print_init (&dpi
, callback
, opaque
, dc
);
4598 #ifdef CP_DYNAMIC_ARRAYS
4599 /* Avoid zero-length VLAs, which are prohibited by the C99 standard
4600 and flagged as errors by Address Sanitizer. */
4601 __extension__
struct d_saved_scope scopes
[(dpi
.num_saved_scopes
> 0)
4602 ? dpi
.num_saved_scopes
: 1];
4603 __extension__
struct d_print_template temps
[(dpi
.num_copy_templates
> 0)
4604 ? dpi
.num_copy_templates
: 1];
4606 dpi
.saved_scopes
= scopes
;
4607 dpi
.copy_templates
= temps
;
4609 dpi
.saved_scopes
= alloca (dpi
.num_saved_scopes
4610 * sizeof (*dpi
.saved_scopes
));
4611 dpi
.copy_templates
= alloca (dpi
.num_copy_templates
4612 * sizeof (*dpi
.copy_templates
));
4615 d_print_comp (&dpi
, options
, dc
);
4618 d_print_flush (&dpi
);
4620 return ! d_print_saw_error (&dpi
);
4623 /* Turn components into a human readable string. OPTIONS is the
4624 options bits passed to the demangler. DC is the tree to print.
4625 ESTIMATE is a guess at the length of the result. This returns a
4626 string allocated by malloc, or NULL on error. On success, this
4627 sets *PALC to the size of the allocated buffer. On failure, this
4628 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
4631 CP_STATIC_IF_GLIBCPP_V3
4633 cplus_demangle_print (int options
, struct demangle_component
*dc
,
4634 int estimate
, size_t *palc
)
4636 struct d_growable_string dgs
;
4638 d_growable_string_init (&dgs
, estimate
);
4640 if (! cplus_demangle_print_callback (options
, dc
,
4641 d_growable_string_callback_adapter
,
4649 *palc
= dgs
.allocation_failure
? 1 : dgs
.alc
;
4653 /* Returns the I'th element of the template arglist ARGS, or NULL on
4654 failure. If I is negative, return the entire arglist. */
4656 static struct demangle_component
*
4657 d_index_template_argument (struct demangle_component
*args
, int i
)
4659 struct demangle_component
*a
;
4662 /* Print the whole argument pack. */
4669 if (a
->type
!= DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4675 if (i
!= 0 || a
== NULL
)
4681 /* Returns the template argument from the current context indicated by DC,
4682 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
4684 static struct demangle_component
*
4685 d_lookup_template_argument (struct d_print_info
*dpi
,
4686 const struct demangle_component
*dc
)
4688 if (dpi
->templates
== NULL
)
4690 d_print_error (dpi
);
4694 return d_index_template_argument
4695 (d_right (dpi
->templates
->template_decl
),
4696 dc
->u
.s_number
.number
);
4699 /* Returns a template argument pack used in DC (any will do), or NULL. */
4701 static struct demangle_component
*
4702 d_find_pack (struct d_print_info
*dpi
,
4703 const struct demangle_component
*dc
)
4705 struct demangle_component
*a
;
4711 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
4712 a
= d_lookup_template_argument (dpi
, dc
);
4713 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4717 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
4720 case DEMANGLE_COMPONENT_LAMBDA
:
4721 case DEMANGLE_COMPONENT_NAME
:
4722 case DEMANGLE_COMPONENT_TAGGED_NAME
:
4723 case DEMANGLE_COMPONENT_OPERATOR
:
4724 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
4725 case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE
:
4726 case DEMANGLE_COMPONENT_SUB_STD
:
4727 case DEMANGLE_COMPONENT_CHARACTER
:
4728 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
4729 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
4730 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
4731 case DEMANGLE_COMPONENT_NUMBER
:
4734 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
4735 return d_find_pack (dpi
, dc
->u
.s_extended_operator
.name
);
4736 case DEMANGLE_COMPONENT_CTOR
:
4737 return d_find_pack (dpi
, dc
->u
.s_ctor
.name
);
4738 case DEMANGLE_COMPONENT_DTOR
:
4739 return d_find_pack (dpi
, dc
->u
.s_dtor
.name
);
4742 a
= d_find_pack (dpi
, d_left (dc
));
4745 return d_find_pack (dpi
, d_right (dc
));
4749 /* Returns the length of the template argument pack DC. */
4752 d_pack_length (const struct demangle_component
*dc
)
4755 while (dc
&& dc
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
4756 && d_left (dc
) != NULL
)
4764 /* Returns the number of template args in DC, expanding any pack expansions
4768 d_args_length (struct d_print_info
*dpi
, const struct demangle_component
*dc
)
4771 for (; dc
&& dc
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
;
4774 struct demangle_component
*elt
= d_left (dc
);
4777 if (elt
->type
== DEMANGLE_COMPONENT_PACK_EXPANSION
)
4779 struct demangle_component
*a
= d_find_pack (dpi
, d_left (elt
));
4780 count
+= d_pack_length (a
);
4788 /* DC is a component of a mangled expression. Print it, wrapped in parens
4792 d_print_subexpr (struct d_print_info
*dpi
, int options
,
4793 struct demangle_component
*dc
)
4796 if (dc
->type
== DEMANGLE_COMPONENT_NAME
4797 || dc
->type
== DEMANGLE_COMPONENT_QUAL_NAME
4798 || dc
->type
== DEMANGLE_COMPONENT_INITIALIZER_LIST
4799 || dc
->type
== DEMANGLE_COMPONENT_FUNCTION_PARAM
)
4802 d_append_char (dpi
, '(');
4803 d_print_comp (dpi
, options
, dc
);
4805 d_append_char (dpi
, ')');
4808 /* Save the current scope. */
4811 d_save_scope (struct d_print_info
*dpi
,
4812 const struct demangle_component
*container
)
4814 struct d_saved_scope
*scope
;
4815 struct d_print_template
*src
, **link
;
4817 if (dpi
->next_saved_scope
>= dpi
->num_saved_scopes
)
4819 d_print_error (dpi
);
4822 scope
= &dpi
->saved_scopes
[dpi
->next_saved_scope
];
4823 dpi
->next_saved_scope
++;
4825 scope
->container
= container
;
4826 link
= &scope
->templates
;
4828 for (src
= dpi
->templates
; src
!= NULL
; src
= src
->next
)
4830 struct d_print_template
*dst
;
4832 if (dpi
->next_copy_template
>= dpi
->num_copy_templates
)
4834 d_print_error (dpi
);
4837 dst
= &dpi
->copy_templates
[dpi
->next_copy_template
];
4838 dpi
->next_copy_template
++;
4840 dst
->template_decl
= src
->template_decl
;
4848 /* Attempt to locate a previously saved scope. Returns NULL if no
4849 corresponding saved scope was found. */
4851 static struct d_saved_scope
*
4852 d_get_saved_scope (struct d_print_info
*dpi
,
4853 const struct demangle_component
*container
)
4857 for (i
= 0; i
< dpi
->next_saved_scope
; i
++)
4858 if (dpi
->saved_scopes
[i
].container
== container
)
4859 return &dpi
->saved_scopes
[i
];
4864 /* If DC is a C++17 fold-expression, print it and return true; otherwise
4868 d_maybe_print_fold_expression (struct d_print_info
*dpi
, int options
,
4869 struct demangle_component
*dc
)
4871 struct demangle_component
*ops
, *operator_
, *op1
, *op2
;
4874 const char *fold_code
= d_left (dc
)->u
.s_operator
.op
->code
;
4875 if (fold_code
[0] != 'f')
4879 operator_
= d_left (ops
);
4880 op1
= d_right (ops
);
4882 if (op1
->type
== DEMANGLE_COMPONENT_TRINARY_ARG2
)
4884 op2
= d_right (op1
);
4888 /* Print the whole pack. */
4889 save_idx
= dpi
->pack_index
;
4890 dpi
->pack_index
= -1;
4892 switch (fold_code
[1])
4894 /* Unary left fold, (... + X). */
4896 d_append_string (dpi
, "(...");
4897 d_print_expr_op (dpi
, options
, operator_
);
4898 d_print_subexpr (dpi
, options
, op1
);
4899 d_append_char (dpi
, ')');
4902 /* Unary right fold, (X + ...). */
4904 d_append_char (dpi
, '(');
4905 d_print_subexpr (dpi
, options
, op1
);
4906 d_print_expr_op (dpi
, options
, operator_
);
4907 d_append_string (dpi
, "...)");
4910 /* Binary left fold, (42 + ... + X). */
4912 /* Binary right fold, (X + ... + 42). */
4914 d_append_char (dpi
, '(');
4915 d_print_subexpr (dpi
, options
, op1
);
4916 d_print_expr_op (dpi
, options
, operator_
);
4917 d_append_string (dpi
, "...");
4918 d_print_expr_op (dpi
, options
, operator_
);
4919 d_print_subexpr (dpi
, options
, op2
);
4920 d_append_char (dpi
, ')');
4924 dpi
->pack_index
= save_idx
;
4928 /* True iff DC represents a C99-style designated initializer. */
4931 is_designated_init (struct demangle_component
*dc
)
4933 if (dc
->type
!= DEMANGLE_COMPONENT_BINARY
4934 && dc
->type
!= DEMANGLE_COMPONENT_TRINARY
)
4937 struct demangle_component
*op
= d_left (dc
);
4938 const char *code
= op
->u
.s_operator
.op
->code
;
4939 return (code
[0] == 'd'
4940 && (code
[1] == 'i' || code
[1] == 'x' || code
[1] == 'X'));
4943 /* If DC represents a C99-style designated initializer, print it and return
4944 true; otherwise, return false. */
4947 d_maybe_print_designated_init (struct d_print_info
*dpi
, int options
,
4948 struct demangle_component
*dc
)
4950 if (!is_designated_init (dc
))
4953 const char *code
= d_left (dc
)->u
.s_operator
.op
->code
;
4955 struct demangle_component
*operands
= d_right (dc
);
4956 struct demangle_component
*op1
= d_left (operands
);
4957 struct demangle_component
*op2
= d_right (operands
);
4960 d_append_char (dpi
, '.');
4962 d_append_char (dpi
, '[');
4964 d_print_comp (dpi
, options
, op1
);
4967 d_append_string (dpi
, " ... ");
4968 d_print_comp (dpi
, options
, d_left (op2
));
4969 op2
= d_right (op2
);
4972 d_append_char (dpi
, ']');
4973 if (is_designated_init (op2
))
4975 /* Don't put '=' or '(' between chained designators. */
4976 d_print_comp (dpi
, options
, op2
);
4980 d_append_char (dpi
, '=');
4981 d_print_subexpr (dpi
, options
, op2
);
4987 d_print_lambda_parm_name (struct d_print_info
*dpi
, int type
, unsigned index
)
4993 dpi
->demangle_failure
= 1;
4997 case DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM
:
5001 case DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM
:
5005 case DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM
:
5009 d_append_string (dpi
, str
);
5010 d_append_num (dpi
, index
);
5013 /* Subroutine to handle components. */
5016 d_print_comp_inner (struct d_print_info
*dpi
, int options
,
5017 struct demangle_component
*dc
)
5019 /* Magic variable to let reference smashing skip over the next modifier
5020 without needing to modify *dc. */
5021 struct demangle_component
*mod_inner
= NULL
;
5023 /* Variable used to store the current templates while a previously
5024 captured scope is used. */
5025 struct d_print_template
*saved_templates
;
5027 /* Nonzero if templates have been stored in the above variable. */
5028 int need_template_restore
= 0;
5032 d_print_error (dpi
);
5035 if (d_print_saw_error (dpi
))
5040 case DEMANGLE_COMPONENT_NAME
:
5041 if ((options
& DMGL_JAVA
) == 0)
5042 d_append_buffer (dpi
, dc
->u
.s_name
.s
, dc
->u
.s_name
.len
);
5044 d_print_java_identifier (dpi
, dc
->u
.s_name
.s
, dc
->u
.s_name
.len
);
5047 case DEMANGLE_COMPONENT_TAGGED_NAME
:
5048 d_print_comp (dpi
, options
, d_left (dc
));
5049 d_append_string (dpi
, "[abi:");
5050 d_print_comp (dpi
, options
, d_right (dc
));
5051 d_append_char (dpi
, ']');
5054 case DEMANGLE_COMPONENT_STRUCTURED_BINDING
:
5055 d_append_char (dpi
, '[');
5058 d_print_comp (dpi
, options
, d_left (dc
));
5062 d_append_string (dpi
, ", ");
5064 d_append_char (dpi
, ']');
5067 case DEMANGLE_COMPONENT_MODULE_ENTITY
:
5068 d_print_comp (dpi
, options
, d_left (dc
));
5069 d_append_char (dpi
, '@');
5070 d_print_comp (dpi
, options
, d_right (dc
));
5073 case DEMANGLE_COMPONENT_MODULE_NAME
:
5074 case DEMANGLE_COMPONENT_MODULE_PARTITION
:
5077 d_print_comp (dpi
, options
, d_left (dc
));
5078 char c
= dc
->type
== DEMANGLE_COMPONENT_MODULE_PARTITION
5079 ? ':' : d_left (dc
) ? '.' : 0;
5081 d_append_char (dpi
, c
);
5082 d_print_comp (dpi
, options
, d_right (dc
));
5086 case DEMANGLE_COMPONENT_QUAL_NAME
:
5087 case DEMANGLE_COMPONENT_LOCAL_NAME
:
5088 d_print_comp (dpi
, options
, d_left (dc
));
5089 if ((options
& DMGL_JAVA
) == 0)
5090 d_append_string (dpi
, "::");
5092 d_append_char (dpi
, '.');
5094 struct demangle_component
*local_name
= d_right (dc
);
5095 if (local_name
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
5097 d_append_string (dpi
, "{default arg#");
5098 d_append_num (dpi
, local_name
->u
.s_unary_num
.num
+ 1);
5099 d_append_string (dpi
, "}::");
5100 local_name
= local_name
->u
.s_unary_num
.sub
;
5102 d_print_comp (dpi
, options
, local_name
);
5106 case DEMANGLE_COMPONENT_TYPED_NAME
:
5108 struct d_print_mod
*hold_modifiers
;
5109 struct demangle_component
*typed_name
;
5110 struct d_print_mod adpm
[4];
5112 struct d_print_template dpt
;
5114 /* Pass the name down to the type so that it can be printed in
5115 the right place for the type. We also have to pass down
5116 any CV-qualifiers, which apply to the this parameter. */
5117 hold_modifiers
= dpi
->modifiers
;
5120 typed_name
= d_left (dc
);
5121 while (typed_name
!= NULL
)
5123 if (i
>= sizeof adpm
/ sizeof adpm
[0])
5125 d_print_error (dpi
);
5129 adpm
[i
].next
= dpi
->modifiers
;
5130 dpi
->modifiers
= &adpm
[i
];
5131 adpm
[i
].mod
= typed_name
;
5132 adpm
[i
].printed
= 0;
5133 adpm
[i
].templates
= dpi
->templates
;
5136 if (!is_fnqual_component_type (typed_name
->type
))
5139 typed_name
= d_left (typed_name
);
5142 if (typed_name
== NULL
)
5144 d_print_error (dpi
);
5148 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
5149 there may be CV-qualifiers on its right argument which
5150 really apply here; this happens when parsing a class that
5151 is local to a function. */
5152 if (typed_name
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
5154 typed_name
= d_right (typed_name
);
5155 if (typed_name
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
5156 typed_name
= typed_name
->u
.s_unary_num
.sub
;
5157 while (typed_name
!= NULL
5158 && is_fnqual_component_type (typed_name
->type
))
5160 if (i
>= sizeof adpm
/ sizeof adpm
[0])
5162 d_print_error (dpi
);
5166 adpm
[i
] = adpm
[i
- 1];
5167 adpm
[i
].next
= &adpm
[i
- 1];
5168 dpi
->modifiers
= &adpm
[i
];
5170 adpm
[i
- 1].mod
= typed_name
;
5171 adpm
[i
- 1].printed
= 0;
5172 adpm
[i
- 1].templates
= dpi
->templates
;
5175 typed_name
= d_left (typed_name
);
5177 if (typed_name
== NULL
)
5179 d_print_error (dpi
);
5184 /* If typed_name is a template, then it applies to the
5185 function type as well. */
5186 if (typed_name
->type
== DEMANGLE_COMPONENT_TEMPLATE
)
5188 dpt
.next
= dpi
->templates
;
5189 dpi
->templates
= &dpt
;
5190 dpt
.template_decl
= typed_name
;
5193 d_print_comp (dpi
, options
, d_right (dc
));
5195 if (typed_name
->type
== DEMANGLE_COMPONENT_TEMPLATE
)
5196 dpi
->templates
= dpt
.next
;
5198 /* If the modifiers didn't get printed by the type, print them
5203 if (! adpm
[i
].printed
)
5205 d_append_char (dpi
, ' ');
5206 d_print_mod (dpi
, options
, adpm
[i
].mod
);
5210 dpi
->modifiers
= hold_modifiers
;
5215 case DEMANGLE_COMPONENT_TEMPLATE
:
5217 struct d_print_mod
*hold_dpm
;
5218 struct demangle_component
*dcl
;
5219 const struct demangle_component
*hold_current
;
5221 /* This template may need to be referenced by a cast operator
5222 contained in its subtree. */
5223 hold_current
= dpi
->current_template
;
5224 dpi
->current_template
= dc
;
5226 /* Don't push modifiers into a template definition. Doing so
5227 could give the wrong definition for a template argument.
5228 Instead, treat the template essentially as a name. */
5230 hold_dpm
= dpi
->modifiers
;
5231 dpi
->modifiers
= NULL
;
5235 if ((options
& DMGL_JAVA
) != 0
5236 && dcl
->type
== DEMANGLE_COMPONENT_NAME
5237 && dcl
->u
.s_name
.len
== 6
5238 && strncmp (dcl
->u
.s_name
.s
, "JArray", 6) == 0)
5240 /* Special-case Java arrays, so that JArray<TYPE> appears
5241 instead as TYPE[]. */
5243 d_print_comp (dpi
, options
, d_right (dc
));
5244 d_append_string (dpi
, "[]");
5248 d_print_comp (dpi
, options
, dcl
);
5249 if (d_last_char (dpi
) == '<')
5250 d_append_char (dpi
, ' ');
5251 d_append_char (dpi
, '<');
5252 d_print_comp (dpi
, options
, d_right (dc
));
5253 /* Avoid generating two consecutive '>' characters, to avoid
5254 the C++ syntactic ambiguity. */
5255 if (d_last_char (dpi
) == '>')
5256 d_append_char (dpi
, ' ');
5257 d_append_char (dpi
, '>');
5260 dpi
->modifiers
= hold_dpm
;
5261 dpi
->current_template
= hold_current
;
5266 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
5267 if (dpi
->lambda_tpl_parms
> dc
->u
.s_number
.number
+ 1)
5269 const struct demangle_component
*a
5270 = d_left (dpi
->templates
->template_decl
);
5272 for (c
= dc
->u
.s_number
.number
; a
&& c
; c
--)
5274 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM
)
5277 dpi
->demangle_failure
= 1;
5279 d_print_lambda_parm_name (dpi
, a
->type
, dc
->u
.s_number
.number
);
5281 else if (dpi
->lambda_tpl_parms
)
5283 /* Show the template parm index, as that's how g++ displays
5284 these, and future proofs us against potential
5285 '[]<typename T> (T *a, T *b) {...}'. */
5286 d_append_buffer (dpi
, "auto:", 5);
5287 d_append_num (dpi
, dc
->u
.s_number
.number
+ 1);
5291 struct d_print_template
*hold_dpt
;
5292 struct demangle_component
*a
= d_lookup_template_argument (dpi
, dc
);
5294 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
5295 a
= d_index_template_argument (a
, dpi
->pack_index
);
5299 d_print_error (dpi
);
5303 /* While processing this parameter, we need to pop the list
5304 of templates. This is because the template parameter may
5305 itself be a reference to a parameter of an outer
5308 hold_dpt
= dpi
->templates
;
5309 dpi
->templates
= hold_dpt
->next
;
5311 d_print_comp (dpi
, options
, a
);
5313 dpi
->templates
= hold_dpt
;
5317 case DEMANGLE_COMPONENT_TPARM_OBJ
:
5318 d_append_string (dpi
, "template parameter object for ");
5319 d_print_comp (dpi
, options
, d_left (dc
));
5322 case DEMANGLE_COMPONENT_CTOR
:
5323 d_print_comp (dpi
, options
, dc
->u
.s_ctor
.name
);
5326 case DEMANGLE_COMPONENT_DTOR
:
5327 d_append_char (dpi
, '~');
5328 d_print_comp (dpi
, options
, dc
->u
.s_dtor
.name
);
5331 case DEMANGLE_COMPONENT_MODULE_INIT
:
5332 d_append_string (dpi
, "initializer for module ");
5333 d_print_comp (dpi
, options
, d_left (dc
));
5336 case DEMANGLE_COMPONENT_VTABLE
:
5337 d_append_string (dpi
, "vtable for ");
5338 d_print_comp (dpi
, options
, d_left (dc
));
5341 case DEMANGLE_COMPONENT_VTT
:
5342 d_append_string (dpi
, "VTT for ");
5343 d_print_comp (dpi
, options
, d_left (dc
));
5346 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
5347 d_append_string (dpi
, "construction vtable for ");
5348 d_print_comp (dpi
, options
, d_left (dc
));
5349 d_append_string (dpi
, "-in-");
5350 d_print_comp (dpi
, options
, d_right (dc
));
5353 case DEMANGLE_COMPONENT_TYPEINFO
:
5354 d_append_string (dpi
, "typeinfo for ");
5355 d_print_comp (dpi
, options
, d_left (dc
));
5358 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
5359 d_append_string (dpi
, "typeinfo name for ");
5360 d_print_comp (dpi
, options
, d_left (dc
));
5363 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
5364 d_append_string (dpi
, "typeinfo fn for ");
5365 d_print_comp (dpi
, options
, d_left (dc
));
5368 case DEMANGLE_COMPONENT_THUNK
:
5369 d_append_string (dpi
, "non-virtual thunk to ");
5370 d_print_comp (dpi
, options
, d_left (dc
));
5373 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
5374 d_append_string (dpi
, "virtual thunk to ");
5375 d_print_comp (dpi
, options
, d_left (dc
));
5378 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
5379 d_append_string (dpi
, "covariant return thunk to ");
5380 d_print_comp (dpi
, options
, d_left (dc
));
5383 case DEMANGLE_COMPONENT_JAVA_CLASS
:
5384 d_append_string (dpi
, "java Class for ");
5385 d_print_comp (dpi
, options
, d_left (dc
));
5388 case DEMANGLE_COMPONENT_GUARD
:
5389 d_append_string (dpi
, "guard variable for ");
5390 d_print_comp (dpi
, options
, d_left (dc
));
5393 case DEMANGLE_COMPONENT_TLS_INIT
:
5394 d_append_string (dpi
, "TLS init function for ");
5395 d_print_comp (dpi
, options
, d_left (dc
));
5398 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
5399 d_append_string (dpi
, "TLS wrapper function for ");
5400 d_print_comp (dpi
, options
, d_left (dc
));
5403 case DEMANGLE_COMPONENT_REFTEMP
:
5404 d_append_string (dpi
, "reference temporary #");
5405 d_print_comp (dpi
, options
, d_right (dc
));
5406 d_append_string (dpi
, " for ");
5407 d_print_comp (dpi
, options
, d_left (dc
));
5410 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
5411 d_append_string (dpi
, "hidden alias for ");
5412 d_print_comp (dpi
, options
, d_left (dc
));
5415 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
5416 d_append_string (dpi
, "transaction clone for ");
5417 d_print_comp (dpi
, options
, d_left (dc
));
5420 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
5421 d_append_string (dpi
, "non-transaction clone for ");
5422 d_print_comp (dpi
, options
, d_left (dc
));
5425 case DEMANGLE_COMPONENT_SUB_STD
:
5426 d_append_buffer (dpi
, dc
->u
.s_string
.string
, dc
->u
.s_string
.len
);
5429 case DEMANGLE_COMPONENT_RESTRICT
:
5430 case DEMANGLE_COMPONENT_VOLATILE
:
5431 case DEMANGLE_COMPONENT_CONST
:
5433 struct d_print_mod
*pdpm
;
5435 /* When printing arrays, it's possible to have cases where the
5436 same CV-qualifier gets pushed on the stack multiple times.
5437 We only need to print it once. */
5439 for (pdpm
= dpi
->modifiers
; pdpm
!= NULL
; pdpm
= pdpm
->next
)
5441 if (! pdpm
->printed
)
5443 if (pdpm
->mod
->type
!= DEMANGLE_COMPONENT_RESTRICT
5444 && pdpm
->mod
->type
!= DEMANGLE_COMPONENT_VOLATILE
5445 && pdpm
->mod
->type
!= DEMANGLE_COMPONENT_CONST
)
5447 if (pdpm
->mod
->type
== dc
->type
)
5449 d_print_comp (dpi
, options
, d_left (dc
));
5457 case DEMANGLE_COMPONENT_REFERENCE
:
5458 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
5460 /* Handle reference smashing: & + && = &. */
5461 struct demangle_component
*sub
= d_left (dc
);
5462 if (!dpi
->lambda_tpl_parms
5463 && sub
->type
== DEMANGLE_COMPONENT_TEMPLATE_PARAM
)
5465 struct d_saved_scope
*scope
= d_get_saved_scope (dpi
, sub
);
5466 struct demangle_component
*a
;
5470 /* This is the first time SUB has been traversed.
5471 We need to capture the current templates so
5472 they can be restored if SUB is reentered as a
5474 d_save_scope (dpi
, sub
);
5475 if (d_print_saw_error (dpi
))
5480 const struct d_component_stack
*dcse
;
5481 int found_self_or_parent
= 0;
5483 /* This traversal is reentering SUB as a substition.
5484 If we are not beneath SUB or DC in the tree then we
5485 need to restore SUB's template stack temporarily. */
5486 for (dcse
= dpi
->component_stack
; dcse
!= NULL
;
5487 dcse
= dcse
->parent
)
5491 && dcse
!= dpi
->component_stack
))
5493 found_self_or_parent
= 1;
5498 if (!found_self_or_parent
)
5500 saved_templates
= dpi
->templates
;
5501 dpi
->templates
= scope
->templates
;
5502 need_template_restore
= 1;
5506 a
= d_lookup_template_argument (dpi
, sub
);
5507 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
5508 a
= d_index_template_argument (a
, dpi
->pack_index
);
5512 if (need_template_restore
)
5513 dpi
->templates
= saved_templates
;
5515 d_print_error (dpi
);
5522 if (sub
->type
== DEMANGLE_COMPONENT_REFERENCE
5523 || sub
->type
== dc
->type
)
5525 else if (sub
->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE
)
5526 mod_inner
= d_left (sub
);
5530 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
5531 case DEMANGLE_COMPONENT_POINTER
:
5532 case DEMANGLE_COMPONENT_COMPLEX
:
5533 case DEMANGLE_COMPONENT_IMAGINARY
:
5534 FNQUAL_COMPONENT_CASE
:
5537 /* We keep a list of modifiers on the stack. */
5538 struct d_print_mod dpm
;
5540 dpm
.next
= dpi
->modifiers
;
5541 dpi
->modifiers
= &dpm
;
5544 dpm
.templates
= dpi
->templates
;
5547 mod_inner
= d_left (dc
);
5549 d_print_comp (dpi
, options
, mod_inner
);
5551 /* If the modifier didn't get printed by the type, print it
5554 d_print_mod (dpi
, options
, dc
);
5556 dpi
->modifiers
= dpm
.next
;
5558 if (need_template_restore
)
5559 dpi
->templates
= saved_templates
;
5564 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
5565 if ((options
& DMGL_JAVA
) == 0)
5566 d_append_buffer (dpi
, dc
->u
.s_builtin
.type
->name
,
5567 dc
->u
.s_builtin
.type
->len
);
5569 d_append_buffer (dpi
, dc
->u
.s_builtin
.type
->java_name
,
5570 dc
->u
.s_builtin
.type
->java_len
);
5573 case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE
:
5574 d_append_buffer (dpi
, dc
->u
.s_extended_builtin
.type
->name
,
5575 dc
->u
.s_extended_builtin
.type
->len
);
5576 d_append_num (dpi
, dc
->u
.s_extended_builtin
.arg
);
5577 if (dc
->u
.s_extended_builtin
.suffix
)
5578 d_append_buffer (dpi
, &dc
->u
.s_extended_builtin
.suffix
, 1);
5581 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
5582 d_print_comp (dpi
, options
, d_left (dc
));
5585 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
5587 if ((options
& DMGL_RET_POSTFIX
) != 0)
5588 d_print_function_type (dpi
,
5589 options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5590 dc
, dpi
->modifiers
);
5592 /* Print return type if present */
5593 if (d_left (dc
) != NULL
&& (options
& DMGL_RET_POSTFIX
) != 0)
5594 d_print_comp (dpi
, options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5596 else if (d_left (dc
) != NULL
&& (options
& DMGL_RET_DROP
) == 0)
5598 struct d_print_mod dpm
;
5600 /* We must pass this type down as a modifier in order to
5601 print it in the right location. */
5602 dpm
.next
= dpi
->modifiers
;
5603 dpi
->modifiers
= &dpm
;
5606 dpm
.templates
= dpi
->templates
;
5608 d_print_comp (dpi
, options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5611 dpi
->modifiers
= dpm
.next
;
5616 /* In standard prefix notation, there is a space between the
5617 return type and the function signature. */
5618 if ((options
& DMGL_RET_POSTFIX
) == 0)
5619 d_append_char (dpi
, ' ');
5622 if ((options
& DMGL_RET_POSTFIX
) == 0)
5623 d_print_function_type (dpi
,
5624 options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5625 dc
, dpi
->modifiers
);
5630 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
5632 struct d_print_mod
*hold_modifiers
;
5633 struct d_print_mod adpm
[4];
5635 struct d_print_mod
*pdpm
;
5637 /* We must pass this type down as a modifier in order to print
5638 multi-dimensional arrays correctly. If the array itself is
5639 CV-qualified, we act as though the element type were
5640 CV-qualified. We do this by copying the modifiers down
5641 rather than fiddling pointers, so that we don't wind up
5642 with a d_print_mod higher on the stack pointing into our
5643 stack frame after we return. */
5645 hold_modifiers
= dpi
->modifiers
;
5647 adpm
[0].next
= hold_modifiers
;
5648 dpi
->modifiers
= &adpm
[0];
5650 adpm
[0].printed
= 0;
5651 adpm
[0].templates
= dpi
->templates
;
5654 pdpm
= hold_modifiers
;
5656 && (pdpm
->mod
->type
== DEMANGLE_COMPONENT_RESTRICT
5657 || pdpm
->mod
->type
== DEMANGLE_COMPONENT_VOLATILE
5658 || pdpm
->mod
->type
== DEMANGLE_COMPONENT_CONST
))
5660 if (! pdpm
->printed
)
5662 if (i
>= sizeof adpm
/ sizeof adpm
[0])
5664 d_print_error (dpi
);
5669 adpm
[i
].next
= dpi
->modifiers
;
5670 dpi
->modifiers
= &adpm
[i
];
5678 d_print_comp (dpi
, options
, d_right (dc
));
5680 dpi
->modifiers
= hold_modifiers
;
5682 if (adpm
[0].printed
)
5688 d_print_mod (dpi
, options
, adpm
[i
].mod
);
5691 d_print_array_type (dpi
, options
, dc
, dpi
->modifiers
);
5696 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
5697 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
5699 struct d_print_mod dpm
;
5701 dpm
.next
= dpi
->modifiers
;
5702 dpi
->modifiers
= &dpm
;
5705 dpm
.templates
= dpi
->templates
;
5707 d_print_comp (dpi
, options
, d_right (dc
));
5709 /* If the modifier didn't get printed by the type, print it
5712 d_print_mod (dpi
, options
, dc
);
5714 dpi
->modifiers
= dpm
.next
;
5719 case DEMANGLE_COMPONENT_ARGLIST
:
5720 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
5721 if (d_left (dc
) != NULL
)
5722 d_print_comp (dpi
, options
, d_left (dc
));
5723 if (d_right (dc
) != NULL
)
5726 unsigned long int flush_count
;
5727 /* Make sure ", " isn't flushed by d_append_string, otherwise
5728 dpi->len -= 2 wouldn't work. */
5729 if (dpi
->len
>= sizeof (dpi
->buf
) - 2)
5730 d_print_flush (dpi
);
5731 d_append_string (dpi
, ", ");
5733 flush_count
= dpi
->flush_count
;
5734 d_print_comp (dpi
, options
, d_right (dc
));
5735 /* If that didn't print anything (which can happen with empty
5736 template argument packs), remove the comma and space. */
5737 if (dpi
->flush_count
== flush_count
&& dpi
->len
== len
)
5742 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
5744 struct demangle_component
*type
= d_left (dc
);
5745 struct demangle_component
*list
= d_right (dc
);
5748 d_print_comp (dpi
, options
, type
);
5749 d_append_char (dpi
, '{');
5750 d_print_comp (dpi
, options
, list
);
5751 d_append_char (dpi
, '}');
5755 case DEMANGLE_COMPONENT_OPERATOR
:
5757 const struct demangle_operator_info
*op
= dc
->u
.s_operator
.op
;
5760 d_append_string (dpi
, "operator");
5761 /* Add a space before new/delete. */
5762 if (IS_LOWER (op
->name
[0]))
5763 d_append_char (dpi
, ' ');
5764 /* Omit a trailing space. */
5765 if (op
->name
[len
-1] == ' ')
5767 d_append_buffer (dpi
, op
->name
, len
);
5771 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
5772 d_append_string (dpi
, "operator ");
5773 d_print_comp (dpi
, options
, dc
->u
.s_extended_operator
.name
);
5776 case DEMANGLE_COMPONENT_CONVERSION
:
5777 d_append_string (dpi
, "operator ");
5778 d_print_conversion (dpi
, options
, dc
);
5781 case DEMANGLE_COMPONENT_NULLARY
:
5782 d_print_expr_op (dpi
, options
, d_left (dc
));
5785 case DEMANGLE_COMPONENT_UNARY
:
5787 struct demangle_component
*op
= d_left (dc
);
5788 struct demangle_component
*operand
= d_right (dc
);
5789 const char *code
= NULL
;
5791 if (op
->type
== DEMANGLE_COMPONENT_OPERATOR
)
5793 code
= op
->u
.s_operator
.op
->code
;
5794 if (!strcmp (code
, "ad"))
5796 /* Don't print the argument list for the address of a
5798 if (operand
->type
== DEMANGLE_COMPONENT_TYPED_NAME
5799 && d_left (operand
)->type
== DEMANGLE_COMPONENT_QUAL_NAME
5800 && d_right (operand
)->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5801 operand
= d_left (operand
);
5803 if (operand
->type
== DEMANGLE_COMPONENT_BINARY_ARGS
)
5805 /* This indicates a suffix operator. */
5806 operand
= d_left (operand
);
5807 d_print_subexpr (dpi
, options
, operand
);
5808 d_print_expr_op (dpi
, options
, op
);
5813 /* For sizeof..., just print the pack length. */
5814 if (code
&& !strcmp (code
, "sZ"))
5816 struct demangle_component
*a
= d_find_pack (dpi
, operand
);
5817 int len
= d_pack_length (a
);
5818 d_append_num (dpi
, len
);
5821 else if (code
&& !strcmp (code
, "sP"))
5823 int len
= d_args_length (dpi
, operand
);
5824 d_append_num (dpi
, len
);
5828 if (op
->type
!= DEMANGLE_COMPONENT_CAST
)
5829 d_print_expr_op (dpi
, options
, op
);
5832 d_append_char (dpi
, '(');
5833 d_print_cast (dpi
, options
, op
);
5834 d_append_char (dpi
, ')');
5836 if (code
&& !strcmp (code
, "gs"))
5837 /* Avoid parens after '::'. */
5838 d_print_comp (dpi
, options
, operand
);
5839 else if (code
&& !strcmp (code
, "st"))
5840 /* Always print parens for sizeof (type). */
5842 d_append_char (dpi
, '(');
5843 d_print_comp (dpi
, options
, operand
);
5844 d_append_char (dpi
, ')');
5847 d_print_subexpr (dpi
, options
, operand
);
5851 case DEMANGLE_COMPONENT_BINARY
:
5852 if (d_right (dc
)->type
!= DEMANGLE_COMPONENT_BINARY_ARGS
)
5854 d_print_error (dpi
);
5858 if (op_is_new_cast (d_left (dc
)))
5860 d_print_expr_op (dpi
, options
, d_left (dc
));
5861 d_append_char (dpi
, '<');
5862 d_print_comp (dpi
, options
, d_left (d_right (dc
)));
5863 d_append_string (dpi
, ">(");
5864 d_print_comp (dpi
, options
, d_right (d_right (dc
)));
5865 d_append_char (dpi
, ')');
5869 if (d_maybe_print_fold_expression (dpi
, options
, dc
))
5872 if (d_maybe_print_designated_init (dpi
, options
, dc
))
5875 /* We wrap an expression which uses the greater-than operator in
5876 an extra layer of parens so that it does not get confused
5877 with the '>' which ends the template parameters. */
5878 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_OPERATOR
5879 && d_left (dc
)->u
.s_operator
.op
->len
== 1
5880 && d_left (dc
)->u
.s_operator
.op
->name
[0] == '>')
5881 d_append_char (dpi
, '(');
5883 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "cl") == 0
5884 && d_left (d_right (dc
))->type
== DEMANGLE_COMPONENT_TYPED_NAME
)
5886 /* Function call used in an expression should not have printed types
5887 of the function arguments. Values of the function arguments still
5888 get printed below. */
5890 const struct demangle_component
*func
= d_left (d_right (dc
));
5892 if (d_right (func
)->type
!= DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5893 d_print_error (dpi
);
5894 d_print_subexpr (dpi
, options
, d_left (func
));
5897 d_print_subexpr (dpi
, options
, d_left (d_right (dc
)));
5898 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "ix") == 0)
5900 d_append_char (dpi
, '[');
5901 d_print_comp (dpi
, options
, d_right (d_right (dc
)));
5902 d_append_char (dpi
, ']');
5906 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "cl") != 0)
5907 d_print_expr_op (dpi
, options
, d_left (dc
));
5908 d_print_subexpr (dpi
, options
, d_right (d_right (dc
)));
5911 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_OPERATOR
5912 && d_left (dc
)->u
.s_operator
.op
->len
== 1
5913 && d_left (dc
)->u
.s_operator
.op
->name
[0] == '>')
5914 d_append_char (dpi
, ')');
5918 case DEMANGLE_COMPONENT_BINARY_ARGS
:
5919 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
5920 d_print_error (dpi
);
5923 case DEMANGLE_COMPONENT_TRINARY
:
5924 if (d_right (dc
)->type
!= DEMANGLE_COMPONENT_TRINARY_ARG1
5925 || d_right (d_right (dc
))->type
!= DEMANGLE_COMPONENT_TRINARY_ARG2
)
5927 d_print_error (dpi
);
5930 if (d_maybe_print_fold_expression (dpi
, options
, dc
))
5932 if (d_maybe_print_designated_init (dpi
, options
, dc
))
5935 struct demangle_component
*op
= d_left (dc
);
5936 struct demangle_component
*first
= d_left (d_right (dc
));
5937 struct demangle_component
*second
= d_left (d_right (d_right (dc
)));
5938 struct demangle_component
*third
= d_right (d_right (d_right (dc
)));
5940 if (!strcmp (op
->u
.s_operator
.op
->code
, "qu"))
5942 d_print_subexpr (dpi
, options
, first
);
5943 d_print_expr_op (dpi
, options
, op
);
5944 d_print_subexpr (dpi
, options
, second
);
5945 d_append_string (dpi
, " : ");
5946 d_print_subexpr (dpi
, options
, third
);
5950 d_append_string (dpi
, "new ");
5951 if (d_left (first
) != NULL
)
5953 d_print_subexpr (dpi
, options
, first
);
5954 d_append_char (dpi
, ' ');
5956 d_print_comp (dpi
, options
, second
);
5958 d_print_subexpr (dpi
, options
, third
);
5963 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
5964 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
5965 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
5966 d_print_error (dpi
);
5969 case DEMANGLE_COMPONENT_LITERAL
:
5970 case DEMANGLE_COMPONENT_LITERAL_NEG
:
5972 enum d_builtin_type_print tp
;
5974 /* For some builtin types, produce simpler output. */
5975 tp
= D_PRINT_DEFAULT
;
5976 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
)
5978 tp
= d_left (dc
)->u
.s_builtin
.type
->print
;
5982 case D_PRINT_UNSIGNED
:
5984 case D_PRINT_UNSIGNED_LONG
:
5985 case D_PRINT_LONG_LONG
:
5986 case D_PRINT_UNSIGNED_LONG_LONG
:
5987 if (d_right (dc
)->type
== DEMANGLE_COMPONENT_NAME
)
5989 if (dc
->type
== DEMANGLE_COMPONENT_LITERAL_NEG
)
5990 d_append_char (dpi
, '-');
5991 d_print_comp (dpi
, options
, d_right (dc
));
5996 case D_PRINT_UNSIGNED
:
5997 d_append_char (dpi
, 'u');
6000 d_append_char (dpi
, 'l');
6002 case D_PRINT_UNSIGNED_LONG
:
6003 d_append_string (dpi
, "ul");
6005 case D_PRINT_LONG_LONG
:
6006 d_append_string (dpi
, "ll");
6008 case D_PRINT_UNSIGNED_LONG_LONG
:
6009 d_append_string (dpi
, "ull");
6017 if (d_right (dc
)->type
== DEMANGLE_COMPONENT_NAME
6018 && d_right (dc
)->u
.s_name
.len
== 1
6019 && dc
->type
== DEMANGLE_COMPONENT_LITERAL
)
6021 switch (d_right (dc
)->u
.s_name
.s
[0])
6024 d_append_string (dpi
, "false");
6027 d_append_string (dpi
, "true");
6040 d_append_char (dpi
, '(');
6041 d_print_comp (dpi
, options
, d_left (dc
));
6042 d_append_char (dpi
, ')');
6043 if (dc
->type
== DEMANGLE_COMPONENT_LITERAL_NEG
)
6044 d_append_char (dpi
, '-');
6045 if (tp
== D_PRINT_FLOAT
)
6046 d_append_char (dpi
, '[');
6047 d_print_comp (dpi
, options
, d_right (dc
));
6048 if (tp
== D_PRINT_FLOAT
)
6049 d_append_char (dpi
, ']');
6053 case DEMANGLE_COMPONENT_VENDOR_EXPR
:
6054 d_print_comp (dpi
, options
, d_left (dc
));
6055 d_append_char (dpi
, '(');
6056 d_print_comp (dpi
, options
, d_right (dc
));
6057 d_append_char (dpi
, ')');
6060 case DEMANGLE_COMPONENT_NUMBER
:
6061 d_append_num (dpi
, dc
->u
.s_number
.number
);
6064 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
6065 d_append_string (dpi
, "java resource ");
6066 d_print_comp (dpi
, options
, d_left (dc
));
6069 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
6070 d_print_comp (dpi
, options
, d_left (dc
));
6071 d_print_comp (dpi
, options
, d_right (dc
));
6074 case DEMANGLE_COMPONENT_CHARACTER
:
6075 d_append_char (dpi
, dc
->u
.s_character
.character
);
6078 case DEMANGLE_COMPONENT_DECLTYPE
:
6079 d_append_string (dpi
, "decltype (");
6080 d_print_comp (dpi
, options
, d_left (dc
));
6081 d_append_char (dpi
, ')');
6084 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
6086 struct demangle_component
*a
= NULL
;
6088 if (!dpi
->lambda_tpl_parms
)
6089 a
= d_find_pack (dpi
, d_left (dc
));
6092 /* d_find_pack won't find anything if the only packs involved
6093 in this expansion are function parameter packs; in that
6094 case, just print the pattern and "...". */
6095 d_print_subexpr (dpi
, options
, d_left (dc
));
6096 d_append_string (dpi
, "...");
6100 int len
= d_pack_length (a
);
6104 for (i
= 0; i
< len
; ++i
)
6107 d_append_string (dpi
, ", ");
6108 dpi
->pack_index
= i
;
6109 d_print_comp (dpi
, options
, dc
);
6115 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
6117 long num
= dc
->u
.s_number
.number
;
6119 d_append_string (dpi
, "this");
6122 d_append_string (dpi
, "{parm#");
6123 d_append_num (dpi
, num
);
6124 d_append_char (dpi
, '}');
6129 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
6130 d_append_string (dpi
, "global constructors keyed to ");
6131 d_print_comp (dpi
, options
, dc
->u
.s_binary
.left
);
6134 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
6135 d_append_string (dpi
, "global destructors keyed to ");
6136 d_print_comp (dpi
, options
, dc
->u
.s_binary
.left
);
6139 case DEMANGLE_COMPONENT_LAMBDA
:
6141 d_append_string (dpi
, "{lambda");
6142 struct demangle_component
*parms
= dc
->u
.s_unary_num
.sub
;
6143 struct d_print_template dpt
;
6144 /* Generic lambda auto parms are mangled as the (synthedic) template
6145 type parm they are. We need to tell the printer that (a) we're in
6146 a lambda, and (b) the number of synthetic parms. */
6147 int saved_tpl_parms
= dpi
->lambda_tpl_parms
;
6148 dpi
->lambda_tpl_parms
= 0;
6149 /* Hang any lambda head as-if template args. */
6150 dpt
.template_decl
= NULL
;
6151 dpt
.next
= dpi
->templates
;
6152 dpi
->templates
= &dpt
;
6153 if (parms
&& parms
->type
== DEMANGLE_COMPONENT_TEMPLATE_HEAD
)
6155 dpt
.template_decl
= parms
;
6157 d_append_char (dpi
, '<');
6158 struct demangle_component
*parm
;
6159 for (parm
= d_left (parms
); parm
; parm
= d_right (parm
))
6161 if (dpi
->lambda_tpl_parms
++)
6162 d_append_string (dpi
, ", ");
6163 d_print_comp (dpi
, options
, parm
);
6164 d_append_char (dpi
, ' ');
6165 if (parm
->type
== DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM
)
6166 parm
= d_left (parm
);
6167 d_print_lambda_parm_name (dpi
, parm
->type
,
6168 dpi
->lambda_tpl_parms
- 1);
6170 d_append_char (dpi
, '>');
6172 parms
= d_right (parms
);
6174 dpi
->lambda_tpl_parms
++;
6176 d_append_char (dpi
, '(');
6177 d_print_comp (dpi
, options
, parms
);
6178 dpi
->lambda_tpl_parms
= saved_tpl_parms
;
6179 dpi
->templates
= dpt
.next
;
6180 d_append_string (dpi
, ")#");
6181 d_append_num (dpi
, dc
->u
.s_unary_num
.num
+ 1);
6182 d_append_char (dpi
, '}');
6186 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
6187 d_append_string (dpi
, "{unnamed type#");
6188 d_append_num (dpi
, dc
->u
.s_number
.number
+ 1);
6189 d_append_char (dpi
, '}');
6192 case DEMANGLE_COMPONENT_CLONE
:
6193 d_print_comp (dpi
, options
, d_left (dc
));
6194 d_append_string (dpi
, " [clone ");
6195 d_print_comp (dpi
, options
, d_right (dc
));
6196 d_append_char (dpi
, ']');
6199 case DEMANGLE_COMPONENT_TEMPLATE_HEAD
:
6201 d_append_char (dpi
, '<');
6203 struct demangle_component
*parm
;
6204 for (parm
= d_left (dc
); parm
; parm
= d_right (parm
))
6207 d_append_string (dpi
, ", ");
6208 d_print_comp (dpi
, options
, parm
);
6210 d_append_char (dpi
, '>');
6214 case DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM
:
6215 d_append_string (dpi
, "typename");
6218 case DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM
:
6219 d_print_comp (dpi
, options
, d_left (dc
));
6222 case DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM
:
6223 d_append_string (dpi
, "template");
6224 d_print_comp (dpi
, options
, d_left (dc
));
6225 d_append_string (dpi
, " class");
6228 case DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM
:
6229 d_print_comp (dpi
, options
, d_left (dc
));
6230 d_append_string (dpi
, "...");
6234 d_print_error (dpi
);
6240 d_print_comp (struct d_print_info
*dpi
, int options
,
6241 struct demangle_component
*dc
)
6243 struct d_component_stack self
;
6244 if (dc
== NULL
|| dc
->d_printing
> 1 || dpi
->recursion
> MAX_RECURSION_COUNT
)
6246 d_print_error (dpi
);
6254 self
.parent
= dpi
->component_stack
;
6255 dpi
->component_stack
= &self
;
6257 d_print_comp_inner (dpi
, options
, dc
);
6259 dpi
->component_stack
= self
.parent
;
6264 /* Print a Java dentifier. For Java we try to handle encoded extended
6265 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
6266 so we don't it for C++. Characters are encoded as
6270 d_print_java_identifier (struct d_print_info
*dpi
, const char *name
, int len
)
6276 for (p
= name
; p
< end
; ++p
)
6287 for (q
= p
+ 3; q
< end
; ++q
)
6293 else if (*q
>= 'A' && *q
<= 'F')
6294 dig
= *q
- 'A' + 10;
6295 else if (*q
>= 'a' && *q
<= 'f')
6296 dig
= *q
- 'a' + 10;
6302 /* If the Unicode character is larger than 256, we don't try
6303 to deal with it here. FIXME. */
6304 if (q
< end
&& *q
== '_' && c
< 256)
6306 d_append_char (dpi
, c
);
6312 d_append_char (dpi
, *p
);
6316 /* Print a list of modifiers. SUFFIX is 1 if we are printing
6317 qualifiers on this after printing a function. */
6320 d_print_mod_list (struct d_print_info
*dpi
, int options
,
6321 struct d_print_mod
*mods
, int suffix
)
6323 struct d_print_template
*hold_dpt
;
6325 if (mods
== NULL
|| d_print_saw_error (dpi
))
6330 && (is_fnqual_component_type (mods
->mod
->type
))))
6332 d_print_mod_list (dpi
, options
, mods
->next
, suffix
);
6338 hold_dpt
= dpi
->templates
;
6339 dpi
->templates
= mods
->templates
;
6341 if (mods
->mod
->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
6343 d_print_function_type (dpi
, options
, mods
->mod
, mods
->next
);
6344 dpi
->templates
= hold_dpt
;
6347 else if (mods
->mod
->type
== DEMANGLE_COMPONENT_ARRAY_TYPE
)
6349 d_print_array_type (dpi
, options
, mods
->mod
, mods
->next
);
6350 dpi
->templates
= hold_dpt
;
6353 else if (mods
->mod
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
6355 struct d_print_mod
*hold_modifiers
;
6356 struct demangle_component
*dc
;
6358 /* When this is on the modifier stack, we have pulled any
6359 qualifiers off the right argument already. Otherwise, we
6360 print it as usual, but don't let the left argument see any
6363 hold_modifiers
= dpi
->modifiers
;
6364 dpi
->modifiers
= NULL
;
6365 d_print_comp (dpi
, options
, d_left (mods
->mod
));
6366 dpi
->modifiers
= hold_modifiers
;
6368 if ((options
& DMGL_JAVA
) == 0)
6369 d_append_string (dpi
, "::");
6371 d_append_char (dpi
, '.');
6373 dc
= d_right (mods
->mod
);
6375 if (dc
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
6377 d_append_string (dpi
, "{default arg#");
6378 d_append_num (dpi
, dc
->u
.s_unary_num
.num
+ 1);
6379 d_append_string (dpi
, "}::");
6380 dc
= dc
->u
.s_unary_num
.sub
;
6383 while (is_fnqual_component_type (dc
->type
))
6386 d_print_comp (dpi
, options
, dc
);
6388 dpi
->templates
= hold_dpt
;
6392 d_print_mod (dpi
, options
, mods
->mod
);
6394 dpi
->templates
= hold_dpt
;
6396 d_print_mod_list (dpi
, options
, mods
->next
, suffix
);
6399 /* Print a modifier. */
6402 d_print_mod (struct d_print_info
*dpi
, int options
,
6403 struct demangle_component
*mod
)
6407 case DEMANGLE_COMPONENT_RESTRICT
:
6408 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
6409 d_append_string (dpi
, " restrict");
6411 case DEMANGLE_COMPONENT_VOLATILE
:
6412 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
6413 d_append_string (dpi
, " volatile");
6415 case DEMANGLE_COMPONENT_CONST
:
6416 case DEMANGLE_COMPONENT_CONST_THIS
:
6417 d_append_string (dpi
, " const");
6419 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
6420 d_append_string (dpi
, " transaction_safe");
6422 case DEMANGLE_COMPONENT_NOEXCEPT
:
6423 d_append_string (dpi
, " noexcept");
6426 d_append_char (dpi
, '(');
6427 d_print_comp (dpi
, options
, d_right (mod
));
6428 d_append_char (dpi
, ')');
6431 case DEMANGLE_COMPONENT_THROW_SPEC
:
6432 d_append_string (dpi
, " throw");
6435 d_append_char (dpi
, '(');
6436 d_print_comp (dpi
, options
, d_right (mod
));
6437 d_append_char (dpi
, ')');
6440 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
6441 d_append_char (dpi
, ' ');
6442 d_print_comp (dpi
, options
, d_right (mod
));
6444 case DEMANGLE_COMPONENT_POINTER
:
6445 /* There is no pointer symbol in Java. */
6446 if ((options
& DMGL_JAVA
) == 0)
6447 d_append_char (dpi
, '*');
6449 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
6450 /* For the ref-qualifier, put a space before the &. */
6451 d_append_char (dpi
, ' ');
6453 case DEMANGLE_COMPONENT_REFERENCE
:
6454 d_append_char (dpi
, '&');
6456 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
6457 d_append_char (dpi
, ' ');
6459 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
6460 d_append_string (dpi
, "&&");
6462 case DEMANGLE_COMPONENT_COMPLEX
:
6463 d_append_string (dpi
, " _Complex");
6465 case DEMANGLE_COMPONENT_IMAGINARY
:
6466 d_append_string (dpi
, " _Imaginary");
6468 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
6469 if (d_last_char (dpi
) != '(')
6470 d_append_char (dpi
, ' ');
6471 d_print_comp (dpi
, options
, d_left (mod
));
6472 d_append_string (dpi
, "::*");
6474 case DEMANGLE_COMPONENT_TYPED_NAME
:
6475 d_print_comp (dpi
, options
, d_left (mod
));
6477 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
6478 d_append_string (dpi
, " __vector(");
6479 d_print_comp (dpi
, options
, d_left (mod
));
6480 d_append_char (dpi
, ')');
6484 /* Otherwise, we have something that won't go back on the
6485 modifier stack, so we can just print it. */
6486 d_print_comp (dpi
, options
, mod
);
6491 /* Print a function type, except for the return type. */
6494 d_print_function_type (struct d_print_info
*dpi
, int options
,
6495 struct demangle_component
*dc
,
6496 struct d_print_mod
*mods
)
6500 struct d_print_mod
*p
;
6501 struct d_print_mod
*hold_modifiers
;
6505 for (p
= mods
; p
!= NULL
; p
= p
->next
)
6510 switch (p
->mod
->type
)
6512 case DEMANGLE_COMPONENT_POINTER
:
6513 case DEMANGLE_COMPONENT_REFERENCE
:
6514 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
6517 case DEMANGLE_COMPONENT_RESTRICT
:
6518 case DEMANGLE_COMPONENT_VOLATILE
:
6519 case DEMANGLE_COMPONENT_CONST
:
6520 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
6521 case DEMANGLE_COMPONENT_COMPLEX
:
6522 case DEMANGLE_COMPONENT_IMAGINARY
:
6523 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
6527 FNQUAL_COMPONENT_CASE
:
6540 if (d_last_char (dpi
) != '('
6541 && d_last_char (dpi
) != '*')
6544 if (need_space
&& d_last_char (dpi
) != ' ')
6545 d_append_char (dpi
, ' ');
6546 d_append_char (dpi
, '(');
6549 hold_modifiers
= dpi
->modifiers
;
6550 dpi
->modifiers
= NULL
;
6552 d_print_mod_list (dpi
, options
, mods
, 0);
6555 d_append_char (dpi
, ')');
6557 d_append_char (dpi
, '(');
6559 if (d_right (dc
) != NULL
)
6560 d_print_comp (dpi
, options
, d_right (dc
));
6562 d_append_char (dpi
, ')');
6564 d_print_mod_list (dpi
, options
, mods
, 1);
6566 dpi
->modifiers
= hold_modifiers
;
6569 /* Print an array type, except for the element type. */
6572 d_print_array_type (struct d_print_info
*dpi
, int options
,
6573 struct demangle_component
*dc
,
6574 struct d_print_mod
*mods
)
6582 struct d_print_mod
*p
;
6585 for (p
= mods
; p
!= NULL
; p
= p
->next
)
6589 if (p
->mod
->type
== DEMANGLE_COMPONENT_ARRAY_TYPE
)
6604 d_append_string (dpi
, " (");
6606 d_print_mod_list (dpi
, options
, mods
, 0);
6609 d_append_char (dpi
, ')');
6613 d_append_char (dpi
, ' ');
6615 d_append_char (dpi
, '[');
6617 if (d_left (dc
) != NULL
)
6618 d_print_comp (dpi
, options
, d_left (dc
));
6620 d_append_char (dpi
, ']');
6623 /* Print an operator in an expression. */
6626 d_print_expr_op (struct d_print_info
*dpi
, int options
,
6627 struct demangle_component
*dc
)
6629 if (dc
->type
== DEMANGLE_COMPONENT_OPERATOR
)
6630 d_append_buffer (dpi
, dc
->u
.s_operator
.op
->name
,
6631 dc
->u
.s_operator
.op
->len
);
6633 d_print_comp (dpi
, options
, dc
);
6639 d_print_cast (struct d_print_info
*dpi
, int options
,
6640 struct demangle_component
*dc
)
6642 d_print_comp (dpi
, options
, d_left (dc
));
6645 /* Print a conversion operator. */
6648 d_print_conversion (struct d_print_info
*dpi
, int options
,
6649 struct demangle_component
*dc
)
6651 struct d_print_template dpt
;
6653 /* For a conversion operator, we need the template parameters from
6654 the enclosing template in scope for processing the type. */
6655 if (dpi
->current_template
!= NULL
)
6657 dpt
.next
= dpi
->templates
;
6658 dpi
->templates
= &dpt
;
6659 dpt
.template_decl
= dpi
->current_template
;
6662 if (d_left (dc
)->type
!= DEMANGLE_COMPONENT_TEMPLATE
)
6664 d_print_comp (dpi
, options
, d_left (dc
));
6665 if (dpi
->current_template
!= NULL
)
6666 dpi
->templates
= dpt
.next
;
6670 d_print_comp (dpi
, options
, d_left (d_left (dc
)));
6672 /* For a templated cast operator, we need to remove the template
6673 parameters from scope after printing the operator name,
6674 so we need to handle the template printing here. */
6675 if (dpi
->current_template
!= NULL
)
6676 dpi
->templates
= dpt
.next
;
6678 if (d_last_char (dpi
) == '<')
6679 d_append_char (dpi
, ' ');
6680 d_append_char (dpi
, '<');
6681 d_print_comp (dpi
, options
, d_right (d_left (dc
)));
6682 /* Avoid generating two consecutive '>' characters, to avoid
6683 the C++ syntactic ambiguity. */
6684 if (d_last_char (dpi
) == '>')
6685 d_append_char (dpi
, ' ');
6686 d_append_char (dpi
, '>');
6690 /* Initialize the information structure we use to pass around
6693 CP_STATIC_IF_GLIBCPP_V3
6695 cplus_demangle_init_info (const char *mangled
, int options
, size_t len
,
6699 di
->send
= mangled
+ len
;
6700 di
->options
= options
;
6704 /* We cannot need more components than twice the number of chars in
6705 the mangled string. Most components correspond directly to
6706 chars, but the ARGLIST types are exceptions. */
6707 di
->num_comps
= 2 * len
;
6710 /* Similarly, we cannot need more substitutions than there are
6711 chars in the mangled string. */
6715 di
->last_name
= NULL
;
6718 di
->is_expression
= 0;
6719 di
->is_conversion
= 0;
6720 di
->recursion_level
= 0;
6723 /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
6724 mangled name, return strings in repeated callback giving the demangled
6725 name. OPTIONS is the usual libiberty demangler options. On success,
6726 this returns 1. On failure, returns 0. */
6729 d_demangle_callback (const char *mangled
, int options
,
6730 demangle_callbackref callback
, void *opaque
)
6741 struct demangle_component
*dc
;
6744 if (mangled
[0] == '_' && mangled
[1] == 'Z')
6746 else if (strncmp (mangled
, "_GLOBAL_", 8) == 0
6747 && (mangled
[8] == '.' || mangled
[8] == '_' || mangled
[8] == '$')
6748 && (mangled
[9] == 'D' || mangled
[9] == 'I')
6749 && mangled
[10] == '_')
6750 type
= mangled
[9] == 'I' ? DCT_GLOBAL_CTORS
: DCT_GLOBAL_DTORS
;
6753 if ((options
& DMGL_TYPES
) == 0)
6758 di
.unresolved_name_state
= 1;
6761 cplus_demangle_init_info (mangled
, options
, strlen (mangled
), &di
);
6763 /* PR 87675 - Check for a mangled string that is so long
6764 that we do not have enough stack space to demangle it. */
6765 if (((options
& DMGL_NO_RECURSE_LIMIT
) == 0)
6766 /* This check is a bit arbitrary, since what we really want to do is to
6767 compare the sizes of the di.comps and di.subs arrays against the
6768 amount of stack space remaining. But there is no portable way to do
6769 this, so instead we use the recursion limit as a guide to the maximum
6770 size of the arrays. */
6771 && (unsigned long) di
.num_comps
> DEMANGLE_RECURSION_LIMIT
)
6773 /* FIXME: We need a way to indicate that a stack limit has been reached. */
6778 #ifdef CP_DYNAMIC_ARRAYS
6779 __extension__
struct demangle_component comps
[di
.num_comps
];
6780 __extension__
struct demangle_component
*subs
[di
.num_subs
];
6785 di
.comps
= alloca (di
.num_comps
* sizeof (*di
.comps
));
6786 di
.subs
= alloca (di
.num_subs
* sizeof (*di
.subs
));
6792 dc
= cplus_demangle_type (&di
);
6795 dc
= cplus_demangle_mangled_name (&di
, 1);
6797 case DCT_GLOBAL_CTORS
:
6798 case DCT_GLOBAL_DTORS
:
6799 d_advance (&di
, 11);
6800 dc
= d_make_comp (&di
,
6801 (type
== DCT_GLOBAL_CTORS
6802 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
6803 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
),
6804 d_make_demangle_mangled_name (&di
, d_str (&di
)),
6806 d_advance (&di
, strlen (d_str (&di
)));
6809 abort (); /* We have listed all the cases. */
6812 /* If DMGL_PARAMS is set, then if we didn't consume the entire
6813 mangled string, then we didn't successfully demangle it. If
6814 DMGL_PARAMS is not set, we didn't look at the trailing
6816 if (((options
& DMGL_PARAMS
) != 0) && d_peek_char (&di
) != '\0')
6819 /* See discussion in d_unresolved_name. */
6820 if (dc
== NULL
&& di
.unresolved_name_state
== -1)
6822 di
.unresolved_name_state
= 0;
6826 #ifdef CP_DEMANGLE_DEBUG
6830 status
= (dc
!= NULL
)
6831 ? cplus_demangle_print_callback (options
, dc
, callback
, opaque
)
6838 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
6839 name, return a buffer allocated with malloc holding the demangled
6840 name. OPTIONS is the usual libiberty demangler options. On
6841 success, this sets *PALC to the allocated size of the returned
6842 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
6843 a memory allocation failure, and returns NULL. */
6846 d_demangle (const char *mangled
, int options
, size_t *palc
)
6848 struct d_growable_string dgs
;
6851 d_growable_string_init (&dgs
, 0);
6853 status
= d_demangle_callback (mangled
, options
,
6854 d_growable_string_callback_adapter
, &dgs
);
6862 *palc
= dgs
.allocation_failure
? 1 : dgs
.alc
;
6866 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
6868 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
6870 /* ia64 ABI-mandated entry point in the C++ runtime library for
6871 performing demangling. MANGLED_NAME is a NUL-terminated character
6872 string containing the name to be demangled.
6874 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
6875 *LENGTH bytes, into which the demangled name is stored. If
6876 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
6877 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
6878 is placed in a region of memory allocated with malloc.
6880 If LENGTH is non-NULL, the length of the buffer containing the
6881 demangled name, is placed in *LENGTH.
6883 The return value is a pointer to the start of the NUL-terminated
6884 demangled name, or NULL if the demangling fails. The caller is
6885 responsible for deallocating this memory using free.
6887 *STATUS is set to one of the following values:
6888 0: The demangling operation succeeded.
6889 -1: A memory allocation failure occurred.
6890 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6891 -3: One of the arguments is invalid.
6893 The demangling is performed using the C++ ABI mangling rules, with
6897 __cxa_demangle (const char *mangled_name
, char *output_buffer
,
6898 size_t *length
, int *status
)
6903 if (mangled_name
== NULL
)
6910 if (output_buffer
!= NULL
&& length
== NULL
)
6917 demangled
= d_demangle (mangled_name
, DMGL_PARAMS
| DMGL_TYPES
, &alc
);
6919 if (demangled
== NULL
)
6931 if (output_buffer
== NULL
)
6938 if (strlen (demangled
) < *length
)
6940 strcpy (output_buffer
, demangled
);
6942 demangled
= output_buffer
;
6946 free (output_buffer
);
6957 extern int __gcclibcxx_demangle_callback (const char *,
6959 (const char *, size_t, void *),
6962 /* Alternative, allocationless entry point in the C++ runtime library
6963 for performing demangling. MANGLED_NAME is a NUL-terminated character
6964 string containing the name to be demangled.
6966 CALLBACK is a callback function, called with demangled string
6967 segments as demangling progresses; it is called at least once,
6968 but may be called more than once. OPAQUE is a generalized pointer
6969 used as a callback argument.
6971 The return code is one of the following values, equivalent to
6972 the STATUS values of __cxa_demangle() (excluding -1, since this
6973 function performs no memory allocations):
6974 0: The demangling operation succeeded.
6975 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6976 -3: One of the arguments is invalid.
6978 The demangling is performed using the C++ ABI mangling rules, with
6982 __gcclibcxx_demangle_callback (const char *mangled_name
,
6983 void (*callback
) (const char *, size_t, void *),
6988 if (mangled_name
== NULL
|| callback
== NULL
)
6991 status
= d_demangle_callback (mangled_name
, DMGL_PARAMS
| DMGL_TYPES
,
6999 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
7001 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
7002 mangled name, return a buffer allocated with malloc holding the
7003 demangled name. Otherwise, return NULL. */
7006 cplus_demangle_v3 (const char *mangled
, int options
)
7010 return d_demangle (mangled
, options
, &alc
);
7014 cplus_demangle_v3_callback (const char *mangled
, int options
,
7015 demangle_callbackref callback
, void *opaque
)
7017 return d_demangle_callback (mangled
, options
, callback
, opaque
);
7020 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
7021 conventions, but the output formatting is a little different.
7022 This instructs the C++ demangler not to emit pointer characters ("*"), to
7023 use Java's namespace separator symbol ("." instead of "::"), and to output
7024 JArray<TYPE> as TYPE[]. */
7027 java_demangle_v3 (const char *mangled
)
7031 return d_demangle (mangled
, DMGL_JAVA
| DMGL_PARAMS
| DMGL_RET_POSTFIX
, &alc
);
7035 java_demangle_v3_callback (const char *mangled
,
7036 demangle_callbackref callback
, void *opaque
)
7038 return d_demangle_callback (mangled
,
7039 DMGL_JAVA
| DMGL_PARAMS
| DMGL_RET_POSTFIX
,
7043 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
7045 #ifndef IN_GLIBCPP_V3
7047 /* Demangle a string in order to find out whether it is a constructor
7048 or destructor. Return non-zero on success. Set *CTOR_KIND and
7049 *DTOR_KIND appropriately. */
7052 is_ctor_or_dtor (const char *mangled
,
7053 enum gnu_v3_ctor_kinds
*ctor_kind
,
7054 enum gnu_v3_dtor_kinds
*dtor_kind
)
7057 struct demangle_component
*dc
;
7060 *ctor_kind
= (enum gnu_v3_ctor_kinds
) 0;
7061 *dtor_kind
= (enum gnu_v3_dtor_kinds
) 0;
7063 cplus_demangle_init_info (mangled
, DMGL_GNU_V3
, strlen (mangled
), &di
);
7066 #ifdef CP_DYNAMIC_ARRAYS
7067 __extension__
struct demangle_component comps
[di
.num_comps
];
7068 __extension__
struct demangle_component
*subs
[di
.num_subs
];
7073 di
.comps
= alloca (di
.num_comps
* sizeof (*di
.comps
));
7074 di
.subs
= alloca (di
.num_subs
* sizeof (*di
.subs
));
7077 dc
= cplus_demangle_mangled_name (&di
, 1);
7079 /* Note that because we did not pass DMGL_PARAMS, we don't expect
7080 to demangle the entire string. */
7087 /* These cannot appear on a constructor or destructor. */
7088 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
7089 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
7090 case DEMANGLE_COMPONENT_CONST_THIS
:
7091 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
7092 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
7096 case DEMANGLE_COMPONENT_TYPED_NAME
:
7097 case DEMANGLE_COMPONENT_TEMPLATE
:
7100 case DEMANGLE_COMPONENT_QUAL_NAME
:
7101 case DEMANGLE_COMPONENT_LOCAL_NAME
:
7104 case DEMANGLE_COMPONENT_CTOR
:
7105 *ctor_kind
= dc
->u
.s_ctor
.kind
;
7109 case DEMANGLE_COMPONENT_DTOR
:
7110 *dtor_kind
= dc
->u
.s_dtor
.kind
;
7121 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
7122 name. A non-zero return indicates the type of constructor. */
7124 enum gnu_v3_ctor_kinds
7125 is_gnu_v3_mangled_ctor (const char *name
)
7127 enum gnu_v3_ctor_kinds ctor_kind
;
7128 enum gnu_v3_dtor_kinds dtor_kind
;
7130 if (! is_ctor_or_dtor (name
, &ctor_kind
, &dtor_kind
))
7131 return (enum gnu_v3_ctor_kinds
) 0;
7136 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
7137 name. A non-zero return indicates the type of destructor. */
7139 enum gnu_v3_dtor_kinds
7140 is_gnu_v3_mangled_dtor (const char *name
)
7142 enum gnu_v3_ctor_kinds ctor_kind
;
7143 enum gnu_v3_dtor_kinds dtor_kind
;
7145 if (! is_ctor_or_dtor (name
, &ctor_kind
, &dtor_kind
))
7146 return (enum gnu_v3_dtor_kinds
) 0;
7150 #endif /* IN_GLIBCPP_V3 */
7152 #ifdef STANDALONE_DEMANGLER
7155 #include "dyn-string.h"
7157 static void print_usage (FILE* fp
, int exit_value
);
7159 #define IS_ALPHA(CHAR) \
7160 (((CHAR) >= 'a' && (CHAR) <= 'z') \
7161 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
7163 /* Non-zero if CHAR is a character than can occur in a mangled name. */
7164 #define is_mangled_char(CHAR) \
7165 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
7166 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
7168 /* The name of this program, as invoked. */
7169 const char* program_name
;
7171 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
7174 print_usage (FILE* fp
, int exit_value
)
7176 fprintf (fp
, "Usage: %s [options] [names ...]\n", program_name
);
7177 fprintf (fp
, "Options:\n");
7178 fprintf (fp
, " -h,--help Display this message.\n");
7179 fprintf (fp
, " -p,--no-params Don't display function parameters\n");
7180 fprintf (fp
, " -v,--verbose Produce verbose demanglings.\n");
7181 fprintf (fp
, "If names are provided, they are demangled. Otherwise filters standard input.\n");
7186 /* Option specification for getopt_long. */
7187 static const struct option long_options
[] =
7189 { "help", no_argument
, NULL
, 'h' },
7190 { "no-params", no_argument
, NULL
, 'p' },
7191 { "verbose", no_argument
, NULL
, 'v' },
7192 { NULL
, no_argument
, NULL
, 0 },
7195 /* Main entry for a demangling filter executable. It will demangle
7196 its command line arguments, if any. If none are provided, it will
7197 filter stdin to stdout, replacing any recognized mangled C++ names
7198 with their demangled equivalents. */
7201 main (int argc
, char *argv
[])
7205 int options
= DMGL_PARAMS
| DMGL_ANSI
| DMGL_TYPES
;
7207 /* Use the program name of this program, as invoked. */
7208 program_name
= argv
[0];
7210 /* Parse options. */
7213 opt_char
= getopt_long (argc
, argv
, "hpv", long_options
, NULL
);
7216 case '?': /* Unrecognized option. */
7217 print_usage (stderr
, 1);
7221 print_usage (stdout
, 0);
7225 options
&= ~ DMGL_PARAMS
;
7229 options
|= DMGL_VERBOSE
;
7233 while (opt_char
!= -1);
7236 /* No command line arguments were provided. Filter stdin. */
7238 dyn_string_t mangled
= dyn_string_new (3);
7241 /* Read all of input. */
7242 while (!feof (stdin
))
7246 /* Pile characters into mangled until we hit one that can't
7247 occur in a mangled name. */
7249 while (!feof (stdin
) && is_mangled_char (c
))
7251 dyn_string_append_char (mangled
, c
);
7257 if (dyn_string_length (mangled
) > 0)
7259 #ifdef IN_GLIBCPP_V3
7260 s
= __cxa_demangle (dyn_string_buf (mangled
), NULL
, NULL
, NULL
);
7262 s
= cplus_demangle_v3 (dyn_string_buf (mangled
), options
);
7272 /* It might not have been a mangled name. Print the
7274 fputs (dyn_string_buf (mangled
), stdout
);
7277 dyn_string_clear (mangled
);
7280 /* If we haven't hit EOF yet, we've read one character that
7281 can't occur in a mangled name, so print it out. */
7286 dyn_string_delete (mangled
);
7289 /* Demangle command line arguments. */
7291 /* Loop over command line arguments. */
7292 for (i
= optind
; i
< argc
; ++i
)
7295 #ifdef IN_GLIBCPP_V3
7299 /* Attempt to demangle. */
7300 #ifdef IN_GLIBCPP_V3
7301 s
= __cxa_demangle (argv
[i
], NULL
, NULL
, &status
);
7303 s
= cplus_demangle_v3 (argv
[i
], options
);
7306 /* If it worked, print the demangled name. */
7314 #ifdef IN_GLIBCPP_V3
7315 fprintf (stderr
, "Failed: %s (status %d)\n", argv
[i
], status
);
7317 fprintf (stderr
, "Failed: %s\n", argv
[i
]);
7326 #endif /* STANDALONE_DEMANGLER */