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 { "nx", NL ("noexcept"), 1 },
1951 { "oR", NL ("|="), 2 },
1952 { "oo", NL ("||"), 2 },
1953 { "or", NL ("|"), 2 },
1954 { "pL", NL ("+="), 2 },
1955 { "pl", NL ("+"), 2 },
1956 { "pm", NL ("->*"), 2 },
1957 { "pp", NL ("++"), 1 },
1958 { "ps", NL ("+"), 1 },
1959 { "pt", NL ("->"), 2 },
1960 { "qu", NL ("?"), 3 },
1961 { "rM", NL ("%="), 2 },
1962 { "rS", NL (">>="), 2 },
1963 { "rc", NL ("reinterpret_cast"), 2 },
1964 { "rm", NL ("%"), 2 },
1965 { "rs", NL (">>"), 2 },
1966 { "sP", NL ("sizeof..."), 1 },
1967 { "sZ", NL ("sizeof..."), 1 },
1968 { "sc", NL ("static_cast"), 2 },
1969 { "ss", NL ("<=>"), 2 },
1970 { "st", NL ("sizeof "), 1 },
1971 { "sz", NL ("sizeof "), 1 },
1972 { "tr", NL ("throw"), 0 },
1973 { "tw", NL ("throw "), 1 },
1974 { NULL
, NULL
, 0, 0 }
1977 static struct demangle_component
*
1978 d_operator_name (struct d_info
*di
)
1983 c1
= d_next_char (di
);
1984 c2
= d_next_char (di
);
1985 if (c1
== 'v' && IS_DIGIT (c2
))
1986 return d_make_extended_operator (di
, c2
- '0', d_source_name (di
));
1987 else if (c1
== 'c' && c2
== 'v')
1989 struct demangle_component
*type
;
1990 int was_conversion
= di
->is_conversion
;
1991 struct demangle_component
*res
;
1993 di
->is_conversion
= ! di
->is_expression
;
1994 type
= cplus_demangle_type (di
);
1995 if (di
->is_conversion
)
1996 res
= d_make_comp (di
, DEMANGLE_COMPONENT_CONVERSION
, type
, NULL
);
1998 res
= d_make_comp (di
, DEMANGLE_COMPONENT_CAST
, type
, NULL
);
1999 di
->is_conversion
= was_conversion
;
2004 /* LOW is the inclusive lower bound. */
2006 /* HIGH is the exclusive upper bound. We subtract one to ignore
2007 the sentinel at the end of the array. */
2008 int high
= ((sizeof (cplus_demangle_operators
)
2009 / sizeof (cplus_demangle_operators
[0]))
2015 const struct demangle_operator_info
*p
;
2017 i
= low
+ (high
- low
) / 2;
2018 p
= cplus_demangle_operators
+ i
;
2020 if (c1
== p
->code
[0] && c2
== p
->code
[1])
2021 return d_make_operator (di
, p
);
2023 if (c1
< p
->code
[0] || (c1
== p
->code
[0] && c2
< p
->code
[1]))
2033 static struct demangle_component
*
2034 d_make_character (struct d_info
*di
, int c
)
2036 struct demangle_component
*p
;
2037 p
= d_make_empty (di
);
2040 p
->type
= DEMANGLE_COMPONENT_CHARACTER
;
2041 p
->u
.s_character
.character
= c
;
2046 static struct demangle_component
*
2047 d_java_resource (struct d_info
*di
)
2049 struct demangle_component
*p
= NULL
;
2050 struct demangle_component
*next
= NULL
;
2055 len
= d_number (di
);
2059 /* Eat the leading '_'. */
2060 if (d_next_char (di
) != '_')
2073 /* Each chunk is either a '$' escape... */
2091 next
= d_make_character (di
, c
);
2099 /* ... or a sequence of characters. */
2102 while (i
< len
&& str
[i
] && str
[i
] != '$')
2105 next
= d_make_name (di
, str
, i
);
2118 p
= d_make_comp (di
, DEMANGLE_COMPONENT_COMPOUND_NAME
, p
, next
);
2124 p
= d_make_comp (di
, DEMANGLE_COMPONENT_JAVA_RESOURCE
, p
, NULL
);
2129 /* <special-name> ::= TV <type>
2133 ::= TA <template-arg>
2134 ::= GV <(object) name>
2135 ::= T <call-offset> <(base) encoding>
2136 ::= Tc <call-offset> <call-offset> <(base) encoding>
2137 Also g++ extensions:
2138 ::= TC <type> <(offset) number> _ <(base) type>
2143 ::= Gr <resource name>
2148 static struct demangle_component
*
2149 d_special_name (struct d_info
*di
)
2151 di
->expansion
+= 20;
2152 if (d_check_char (di
, 'T'))
2154 switch (d_next_char (di
))
2158 return d_make_comp (di
, DEMANGLE_COMPONENT_VTABLE
,
2159 cplus_demangle_type (di
), NULL
);
2161 di
->expansion
-= 10;
2162 return d_make_comp (di
, DEMANGLE_COMPONENT_VTT
,
2163 cplus_demangle_type (di
), NULL
);
2165 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO
,
2166 cplus_demangle_type (di
), NULL
);
2168 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO_NAME
,
2169 cplus_demangle_type (di
), NULL
);
2172 if (! d_call_offset (di
, 'h'))
2174 return d_make_comp (di
, DEMANGLE_COMPONENT_THUNK
,
2175 d_encoding (di
, 0), NULL
);
2178 if (! d_call_offset (di
, 'v'))
2180 return d_make_comp (di
, DEMANGLE_COMPONENT_VIRTUAL_THUNK
,
2181 d_encoding (di
, 0), NULL
);
2184 if (! d_call_offset (di
, '\0'))
2186 if (! d_call_offset (di
, '\0'))
2188 return d_make_comp (di
, DEMANGLE_COMPONENT_COVARIANT_THUNK
,
2189 d_encoding (di
, 0), NULL
);
2193 struct demangle_component
*derived_type
;
2195 struct demangle_component
*base_type
;
2197 derived_type
= cplus_demangle_type (di
);
2198 offset
= d_number (di
);
2201 if (! d_check_char (di
, '_'))
2203 base_type
= cplus_demangle_type (di
);
2204 /* We don't display the offset. FIXME: We should display
2205 it in verbose mode. */
2207 return d_make_comp (di
, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
,
2208 base_type
, derived_type
);
2212 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO_FN
,
2213 cplus_demangle_type (di
), NULL
);
2215 return d_make_comp (di
, DEMANGLE_COMPONENT_JAVA_CLASS
,
2216 cplus_demangle_type (di
), NULL
);
2219 return d_make_comp (di
, DEMANGLE_COMPONENT_TLS_INIT
,
2220 d_name (di
, 0), NULL
);
2223 return d_make_comp (di
, DEMANGLE_COMPONENT_TLS_WRAPPER
,
2224 d_name (di
, 0), NULL
);
2227 return d_make_comp (di
, DEMANGLE_COMPONENT_TPARM_OBJ
,
2228 d_template_arg (di
), NULL
);
2234 else if (d_check_char (di
, 'G'))
2236 switch (d_next_char (di
))
2239 return d_make_comp (di
, DEMANGLE_COMPONENT_GUARD
,
2240 d_name (di
, 0), NULL
);
2244 struct demangle_component
*name
= d_name (di
, 0);
2245 return d_make_comp (di
, DEMANGLE_COMPONENT_REFTEMP
, name
,
2246 d_number_component (di
));
2250 return d_make_comp (di
, DEMANGLE_COMPONENT_HIDDEN_ALIAS
,
2251 d_encoding (di
, 0), NULL
);
2255 struct demangle_component
*module
= NULL
;
2256 if (!d_maybe_module_name (di
, &module
) || !module
)
2258 return d_make_comp (di
, DEMANGLE_COMPONENT_MODULE_INIT
,
2262 switch (d_next_char (di
))
2265 return d_make_comp (di
, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
,
2266 d_encoding (di
, 0), NULL
);
2268 /* ??? The proposal is that other letters (such as 'h') stand
2269 for different variants of transaction cloning, such as
2270 compiling directly for hardware transaction support. But
2271 they still should all be transactional clones of some sort
2272 so go ahead and call them that. */
2274 return d_make_comp (di
, DEMANGLE_COMPONENT_TRANSACTION_CLONE
,
2275 d_encoding (di
, 0), NULL
);
2279 return d_java_resource (di
);
2289 /* <call-offset> ::= h <nv-offset> _
2292 <nv-offset> ::= <(offset) number>
2294 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
2296 The C parameter, if not '\0', is a character we just read which is
2297 the start of the <call-offset>.
2299 We don't display the offset information anywhere. FIXME: We should
2300 display it in verbose mode. */
2303 d_call_offset (struct d_info
*di
, int c
)
2306 c
= d_next_char (di
);
2313 if (! d_check_char (di
, '_'))
2320 if (! d_check_char (di
, '_'))
2326 /* <ctor-dtor-name> ::= C1
2334 static struct demangle_component
*
2335 d_ctor_dtor_name (struct d_info
*di
)
2337 if (di
->last_name
!= NULL
)
2339 if (di
->last_name
->type
== DEMANGLE_COMPONENT_NAME
)
2340 di
->expansion
+= di
->last_name
->u
.s_name
.len
;
2341 else if (di
->last_name
->type
== DEMANGLE_COMPONENT_SUB_STD
)
2342 di
->expansion
+= di
->last_name
->u
.s_string
.len
;
2344 switch (d_peek_char (di
))
2348 enum gnu_v3_ctor_kinds kind
;
2351 if (d_peek_next_char (di
) == 'I')
2357 switch (d_peek_next_char (di
))
2360 kind
= gnu_v3_complete_object_ctor
;
2363 kind
= gnu_v3_base_object_ctor
;
2366 kind
= gnu_v3_complete_object_allocating_ctor
;
2369 kind
= gnu_v3_unified_ctor
;
2372 kind
= gnu_v3_object_ctor_group
;
2381 cplus_demangle_type (di
);
2383 return d_make_ctor (di
, kind
, di
->last_name
);
2388 enum gnu_v3_dtor_kinds kind
;
2390 switch (d_peek_next_char (di
))
2393 kind
= gnu_v3_deleting_dtor
;
2396 kind
= gnu_v3_complete_object_dtor
;
2399 kind
= gnu_v3_base_object_dtor
;
2401 /* digit '3' is not used */
2403 kind
= gnu_v3_unified_dtor
;
2406 kind
= gnu_v3_object_dtor_group
;
2412 return d_make_dtor (di
, kind
, di
->last_name
);
2420 /* True iff we're looking at an order-insensitive type-qualifier, including
2421 function-type-qualifiers. */
2424 next_is_type_qual (struct d_info
*di
)
2426 char peek
= d_peek_char (di
);
2427 if (peek
== 'r' || peek
== 'V' || peek
== 'K')
2431 peek
= d_peek_next_char (di
);
2432 if (peek
== 'x' || peek
== 'o' || peek
== 'O' || peek
== 'w')
2438 /* <type> ::= <builtin-type>
2440 ::= <class-enum-type>
2442 ::= <pointer-to-member-type>
2443 ::= <template-param>
2444 ::= <template-template-param> <template-args>
2446 ::= <CV-qualifiers> <type>
2449 ::= O <type> (C++0x)
2452 ::= U <source-name> <type>
2454 <builtin-type> ::= various one letter codes
2458 CP_STATIC_IF_GLIBCPP_V3
2459 const struct demangle_builtin_type_info
2460 cplus_demangle_builtin_types
[D_BUILTIN_TYPE_COUNT
] =
2462 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT
},
2463 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL
},
2464 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT
},
2465 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT
},
2466 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT
},
2467 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT
},
2468 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT
},
2469 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT
},
2470 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT
},
2471 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED
},
2472 /* k */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2473 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG
},
2474 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG
},
2475 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT
},
2476 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2478 /* p */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2479 /* q */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2480 /* r */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2481 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT
},
2482 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT
},
2483 /* u */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2484 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID
},
2485 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT
},
2486 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG
},
2487 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2488 D_PRINT_UNSIGNED_LONG_LONG
},
2489 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT
},
2490 /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT
},
2491 /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT
},
2492 /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT
},
2493 /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT
},
2494 /* 30 */ { NL ("char8_t"), NL ("char8_t"), D_PRINT_DEFAULT
},
2495 /* 31 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT
},
2496 /* 32 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT
},
2497 /* 33 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"),
2499 /* 34 */ { NL ("_Float"), NL ("_Float"), D_PRINT_FLOAT
},
2500 /* 35 */ { NL ("std::bfloat16_t"), NL ("std::bfloat16_t"), D_PRINT_FLOAT
},
2503 CP_STATIC_IF_GLIBCPP_V3
2504 struct demangle_component
*
2505 cplus_demangle_type (struct d_info
*di
)
2508 struct demangle_component
*ret
;
2511 /* The ABI specifies that when CV-qualifiers are used, the base type
2512 is substitutable, and the fully qualified type is substitutable,
2513 but the base type with a strict subset of the CV-qualifiers is
2514 not substitutable. The natural recursive implementation of the
2515 CV-qualifiers would cause subsets to be substitutable, so instead
2516 we pull them all off now.
2518 FIXME: The ABI says that order-insensitive vendor qualifiers
2519 should be handled in the same way, but we have no way to tell
2520 which vendor qualifiers are order-insensitive and which are
2521 order-sensitive. So we just assume that they are all
2522 order-sensitive. g++ 3.4 supports only one vendor qualifier,
2523 __vector, and it treats it as order-sensitive when mangling
2526 if (next_is_type_qual (di
))
2528 struct demangle_component
**pret
;
2530 pret
= d_cv_qualifiers (di
, &ret
, 0);
2533 if (d_peek_char (di
) == 'F')
2535 /* cv-qualifiers before a function type apply to 'this',
2536 so avoid adding the unqualified function type to
2537 the substitution list. */
2538 *pret
= d_function_type (di
);
2541 *pret
= cplus_demangle_type (di
);
2544 if ((*pret
)->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
2545 || (*pret
)->type
== DEMANGLE_COMPONENT_REFERENCE_THIS
)
2547 /* Move the ref-qualifier outside the cv-qualifiers so that
2548 they are printed in the right order. */
2549 struct demangle_component
*fn
= d_left (*pret
);
2550 d_left (*pret
) = ret
;
2554 if (! d_add_substitution (di
, ret
))
2561 peek
= d_peek_char (di
);
2564 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2565 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
2566 case 'o': case 's': case 't':
2567 case 'v': case 'w': case 'x': case 'y': case 'z':
2568 ret
= d_make_builtin_type (di
,
2569 &cplus_demangle_builtin_types
[peek
- 'a']);
2570 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2577 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_VENDOR_TYPE
,
2578 d_source_name (di
), NULL
);
2582 ret
= d_function_type (di
);
2586 ret
= d_array_type (di
);
2590 ret
= d_pointer_to_member_type (di
);
2594 ret
= d_template_param (di
);
2595 if (d_peek_char (di
) == 'I')
2597 /* This may be <template-template-param> <template-args>.
2598 If this is the type for a conversion operator, we can
2599 have a <template-template-param> here only by following
2600 a derivation like this:
2603 -> <template-prefix> <template-args>
2604 -> <prefix> <template-unqualified-name> <template-args>
2605 -> <unqualified-name> <template-unqualified-name> <template-args>
2606 -> <source-name> <template-unqualified-name> <template-args>
2607 -> <source-name> <operator-name> <template-args>
2608 -> <source-name> cv <type> <template-args>
2609 -> <source-name> cv <template-template-param> <template-args> <template-args>
2611 where the <template-args> is followed by another.
2612 Otherwise, we must have a derivation like this:
2615 -> <template-prefix> <template-args>
2616 -> <prefix> <template-unqualified-name> <template-args>
2617 -> <unqualified-name> <template-unqualified-name> <template-args>
2618 -> <source-name> <template-unqualified-name> <template-args>
2619 -> <source-name> <operator-name> <template-args>
2620 -> <source-name> cv <type> <template-args>
2621 -> <source-name> cv <template-param> <template-args>
2623 where we need to leave the <template-args> to be processed
2624 by d_prefix (following the <template-prefix>).
2626 The <template-template-param> part is a substitution
2628 if (! di
->is_conversion
)
2630 if (! d_add_substitution (di
, ret
))
2632 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2633 d_template_args (di
));
2637 struct demangle_component
*args
;
2638 struct d_info_checkpoint checkpoint
;
2640 d_checkpoint (di
, &checkpoint
);
2641 args
= d_template_args (di
);
2642 if (d_peek_char (di
) == 'I')
2644 if (! d_add_substitution (di
, ret
))
2646 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2650 d_backtrack (di
, &checkpoint
);
2657 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_RVALUE_REFERENCE
,
2658 cplus_demangle_type (di
), NULL
);
2663 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_POINTER
,
2664 cplus_demangle_type (di
), NULL
);
2669 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_REFERENCE
,
2670 cplus_demangle_type (di
), NULL
);
2675 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_COMPLEX
,
2676 cplus_demangle_type (di
), NULL
);
2681 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_IMAGINARY
,
2682 cplus_demangle_type (di
), NULL
);
2687 ret
= d_source_name (di
);
2688 if (d_peek_char (di
) == 'I')
2689 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2690 d_template_args (di
));
2691 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
,
2692 cplus_demangle_type (di
), ret
);
2698 peek
= d_next_char (di
);
2703 /* decltype (expression) */
2704 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_DECLTYPE
,
2705 d_expression (di
), NULL
);
2706 if (ret
&& d_next_char (di
) != 'E')
2712 /* Pack expansion. */
2713 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_PACK_EXPANSION
,
2714 cplus_demangle_type (di
), NULL
);
2720 ret
= d_make_name (di
, "auto", 4);
2723 /* decltype(auto) */
2724 ret
= d_make_name (di
, "decltype(auto)", 14);
2728 /* 32-bit decimal floating point */
2729 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[26]);
2730 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2734 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[27]);
2735 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2739 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[28]);
2740 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2743 /* 16-bit half-precision FP */
2744 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[29]);
2745 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2749 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[30]);
2750 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2754 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[31]);
2755 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2759 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[32]);
2760 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2764 /* DF<number>_ - _Float<number>.
2765 DF<number>x - _Float<number>x
2766 DF16b - std::bfloat16_t. */
2768 int arg
= d_number (di
);
2771 if (d_peek_char (di
) == 'b')
2776 ret
= d_make_builtin_type (di
,
2777 &cplus_demangle_builtin_types
[35]);
2778 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2781 if (d_peek_char (di
) == 'x')
2783 if (!suffix
&& d_peek_char (di
) != '_')
2786 = d_make_extended_builtin_type (di
,
2787 &cplus_demangle_builtin_types
[34],
2790 sprintf (buf
, "%d", arg
);
2791 di
->expansion
+= ret
->u
.s_extended_builtin
.type
->len
2792 + strlen (buf
) + (suffix
!= 0);
2797 ret
= d_vector_type (di
);
2802 /* decltype(nullptr) */
2803 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[33]);
2804 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2813 return d_class_enum_type (di
, 1);
2818 if (! d_add_substitution (di
, ret
))
2825 /* <CV-qualifiers> ::= [r] [V] [K] [Dx] */
2827 static struct demangle_component
**
2828 d_cv_qualifiers (struct d_info
*di
,
2829 struct demangle_component
**pret
, int member_fn
)
2831 struct demangle_component
**pstart
;
2835 peek
= d_peek_char (di
);
2836 while (next_is_type_qual (di
))
2838 enum demangle_component_type t
;
2839 struct demangle_component
*right
= NULL
;
2845 ? DEMANGLE_COMPONENT_RESTRICT_THIS
2846 : DEMANGLE_COMPONENT_RESTRICT
);
2847 di
->expansion
+= sizeof "restrict";
2849 else if (peek
== 'V')
2852 ? DEMANGLE_COMPONENT_VOLATILE_THIS
2853 : DEMANGLE_COMPONENT_VOLATILE
);
2854 di
->expansion
+= sizeof "volatile";
2856 else if (peek
== 'K')
2859 ? DEMANGLE_COMPONENT_CONST_THIS
2860 : DEMANGLE_COMPONENT_CONST
);
2861 di
->expansion
+= sizeof "const";
2865 peek
= d_next_char (di
);
2868 t
= DEMANGLE_COMPONENT_TRANSACTION_SAFE
;
2869 di
->expansion
+= sizeof "transaction_safe";
2871 else if (peek
== 'o'
2874 t
= DEMANGLE_COMPONENT_NOEXCEPT
;
2875 di
->expansion
+= sizeof "noexcept";
2878 right
= d_expression (di
);
2881 if (! d_check_char (di
, 'E'))
2885 else if (peek
== 'w')
2887 t
= DEMANGLE_COMPONENT_THROW_SPEC
;
2888 di
->expansion
+= sizeof "throw";
2889 right
= d_parmlist (di
);
2892 if (! d_check_char (di
, 'E'))
2899 *pret
= d_make_comp (di
, t
, NULL
, right
);
2902 pret
= &d_left (*pret
);
2904 peek
= d_peek_char (di
);
2907 if (!member_fn
&& peek
== 'F')
2909 while (pstart
!= pret
)
2911 switch ((*pstart
)->type
)
2913 case DEMANGLE_COMPONENT_RESTRICT
:
2914 (*pstart
)->type
= DEMANGLE_COMPONENT_RESTRICT_THIS
;
2916 case DEMANGLE_COMPONENT_VOLATILE
:
2917 (*pstart
)->type
= DEMANGLE_COMPONENT_VOLATILE_THIS
;
2919 case DEMANGLE_COMPONENT_CONST
:
2920 (*pstart
)->type
= DEMANGLE_COMPONENT_CONST_THIS
;
2925 pstart
= &d_left (*pstart
);
2932 /* <ref-qualifier> ::= R
2935 static struct demangle_component
*
2936 d_ref_qualifier (struct d_info
*di
, struct demangle_component
*sub
)
2938 struct demangle_component
*ret
= sub
;
2941 peek
= d_peek_char (di
);
2942 if (peek
== 'R' || peek
== 'O')
2944 enum demangle_component_type t
;
2947 t
= DEMANGLE_COMPONENT_REFERENCE_THIS
;
2948 di
->expansion
+= sizeof "&";
2952 t
= DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
;
2953 di
->expansion
+= sizeof "&&";
2957 ret
= d_make_comp (di
, t
, ret
, NULL
);
2963 /* <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] [T] E */
2965 static struct demangle_component
*
2966 d_function_type (struct d_info
*di
)
2968 struct demangle_component
*ret
= NULL
;
2970 if ((di
->options
& DMGL_NO_RECURSE_LIMIT
) == 0)
2972 if (di
->recursion_level
> DEMANGLE_RECURSION_LIMIT
)
2973 /* FIXME: There ought to be a way to report
2974 that the recursion limit has been reached. */
2977 di
->recursion_level
++;
2980 if (d_check_char (di
, 'F'))
2982 if (d_peek_char (di
) == 'Y')
2984 /* Function has C linkage. We don't print this information.
2985 FIXME: We should print it in verbose mode. */
2988 ret
= d_bare_function_type (di
, 1);
2989 ret
= d_ref_qualifier (di
, ret
);
2991 if (! d_check_char (di
, 'E'))
2995 if ((di
->options
& DMGL_NO_RECURSE_LIMIT
) == 0)
2996 di
->recursion_level
--;
3002 static struct demangle_component
*
3003 d_parmlist (struct d_info
*di
)
3005 struct demangle_component
*tl
;
3006 struct demangle_component
**ptl
;
3012 struct demangle_component
*type
;
3014 char peek
= d_peek_char (di
);
3015 if (peek
== '\0' || peek
== 'E' || peek
== '.')
3017 if ((peek
== 'R' || peek
== 'O')
3018 && d_peek_next_char (di
) == 'E')
3019 /* Function ref-qualifier, not a ref prefix for a parameter type. */
3021 type
= cplus_demangle_type (di
);
3024 *ptl
= d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, type
, NULL
);
3027 ptl
= &d_right (*ptl
);
3030 /* There should be at least one parameter type besides the optional
3031 return type. A function which takes no arguments will have a
3032 single parameter type void. */
3036 /* If we have a single parameter type void, omit it. */
3037 if (d_right (tl
) == NULL
3038 && d_left (tl
)->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
3039 && d_left (tl
)->u
.s_builtin
.type
->print
== D_PRINT_VOID
)
3041 di
->expansion
-= d_left (tl
)->u
.s_builtin
.type
->len
;
3048 /* <bare-function-type> ::= [J]<type>+ */
3050 static struct demangle_component
*
3051 d_bare_function_type (struct d_info
*di
, int has_return_type
)
3053 struct demangle_component
*return_type
;
3054 struct demangle_component
*tl
;
3057 /* Detect special qualifier indicating that the first argument
3058 is the return type. */
3059 peek
= d_peek_char (di
);
3063 has_return_type
= 1;
3066 if (has_return_type
)
3068 return_type
= cplus_demangle_type (di
);
3069 if (return_type
== NULL
)
3075 tl
= d_parmlist (di
);
3079 return d_make_comp (di
, DEMANGLE_COMPONENT_FUNCTION_TYPE
,
3083 /* <class-enum-type> ::= <name> */
3085 static struct demangle_component
*
3086 d_class_enum_type (struct d_info
*di
, int substable
)
3088 return d_name (di
, substable
);
3091 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
3092 ::= A [<(dimension) expression>] _ <(element) type>
3095 static struct demangle_component
*
3096 d_array_type (struct d_info
*di
)
3099 struct demangle_component
*dim
;
3101 if (! d_check_char (di
, 'A'))
3104 peek
= d_peek_char (di
);
3107 else if (IS_DIGIT (peek
))
3115 peek
= d_peek_char (di
);
3117 while (IS_DIGIT (peek
));
3118 dim
= d_make_name (di
, s
, d_str (di
) - s
);
3124 dim
= d_expression (di
);
3129 if (! d_check_char (di
, '_'))
3132 return d_make_comp (di
, DEMANGLE_COMPONENT_ARRAY_TYPE
, dim
,
3133 cplus_demangle_type (di
));
3136 /* <vector-type> ::= Dv <number> _ <type>
3137 ::= Dv _ <expression> _ <type> */
3139 static struct demangle_component
*
3140 d_vector_type (struct d_info
*di
)
3143 struct demangle_component
*dim
;
3145 peek
= d_peek_char (di
);
3149 dim
= d_expression (di
);
3152 dim
= d_number_component (di
);
3157 if (! d_check_char (di
, '_'))
3160 return d_make_comp (di
, DEMANGLE_COMPONENT_VECTOR_TYPE
, dim
,
3161 cplus_demangle_type (di
));
3164 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
3166 static struct demangle_component
*
3167 d_pointer_to_member_type (struct d_info
*di
)
3169 struct demangle_component
*cl
;
3170 struct demangle_component
*mem
;
3172 if (! d_check_char (di
, 'M'))
3175 cl
= cplus_demangle_type (di
);
3179 /* The ABI says, "The type of a non-static member function is considered
3180 to be different, for the purposes of substitution, from the type of a
3181 namespace-scope or static member function whose type appears
3182 similar. The types of two non-static member functions are considered
3183 to be different, for the purposes of substitution, if the functions
3184 are members of different classes. In other words, for the purposes of
3185 substitution, the class of which the function is a member is
3186 considered part of the type of function."
3188 For a pointer to member function, this call to cplus_demangle_type
3189 will end up adding a (possibly qualified) non-member function type to
3190 the substitution table, which is not correct; however, the member
3191 function type will never be used in a substitution, so putting the
3192 wrong type in the substitution table is harmless. */
3194 mem
= cplus_demangle_type (di
);
3198 return d_make_comp (di
, DEMANGLE_COMPONENT_PTRMEM_TYPE
, cl
, mem
);
3201 /* <non-negative number> _ */
3204 d_compact_number (struct d_info
*di
)
3207 if (d_peek_char (di
) == '_')
3209 else if (d_peek_char (di
) == 'n')
3212 num
= d_number (di
) + 1;
3214 if (num
< 0 || ! d_check_char (di
, '_'))
3219 /* <template-param> ::= T_
3220 ::= T <(parameter-2 non-negative) number> _
3223 static struct demangle_component
*
3224 d_template_param (struct d_info
*di
)
3228 if (! d_check_char (di
, 'T'))
3231 param
= d_compact_number (di
);
3235 return d_make_template_param (di
, param
);
3238 /* <template-args> ::= I <template-arg>+ E */
3240 static struct demangle_component
*
3241 d_template_args (struct d_info
*di
)
3243 if (d_peek_char (di
) != 'I'
3244 && d_peek_char (di
) != 'J')
3248 return d_template_args_1 (di
);
3251 /* <template-arg>* E */
3253 static struct demangle_component
*
3254 d_template_args_1 (struct d_info
*di
)
3256 struct demangle_component
*hold_last_name
;
3257 struct demangle_component
*al
;
3258 struct demangle_component
**pal
;
3260 /* Preserve the last name we saw--don't let the template arguments
3261 clobber it, as that would give us the wrong name for a subsequent
3262 constructor or destructor. */
3263 hold_last_name
= di
->last_name
;
3265 if (d_peek_char (di
) == 'E')
3267 /* An argument pack can be empty. */
3269 return d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
, NULL
, NULL
);
3276 struct demangle_component
*a
;
3278 a
= d_template_arg (di
);
3282 *pal
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
, a
, NULL
);
3285 pal
= &d_right (*pal
);
3287 if (d_peek_char (di
) == 'E')
3294 di
->last_name
= hold_last_name
;
3299 /* <template-arg> ::= <type>
3300 ::= X <expression> E
3304 static struct demangle_component
*
3305 d_template_arg (struct d_info
*di
)
3307 struct demangle_component
*ret
;
3309 switch (d_peek_char (di
))
3313 ret
= d_expression (di
);
3314 if (! d_check_char (di
, 'E'))
3319 return d_expr_primary (di
);
3323 /* An argument pack. */
3324 return d_template_args (di
);
3327 return cplus_demangle_type (di
);
3331 /* Parse a sequence of expressions until we hit the terminator
3334 static struct demangle_component
*
3335 d_exprlist (struct d_info
*di
, char terminator
)
3337 struct demangle_component
*list
= NULL
;
3338 struct demangle_component
**p
= &list
;
3340 if (d_peek_char (di
) == terminator
)
3343 return d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, NULL
, NULL
);
3348 struct demangle_component
*arg
= d_expression (di
);
3352 *p
= d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, arg
, NULL
);
3357 if (d_peek_char (di
) == terminator
)
3367 /* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
3368 dynamic_cast, static_cast or reinterpret_cast. */
3371 op_is_new_cast (struct demangle_component
*op
)
3373 const char *code
= op
->u
.s_operator
.op
->code
;
3374 return (code
[1] == 'c'
3375 && (code
[0] == 's' || code
[0] == 'd'
3376 || code
[0] == 'c' || code
[0] == 'r'));
3379 /* <unresolved-name> ::= [gs] <base-unresolved-name> # x or (with "gs") ::x
3380 ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x
3381 # T::N::x /decltype(p)::N::x
3382 ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name>
3383 # A::x, N::y, A<T>::z; "gs" means leading "::"
3384 ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name>
3386 "gs" is handled elsewhere, as a unary operator. */
3388 static struct demangle_component
*
3389 d_unresolved_name (struct d_info
*di
)
3391 struct demangle_component
*type
;
3392 struct demangle_component
*name
;
3395 /* Consume the "sr". */
3398 peek
= d_peek_char (di
);
3399 if (di
->unresolved_name_state
3406 /* The third production is ambiguous with the old unresolved-name syntax
3407 of <type> <base-unresolved-name>; in the old mangling, A::x was mangled
3408 as sr1A1x, now sr1AE1x. So we first try to demangle using the new
3409 mangling, then with the old if that fails. */
3410 di
->unresolved_name_state
= -1;
3411 type
= d_prefix (di
, 0);
3412 if (d_peek_char (di
) == 'E')
3416 type
= cplus_demangle_type (di
);
3417 name
= d_unqualified_name (di
, type
, NULL
);
3418 if (d_peek_char (di
) == 'I')
3419 name
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, name
,
3420 d_template_args (di
));
3424 /* <expression> ::= <(unary) operator-name> <expression>
3425 ::= <(binary) operator-name> <expression> <expression>
3426 ::= <(trinary) operator-name> <expression> <expression> <expression>
3427 ::= cl <expression>+ E
3429 ::= <template-param>
3430 ::= u <source-name> <template-arg>* E # vendor extended expression
3431 ::= <unresolved-name>
3434 <braced-expression> ::= <expression>
3435 ::= di <field source-name> <braced-expression> # .name = expr
3436 ::= dx <index expression> <braced-expression> # [expr] = expr
3437 ::= dX <range begin expression> <range end expression> <braced-expression>
3438 # [expr ... expr] = expr
3441 static struct demangle_component
*
3442 d_expression_1 (struct d_info
*di
)
3446 peek
= d_peek_char (di
);
3448 return d_expr_primary (di
);
3449 else if (peek
== 'T')
3450 return d_template_param (di
);
3451 else if (peek
== 's' && d_peek_next_char (di
) == 'r')
3452 return d_unresolved_name (di
);
3453 else if (peek
== 's' && d_peek_next_char (di
) == 'p')
3456 return d_make_comp (di
, DEMANGLE_COMPONENT_PACK_EXPANSION
,
3457 d_expression_1 (di
), NULL
);
3459 else if (peek
== 'f' && d_peek_next_char (di
) == 'p')
3461 /* Function parameter used in a late-specified return type. */
3464 if (d_peek_char (di
) == 'T')
3466 /* 'this' parameter. */
3472 index
= d_compact_number (di
);
3473 if (index
== INT_MAX
|| index
== -1)
3477 return d_make_function_param (di
, index
);
3479 else if (IS_DIGIT (peek
)
3480 || (peek
== 'o' && d_peek_next_char (di
) == 'n'))
3482 /* We can get an unqualified name as an expression in the case of
3483 a dependent function call, i.e. decltype(f(t)). */
3484 struct demangle_component
*name
;
3487 /* operator-function-id, i.e. operator+(t). */
3490 name
= d_unqualified_name (di
, NULL
, NULL
);
3493 if (d_peek_char (di
) == 'I')
3494 return d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, name
,
3495 d_template_args (di
));
3499 else if ((peek
== 'i' || peek
== 't')
3500 && d_peek_next_char (di
) == 'l')
3502 /* Brace-enclosed initializer list, untyped or typed. */
3503 struct demangle_component
*type
= NULL
;
3506 type
= cplus_demangle_type (di
);
3507 if (!d_peek_char (di
) || !d_peek_next_char (di
))
3509 return d_make_comp (di
, DEMANGLE_COMPONENT_INITIALIZER_LIST
,
3510 type
, d_exprlist (di
, 'E'));
3512 else if (peek
== 'u')
3514 /* A vendor extended expression. */
3515 struct demangle_component
*name
, *args
;
3517 name
= d_source_name (di
);
3518 args
= d_template_args_1 (di
);
3519 return d_make_comp (di
, DEMANGLE_COMPONENT_VENDOR_EXPR
, name
, args
);
3523 struct demangle_component
*op
;
3524 const char *code
= NULL
;
3527 op
= d_operator_name (di
);
3531 if (op
->type
== DEMANGLE_COMPONENT_OPERATOR
)
3533 code
= op
->u
.s_operator
.op
->code
;
3534 di
->expansion
+= op
->u
.s_operator
.op
->len
- 2;
3535 if (strcmp (code
, "st") == 0)
3536 return d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, op
,
3537 cplus_demangle_type (di
));
3544 case DEMANGLE_COMPONENT_OPERATOR
:
3545 args
= op
->u
.s_operator
.op
->args
;
3547 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
3548 args
= op
->u
.s_extended_operator
.args
;
3550 case DEMANGLE_COMPONENT_CAST
:
3558 return d_make_comp (di
, DEMANGLE_COMPONENT_NULLARY
, op
, NULL
);
3562 struct demangle_component
*operand
;
3565 if (code
&& (code
[0] == 'p' || code
[0] == 'm')
3566 && code
[1] == code
[0])
3567 /* pp_ and mm_ are the prefix variants. */
3568 suffix
= !d_check_char (di
, '_');
3570 if (op
->type
== DEMANGLE_COMPONENT_CAST
3571 && d_check_char (di
, '_'))
3572 operand
= d_exprlist (di
, 'E');
3573 else if (code
&& !strcmp (code
, "sP"))
3574 operand
= d_template_args_1 (di
);
3576 operand
= d_expression_1 (di
);
3579 /* Indicate the suffix variant for d_print_comp. */
3580 operand
= d_make_comp (di
, DEMANGLE_COMPONENT_BINARY_ARGS
,
3583 return d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, op
, operand
);
3587 struct demangle_component
*left
;
3588 struct demangle_component
*right
;
3592 if (op_is_new_cast (op
))
3593 left
= cplus_demangle_type (di
);
3594 else if (code
[0] == 'f')
3595 /* fold-expression. */
3596 left
= d_operator_name (di
);
3597 else if (!strcmp (code
, "di"))
3598 left
= d_unqualified_name (di
, NULL
, NULL
);
3600 left
= d_expression_1 (di
);
3601 if (!strcmp (code
, "cl"))
3602 right
= d_exprlist (di
, 'E');
3603 else if (!strcmp (code
, "dt") || !strcmp (code
, "pt"))
3605 peek
= d_peek_char (di
);
3606 /* These codes start a qualified name. */
3607 if ((peek
== 'g' && d_peek_next_char (di
) == 's')
3608 || (peek
== 's' && d_peek_next_char (di
) == 'r'))
3609 right
= d_expression_1 (di
);
3612 /* Otherwise it's an unqualified name. We use
3613 d_unqualified_name rather than d_expression_1 here for
3614 old mangled names that didn't add 'on' before operator
3616 right
= d_unqualified_name (di
, NULL
, NULL
);
3617 if (d_peek_char (di
) == 'I')
3618 right
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
,
3619 right
, d_template_args (di
));
3623 right
= d_expression_1 (di
);
3625 return d_make_comp (di
, DEMANGLE_COMPONENT_BINARY
, op
,
3627 DEMANGLE_COMPONENT_BINARY_ARGS
,
3632 struct demangle_component
*first
;
3633 struct demangle_component
*second
;
3634 struct demangle_component
*third
;
3638 else if (!strcmp (code
, "qu")
3639 || !strcmp (code
, "dX"))
3641 /* ?: expression. */
3642 first
= d_expression_1 (di
);
3643 second
= d_expression_1 (di
);
3644 third
= d_expression_1 (di
);
3648 else if (code
[0] == 'f')
3650 /* fold-expression. */
3651 first
= d_operator_name (di
);
3652 second
= d_expression_1 (di
);
3653 third
= d_expression_1 (di
);
3657 else if (code
[0] == 'n')
3659 /* new-expression. */
3660 if (code
[1] != 'w' && code
[1] != 'a')
3662 first
= d_exprlist (di
, '_');
3663 second
= cplus_demangle_type (di
);
3664 if (d_peek_char (di
) == 'E')
3669 else if (d_peek_char (di
) == 'p'
3670 && d_peek_next_char (di
) == 'i')
3672 /* Parenthesized initializer. */
3674 third
= d_exprlist (di
, 'E');
3676 else if (d_peek_char (di
) == 'i'
3677 && d_peek_next_char (di
) == 'l')
3678 /* initializer-list. */
3679 third
= d_expression_1 (di
);
3685 return d_make_comp (di
, DEMANGLE_COMPONENT_TRINARY
, op
,
3687 DEMANGLE_COMPONENT_TRINARY_ARG1
,
3690 DEMANGLE_COMPONENT_TRINARY_ARG2
,
3699 static struct demangle_component
*
3700 d_expression (struct d_info
*di
)
3702 struct demangle_component
*ret
;
3703 int was_expression
= di
->is_expression
;
3705 di
->is_expression
= 1;
3706 ret
= d_expression_1 (di
);
3707 di
->is_expression
= was_expression
;
3711 /* <expr-primary> ::= L <type> <(value) number> E
3712 ::= L <type> <(value) float> E
3713 ::= L <mangled-name> E
3716 static struct demangle_component
*
3717 d_expr_primary (struct d_info
*di
)
3719 struct demangle_component
*ret
;
3721 if (! d_check_char (di
, 'L'))
3723 if (d_peek_char (di
) == '_'
3724 /* Workaround for G++ bug; see comment in write_template_arg. */
3725 || d_peek_char (di
) == 'Z')
3726 ret
= cplus_demangle_mangled_name (di
, 0);
3729 struct demangle_component
*type
;
3730 enum demangle_component_type t
;
3733 type
= cplus_demangle_type (di
);
3737 /* If we have a type we know how to print, we aren't going to
3738 print the type name itself. */
3739 if (type
->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
3740 && type
->u
.s_builtin
.type
->print
!= D_PRINT_DEFAULT
)
3741 di
->expansion
-= type
->u
.s_builtin
.type
->len
;
3743 if (type
->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
3744 && strcmp (type
->u
.s_builtin
.type
->name
,
3745 cplus_demangle_builtin_types
[33].name
) == 0)
3747 if (d_peek_char (di
) == 'E')
3754 /* Rather than try to interpret the literal value, we just
3755 collect it as a string. Note that it's possible to have a
3756 floating point literal here. The ABI specifies that the
3757 format of such literals is machine independent. That's fine,
3758 but what's not fine is that versions of g++ up to 3.2 with
3759 -fabi-version=1 used upper case letters in the hex constant,
3760 and dumped out gcc's internal representation. That makes it
3761 hard to tell where the constant ends, and hard to dump the
3762 constant in any readable form anyhow. We don't attempt to
3763 handle these cases. */
3765 t
= DEMANGLE_COMPONENT_LITERAL
;
3766 if (d_peek_char (di
) == 'n')
3768 t
= DEMANGLE_COMPONENT_LITERAL_NEG
;
3772 while (d_peek_char (di
) != 'E')
3774 if (d_peek_char (di
) == '\0')
3778 ret
= d_make_comp (di
, t
, type
, d_make_name (di
, s
, d_str (di
) - s
));
3780 if (! d_check_char (di
, 'E'))
3785 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3786 ::= Z <(function) encoding> E s [<discriminator>]
3787 ::= Z <(function) encoding> E d [<parameter> number>] _ <entity name>
3790 static struct demangle_component
*
3791 d_local_name (struct d_info
*di
)
3793 struct demangle_component
*function
;
3794 struct demangle_component
*name
;
3796 if (! d_check_char (di
, 'Z'))
3799 function
= d_encoding (di
, 0);
3803 if (! d_check_char (di
, 'E'))
3806 if (d_peek_char (di
) == 's')
3809 if (! d_discriminator (di
))
3811 name
= d_make_name (di
, "string literal", sizeof "string literal" - 1);
3817 if (d_peek_char (di
) == 'd')
3819 /* Default argument scope: d <number> _. */
3821 num
= d_compact_number (di
);
3826 name
= d_name (di
, 0);
3829 /* Lambdas and unnamed types have internal discriminators
3830 and are not functions. */
3831 && name
->type
!= DEMANGLE_COMPONENT_LAMBDA
3832 && name
->type
!= DEMANGLE_COMPONENT_UNNAMED_TYPE
)
3834 /* Read and ignore an optional discriminator. */
3835 if (! d_discriminator (di
))
3840 name
= d_make_default_arg (di
, num
, name
);
3843 /* Elide the return type of the containing function so as to not
3844 confuse the user thinking it is the return type of whatever local
3845 function we might be containing. */
3846 if (function
->type
== DEMANGLE_COMPONENT_TYPED_NAME
3847 && d_right (function
)->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
3848 d_left (d_right (function
)) = NULL
;
3850 return d_make_comp (di
, DEMANGLE_COMPONENT_LOCAL_NAME
, function
, name
);
3853 /* <discriminator> ::= _ <number> # when number < 10
3854 ::= __ <number> _ # when number >= 10
3856 <discriminator> ::= _ <number> # when number >=10
3857 is also accepted to support gcc versions that wrongly mangled that way.
3859 We demangle the discriminator, but we don't print it out. FIXME:
3860 We should print it out in verbose mode. */
3863 d_discriminator (struct d_info
*di
)
3865 int discrim
, num_underscores
= 1;
3867 if (d_peek_char (di
) != '_')
3870 if (d_peek_char (di
) == '_')
3876 discrim
= d_number (di
);
3879 if (num_underscores
> 1 && discrim
>= 10)
3881 if (d_peek_char (di
) == '_')
3890 /* <template-parm> ::= Ty
3892 ::= Tt <template-head> E
3893 ::= Tp <template-parm> */
3895 static struct demangle_component
*
3896 d_template_parm (struct d_info
*di
, int *bad
)
3898 if (d_peek_char (di
) != 'T')
3901 struct demangle_component
*op
;
3902 enum demangle_component_type kind
;
3903 switch (d_peek_next_char (di
))
3908 case 'p': /* Pack */
3910 op
= d_template_parm (di
, bad
);
3911 kind
= DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM
;
3919 case 'y': /* Typename */
3922 kind
= DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM
;
3925 case 'n': /* Non-Type */
3927 op
= cplus_demangle_type (di
);
3928 kind
= DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM
;
3936 case 't': /* Template */
3938 op
= d_template_head (di
, bad
);
3939 kind
= DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM
;
3940 if (!op
|| !d_check_char (di
, 'E'))
3947 return d_make_comp (di
, kind
, op
, NULL
);
3950 /* <template-head> ::= <template-head>? <template-parm> */
3952 static struct demangle_component
*
3953 d_template_head (struct d_info
*di
, int *bad
)
3955 struct demangle_component
*res
= NULL
, **slot
= &res
;
3956 struct demangle_component
*op
;
3958 while ((op
= d_template_parm (di
, bad
)))
3961 slot
= &d_right (op
);
3964 /* Wrap it in a template head, to make concatenating with any parm list, and
3965 printing simpler. */
3967 res
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE_HEAD
, res
, NULL
);
3972 /* <closure-type-name> ::= Ul <template-head>? <lambda-sig> E [ <nonnegative number> ] _ */
3974 static struct demangle_component
*
3975 d_lambda (struct d_info
*di
)
3977 if (! d_check_char (di
, 'U'))
3979 if (! d_check_char (di
, 'l'))
3983 struct demangle_component
*head
= d_template_head (di
, &bad
);
3987 struct demangle_component
*tl
= d_parmlist (di
);
3992 d_right (head
) = tl
;
3996 if (! d_check_char (di
, 'E'))
3999 int num
= d_compact_number (di
);
4003 struct demangle_component
*ret
= d_make_empty (di
);
4006 ret
->type
= DEMANGLE_COMPONENT_LAMBDA
;
4007 ret
->u
.s_unary_num
.sub
= tl
;
4008 ret
->u
.s_unary_num
.num
= num
;
4014 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
4016 static struct demangle_component
*
4017 d_unnamed_type (struct d_info
*di
)
4019 struct demangle_component
*ret
;
4022 if (! d_check_char (di
, 'U'))
4024 if (! d_check_char (di
, 't'))
4027 num
= d_compact_number (di
);
4031 ret
= d_make_empty (di
);
4034 ret
->type
= DEMANGLE_COMPONENT_UNNAMED_TYPE
;
4035 ret
->u
.s_number
.number
= num
;
4038 if (! d_add_substitution (di
, ret
))
4044 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
4047 static struct demangle_component
*
4048 d_clone_suffix (struct d_info
*di
, struct demangle_component
*encoding
)
4050 const char *suffix
= d_str (di
);
4051 const char *pend
= suffix
;
4052 struct demangle_component
*n
;
4054 if (*pend
== '.' && (IS_LOWER (pend
[1]) || IS_DIGIT (pend
[1])
4058 while (IS_LOWER (*pend
) || IS_DIGIT (*pend
) || *pend
== '_')
4061 while (*pend
== '.' && IS_DIGIT (pend
[1]))
4064 while (IS_DIGIT (*pend
))
4067 d_advance (di
, pend
- suffix
);
4068 n
= d_make_name (di
, suffix
, pend
- suffix
);
4069 return d_make_comp (di
, DEMANGLE_COMPONENT_CLONE
, encoding
, n
);
4072 /* Add a new substitution. */
4075 d_add_substitution (struct d_info
*di
, struct demangle_component
*dc
)
4079 if (di
->next_sub
>= di
->num_subs
)
4081 di
->subs
[di
->next_sub
] = dc
;
4086 /* <substitution> ::= S <seq-id> _
4096 If PREFIX is non-zero, then this type is being used as a prefix in
4097 a qualified name. In this case, for the standard substitutions, we
4098 need to check whether we are being used as a prefix for a
4099 constructor or destructor, and return a full template name.
4100 Otherwise we will get something like std::iostream::~iostream()
4101 which does not correspond particularly well to any function which
4102 actually appears in the source.
4105 static const struct d_standard_sub_info standard_subs
[] =
4110 { 'a', NL ("std::allocator"),
4111 NL ("std::allocator"),
4113 { 'b', NL ("std::basic_string"),
4114 NL ("std::basic_string"),
4115 NL ("basic_string") },
4116 { 's', NL ("std::string"),
4117 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
4118 NL ("basic_string") },
4119 { 'i', NL ("std::istream"),
4120 NL ("std::basic_istream<char, std::char_traits<char> >"),
4121 NL ("basic_istream") },
4122 { 'o', NL ("std::ostream"),
4123 NL ("std::basic_ostream<char, std::char_traits<char> >"),
4124 NL ("basic_ostream") },
4125 { 'd', NL ("std::iostream"),
4126 NL ("std::basic_iostream<char, std::char_traits<char> >"),
4127 NL ("basic_iostream") }
4130 static struct demangle_component
*
4131 d_substitution (struct d_info
*di
, int prefix
)
4135 if (! d_check_char (di
, 'S'))
4138 c
= d_next_char (di
);
4139 if (c
== '_' || IS_DIGIT (c
) || IS_UPPER (c
))
4148 unsigned int new_id
;
4151 new_id
= id
* 36 + c
- '0';
4152 else if (IS_UPPER (c
))
4153 new_id
= id
* 36 + c
- 'A' + 10;
4159 c
= d_next_char (di
);
4166 if (id
>= (unsigned int) di
->next_sub
)
4169 return di
->subs
[id
];
4174 const struct d_standard_sub_info
*p
;
4175 const struct d_standard_sub_info
*pend
;
4177 verbose
= (di
->options
& DMGL_VERBOSE
) != 0;
4178 if (! verbose
&& prefix
)
4182 peek
= d_peek_char (di
);
4183 if (peek
== 'C' || peek
== 'D')
4187 pend
= (&standard_subs
[0]
4188 + sizeof standard_subs
/ sizeof standard_subs
[0]);
4189 for (p
= &standard_subs
[0]; p
< pend
; ++p
)
4195 struct demangle_component
*dc
;
4197 if (p
->set_last_name
!= NULL
)
4198 di
->last_name
= d_make_sub (di
, p
->set_last_name
,
4199 p
->set_last_name_len
);
4202 s
= p
->full_expansion
;
4207 s
= p
->simple_expansion
;
4208 len
= p
->simple_len
;
4210 di
->expansion
+= len
;
4211 dc
= d_make_sub (di
, s
, len
);
4212 if (d_peek_char (di
) == 'B')
4214 /* If there are ABI tags on the abbreviation, it becomes
4215 a substitution candidate. */
4216 dc
= d_abi_tags (di
, dc
);
4217 if (! d_add_substitution (di
, dc
))
4229 d_checkpoint (struct d_info
*di
, struct d_info_checkpoint
*checkpoint
)
4231 checkpoint
->n
= di
->n
;
4232 checkpoint
->next_comp
= di
->next_comp
;
4233 checkpoint
->next_sub
= di
->next_sub
;
4234 checkpoint
->expansion
= di
->expansion
;
4238 d_backtrack (struct d_info
*di
, struct d_info_checkpoint
*checkpoint
)
4240 di
->n
= checkpoint
->n
;
4241 di
->next_comp
= checkpoint
->next_comp
;
4242 di
->next_sub
= checkpoint
->next_sub
;
4243 di
->expansion
= checkpoint
->expansion
;
4246 /* Initialize a growable string. */
4249 d_growable_string_init (struct d_growable_string
*dgs
, size_t estimate
)
4254 dgs
->allocation_failure
= 0;
4257 d_growable_string_resize (dgs
, estimate
);
4260 /* Grow a growable string to a given size. */
4263 d_growable_string_resize (struct d_growable_string
*dgs
, size_t need
)
4268 if (dgs
->allocation_failure
)
4271 /* Start allocation at two bytes to avoid any possibility of confusion
4272 with the special value of 1 used as a return in *palc to indicate
4273 allocation failures. */
4274 newalc
= dgs
->alc
> 0 ? dgs
->alc
: 2;
4275 while (newalc
< need
)
4278 newbuf
= (char *) realloc (dgs
->buf
, newalc
);
4285 dgs
->allocation_failure
= 1;
4292 /* Append a buffer to a growable string. */
4295 d_growable_string_append_buffer (struct d_growable_string
*dgs
,
4296 const char *s
, size_t l
)
4300 need
= dgs
->len
+ l
+ 1;
4301 if (need
> dgs
->alc
)
4302 d_growable_string_resize (dgs
, need
);
4304 if (dgs
->allocation_failure
)
4307 memcpy (dgs
->buf
+ dgs
->len
, s
, l
);
4308 dgs
->buf
[dgs
->len
+ l
] = '\0';
4312 /* Bridge growable strings to the callback mechanism. */
4315 d_growable_string_callback_adapter (const char *s
, size_t l
, void *opaque
)
4317 struct d_growable_string
*dgs
= (struct d_growable_string
*) opaque
;
4319 d_growable_string_append_buffer (dgs
, s
, l
);
4322 /* Walk the tree, counting the number of templates encountered, and
4323 the number of times a scope might be saved. These counts will be
4324 used to allocate data structures for d_print_comp, so the logic
4325 here must mirror the logic d_print_comp will use. It is not
4326 important that the resulting numbers are exact, so long as they
4327 are larger than the actual numbers encountered. */
4330 d_count_templates_scopes (struct d_print_info
*dpi
,
4331 struct demangle_component
*dc
)
4333 if (dc
== NULL
|| dc
->d_counting
> 1 || dpi
->recursion
> MAX_RECURSION_COUNT
)
4340 case DEMANGLE_COMPONENT_NAME
:
4341 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
4342 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
4343 case DEMANGLE_COMPONENT_SUB_STD
:
4344 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
4345 case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE
:
4346 case DEMANGLE_COMPONENT_OPERATOR
:
4347 case DEMANGLE_COMPONENT_CHARACTER
:
4348 case DEMANGLE_COMPONENT_NUMBER
:
4349 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
4350 case DEMANGLE_COMPONENT_STRUCTURED_BINDING
:
4351 case DEMANGLE_COMPONENT_MODULE_NAME
:
4352 case DEMANGLE_COMPONENT_MODULE_PARTITION
:
4353 case DEMANGLE_COMPONENT_MODULE_INIT
:
4354 case DEMANGLE_COMPONENT_FIXED_TYPE
:
4355 case DEMANGLE_COMPONENT_TEMPLATE_HEAD
:
4356 case DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM
:
4357 case DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM
:
4358 case DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM
:
4359 case DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM
:
4362 case DEMANGLE_COMPONENT_TEMPLATE
:
4363 dpi
->num_copy_templates
++;
4364 goto recurse_left_right
;
4366 case DEMANGLE_COMPONENT_REFERENCE
:
4367 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
4368 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_TEMPLATE_PARAM
)
4369 dpi
->num_saved_scopes
++;
4370 goto recurse_left_right
;
4372 case DEMANGLE_COMPONENT_QUAL_NAME
:
4373 case DEMANGLE_COMPONENT_LOCAL_NAME
:
4374 case DEMANGLE_COMPONENT_TYPED_NAME
:
4375 case DEMANGLE_COMPONENT_VTABLE
:
4376 case DEMANGLE_COMPONENT_VTT
:
4377 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
4378 case DEMANGLE_COMPONENT_TYPEINFO
:
4379 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
4380 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
4381 case DEMANGLE_COMPONENT_THUNK
:
4382 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
4383 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
4384 case DEMANGLE_COMPONENT_JAVA_CLASS
:
4385 case DEMANGLE_COMPONENT_GUARD
:
4386 case DEMANGLE_COMPONENT_TLS_INIT
:
4387 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
4388 case DEMANGLE_COMPONENT_REFTEMP
:
4389 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
4390 case DEMANGLE_COMPONENT_RESTRICT
:
4391 case DEMANGLE_COMPONENT_VOLATILE
:
4392 case DEMANGLE_COMPONENT_CONST
:
4393 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
4394 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
4395 case DEMANGLE_COMPONENT_CONST_THIS
:
4396 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
4397 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
4398 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
4399 case DEMANGLE_COMPONENT_NOEXCEPT
:
4400 case DEMANGLE_COMPONENT_THROW_SPEC
:
4401 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
4402 case DEMANGLE_COMPONENT_POINTER
:
4403 case DEMANGLE_COMPONENT_COMPLEX
:
4404 case DEMANGLE_COMPONENT_IMAGINARY
:
4405 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
4406 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
4407 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
4408 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
4409 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
4410 case DEMANGLE_COMPONENT_ARGLIST
:
4411 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
4412 case DEMANGLE_COMPONENT_TPARM_OBJ
:
4413 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
4414 case DEMANGLE_COMPONENT_CAST
:
4415 case DEMANGLE_COMPONENT_CONVERSION
:
4416 case DEMANGLE_COMPONENT_NULLARY
:
4417 case DEMANGLE_COMPONENT_UNARY
:
4418 case DEMANGLE_COMPONENT_BINARY
:
4419 case DEMANGLE_COMPONENT_BINARY_ARGS
:
4420 case DEMANGLE_COMPONENT_TRINARY
:
4421 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
4422 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
4423 case DEMANGLE_COMPONENT_LITERAL
:
4424 case DEMANGLE_COMPONENT_LITERAL_NEG
:
4425 case DEMANGLE_COMPONENT_VENDOR_EXPR
:
4426 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
4427 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
4428 case DEMANGLE_COMPONENT_DECLTYPE
:
4429 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
4430 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
4431 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
4432 case DEMANGLE_COMPONENT_TAGGED_NAME
:
4433 case DEMANGLE_COMPONENT_CLONE
:
4435 /* PR 89394 - Check for too much recursion. */
4436 if (dpi
->recursion
> DEMANGLE_RECURSION_LIMIT
)
4437 /* FIXME: There ought to be a way to report to the
4438 user that the recursion limit has been reached. */
4442 d_count_templates_scopes (dpi
, d_left (dc
));
4443 d_count_templates_scopes (dpi
, d_right (dc
));
4447 case DEMANGLE_COMPONENT_CTOR
:
4448 d_count_templates_scopes (dpi
, dc
->u
.s_ctor
.name
);
4451 case DEMANGLE_COMPONENT_DTOR
:
4452 d_count_templates_scopes (dpi
, dc
->u
.s_dtor
.name
);
4455 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
4456 d_count_templates_scopes (dpi
, dc
->u
.s_extended_operator
.name
);
4459 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
4460 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
4461 case DEMANGLE_COMPONENT_MODULE_ENTITY
:
4462 d_count_templates_scopes (dpi
, d_left (dc
));
4465 case DEMANGLE_COMPONENT_LAMBDA
:
4466 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
4467 d_count_templates_scopes (dpi
, dc
->u
.s_unary_num
.sub
);
4472 /* Initialize a print information structure. */
4475 d_print_init (struct d_print_info
*dpi
, demangle_callbackref callback
,
4476 void *opaque
, struct demangle_component
*dc
)
4479 dpi
->last_char
= '\0';
4480 dpi
->templates
= NULL
;
4481 dpi
->modifiers
= NULL
;
4482 dpi
->pack_index
= 0;
4483 dpi
->flush_count
= 0;
4485 dpi
->callback
= callback
;
4486 dpi
->opaque
= opaque
;
4488 dpi
->demangle_failure
= 0;
4490 dpi
->lambda_tpl_parms
= 0;
4492 dpi
->component_stack
= NULL
;
4494 dpi
->saved_scopes
= NULL
;
4495 dpi
->next_saved_scope
= 0;
4496 dpi
->num_saved_scopes
= 0;
4498 dpi
->copy_templates
= NULL
;
4499 dpi
->next_copy_template
= 0;
4500 dpi
->num_copy_templates
= 0;
4502 d_count_templates_scopes (dpi
, dc
);
4503 /* If we did not reach the recursion limit, then reset the
4504 current recursion value back to 0, so that we can print
4506 if (dpi
->recursion
< DEMANGLE_RECURSION_LIMIT
)
4508 dpi
->num_copy_templates
*= dpi
->num_saved_scopes
;
4510 dpi
->current_template
= NULL
;
4513 /* Indicate that an error occurred during printing, and test for error. */
4516 d_print_error (struct d_print_info
*dpi
)
4518 dpi
->demangle_failure
= 1;
4522 d_print_saw_error (struct d_print_info
*dpi
)
4524 return dpi
->demangle_failure
!= 0;
4527 /* Flush buffered characters to the callback. */
4530 d_print_flush (struct d_print_info
*dpi
)
4532 dpi
->buf
[dpi
->len
] = '\0';
4533 dpi
->callback (dpi
->buf
, dpi
->len
, dpi
->opaque
);
4538 /* Append characters and buffers for printing. */
4541 d_append_char (struct d_print_info
*dpi
, char c
)
4543 if (dpi
->len
== sizeof (dpi
->buf
) - 1)
4544 d_print_flush (dpi
);
4546 dpi
->buf
[dpi
->len
++] = c
;
4551 d_append_buffer (struct d_print_info
*dpi
, const char *s
, size_t l
)
4555 for (i
= 0; i
< l
; i
++)
4556 d_append_char (dpi
, s
[i
]);
4560 d_append_string (struct d_print_info
*dpi
, const char *s
)
4562 d_append_buffer (dpi
, s
, strlen (s
));
4566 d_append_num (struct d_print_info
*dpi
, int l
)
4569 sprintf (buf
,"%d", l
);
4570 d_append_string (dpi
, buf
);
4574 d_last_char (struct d_print_info
*dpi
)
4576 return dpi
->last_char
;
4579 /* Turn components into a human readable string. OPTIONS is the
4580 options bits passed to the demangler. DC is the tree to print.
4581 CALLBACK is a function to call to flush demangled string segments
4582 as they fill the intermediate buffer, and OPAQUE is a generalized
4583 callback argument. On success, this returns 1. On failure,
4584 it returns 0, indicating a bad parse. It does not use heap
4585 memory to build an output string, so cannot encounter memory
4586 allocation failure. */
4588 CP_STATIC_IF_GLIBCPP_V3
4590 cplus_demangle_print_callback (int options
,
4591 struct demangle_component
*dc
,
4592 demangle_callbackref callback
, void *opaque
)
4594 struct d_print_info dpi
;
4596 d_print_init (&dpi
, callback
, opaque
, dc
);
4599 #ifdef CP_DYNAMIC_ARRAYS
4600 /* Avoid zero-length VLAs, which are prohibited by the C99 standard
4601 and flagged as errors by Address Sanitizer. */
4602 __extension__
struct d_saved_scope scopes
[(dpi
.num_saved_scopes
> 0)
4603 ? dpi
.num_saved_scopes
: 1];
4604 __extension__
struct d_print_template temps
[(dpi
.num_copy_templates
> 0)
4605 ? dpi
.num_copy_templates
: 1];
4607 dpi
.saved_scopes
= scopes
;
4608 dpi
.copy_templates
= temps
;
4610 dpi
.saved_scopes
= alloca (dpi
.num_saved_scopes
4611 * sizeof (*dpi
.saved_scopes
));
4612 dpi
.copy_templates
= alloca (dpi
.num_copy_templates
4613 * sizeof (*dpi
.copy_templates
));
4616 d_print_comp (&dpi
, options
, dc
);
4619 d_print_flush (&dpi
);
4621 return ! d_print_saw_error (&dpi
);
4624 /* Turn components into a human readable string. OPTIONS is the
4625 options bits passed to the demangler. DC is the tree to print.
4626 ESTIMATE is a guess at the length of the result. This returns a
4627 string allocated by malloc, or NULL on error. On success, this
4628 sets *PALC to the size of the allocated buffer. On failure, this
4629 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
4632 CP_STATIC_IF_GLIBCPP_V3
4634 cplus_demangle_print (int options
, struct demangle_component
*dc
,
4635 int estimate
, size_t *palc
)
4637 struct d_growable_string dgs
;
4639 d_growable_string_init (&dgs
, estimate
);
4641 if (! cplus_demangle_print_callback (options
, dc
,
4642 d_growable_string_callback_adapter
,
4650 *palc
= dgs
.allocation_failure
? 1 : dgs
.alc
;
4654 /* Returns the I'th element of the template arglist ARGS, or NULL on
4655 failure. If I is negative, return the entire arglist. */
4657 static struct demangle_component
*
4658 d_index_template_argument (struct demangle_component
*args
, int i
)
4660 struct demangle_component
*a
;
4663 /* Print the whole argument pack. */
4670 if (a
->type
!= DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4676 if (i
!= 0 || a
== NULL
)
4682 /* Returns the template argument from the current context indicated by DC,
4683 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
4685 static struct demangle_component
*
4686 d_lookup_template_argument (struct d_print_info
*dpi
,
4687 const struct demangle_component
*dc
)
4689 if (dpi
->templates
== NULL
)
4691 d_print_error (dpi
);
4695 return d_index_template_argument
4696 (d_right (dpi
->templates
->template_decl
),
4697 dc
->u
.s_number
.number
);
4700 /* Returns a template argument pack used in DC (any will do), or NULL. */
4702 static struct demangle_component
*
4703 d_find_pack (struct d_print_info
*dpi
,
4704 const struct demangle_component
*dc
)
4706 struct demangle_component
*a
;
4712 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
4713 a
= d_lookup_template_argument (dpi
, dc
);
4714 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4718 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
4721 case DEMANGLE_COMPONENT_LAMBDA
:
4722 case DEMANGLE_COMPONENT_NAME
:
4723 case DEMANGLE_COMPONENT_TAGGED_NAME
:
4724 case DEMANGLE_COMPONENT_OPERATOR
:
4725 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
4726 case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE
:
4727 case DEMANGLE_COMPONENT_SUB_STD
:
4728 case DEMANGLE_COMPONENT_CHARACTER
:
4729 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
4730 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
4731 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
4732 case DEMANGLE_COMPONENT_NUMBER
:
4735 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
4736 return d_find_pack (dpi
, dc
->u
.s_extended_operator
.name
);
4737 case DEMANGLE_COMPONENT_CTOR
:
4738 return d_find_pack (dpi
, dc
->u
.s_ctor
.name
);
4739 case DEMANGLE_COMPONENT_DTOR
:
4740 return d_find_pack (dpi
, dc
->u
.s_dtor
.name
);
4743 a
= d_find_pack (dpi
, d_left (dc
));
4746 return d_find_pack (dpi
, d_right (dc
));
4750 /* Returns the length of the template argument pack DC. */
4753 d_pack_length (const struct demangle_component
*dc
)
4756 while (dc
&& dc
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
4757 && d_left (dc
) != NULL
)
4765 /* Returns the number of template args in DC, expanding any pack expansions
4769 d_args_length (struct d_print_info
*dpi
, const struct demangle_component
*dc
)
4772 for (; dc
&& dc
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
;
4775 struct demangle_component
*elt
= d_left (dc
);
4778 if (elt
->type
== DEMANGLE_COMPONENT_PACK_EXPANSION
)
4780 struct demangle_component
*a
= d_find_pack (dpi
, d_left (elt
));
4781 count
+= d_pack_length (a
);
4789 /* DC is a component of a mangled expression. Print it, wrapped in parens
4793 d_print_subexpr (struct d_print_info
*dpi
, int options
,
4794 struct demangle_component
*dc
)
4797 if (dc
->type
== DEMANGLE_COMPONENT_NAME
4798 || dc
->type
== DEMANGLE_COMPONENT_QUAL_NAME
4799 || dc
->type
== DEMANGLE_COMPONENT_INITIALIZER_LIST
4800 || dc
->type
== DEMANGLE_COMPONENT_FUNCTION_PARAM
)
4803 d_append_char (dpi
, '(');
4804 d_print_comp (dpi
, options
, dc
);
4806 d_append_char (dpi
, ')');
4809 /* Save the current scope. */
4812 d_save_scope (struct d_print_info
*dpi
,
4813 const struct demangle_component
*container
)
4815 struct d_saved_scope
*scope
;
4816 struct d_print_template
*src
, **link
;
4818 if (dpi
->next_saved_scope
>= dpi
->num_saved_scopes
)
4820 d_print_error (dpi
);
4823 scope
= &dpi
->saved_scopes
[dpi
->next_saved_scope
];
4824 dpi
->next_saved_scope
++;
4826 scope
->container
= container
;
4827 link
= &scope
->templates
;
4829 for (src
= dpi
->templates
; src
!= NULL
; src
= src
->next
)
4831 struct d_print_template
*dst
;
4833 if (dpi
->next_copy_template
>= dpi
->num_copy_templates
)
4835 d_print_error (dpi
);
4838 dst
= &dpi
->copy_templates
[dpi
->next_copy_template
];
4839 dpi
->next_copy_template
++;
4841 dst
->template_decl
= src
->template_decl
;
4849 /* Attempt to locate a previously saved scope. Returns NULL if no
4850 corresponding saved scope was found. */
4852 static struct d_saved_scope
*
4853 d_get_saved_scope (struct d_print_info
*dpi
,
4854 const struct demangle_component
*container
)
4858 for (i
= 0; i
< dpi
->next_saved_scope
; i
++)
4859 if (dpi
->saved_scopes
[i
].container
== container
)
4860 return &dpi
->saved_scopes
[i
];
4865 /* If DC is a C++17 fold-expression, print it and return true; otherwise
4869 d_maybe_print_fold_expression (struct d_print_info
*dpi
, int options
,
4870 struct demangle_component
*dc
)
4872 struct demangle_component
*ops
, *operator_
, *op1
, *op2
;
4875 const char *fold_code
= d_left (dc
)->u
.s_operator
.op
->code
;
4876 if (fold_code
[0] != 'f')
4880 operator_
= d_left (ops
);
4881 op1
= d_right (ops
);
4883 if (op1
->type
== DEMANGLE_COMPONENT_TRINARY_ARG2
)
4885 op2
= d_right (op1
);
4889 /* Print the whole pack. */
4890 save_idx
= dpi
->pack_index
;
4891 dpi
->pack_index
= -1;
4893 switch (fold_code
[1])
4895 /* Unary left fold, (... + X). */
4897 d_append_string (dpi
, "(...");
4898 d_print_expr_op (dpi
, options
, operator_
);
4899 d_print_subexpr (dpi
, options
, op1
);
4900 d_append_char (dpi
, ')');
4903 /* Unary right fold, (X + ...). */
4905 d_append_char (dpi
, '(');
4906 d_print_subexpr (dpi
, options
, op1
);
4907 d_print_expr_op (dpi
, options
, operator_
);
4908 d_append_string (dpi
, "...)");
4911 /* Binary left fold, (42 + ... + X). */
4913 /* Binary right fold, (X + ... + 42). */
4915 d_append_char (dpi
, '(');
4916 d_print_subexpr (dpi
, options
, op1
);
4917 d_print_expr_op (dpi
, options
, operator_
);
4918 d_append_string (dpi
, "...");
4919 d_print_expr_op (dpi
, options
, operator_
);
4920 d_print_subexpr (dpi
, options
, op2
);
4921 d_append_char (dpi
, ')');
4925 dpi
->pack_index
= save_idx
;
4929 /* True iff DC represents a C99-style designated initializer. */
4932 is_designated_init (struct demangle_component
*dc
)
4934 if (dc
->type
!= DEMANGLE_COMPONENT_BINARY
4935 && dc
->type
!= DEMANGLE_COMPONENT_TRINARY
)
4938 struct demangle_component
*op
= d_left (dc
);
4939 const char *code
= op
->u
.s_operator
.op
->code
;
4940 return (code
[0] == 'd'
4941 && (code
[1] == 'i' || code
[1] == 'x' || code
[1] == 'X'));
4944 /* If DC represents a C99-style designated initializer, print it and return
4945 true; otherwise, return false. */
4948 d_maybe_print_designated_init (struct d_print_info
*dpi
, int options
,
4949 struct demangle_component
*dc
)
4951 if (!is_designated_init (dc
))
4954 const char *code
= d_left (dc
)->u
.s_operator
.op
->code
;
4956 struct demangle_component
*operands
= d_right (dc
);
4957 struct demangle_component
*op1
= d_left (operands
);
4958 struct demangle_component
*op2
= d_right (operands
);
4961 d_append_char (dpi
, '.');
4963 d_append_char (dpi
, '[');
4965 d_print_comp (dpi
, options
, op1
);
4968 d_append_string (dpi
, " ... ");
4969 d_print_comp (dpi
, options
, d_left (op2
));
4970 op2
= d_right (op2
);
4973 d_append_char (dpi
, ']');
4974 if (is_designated_init (op2
))
4976 /* Don't put '=' or '(' between chained designators. */
4977 d_print_comp (dpi
, options
, op2
);
4981 d_append_char (dpi
, '=');
4982 d_print_subexpr (dpi
, options
, op2
);
4988 d_print_lambda_parm_name (struct d_print_info
*dpi
, int type
, unsigned index
)
4994 dpi
->demangle_failure
= 1;
4998 case DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM
:
5002 case DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM
:
5006 case DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM
:
5010 d_append_string (dpi
, str
);
5011 d_append_num (dpi
, index
);
5014 /* Subroutine to handle components. */
5017 d_print_comp_inner (struct d_print_info
*dpi
, int options
,
5018 struct demangle_component
*dc
)
5020 /* Magic variable to let reference smashing skip over the next modifier
5021 without needing to modify *dc. */
5022 struct demangle_component
*mod_inner
= NULL
;
5024 /* Variable used to store the current templates while a previously
5025 captured scope is used. */
5026 struct d_print_template
*saved_templates
;
5028 /* Nonzero if templates have been stored in the above variable. */
5029 int need_template_restore
= 0;
5033 d_print_error (dpi
);
5036 if (d_print_saw_error (dpi
))
5041 case DEMANGLE_COMPONENT_NAME
:
5042 if ((options
& DMGL_JAVA
) == 0)
5043 d_append_buffer (dpi
, dc
->u
.s_name
.s
, dc
->u
.s_name
.len
);
5045 d_print_java_identifier (dpi
, dc
->u
.s_name
.s
, dc
->u
.s_name
.len
);
5048 case DEMANGLE_COMPONENT_TAGGED_NAME
:
5049 d_print_comp (dpi
, options
, d_left (dc
));
5050 d_append_string (dpi
, "[abi:");
5051 d_print_comp (dpi
, options
, d_right (dc
));
5052 d_append_char (dpi
, ']');
5055 case DEMANGLE_COMPONENT_STRUCTURED_BINDING
:
5056 d_append_char (dpi
, '[');
5059 d_print_comp (dpi
, options
, d_left (dc
));
5063 d_append_string (dpi
, ", ");
5065 d_append_char (dpi
, ']');
5068 case DEMANGLE_COMPONENT_MODULE_ENTITY
:
5069 d_print_comp (dpi
, options
, d_left (dc
));
5070 d_append_char (dpi
, '@');
5071 d_print_comp (dpi
, options
, d_right (dc
));
5074 case DEMANGLE_COMPONENT_MODULE_NAME
:
5075 case DEMANGLE_COMPONENT_MODULE_PARTITION
:
5078 d_print_comp (dpi
, options
, d_left (dc
));
5079 char c
= dc
->type
== DEMANGLE_COMPONENT_MODULE_PARTITION
5080 ? ':' : d_left (dc
) ? '.' : 0;
5082 d_append_char (dpi
, c
);
5083 d_print_comp (dpi
, options
, d_right (dc
));
5087 case DEMANGLE_COMPONENT_QUAL_NAME
:
5088 case DEMANGLE_COMPONENT_LOCAL_NAME
:
5089 d_print_comp (dpi
, options
, d_left (dc
));
5090 if ((options
& DMGL_JAVA
) == 0)
5091 d_append_string (dpi
, "::");
5093 d_append_char (dpi
, '.');
5095 struct demangle_component
*local_name
= d_right (dc
);
5096 if (local_name
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
5098 d_append_string (dpi
, "{default arg#");
5099 d_append_num (dpi
, local_name
->u
.s_unary_num
.num
+ 1);
5100 d_append_string (dpi
, "}::");
5101 local_name
= local_name
->u
.s_unary_num
.sub
;
5103 d_print_comp (dpi
, options
, local_name
);
5107 case DEMANGLE_COMPONENT_TYPED_NAME
:
5109 struct d_print_mod
*hold_modifiers
;
5110 struct demangle_component
*typed_name
;
5111 struct d_print_mod adpm
[4];
5113 struct d_print_template dpt
;
5115 /* Pass the name down to the type so that it can be printed in
5116 the right place for the type. We also have to pass down
5117 any CV-qualifiers, which apply to the this parameter. */
5118 hold_modifiers
= dpi
->modifiers
;
5121 typed_name
= d_left (dc
);
5122 while (typed_name
!= NULL
)
5124 if (i
>= sizeof adpm
/ sizeof adpm
[0])
5126 d_print_error (dpi
);
5130 adpm
[i
].next
= dpi
->modifiers
;
5131 dpi
->modifiers
= &adpm
[i
];
5132 adpm
[i
].mod
= typed_name
;
5133 adpm
[i
].printed
= 0;
5134 adpm
[i
].templates
= dpi
->templates
;
5137 if (!is_fnqual_component_type (typed_name
->type
))
5140 typed_name
= d_left (typed_name
);
5143 if (typed_name
== NULL
)
5145 d_print_error (dpi
);
5149 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
5150 there may be CV-qualifiers on its right argument which
5151 really apply here; this happens when parsing a class that
5152 is local to a function. */
5153 if (typed_name
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
5155 typed_name
= d_right (typed_name
);
5156 if (typed_name
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
5157 typed_name
= typed_name
->u
.s_unary_num
.sub
;
5158 while (typed_name
!= NULL
5159 && is_fnqual_component_type (typed_name
->type
))
5161 if (i
>= sizeof adpm
/ sizeof adpm
[0])
5163 d_print_error (dpi
);
5167 adpm
[i
] = adpm
[i
- 1];
5168 adpm
[i
].next
= &adpm
[i
- 1];
5169 dpi
->modifiers
= &adpm
[i
];
5171 adpm
[i
- 1].mod
= typed_name
;
5172 adpm
[i
- 1].printed
= 0;
5173 adpm
[i
- 1].templates
= dpi
->templates
;
5176 typed_name
= d_left (typed_name
);
5178 if (typed_name
== NULL
)
5180 d_print_error (dpi
);
5185 /* If typed_name is a template, then it applies to the
5186 function type as well. */
5187 if (typed_name
->type
== DEMANGLE_COMPONENT_TEMPLATE
)
5189 dpt
.next
= dpi
->templates
;
5190 dpi
->templates
= &dpt
;
5191 dpt
.template_decl
= typed_name
;
5194 d_print_comp (dpi
, options
, d_right (dc
));
5196 if (typed_name
->type
== DEMANGLE_COMPONENT_TEMPLATE
)
5197 dpi
->templates
= dpt
.next
;
5199 /* If the modifiers didn't get printed by the type, print them
5204 if (! adpm
[i
].printed
)
5206 d_append_char (dpi
, ' ');
5207 d_print_mod (dpi
, options
, adpm
[i
].mod
);
5211 dpi
->modifiers
= hold_modifiers
;
5216 case DEMANGLE_COMPONENT_TEMPLATE
:
5218 struct d_print_mod
*hold_dpm
;
5219 struct demangle_component
*dcl
;
5220 const struct demangle_component
*hold_current
;
5222 /* This template may need to be referenced by a cast operator
5223 contained in its subtree. */
5224 hold_current
= dpi
->current_template
;
5225 dpi
->current_template
= dc
;
5227 /* Don't push modifiers into a template definition. Doing so
5228 could give the wrong definition for a template argument.
5229 Instead, treat the template essentially as a name. */
5231 hold_dpm
= dpi
->modifiers
;
5232 dpi
->modifiers
= NULL
;
5236 if ((options
& DMGL_JAVA
) != 0
5237 && dcl
->type
== DEMANGLE_COMPONENT_NAME
5238 && dcl
->u
.s_name
.len
== 6
5239 && strncmp (dcl
->u
.s_name
.s
, "JArray", 6) == 0)
5241 /* Special-case Java arrays, so that JArray<TYPE> appears
5242 instead as TYPE[]. */
5244 d_print_comp (dpi
, options
, d_right (dc
));
5245 d_append_string (dpi
, "[]");
5249 d_print_comp (dpi
, options
, dcl
);
5250 if (d_last_char (dpi
) == '<')
5251 d_append_char (dpi
, ' ');
5252 d_append_char (dpi
, '<');
5253 d_print_comp (dpi
, options
, d_right (dc
));
5254 /* Avoid generating two consecutive '>' characters, to avoid
5255 the C++ syntactic ambiguity. */
5256 if (d_last_char (dpi
) == '>')
5257 d_append_char (dpi
, ' ');
5258 d_append_char (dpi
, '>');
5261 dpi
->modifiers
= hold_dpm
;
5262 dpi
->current_template
= hold_current
;
5267 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
5268 if (dpi
->lambda_tpl_parms
> dc
->u
.s_number
.number
+ 1)
5270 const struct demangle_component
*a
5271 = d_left (dpi
->templates
->template_decl
);
5273 for (c
= dc
->u
.s_number
.number
; a
&& c
; c
--)
5275 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM
)
5278 dpi
->demangle_failure
= 1;
5280 d_print_lambda_parm_name (dpi
, a
->type
, dc
->u
.s_number
.number
);
5282 else if (dpi
->lambda_tpl_parms
)
5284 /* Show the template parm index, as that's how g++ displays
5285 these, and future proofs us against potential
5286 '[]<typename T> (T *a, T *b) {...}'. */
5287 d_append_buffer (dpi
, "auto:", 5);
5288 d_append_num (dpi
, dc
->u
.s_number
.number
+ 1);
5292 struct d_print_template
*hold_dpt
;
5293 struct demangle_component
*a
= d_lookup_template_argument (dpi
, dc
);
5295 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
5296 a
= d_index_template_argument (a
, dpi
->pack_index
);
5300 d_print_error (dpi
);
5304 /* While processing this parameter, we need to pop the list
5305 of templates. This is because the template parameter may
5306 itself be a reference to a parameter of an outer
5309 hold_dpt
= dpi
->templates
;
5310 dpi
->templates
= hold_dpt
->next
;
5312 d_print_comp (dpi
, options
, a
);
5314 dpi
->templates
= hold_dpt
;
5318 case DEMANGLE_COMPONENT_TPARM_OBJ
:
5319 d_append_string (dpi
, "template parameter object for ");
5320 d_print_comp (dpi
, options
, d_left (dc
));
5323 case DEMANGLE_COMPONENT_CTOR
:
5324 d_print_comp (dpi
, options
, dc
->u
.s_ctor
.name
);
5327 case DEMANGLE_COMPONENT_DTOR
:
5328 d_append_char (dpi
, '~');
5329 d_print_comp (dpi
, options
, dc
->u
.s_dtor
.name
);
5332 case DEMANGLE_COMPONENT_MODULE_INIT
:
5333 d_append_string (dpi
, "initializer for module ");
5334 d_print_comp (dpi
, options
, d_left (dc
));
5337 case DEMANGLE_COMPONENT_VTABLE
:
5338 d_append_string (dpi
, "vtable for ");
5339 d_print_comp (dpi
, options
, d_left (dc
));
5342 case DEMANGLE_COMPONENT_VTT
:
5343 d_append_string (dpi
, "VTT for ");
5344 d_print_comp (dpi
, options
, d_left (dc
));
5347 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
5348 d_append_string (dpi
, "construction vtable for ");
5349 d_print_comp (dpi
, options
, d_left (dc
));
5350 d_append_string (dpi
, "-in-");
5351 d_print_comp (dpi
, options
, d_right (dc
));
5354 case DEMANGLE_COMPONENT_TYPEINFO
:
5355 d_append_string (dpi
, "typeinfo for ");
5356 d_print_comp (dpi
, options
, d_left (dc
));
5359 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
5360 d_append_string (dpi
, "typeinfo name for ");
5361 d_print_comp (dpi
, options
, d_left (dc
));
5364 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
5365 d_append_string (dpi
, "typeinfo fn for ");
5366 d_print_comp (dpi
, options
, d_left (dc
));
5369 case DEMANGLE_COMPONENT_THUNK
:
5370 d_append_string (dpi
, "non-virtual thunk to ");
5371 d_print_comp (dpi
, options
, d_left (dc
));
5374 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
5375 d_append_string (dpi
, "virtual thunk to ");
5376 d_print_comp (dpi
, options
, d_left (dc
));
5379 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
5380 d_append_string (dpi
, "covariant return thunk to ");
5381 d_print_comp (dpi
, options
, d_left (dc
));
5384 case DEMANGLE_COMPONENT_JAVA_CLASS
:
5385 d_append_string (dpi
, "java Class for ");
5386 d_print_comp (dpi
, options
, d_left (dc
));
5389 case DEMANGLE_COMPONENT_GUARD
:
5390 d_append_string (dpi
, "guard variable for ");
5391 d_print_comp (dpi
, options
, d_left (dc
));
5394 case DEMANGLE_COMPONENT_TLS_INIT
:
5395 d_append_string (dpi
, "TLS init function for ");
5396 d_print_comp (dpi
, options
, d_left (dc
));
5399 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
5400 d_append_string (dpi
, "TLS wrapper function for ");
5401 d_print_comp (dpi
, options
, d_left (dc
));
5404 case DEMANGLE_COMPONENT_REFTEMP
:
5405 d_append_string (dpi
, "reference temporary #");
5406 d_print_comp (dpi
, options
, d_right (dc
));
5407 d_append_string (dpi
, " for ");
5408 d_print_comp (dpi
, options
, d_left (dc
));
5411 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
5412 d_append_string (dpi
, "hidden alias for ");
5413 d_print_comp (dpi
, options
, d_left (dc
));
5416 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
5417 d_append_string (dpi
, "transaction clone for ");
5418 d_print_comp (dpi
, options
, d_left (dc
));
5421 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
5422 d_append_string (dpi
, "non-transaction clone for ");
5423 d_print_comp (dpi
, options
, d_left (dc
));
5426 case DEMANGLE_COMPONENT_SUB_STD
:
5427 d_append_buffer (dpi
, dc
->u
.s_string
.string
, dc
->u
.s_string
.len
);
5430 case DEMANGLE_COMPONENT_RESTRICT
:
5431 case DEMANGLE_COMPONENT_VOLATILE
:
5432 case DEMANGLE_COMPONENT_CONST
:
5434 struct d_print_mod
*pdpm
;
5436 /* When printing arrays, it's possible to have cases where the
5437 same CV-qualifier gets pushed on the stack multiple times.
5438 We only need to print it once. */
5440 for (pdpm
= dpi
->modifiers
; pdpm
!= NULL
; pdpm
= pdpm
->next
)
5442 if (! pdpm
->printed
)
5444 if (pdpm
->mod
->type
!= DEMANGLE_COMPONENT_RESTRICT
5445 && pdpm
->mod
->type
!= DEMANGLE_COMPONENT_VOLATILE
5446 && pdpm
->mod
->type
!= DEMANGLE_COMPONENT_CONST
)
5448 if (pdpm
->mod
->type
== dc
->type
)
5450 d_print_comp (dpi
, options
, d_left (dc
));
5458 case DEMANGLE_COMPONENT_REFERENCE
:
5459 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
5461 /* Handle reference smashing: & + && = &. */
5462 struct demangle_component
*sub
= d_left (dc
);
5463 if (!dpi
->lambda_tpl_parms
5464 && sub
->type
== DEMANGLE_COMPONENT_TEMPLATE_PARAM
)
5466 struct d_saved_scope
*scope
= d_get_saved_scope (dpi
, sub
);
5467 struct demangle_component
*a
;
5471 /* This is the first time SUB has been traversed.
5472 We need to capture the current templates so
5473 they can be restored if SUB is reentered as a
5475 d_save_scope (dpi
, sub
);
5476 if (d_print_saw_error (dpi
))
5481 const struct d_component_stack
*dcse
;
5482 int found_self_or_parent
= 0;
5484 /* This traversal is reentering SUB as a substition.
5485 If we are not beneath SUB or DC in the tree then we
5486 need to restore SUB's template stack temporarily. */
5487 for (dcse
= dpi
->component_stack
; dcse
!= NULL
;
5488 dcse
= dcse
->parent
)
5492 && dcse
!= dpi
->component_stack
))
5494 found_self_or_parent
= 1;
5499 if (!found_self_or_parent
)
5501 saved_templates
= dpi
->templates
;
5502 dpi
->templates
= scope
->templates
;
5503 need_template_restore
= 1;
5507 a
= d_lookup_template_argument (dpi
, sub
);
5508 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
5509 a
= d_index_template_argument (a
, dpi
->pack_index
);
5513 if (need_template_restore
)
5514 dpi
->templates
= saved_templates
;
5516 d_print_error (dpi
);
5523 if (sub
->type
== DEMANGLE_COMPONENT_REFERENCE
5524 || sub
->type
== dc
->type
)
5526 else if (sub
->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE
)
5527 mod_inner
= d_left (sub
);
5531 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
5532 case DEMANGLE_COMPONENT_POINTER
:
5533 case DEMANGLE_COMPONENT_COMPLEX
:
5534 case DEMANGLE_COMPONENT_IMAGINARY
:
5535 FNQUAL_COMPONENT_CASE
:
5538 /* We keep a list of modifiers on the stack. */
5539 struct d_print_mod dpm
;
5541 dpm
.next
= dpi
->modifiers
;
5542 dpi
->modifiers
= &dpm
;
5545 dpm
.templates
= dpi
->templates
;
5548 mod_inner
= d_left (dc
);
5550 d_print_comp (dpi
, options
, mod_inner
);
5552 /* If the modifier didn't get printed by the type, print it
5555 d_print_mod (dpi
, options
, dc
);
5557 dpi
->modifiers
= dpm
.next
;
5559 if (need_template_restore
)
5560 dpi
->templates
= saved_templates
;
5565 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
5566 if ((options
& DMGL_JAVA
) == 0)
5567 d_append_buffer (dpi
, dc
->u
.s_builtin
.type
->name
,
5568 dc
->u
.s_builtin
.type
->len
);
5570 d_append_buffer (dpi
, dc
->u
.s_builtin
.type
->java_name
,
5571 dc
->u
.s_builtin
.type
->java_len
);
5574 case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE
:
5575 d_append_buffer (dpi
, dc
->u
.s_extended_builtin
.type
->name
,
5576 dc
->u
.s_extended_builtin
.type
->len
);
5577 d_append_num (dpi
, dc
->u
.s_extended_builtin
.arg
);
5578 if (dc
->u
.s_extended_builtin
.suffix
)
5579 d_append_buffer (dpi
, &dc
->u
.s_extended_builtin
.suffix
, 1);
5582 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
5583 d_print_comp (dpi
, options
, d_left (dc
));
5586 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
5588 if ((options
& DMGL_RET_POSTFIX
) != 0)
5589 d_print_function_type (dpi
,
5590 options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5591 dc
, dpi
->modifiers
);
5593 /* Print return type if present */
5594 if (d_left (dc
) != NULL
&& (options
& DMGL_RET_POSTFIX
) != 0)
5595 d_print_comp (dpi
, options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5597 else if (d_left (dc
) != NULL
&& (options
& DMGL_RET_DROP
) == 0)
5599 struct d_print_mod dpm
;
5601 /* We must pass this type down as a modifier in order to
5602 print it in the right location. */
5603 dpm
.next
= dpi
->modifiers
;
5604 dpi
->modifiers
= &dpm
;
5607 dpm
.templates
= dpi
->templates
;
5609 d_print_comp (dpi
, options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5612 dpi
->modifiers
= dpm
.next
;
5617 /* In standard prefix notation, there is a space between the
5618 return type and the function signature. */
5619 if ((options
& DMGL_RET_POSTFIX
) == 0)
5620 d_append_char (dpi
, ' ');
5623 if ((options
& DMGL_RET_POSTFIX
) == 0)
5624 d_print_function_type (dpi
,
5625 options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5626 dc
, dpi
->modifiers
);
5631 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
5633 struct d_print_mod
*hold_modifiers
;
5634 struct d_print_mod adpm
[4];
5636 struct d_print_mod
*pdpm
;
5638 /* We must pass this type down as a modifier in order to print
5639 multi-dimensional arrays correctly. If the array itself is
5640 CV-qualified, we act as though the element type were
5641 CV-qualified. We do this by copying the modifiers down
5642 rather than fiddling pointers, so that we don't wind up
5643 with a d_print_mod higher on the stack pointing into our
5644 stack frame after we return. */
5646 hold_modifiers
= dpi
->modifiers
;
5648 adpm
[0].next
= hold_modifiers
;
5649 dpi
->modifiers
= &adpm
[0];
5651 adpm
[0].printed
= 0;
5652 adpm
[0].templates
= dpi
->templates
;
5655 pdpm
= hold_modifiers
;
5657 && (pdpm
->mod
->type
== DEMANGLE_COMPONENT_RESTRICT
5658 || pdpm
->mod
->type
== DEMANGLE_COMPONENT_VOLATILE
5659 || pdpm
->mod
->type
== DEMANGLE_COMPONENT_CONST
))
5661 if (! pdpm
->printed
)
5663 if (i
>= sizeof adpm
/ sizeof adpm
[0])
5665 d_print_error (dpi
);
5670 adpm
[i
].next
= dpi
->modifiers
;
5671 dpi
->modifiers
= &adpm
[i
];
5679 d_print_comp (dpi
, options
, d_right (dc
));
5681 dpi
->modifiers
= hold_modifiers
;
5683 if (adpm
[0].printed
)
5689 d_print_mod (dpi
, options
, adpm
[i
].mod
);
5692 d_print_array_type (dpi
, options
, dc
, dpi
->modifiers
);
5697 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
5698 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
5700 struct d_print_mod dpm
;
5702 dpm
.next
= dpi
->modifiers
;
5703 dpi
->modifiers
= &dpm
;
5706 dpm
.templates
= dpi
->templates
;
5708 d_print_comp (dpi
, options
, d_right (dc
));
5710 /* If the modifier didn't get printed by the type, print it
5713 d_print_mod (dpi
, options
, dc
);
5715 dpi
->modifiers
= dpm
.next
;
5720 case DEMANGLE_COMPONENT_ARGLIST
:
5721 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
5722 if (d_left (dc
) != NULL
)
5723 d_print_comp (dpi
, options
, d_left (dc
));
5724 if (d_right (dc
) != NULL
)
5727 unsigned long int flush_count
;
5728 /* Make sure ", " isn't flushed by d_append_string, otherwise
5729 dpi->len -= 2 wouldn't work. */
5730 if (dpi
->len
>= sizeof (dpi
->buf
) - 2)
5731 d_print_flush (dpi
);
5732 d_append_string (dpi
, ", ");
5734 flush_count
= dpi
->flush_count
;
5735 d_print_comp (dpi
, options
, d_right (dc
));
5736 /* If that didn't print anything (which can happen with empty
5737 template argument packs), remove the comma and space. */
5738 if (dpi
->flush_count
== flush_count
&& dpi
->len
== len
)
5743 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
5745 struct demangle_component
*type
= d_left (dc
);
5746 struct demangle_component
*list
= d_right (dc
);
5749 d_print_comp (dpi
, options
, type
);
5750 d_append_char (dpi
, '{');
5751 d_print_comp (dpi
, options
, list
);
5752 d_append_char (dpi
, '}');
5756 case DEMANGLE_COMPONENT_OPERATOR
:
5758 const struct demangle_operator_info
*op
= dc
->u
.s_operator
.op
;
5761 d_append_string (dpi
, "operator");
5762 /* Add a space before new/delete. */
5763 if (IS_LOWER (op
->name
[0]))
5764 d_append_char (dpi
, ' ');
5765 /* Omit a trailing space. */
5766 if (op
->name
[len
-1] == ' ')
5768 d_append_buffer (dpi
, op
->name
, len
);
5772 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
5773 d_append_string (dpi
, "operator ");
5774 d_print_comp (dpi
, options
, dc
->u
.s_extended_operator
.name
);
5777 case DEMANGLE_COMPONENT_CONVERSION
:
5778 d_append_string (dpi
, "operator ");
5779 d_print_conversion (dpi
, options
, dc
);
5782 case DEMANGLE_COMPONENT_NULLARY
:
5783 d_print_expr_op (dpi
, options
, d_left (dc
));
5786 case DEMANGLE_COMPONENT_UNARY
:
5788 struct demangle_component
*op
= d_left (dc
);
5789 struct demangle_component
*operand
= d_right (dc
);
5790 const char *code
= NULL
;
5792 if (op
->type
== DEMANGLE_COMPONENT_OPERATOR
)
5794 code
= op
->u
.s_operator
.op
->code
;
5795 if (!strcmp (code
, "ad"))
5797 /* Don't print the argument list for the address of a
5799 if (operand
->type
== DEMANGLE_COMPONENT_TYPED_NAME
5800 && d_left (operand
)->type
== DEMANGLE_COMPONENT_QUAL_NAME
5801 && d_right (operand
)->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5802 operand
= d_left (operand
);
5804 if (operand
->type
== DEMANGLE_COMPONENT_BINARY_ARGS
)
5806 /* This indicates a suffix operator. */
5807 operand
= d_left (operand
);
5808 d_print_subexpr (dpi
, options
, operand
);
5809 d_print_expr_op (dpi
, options
, op
);
5814 /* For sizeof..., just print the pack length. */
5815 if (code
&& !strcmp (code
, "sZ"))
5817 struct demangle_component
*a
= d_find_pack (dpi
, operand
);
5818 int len
= d_pack_length (a
);
5819 d_append_num (dpi
, len
);
5822 else if (code
&& !strcmp (code
, "sP"))
5824 int len
= d_args_length (dpi
, operand
);
5825 d_append_num (dpi
, len
);
5829 if (op
->type
!= DEMANGLE_COMPONENT_CAST
)
5830 d_print_expr_op (dpi
, options
, op
);
5833 d_append_char (dpi
, '(');
5834 d_print_cast (dpi
, options
, op
);
5835 d_append_char (dpi
, ')');
5837 if (code
&& !strcmp (code
, "gs"))
5838 /* Avoid parens after '::'. */
5839 d_print_comp (dpi
, options
, operand
);
5840 else if (code
&& (!strcmp (code
, "st") || !strcmp (code
, "nx")))
5841 /* Always print parens for sizeof (type) and noexcept(expr). */
5843 d_append_char (dpi
, '(');
5844 d_print_comp (dpi
, options
, operand
);
5845 d_append_char (dpi
, ')');
5848 d_print_subexpr (dpi
, options
, operand
);
5852 case DEMANGLE_COMPONENT_BINARY
:
5853 if (d_right (dc
)->type
!= DEMANGLE_COMPONENT_BINARY_ARGS
)
5855 d_print_error (dpi
);
5859 if (op_is_new_cast (d_left (dc
)))
5861 d_print_expr_op (dpi
, options
, d_left (dc
));
5862 d_append_char (dpi
, '<');
5863 d_print_comp (dpi
, options
, d_left (d_right (dc
)));
5864 d_append_string (dpi
, ">(");
5865 d_print_comp (dpi
, options
, d_right (d_right (dc
)));
5866 d_append_char (dpi
, ')');
5870 if (d_maybe_print_fold_expression (dpi
, options
, dc
))
5873 if (d_maybe_print_designated_init (dpi
, options
, dc
))
5876 /* We wrap an expression which uses the greater-than operator in
5877 an extra layer of parens so that it does not get confused
5878 with the '>' which ends the template parameters. */
5879 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_OPERATOR
5880 && d_left (dc
)->u
.s_operator
.op
->len
== 1
5881 && d_left (dc
)->u
.s_operator
.op
->name
[0] == '>')
5882 d_append_char (dpi
, '(');
5884 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "cl") == 0
5885 && d_left (d_right (dc
))->type
== DEMANGLE_COMPONENT_TYPED_NAME
)
5887 /* Function call used in an expression should not have printed types
5888 of the function arguments. Values of the function arguments still
5889 get printed below. */
5891 const struct demangle_component
*func
= d_left (d_right (dc
));
5893 if (d_right (func
)->type
!= DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5894 d_print_error (dpi
);
5895 d_print_subexpr (dpi
, options
, d_left (func
));
5898 d_print_subexpr (dpi
, options
, d_left (d_right (dc
)));
5899 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "ix") == 0)
5901 d_append_char (dpi
, '[');
5902 d_print_comp (dpi
, options
, d_right (d_right (dc
)));
5903 d_append_char (dpi
, ']');
5907 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "cl") != 0)
5908 d_print_expr_op (dpi
, options
, d_left (dc
));
5909 d_print_subexpr (dpi
, options
, d_right (d_right (dc
)));
5912 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_OPERATOR
5913 && d_left (dc
)->u
.s_operator
.op
->len
== 1
5914 && d_left (dc
)->u
.s_operator
.op
->name
[0] == '>')
5915 d_append_char (dpi
, ')');
5919 case DEMANGLE_COMPONENT_BINARY_ARGS
:
5920 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
5921 d_print_error (dpi
);
5924 case DEMANGLE_COMPONENT_TRINARY
:
5925 if (d_right (dc
)->type
!= DEMANGLE_COMPONENT_TRINARY_ARG1
5926 || d_right (d_right (dc
))->type
!= DEMANGLE_COMPONENT_TRINARY_ARG2
)
5928 d_print_error (dpi
);
5931 if (d_maybe_print_fold_expression (dpi
, options
, dc
))
5933 if (d_maybe_print_designated_init (dpi
, options
, dc
))
5936 struct demangle_component
*op
= d_left (dc
);
5937 struct demangle_component
*first
= d_left (d_right (dc
));
5938 struct demangle_component
*second
= d_left (d_right (d_right (dc
)));
5939 struct demangle_component
*third
= d_right (d_right (d_right (dc
)));
5941 if (!strcmp (op
->u
.s_operator
.op
->code
, "qu"))
5943 d_print_subexpr (dpi
, options
, first
);
5944 d_print_expr_op (dpi
, options
, op
);
5945 d_print_subexpr (dpi
, options
, second
);
5946 d_append_string (dpi
, " : ");
5947 d_print_subexpr (dpi
, options
, third
);
5951 d_append_string (dpi
, "new ");
5952 if (d_left (first
) != NULL
)
5954 d_print_subexpr (dpi
, options
, first
);
5955 d_append_char (dpi
, ' ');
5957 d_print_comp (dpi
, options
, second
);
5959 d_print_subexpr (dpi
, options
, third
);
5964 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
5965 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
5966 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
5967 d_print_error (dpi
);
5970 case DEMANGLE_COMPONENT_LITERAL
:
5971 case DEMANGLE_COMPONENT_LITERAL_NEG
:
5973 enum d_builtin_type_print tp
;
5975 /* For some builtin types, produce simpler output. */
5976 tp
= D_PRINT_DEFAULT
;
5977 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
)
5979 tp
= d_left (dc
)->u
.s_builtin
.type
->print
;
5983 case D_PRINT_UNSIGNED
:
5985 case D_PRINT_UNSIGNED_LONG
:
5986 case D_PRINT_LONG_LONG
:
5987 case D_PRINT_UNSIGNED_LONG_LONG
:
5988 if (d_right (dc
)->type
== DEMANGLE_COMPONENT_NAME
)
5990 if (dc
->type
== DEMANGLE_COMPONENT_LITERAL_NEG
)
5991 d_append_char (dpi
, '-');
5992 d_print_comp (dpi
, options
, d_right (dc
));
5997 case D_PRINT_UNSIGNED
:
5998 d_append_char (dpi
, 'u');
6001 d_append_char (dpi
, 'l');
6003 case D_PRINT_UNSIGNED_LONG
:
6004 d_append_string (dpi
, "ul");
6006 case D_PRINT_LONG_LONG
:
6007 d_append_string (dpi
, "ll");
6009 case D_PRINT_UNSIGNED_LONG_LONG
:
6010 d_append_string (dpi
, "ull");
6018 if (d_right (dc
)->type
== DEMANGLE_COMPONENT_NAME
6019 && d_right (dc
)->u
.s_name
.len
== 1
6020 && dc
->type
== DEMANGLE_COMPONENT_LITERAL
)
6022 switch (d_right (dc
)->u
.s_name
.s
[0])
6025 d_append_string (dpi
, "false");
6028 d_append_string (dpi
, "true");
6041 d_append_char (dpi
, '(');
6042 d_print_comp (dpi
, options
, d_left (dc
));
6043 d_append_char (dpi
, ')');
6044 if (dc
->type
== DEMANGLE_COMPONENT_LITERAL_NEG
)
6045 d_append_char (dpi
, '-');
6046 if (tp
== D_PRINT_FLOAT
)
6047 d_append_char (dpi
, '[');
6048 d_print_comp (dpi
, options
, d_right (dc
));
6049 if (tp
== D_PRINT_FLOAT
)
6050 d_append_char (dpi
, ']');
6054 case DEMANGLE_COMPONENT_VENDOR_EXPR
:
6055 d_print_comp (dpi
, options
, d_left (dc
));
6056 d_append_char (dpi
, '(');
6057 d_print_comp (dpi
, options
, d_right (dc
));
6058 d_append_char (dpi
, ')');
6061 case DEMANGLE_COMPONENT_NUMBER
:
6062 d_append_num (dpi
, dc
->u
.s_number
.number
);
6065 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
6066 d_append_string (dpi
, "java resource ");
6067 d_print_comp (dpi
, options
, d_left (dc
));
6070 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
6071 d_print_comp (dpi
, options
, d_left (dc
));
6072 d_print_comp (dpi
, options
, d_right (dc
));
6075 case DEMANGLE_COMPONENT_CHARACTER
:
6076 d_append_char (dpi
, dc
->u
.s_character
.character
);
6079 case DEMANGLE_COMPONENT_DECLTYPE
:
6080 d_append_string (dpi
, "decltype (");
6081 d_print_comp (dpi
, options
, d_left (dc
));
6082 d_append_char (dpi
, ')');
6085 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
6087 struct demangle_component
*a
= NULL
;
6089 if (!dpi
->lambda_tpl_parms
)
6090 a
= d_find_pack (dpi
, d_left (dc
));
6093 /* d_find_pack won't find anything if the only packs involved
6094 in this expansion are function parameter packs; in that
6095 case, just print the pattern and "...". */
6096 d_print_subexpr (dpi
, options
, d_left (dc
));
6097 d_append_string (dpi
, "...");
6101 int len
= d_pack_length (a
);
6105 for (i
= 0; i
< len
; ++i
)
6108 d_append_string (dpi
, ", ");
6109 dpi
->pack_index
= i
;
6110 d_print_comp (dpi
, options
, dc
);
6116 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
6118 long num
= dc
->u
.s_number
.number
;
6120 d_append_string (dpi
, "this");
6123 d_append_string (dpi
, "{parm#");
6124 d_append_num (dpi
, num
);
6125 d_append_char (dpi
, '}');
6130 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
6131 d_append_string (dpi
, "global constructors keyed to ");
6132 d_print_comp (dpi
, options
, dc
->u
.s_binary
.left
);
6135 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
6136 d_append_string (dpi
, "global destructors keyed to ");
6137 d_print_comp (dpi
, options
, dc
->u
.s_binary
.left
);
6140 case DEMANGLE_COMPONENT_LAMBDA
:
6142 d_append_string (dpi
, "{lambda");
6143 struct demangle_component
*parms
= dc
->u
.s_unary_num
.sub
;
6144 struct d_print_template dpt
;
6145 /* Generic lambda auto parms are mangled as the (synthedic) template
6146 type parm they are. We need to tell the printer that (a) we're in
6147 a lambda, and (b) the number of synthetic parms. */
6148 int saved_tpl_parms
= dpi
->lambda_tpl_parms
;
6149 dpi
->lambda_tpl_parms
= 0;
6150 /* Hang any lambda head as-if template args. */
6151 dpt
.template_decl
= NULL
;
6152 dpt
.next
= dpi
->templates
;
6153 dpi
->templates
= &dpt
;
6154 if (parms
&& parms
->type
== DEMANGLE_COMPONENT_TEMPLATE_HEAD
)
6156 dpt
.template_decl
= parms
;
6158 d_append_char (dpi
, '<');
6159 struct demangle_component
*parm
;
6160 for (parm
= d_left (parms
); parm
; parm
= d_right (parm
))
6162 if (dpi
->lambda_tpl_parms
++)
6163 d_append_string (dpi
, ", ");
6164 d_print_comp (dpi
, options
, parm
);
6165 d_append_char (dpi
, ' ');
6166 if (parm
->type
== DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM
)
6167 parm
= d_left (parm
);
6168 d_print_lambda_parm_name (dpi
, parm
->type
,
6169 dpi
->lambda_tpl_parms
- 1);
6171 d_append_char (dpi
, '>');
6173 parms
= d_right (parms
);
6175 dpi
->lambda_tpl_parms
++;
6177 d_append_char (dpi
, '(');
6178 d_print_comp (dpi
, options
, parms
);
6179 dpi
->lambda_tpl_parms
= saved_tpl_parms
;
6180 dpi
->templates
= dpt
.next
;
6181 d_append_string (dpi
, ")#");
6182 d_append_num (dpi
, dc
->u
.s_unary_num
.num
+ 1);
6183 d_append_char (dpi
, '}');
6187 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
6188 d_append_string (dpi
, "{unnamed type#");
6189 d_append_num (dpi
, dc
->u
.s_number
.number
+ 1);
6190 d_append_char (dpi
, '}');
6193 case DEMANGLE_COMPONENT_CLONE
:
6194 d_print_comp (dpi
, options
, d_left (dc
));
6195 d_append_string (dpi
, " [clone ");
6196 d_print_comp (dpi
, options
, d_right (dc
));
6197 d_append_char (dpi
, ']');
6200 case DEMANGLE_COMPONENT_TEMPLATE_HEAD
:
6202 d_append_char (dpi
, '<');
6204 struct demangle_component
*parm
;
6205 for (parm
= d_left (dc
); parm
; parm
= d_right (parm
))
6208 d_append_string (dpi
, ", ");
6209 d_print_comp (dpi
, options
, parm
);
6211 d_append_char (dpi
, '>');
6215 case DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM
:
6216 d_append_string (dpi
, "typename");
6219 case DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM
:
6220 d_print_comp (dpi
, options
, d_left (dc
));
6223 case DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM
:
6224 d_append_string (dpi
, "template");
6225 d_print_comp (dpi
, options
, d_left (dc
));
6226 d_append_string (dpi
, " class");
6229 case DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM
:
6230 d_print_comp (dpi
, options
, d_left (dc
));
6231 d_append_string (dpi
, "...");
6235 d_print_error (dpi
);
6241 d_print_comp (struct d_print_info
*dpi
, int options
,
6242 struct demangle_component
*dc
)
6244 struct d_component_stack self
;
6245 if (dc
== NULL
|| dc
->d_printing
> 1 || dpi
->recursion
> MAX_RECURSION_COUNT
)
6247 d_print_error (dpi
);
6255 self
.parent
= dpi
->component_stack
;
6256 dpi
->component_stack
= &self
;
6258 d_print_comp_inner (dpi
, options
, dc
);
6260 dpi
->component_stack
= self
.parent
;
6265 /* Print a Java dentifier. For Java we try to handle encoded extended
6266 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
6267 so we don't it for C++. Characters are encoded as
6271 d_print_java_identifier (struct d_print_info
*dpi
, const char *name
, int len
)
6277 for (p
= name
; p
< end
; ++p
)
6288 for (q
= p
+ 3; q
< end
; ++q
)
6294 else if (*q
>= 'A' && *q
<= 'F')
6295 dig
= *q
- 'A' + 10;
6296 else if (*q
>= 'a' && *q
<= 'f')
6297 dig
= *q
- 'a' + 10;
6303 /* If the Unicode character is larger than 256, we don't try
6304 to deal with it here. FIXME. */
6305 if (q
< end
&& *q
== '_' && c
< 256)
6307 d_append_char (dpi
, c
);
6313 d_append_char (dpi
, *p
);
6317 /* Print a list of modifiers. SUFFIX is 1 if we are printing
6318 qualifiers on this after printing a function. */
6321 d_print_mod_list (struct d_print_info
*dpi
, int options
,
6322 struct d_print_mod
*mods
, int suffix
)
6324 struct d_print_template
*hold_dpt
;
6326 if (mods
== NULL
|| d_print_saw_error (dpi
))
6331 && (is_fnqual_component_type (mods
->mod
->type
))))
6333 d_print_mod_list (dpi
, options
, mods
->next
, suffix
);
6339 hold_dpt
= dpi
->templates
;
6340 dpi
->templates
= mods
->templates
;
6342 if (mods
->mod
->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
6344 d_print_function_type (dpi
, options
, mods
->mod
, mods
->next
);
6345 dpi
->templates
= hold_dpt
;
6348 else if (mods
->mod
->type
== DEMANGLE_COMPONENT_ARRAY_TYPE
)
6350 d_print_array_type (dpi
, options
, mods
->mod
, mods
->next
);
6351 dpi
->templates
= hold_dpt
;
6354 else if (mods
->mod
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
6356 struct d_print_mod
*hold_modifiers
;
6357 struct demangle_component
*dc
;
6359 /* When this is on the modifier stack, we have pulled any
6360 qualifiers off the right argument already. Otherwise, we
6361 print it as usual, but don't let the left argument see any
6364 hold_modifiers
= dpi
->modifiers
;
6365 dpi
->modifiers
= NULL
;
6366 d_print_comp (dpi
, options
, d_left (mods
->mod
));
6367 dpi
->modifiers
= hold_modifiers
;
6369 if ((options
& DMGL_JAVA
) == 0)
6370 d_append_string (dpi
, "::");
6372 d_append_char (dpi
, '.');
6374 dc
= d_right (mods
->mod
);
6376 if (dc
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
6378 d_append_string (dpi
, "{default arg#");
6379 d_append_num (dpi
, dc
->u
.s_unary_num
.num
+ 1);
6380 d_append_string (dpi
, "}::");
6381 dc
= dc
->u
.s_unary_num
.sub
;
6384 while (is_fnqual_component_type (dc
->type
))
6387 d_print_comp (dpi
, options
, dc
);
6389 dpi
->templates
= hold_dpt
;
6393 d_print_mod (dpi
, options
, mods
->mod
);
6395 dpi
->templates
= hold_dpt
;
6397 d_print_mod_list (dpi
, options
, mods
->next
, suffix
);
6400 /* Print a modifier. */
6403 d_print_mod (struct d_print_info
*dpi
, int options
,
6404 struct demangle_component
*mod
)
6408 case DEMANGLE_COMPONENT_RESTRICT
:
6409 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
6410 d_append_string (dpi
, " restrict");
6412 case DEMANGLE_COMPONENT_VOLATILE
:
6413 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
6414 d_append_string (dpi
, " volatile");
6416 case DEMANGLE_COMPONENT_CONST
:
6417 case DEMANGLE_COMPONENT_CONST_THIS
:
6418 d_append_string (dpi
, " const");
6420 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
6421 d_append_string (dpi
, " transaction_safe");
6423 case DEMANGLE_COMPONENT_NOEXCEPT
:
6424 d_append_string (dpi
, " noexcept");
6427 d_append_char (dpi
, '(');
6428 d_print_comp (dpi
, options
, d_right (mod
));
6429 d_append_char (dpi
, ')');
6432 case DEMANGLE_COMPONENT_THROW_SPEC
:
6433 d_append_string (dpi
, " throw");
6436 d_append_char (dpi
, '(');
6437 d_print_comp (dpi
, options
, d_right (mod
));
6438 d_append_char (dpi
, ')');
6441 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
6442 d_append_char (dpi
, ' ');
6443 d_print_comp (dpi
, options
, d_right (mod
));
6445 case DEMANGLE_COMPONENT_POINTER
:
6446 /* There is no pointer symbol in Java. */
6447 if ((options
& DMGL_JAVA
) == 0)
6448 d_append_char (dpi
, '*');
6450 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
6451 /* For the ref-qualifier, put a space before the &. */
6452 d_append_char (dpi
, ' ');
6454 case DEMANGLE_COMPONENT_REFERENCE
:
6455 d_append_char (dpi
, '&');
6457 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
6458 d_append_char (dpi
, ' ');
6460 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
6461 d_append_string (dpi
, "&&");
6463 case DEMANGLE_COMPONENT_COMPLEX
:
6464 d_append_string (dpi
, " _Complex");
6466 case DEMANGLE_COMPONENT_IMAGINARY
:
6467 d_append_string (dpi
, " _Imaginary");
6469 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
6470 if (d_last_char (dpi
) != '(')
6471 d_append_char (dpi
, ' ');
6472 d_print_comp (dpi
, options
, d_left (mod
));
6473 d_append_string (dpi
, "::*");
6475 case DEMANGLE_COMPONENT_TYPED_NAME
:
6476 d_print_comp (dpi
, options
, d_left (mod
));
6478 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
6479 d_append_string (dpi
, " __vector(");
6480 d_print_comp (dpi
, options
, d_left (mod
));
6481 d_append_char (dpi
, ')');
6485 /* Otherwise, we have something that won't go back on the
6486 modifier stack, so we can just print it. */
6487 d_print_comp (dpi
, options
, mod
);
6492 /* Print a function type, except for the return type. */
6495 d_print_function_type (struct d_print_info
*dpi
, int options
,
6496 struct demangle_component
*dc
,
6497 struct d_print_mod
*mods
)
6501 struct d_print_mod
*p
;
6502 struct d_print_mod
*hold_modifiers
;
6506 for (p
= mods
; p
!= NULL
; p
= p
->next
)
6511 switch (p
->mod
->type
)
6513 case DEMANGLE_COMPONENT_POINTER
:
6514 case DEMANGLE_COMPONENT_REFERENCE
:
6515 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
6518 case DEMANGLE_COMPONENT_RESTRICT
:
6519 case DEMANGLE_COMPONENT_VOLATILE
:
6520 case DEMANGLE_COMPONENT_CONST
:
6521 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
6522 case DEMANGLE_COMPONENT_COMPLEX
:
6523 case DEMANGLE_COMPONENT_IMAGINARY
:
6524 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
6528 FNQUAL_COMPONENT_CASE
:
6541 if (d_last_char (dpi
) != '('
6542 && d_last_char (dpi
) != '*')
6545 if (need_space
&& d_last_char (dpi
) != ' ')
6546 d_append_char (dpi
, ' ');
6547 d_append_char (dpi
, '(');
6550 hold_modifiers
= dpi
->modifiers
;
6551 dpi
->modifiers
= NULL
;
6553 d_print_mod_list (dpi
, options
, mods
, 0);
6556 d_append_char (dpi
, ')');
6558 d_append_char (dpi
, '(');
6560 if (d_right (dc
) != NULL
)
6561 d_print_comp (dpi
, options
, d_right (dc
));
6563 d_append_char (dpi
, ')');
6565 d_print_mod_list (dpi
, options
, mods
, 1);
6567 dpi
->modifiers
= hold_modifiers
;
6570 /* Print an array type, except for the element type. */
6573 d_print_array_type (struct d_print_info
*dpi
, int options
,
6574 struct demangle_component
*dc
,
6575 struct d_print_mod
*mods
)
6583 struct d_print_mod
*p
;
6586 for (p
= mods
; p
!= NULL
; p
= p
->next
)
6590 if (p
->mod
->type
== DEMANGLE_COMPONENT_ARRAY_TYPE
)
6605 d_append_string (dpi
, " (");
6607 d_print_mod_list (dpi
, options
, mods
, 0);
6610 d_append_char (dpi
, ')');
6614 d_append_char (dpi
, ' ');
6616 d_append_char (dpi
, '[');
6618 if (d_left (dc
) != NULL
)
6619 d_print_comp (dpi
, options
, d_left (dc
));
6621 d_append_char (dpi
, ']');
6624 /* Print an operator in an expression. */
6627 d_print_expr_op (struct d_print_info
*dpi
, int options
,
6628 struct demangle_component
*dc
)
6630 if (dc
->type
== DEMANGLE_COMPONENT_OPERATOR
)
6631 d_append_buffer (dpi
, dc
->u
.s_operator
.op
->name
,
6632 dc
->u
.s_operator
.op
->len
);
6634 d_print_comp (dpi
, options
, dc
);
6640 d_print_cast (struct d_print_info
*dpi
, int options
,
6641 struct demangle_component
*dc
)
6643 d_print_comp (dpi
, options
, d_left (dc
));
6646 /* Print a conversion operator. */
6649 d_print_conversion (struct d_print_info
*dpi
, int options
,
6650 struct demangle_component
*dc
)
6652 struct d_print_template dpt
;
6654 /* For a conversion operator, we need the template parameters from
6655 the enclosing template in scope for processing the type. */
6656 if (dpi
->current_template
!= NULL
)
6658 dpt
.next
= dpi
->templates
;
6659 dpi
->templates
= &dpt
;
6660 dpt
.template_decl
= dpi
->current_template
;
6663 d_print_comp (dpi
, options
, d_left (dc
));
6665 if (dpi
->current_template
!= NULL
)
6666 dpi
->templates
= dpt
.next
;
6669 /* Initialize the information structure we use to pass around
6672 CP_STATIC_IF_GLIBCPP_V3
6674 cplus_demangle_init_info (const char *mangled
, int options
, size_t len
,
6678 di
->send
= mangled
+ len
;
6679 di
->options
= options
;
6683 /* We cannot need more components than twice the number of chars in
6684 the mangled string. Most components correspond directly to
6685 chars, but the ARGLIST types are exceptions. */
6686 di
->num_comps
= 2 * len
;
6689 /* Similarly, we cannot need more substitutions than there are
6690 chars in the mangled string. */
6694 di
->last_name
= NULL
;
6697 di
->is_expression
= 0;
6698 di
->is_conversion
= 0;
6699 di
->recursion_level
= 0;
6702 /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
6703 mangled name, return strings in repeated callback giving the demangled
6704 name. OPTIONS is the usual libiberty demangler options. On success,
6705 this returns 1. On failure, returns 0. */
6708 d_demangle_callback (const char *mangled
, int options
,
6709 demangle_callbackref callback
, void *opaque
)
6720 struct demangle_component
*dc
;
6723 if (mangled
[0] == '_' && mangled
[1] == 'Z')
6725 else if (strncmp (mangled
, "_GLOBAL_", 8) == 0
6726 && (mangled
[8] == '.' || mangled
[8] == '_' || mangled
[8] == '$')
6727 && (mangled
[9] == 'D' || mangled
[9] == 'I')
6728 && mangled
[10] == '_')
6729 type
= mangled
[9] == 'I' ? DCT_GLOBAL_CTORS
: DCT_GLOBAL_DTORS
;
6732 if ((options
& DMGL_TYPES
) == 0)
6737 di
.unresolved_name_state
= 1;
6740 cplus_demangle_init_info (mangled
, options
, strlen (mangled
), &di
);
6742 /* PR 87675 - Check for a mangled string that is so long
6743 that we do not have enough stack space to demangle it. */
6744 if (((options
& DMGL_NO_RECURSE_LIMIT
) == 0)
6745 /* This check is a bit arbitrary, since what we really want to do is to
6746 compare the sizes of the di.comps and di.subs arrays against the
6747 amount of stack space remaining. But there is no portable way to do
6748 this, so instead we use the recursion limit as a guide to the maximum
6749 size of the arrays. */
6750 && (unsigned long) di
.num_comps
> DEMANGLE_RECURSION_LIMIT
)
6752 /* FIXME: We need a way to indicate that a stack limit has been reached. */
6757 #ifdef CP_DYNAMIC_ARRAYS
6758 __extension__
struct demangle_component comps
[di
.num_comps
];
6759 __extension__
struct demangle_component
*subs
[di
.num_subs
];
6764 di
.comps
= alloca (di
.num_comps
* sizeof (*di
.comps
));
6765 di
.subs
= alloca (di
.num_subs
* sizeof (*di
.subs
));
6771 dc
= cplus_demangle_type (&di
);
6774 dc
= cplus_demangle_mangled_name (&di
, 1);
6776 case DCT_GLOBAL_CTORS
:
6777 case DCT_GLOBAL_DTORS
:
6778 d_advance (&di
, 11);
6779 dc
= d_make_comp (&di
,
6780 (type
== DCT_GLOBAL_CTORS
6781 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
6782 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
),
6783 d_make_demangle_mangled_name (&di
, d_str (&di
)),
6785 d_advance (&di
, strlen (d_str (&di
)));
6788 abort (); /* We have listed all the cases. */
6791 /* If DMGL_PARAMS is set, then if we didn't consume the entire
6792 mangled string, then we didn't successfully demangle it. If
6793 DMGL_PARAMS is not set, we didn't look at the trailing
6795 if (((options
& DMGL_PARAMS
) != 0) && d_peek_char (&di
) != '\0')
6798 /* See discussion in d_unresolved_name. */
6799 if (dc
== NULL
&& di
.unresolved_name_state
== -1)
6801 di
.unresolved_name_state
= 0;
6805 #ifdef CP_DEMANGLE_DEBUG
6809 status
= (dc
!= NULL
)
6810 ? cplus_demangle_print_callback (options
, dc
, callback
, opaque
)
6817 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
6818 name, return a buffer allocated with malloc holding the demangled
6819 name. OPTIONS is the usual libiberty demangler options. On
6820 success, this sets *PALC to the allocated size of the returned
6821 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
6822 a memory allocation failure, and returns NULL. */
6825 d_demangle (const char *mangled
, int options
, size_t *palc
)
6827 struct d_growable_string dgs
;
6830 d_growable_string_init (&dgs
, 0);
6832 status
= d_demangle_callback (mangled
, options
,
6833 d_growable_string_callback_adapter
, &dgs
);
6841 *palc
= dgs
.allocation_failure
? 1 : dgs
.alc
;
6845 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
6847 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
6849 /* ia64 ABI-mandated entry point in the C++ runtime library for
6850 performing demangling. MANGLED_NAME is a NUL-terminated character
6851 string containing the name to be demangled.
6853 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
6854 *LENGTH bytes, into which the demangled name is stored. If
6855 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
6856 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
6857 is placed in a region of memory allocated with malloc.
6859 If LENGTH is non-NULL, the length of the buffer containing the
6860 demangled name, is placed in *LENGTH.
6862 The return value is a pointer to the start of the NUL-terminated
6863 demangled name, or NULL if the demangling fails. The caller is
6864 responsible for deallocating this memory using free.
6866 *STATUS is set to one of the following values:
6867 0: The demangling operation succeeded.
6868 -1: A memory allocation failure occurred.
6869 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6870 -3: One of the arguments is invalid.
6872 The demangling is performed using the C++ ABI mangling rules, with
6876 __cxa_demangle (const char *mangled_name
, char *output_buffer
,
6877 size_t *length
, int *status
)
6882 if (mangled_name
== NULL
)
6889 if (output_buffer
!= NULL
&& length
== NULL
)
6896 demangled
= d_demangle (mangled_name
, DMGL_PARAMS
| DMGL_TYPES
, &alc
);
6898 if (demangled
== NULL
)
6910 if (output_buffer
== NULL
)
6917 if (strlen (demangled
) < *length
)
6919 strcpy (output_buffer
, demangled
);
6921 demangled
= output_buffer
;
6925 free (output_buffer
);
6936 extern int __gcclibcxx_demangle_callback (const char *,
6938 (const char *, size_t, void *),
6941 /* Alternative, allocationless entry point in the C++ runtime library
6942 for performing demangling. MANGLED_NAME is a NUL-terminated character
6943 string containing the name to be demangled.
6945 CALLBACK is a callback function, called with demangled string
6946 segments as demangling progresses; it is called at least once,
6947 but may be called more than once. OPAQUE is a generalized pointer
6948 used as a callback argument.
6950 The return code is one of the following values, equivalent to
6951 the STATUS values of __cxa_demangle() (excluding -1, since this
6952 function performs no memory allocations):
6953 0: The demangling operation succeeded.
6954 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6955 -3: One of the arguments is invalid.
6957 The demangling is performed using the C++ ABI mangling rules, with
6961 __gcclibcxx_demangle_callback (const char *mangled_name
,
6962 void (*callback
) (const char *, size_t, void *),
6967 if (mangled_name
== NULL
|| callback
== NULL
)
6970 status
= d_demangle_callback (mangled_name
, DMGL_PARAMS
| DMGL_TYPES
,
6978 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
6980 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
6981 mangled name, return a buffer allocated with malloc holding the
6982 demangled name. Otherwise, return NULL. */
6985 cplus_demangle_v3 (const char *mangled
, int options
)
6989 return d_demangle (mangled
, options
, &alc
);
6993 cplus_demangle_v3_callback (const char *mangled
, int options
,
6994 demangle_callbackref callback
, void *opaque
)
6996 return d_demangle_callback (mangled
, options
, callback
, opaque
);
6999 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
7000 conventions, but the output formatting is a little different.
7001 This instructs the C++ demangler not to emit pointer characters ("*"), to
7002 use Java's namespace separator symbol ("." instead of "::"), and to output
7003 JArray<TYPE> as TYPE[]. */
7006 java_demangle_v3 (const char *mangled
)
7010 return d_demangle (mangled
, DMGL_JAVA
| DMGL_PARAMS
| DMGL_RET_POSTFIX
, &alc
);
7014 java_demangle_v3_callback (const char *mangled
,
7015 demangle_callbackref callback
, void *opaque
)
7017 return d_demangle_callback (mangled
,
7018 DMGL_JAVA
| DMGL_PARAMS
| DMGL_RET_POSTFIX
,
7022 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
7024 #ifndef IN_GLIBCPP_V3
7026 /* Demangle a string in order to find out whether it is a constructor
7027 or destructor. Return non-zero on success. Set *CTOR_KIND and
7028 *DTOR_KIND appropriately. */
7031 is_ctor_or_dtor (const char *mangled
,
7032 enum gnu_v3_ctor_kinds
*ctor_kind
,
7033 enum gnu_v3_dtor_kinds
*dtor_kind
)
7036 struct demangle_component
*dc
;
7039 *ctor_kind
= (enum gnu_v3_ctor_kinds
) 0;
7040 *dtor_kind
= (enum gnu_v3_dtor_kinds
) 0;
7042 cplus_demangle_init_info (mangled
, DMGL_GNU_V3
, strlen (mangled
), &di
);
7045 #ifdef CP_DYNAMIC_ARRAYS
7046 __extension__
struct demangle_component comps
[di
.num_comps
];
7047 __extension__
struct demangle_component
*subs
[di
.num_subs
];
7052 di
.comps
= alloca (di
.num_comps
* sizeof (*di
.comps
));
7053 di
.subs
= alloca (di
.num_subs
* sizeof (*di
.subs
));
7056 dc
= cplus_demangle_mangled_name (&di
, 1);
7058 /* Note that because we did not pass DMGL_PARAMS, we don't expect
7059 to demangle the entire string. */
7066 /* These cannot appear on a constructor or destructor. */
7067 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
7068 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
7069 case DEMANGLE_COMPONENT_CONST_THIS
:
7070 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
7071 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
7075 case DEMANGLE_COMPONENT_TYPED_NAME
:
7076 case DEMANGLE_COMPONENT_TEMPLATE
:
7079 case DEMANGLE_COMPONENT_QUAL_NAME
:
7080 case DEMANGLE_COMPONENT_LOCAL_NAME
:
7083 case DEMANGLE_COMPONENT_CTOR
:
7084 *ctor_kind
= dc
->u
.s_ctor
.kind
;
7088 case DEMANGLE_COMPONENT_DTOR
:
7089 *dtor_kind
= dc
->u
.s_dtor
.kind
;
7100 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
7101 name. A non-zero return indicates the type of constructor. */
7103 enum gnu_v3_ctor_kinds
7104 is_gnu_v3_mangled_ctor (const char *name
)
7106 enum gnu_v3_ctor_kinds ctor_kind
;
7107 enum gnu_v3_dtor_kinds dtor_kind
;
7109 if (! is_ctor_or_dtor (name
, &ctor_kind
, &dtor_kind
))
7110 return (enum gnu_v3_ctor_kinds
) 0;
7115 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
7116 name. A non-zero return indicates the type of destructor. */
7118 enum gnu_v3_dtor_kinds
7119 is_gnu_v3_mangled_dtor (const char *name
)
7121 enum gnu_v3_ctor_kinds ctor_kind
;
7122 enum gnu_v3_dtor_kinds dtor_kind
;
7124 if (! is_ctor_or_dtor (name
, &ctor_kind
, &dtor_kind
))
7125 return (enum gnu_v3_dtor_kinds
) 0;
7129 #endif /* IN_GLIBCPP_V3 */
7131 #ifdef STANDALONE_DEMANGLER
7134 #include "dyn-string.h"
7136 static void print_usage (FILE* fp
, int exit_value
);
7138 #define IS_ALPHA(CHAR) \
7139 (((CHAR) >= 'a' && (CHAR) <= 'z') \
7140 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
7142 /* Non-zero if CHAR is a character than can occur in a mangled name. */
7143 #define is_mangled_char(CHAR) \
7144 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
7145 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
7147 /* The name of this program, as invoked. */
7148 const char* program_name
;
7150 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
7153 print_usage (FILE* fp
, int exit_value
)
7155 fprintf (fp
, "Usage: %s [options] [names ...]\n", program_name
);
7156 fprintf (fp
, "Options:\n");
7157 fprintf (fp
, " -h,--help Display this message.\n");
7158 fprintf (fp
, " -p,--no-params Don't display function parameters\n");
7159 fprintf (fp
, " -v,--verbose Produce verbose demanglings.\n");
7160 fprintf (fp
, "If names are provided, they are demangled. Otherwise filters standard input.\n");
7165 /* Option specification for getopt_long. */
7166 static const struct option long_options
[] =
7168 { "help", no_argument
, NULL
, 'h' },
7169 { "no-params", no_argument
, NULL
, 'p' },
7170 { "verbose", no_argument
, NULL
, 'v' },
7171 { NULL
, no_argument
, NULL
, 0 },
7174 /* Main entry for a demangling filter executable. It will demangle
7175 its command line arguments, if any. If none are provided, it will
7176 filter stdin to stdout, replacing any recognized mangled C++ names
7177 with their demangled equivalents. */
7180 main (int argc
, char *argv
[])
7184 int options
= DMGL_PARAMS
| DMGL_ANSI
| DMGL_TYPES
;
7186 /* Use the program name of this program, as invoked. */
7187 program_name
= argv
[0];
7189 /* Parse options. */
7192 opt_char
= getopt_long (argc
, argv
, "hpv", long_options
, NULL
);
7195 case '?': /* Unrecognized option. */
7196 print_usage (stderr
, 1);
7200 print_usage (stdout
, 0);
7204 options
&= ~ DMGL_PARAMS
;
7208 options
|= DMGL_VERBOSE
;
7212 while (opt_char
!= -1);
7215 /* No command line arguments were provided. Filter stdin. */
7217 dyn_string_t mangled
= dyn_string_new (3);
7220 /* Read all of input. */
7221 while (!feof (stdin
))
7225 /* Pile characters into mangled until we hit one that can't
7226 occur in a mangled name. */
7228 while (!feof (stdin
) && is_mangled_char (c
))
7230 dyn_string_append_char (mangled
, c
);
7236 if (dyn_string_length (mangled
) > 0)
7238 #ifdef IN_GLIBCPP_V3
7239 s
= __cxa_demangle (dyn_string_buf (mangled
), NULL
, NULL
, NULL
);
7241 s
= cplus_demangle_v3 (dyn_string_buf (mangled
), options
);
7251 /* It might not have been a mangled name. Print the
7253 fputs (dyn_string_buf (mangled
), stdout
);
7256 dyn_string_clear (mangled
);
7259 /* If we haven't hit EOF yet, we've read one character that
7260 can't occur in a mangled name, so print it out. */
7265 dyn_string_delete (mangled
);
7268 /* Demangle command line arguments. */
7270 /* Loop over command line arguments. */
7271 for (i
= optind
; i
< argc
; ++i
)
7274 #ifdef IN_GLIBCPP_V3
7278 /* Attempt to demangle. */
7279 #ifdef IN_GLIBCPP_V3
7280 s
= __cxa_demangle (argv
[i
], NULL
, NULL
, &status
);
7282 s
= cplus_demangle_v3 (argv
[i
], options
);
7285 /* If it worked, print the demangled name. */
7293 #ifdef IN_GLIBCPP_V3
7294 fprintf (stderr
, "Failed: %s (status %d)\n", argv
[i
], status
);
7296 fprintf (stderr
, "Failed: %s\n", argv
[i
]);
7305 #endif /* STANDALONE_DEMANGLER */