1 /* Demangler for g++ V3 ABI.
2 Copyright (C) 2003-2020 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 /* Non-zero if we're printing a lambda argument. A template
351 parameter reference actually means 'auto'. */
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
*);
430 static struct demangle_component
*d_nested_name (struct d_info
*);
432 static struct demangle_component
*d_prefix (struct d_info
*);
434 static struct demangle_component
*d_unqualified_name (struct d_info
*);
436 static struct demangle_component
*d_source_name (struct d_info
*);
438 static int d_number (struct d_info
*);
440 static struct demangle_component
*d_identifier (struct d_info
*, int);
442 static struct demangle_component
*d_operator_name (struct d_info
*);
444 static struct demangle_component
*d_special_name (struct d_info
*);
446 static struct demangle_component
*d_parmlist (struct d_info
*);
448 static int d_call_offset (struct d_info
*, int);
450 static struct demangle_component
*d_ctor_dtor_name (struct d_info
*);
452 static struct demangle_component
**
453 d_cv_qualifiers (struct d_info
*, struct demangle_component
**, int);
455 static struct demangle_component
*
456 d_ref_qualifier (struct d_info
*, struct demangle_component
*);
458 static struct demangle_component
*
459 d_function_type (struct d_info
*);
461 static struct demangle_component
*
462 d_bare_function_type (struct d_info
*, int);
464 static struct demangle_component
*
465 d_class_enum_type (struct d_info
*);
467 static struct demangle_component
*d_array_type (struct d_info
*);
469 static struct demangle_component
*d_vector_type (struct d_info
*);
471 static struct demangle_component
*
472 d_pointer_to_member_type (struct d_info
*);
474 static struct demangle_component
*
475 d_template_param (struct d_info
*);
477 static struct demangle_component
*d_template_args (struct d_info
*);
478 static struct demangle_component
*d_template_args_1 (struct d_info
*);
480 static struct demangle_component
*
481 d_template_arg (struct d_info
*);
483 static struct demangle_component
*d_expression (struct d_info
*);
485 static struct demangle_component
*d_expr_primary (struct d_info
*);
487 static struct demangle_component
*d_local_name (struct d_info
*);
489 static int d_discriminator (struct d_info
*);
491 static struct demangle_component
*d_lambda (struct d_info
*);
493 static struct demangle_component
*d_unnamed_type (struct d_info
*);
495 static struct demangle_component
*
496 d_clone_suffix (struct d_info
*, struct demangle_component
*);
499 d_add_substitution (struct d_info
*, struct demangle_component
*);
501 static struct demangle_component
*d_substitution (struct d_info
*, int);
503 static void d_checkpoint (struct d_info
*, struct d_info_checkpoint
*);
505 static void d_backtrack (struct d_info
*, struct d_info_checkpoint
*);
507 static void d_growable_string_init (struct d_growable_string
*, size_t);
510 d_growable_string_resize (struct d_growable_string
*, size_t);
513 d_growable_string_append_buffer (struct d_growable_string
*,
514 const char *, size_t);
516 d_growable_string_callback_adapter (const char *, size_t, void *);
519 d_print_init (struct d_print_info
*, demangle_callbackref
, void *,
520 struct demangle_component
*);
522 static inline void d_print_error (struct d_print_info
*);
524 static inline int d_print_saw_error (struct d_print_info
*);
526 static inline void d_print_flush (struct d_print_info
*);
528 static inline void d_append_char (struct d_print_info
*, char);
530 static inline void d_append_buffer (struct d_print_info
*,
531 const char *, size_t);
533 static inline void d_append_string (struct d_print_info
*, const char *);
535 static inline char d_last_char (struct d_print_info
*);
538 d_print_comp (struct d_print_info
*, int, struct demangle_component
*);
541 d_print_java_identifier (struct d_print_info
*, const char *, int);
544 d_print_mod_list (struct d_print_info
*, int, struct d_print_mod
*, int);
547 d_print_mod (struct d_print_info
*, int, struct demangle_component
*);
550 d_print_function_type (struct d_print_info
*, int,
551 struct demangle_component
*,
552 struct d_print_mod
*);
555 d_print_array_type (struct d_print_info
*, int,
556 struct demangle_component
*,
557 struct d_print_mod
*);
560 d_print_expr_op (struct d_print_info
*, int, struct demangle_component
*);
562 static void d_print_cast (struct d_print_info
*, int,
563 struct demangle_component
*);
564 static void d_print_conversion (struct d_print_info
*, int,
565 struct demangle_component
*);
567 static int d_demangle_callback (const char *, int,
568 demangle_callbackref
, void *);
569 static char *d_demangle (const char *, int, size_t *);
571 #define FNQUAL_COMPONENT_CASE \
572 case DEMANGLE_COMPONENT_RESTRICT_THIS: \
573 case DEMANGLE_COMPONENT_VOLATILE_THIS: \
574 case DEMANGLE_COMPONENT_CONST_THIS: \
575 case DEMANGLE_COMPONENT_REFERENCE_THIS: \
576 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS: \
577 case DEMANGLE_COMPONENT_TRANSACTION_SAFE: \
578 case DEMANGLE_COMPONENT_NOEXCEPT: \
579 case DEMANGLE_COMPONENT_THROW_SPEC
581 /* True iff TYPE is a demangling component representing a
582 function-type-qualifier. */
585 is_fnqual_component_type (enum demangle_component_type type
)
589 FNQUAL_COMPONENT_CASE
:
598 #ifdef CP_DEMANGLE_DEBUG
601 d_dump (struct demangle_component
*dc
, int indent
)
608 printf ("failed demangling\n");
612 for (i
= 0; i
< indent
; ++i
)
617 case DEMANGLE_COMPONENT_NAME
:
618 printf ("name '%.*s'\n", dc
->u
.s_name
.len
, dc
->u
.s_name
.s
);
620 case DEMANGLE_COMPONENT_TAGGED_NAME
:
621 printf ("tagged name\n");
622 d_dump (dc
->u
.s_binary
.left
, indent
+ 2);
623 d_dump (dc
->u
.s_binary
.right
, indent
+ 2);
625 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
626 printf ("template parameter %ld\n", dc
->u
.s_number
.number
);
628 case DEMANGLE_COMPONENT_TPARM_OBJ
:
629 printf ("template parameter object\n");
631 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
632 printf ("function parameter %ld\n", dc
->u
.s_number
.number
);
634 case DEMANGLE_COMPONENT_CTOR
:
635 printf ("constructor %d\n", (int) dc
->u
.s_ctor
.kind
);
636 d_dump (dc
->u
.s_ctor
.name
, indent
+ 2);
638 case DEMANGLE_COMPONENT_DTOR
:
639 printf ("destructor %d\n", (int) dc
->u
.s_dtor
.kind
);
640 d_dump (dc
->u
.s_dtor
.name
, indent
+ 2);
642 case DEMANGLE_COMPONENT_SUB_STD
:
643 printf ("standard substitution %s\n", dc
->u
.s_string
.string
);
645 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
646 printf ("builtin type %s\n", dc
->u
.s_builtin
.type
->name
);
648 case DEMANGLE_COMPONENT_OPERATOR
:
649 printf ("operator %s\n", dc
->u
.s_operator
.op
->name
);
651 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
652 printf ("extended operator with %d args\n",
653 dc
->u
.s_extended_operator
.args
);
654 d_dump (dc
->u
.s_extended_operator
.name
, indent
+ 2);
657 case DEMANGLE_COMPONENT_QUAL_NAME
:
658 printf ("qualified name\n");
660 case DEMANGLE_COMPONENT_LOCAL_NAME
:
661 printf ("local name\n");
663 case DEMANGLE_COMPONENT_TYPED_NAME
:
664 printf ("typed name\n");
666 case DEMANGLE_COMPONENT_TEMPLATE
:
667 printf ("template\n");
669 case DEMANGLE_COMPONENT_VTABLE
:
672 case DEMANGLE_COMPONENT_VTT
:
675 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
676 printf ("construction vtable\n");
678 case DEMANGLE_COMPONENT_TYPEINFO
:
679 printf ("typeinfo\n");
681 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
682 printf ("typeinfo name\n");
684 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
685 printf ("typeinfo function\n");
687 case DEMANGLE_COMPONENT_THUNK
:
690 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
691 printf ("virtual thunk\n");
693 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
694 printf ("covariant thunk\n");
696 case DEMANGLE_COMPONENT_JAVA_CLASS
:
697 printf ("java class\n");
699 case DEMANGLE_COMPONENT_GUARD
:
702 case DEMANGLE_COMPONENT_REFTEMP
:
703 printf ("reference temporary\n");
705 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
706 printf ("hidden alias\n");
708 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
709 printf ("transaction clone\n");
711 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
712 printf ("non-transaction clone\n");
714 case DEMANGLE_COMPONENT_RESTRICT
:
715 printf ("restrict\n");
717 case DEMANGLE_COMPONENT_VOLATILE
:
718 printf ("volatile\n");
720 case DEMANGLE_COMPONENT_CONST
:
723 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
724 printf ("restrict this\n");
726 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
727 printf ("volatile this\n");
729 case DEMANGLE_COMPONENT_CONST_THIS
:
730 printf ("const this\n");
732 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
733 printf ("reference this\n");
735 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
736 printf ("rvalue reference this\n");
738 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
739 printf ("transaction_safe this\n");
741 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
742 printf ("vendor type qualifier\n");
744 case DEMANGLE_COMPONENT_POINTER
:
745 printf ("pointer\n");
747 case DEMANGLE_COMPONENT_REFERENCE
:
748 printf ("reference\n");
750 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
751 printf ("rvalue reference\n");
753 case DEMANGLE_COMPONENT_COMPLEX
:
754 printf ("complex\n");
756 case DEMANGLE_COMPONENT_IMAGINARY
:
757 printf ("imaginary\n");
759 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
760 printf ("vendor type\n");
762 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
763 printf ("function type\n");
765 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
766 printf ("array type\n");
768 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
769 printf ("pointer to member type\n");
771 case DEMANGLE_COMPONENT_FIXED_TYPE
:
772 printf ("fixed-point type, accum? %d, sat? %d\n",
773 dc
->u
.s_fixed
.accum
, dc
->u
.s_fixed
.sat
);
774 d_dump (dc
->u
.s_fixed
.length
, indent
+ 2);
776 case DEMANGLE_COMPONENT_ARGLIST
:
777 printf ("argument list\n");
779 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
780 printf ("template argument list\n");
782 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
783 printf ("initializer list\n");
785 case DEMANGLE_COMPONENT_CAST
:
788 case DEMANGLE_COMPONENT_CONVERSION
:
789 printf ("conversion operator\n");
791 case DEMANGLE_COMPONENT_NULLARY
:
792 printf ("nullary operator\n");
794 case DEMANGLE_COMPONENT_UNARY
:
795 printf ("unary operator\n");
797 case DEMANGLE_COMPONENT_BINARY
:
798 printf ("binary operator\n");
800 case DEMANGLE_COMPONENT_BINARY_ARGS
:
801 printf ("binary operator arguments\n");
803 case DEMANGLE_COMPONENT_TRINARY
:
804 printf ("trinary operator\n");
806 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
807 printf ("trinary operator arguments 1\n");
809 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
810 printf ("trinary operator arguments 1\n");
812 case DEMANGLE_COMPONENT_LITERAL
:
813 printf ("literal\n");
815 case DEMANGLE_COMPONENT_LITERAL_NEG
:
816 printf ("negative literal\n");
818 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
819 printf ("java resource\n");
821 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
822 printf ("compound name\n");
824 case DEMANGLE_COMPONENT_CHARACTER
:
825 printf ("character '%c'\n", dc
->u
.s_character
.character
);
827 case DEMANGLE_COMPONENT_NUMBER
:
828 printf ("number %ld\n", dc
->u
.s_number
.number
);
830 case DEMANGLE_COMPONENT_DECLTYPE
:
831 printf ("decltype\n");
833 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
834 printf ("pack expansion\n");
836 case DEMANGLE_COMPONENT_TLS_INIT
:
837 printf ("tls init function\n");
839 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
840 printf ("tls wrapper function\n");
842 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
843 printf ("default argument %d\n", dc
->u
.s_unary_num
.num
);
844 d_dump (dc
->u
.s_unary_num
.sub
, indent
+2);
846 case DEMANGLE_COMPONENT_LAMBDA
:
847 printf ("lambda %d\n", dc
->u
.s_unary_num
.num
);
848 d_dump (dc
->u
.s_unary_num
.sub
, indent
+2);
852 d_dump (d_left (dc
), indent
+ 2);
853 d_dump (d_right (dc
), indent
+ 2);
856 #endif /* CP_DEMANGLE_DEBUG */
858 /* Fill in a DEMANGLE_COMPONENT_NAME. */
860 CP_STATIC_IF_GLIBCPP_V3
862 cplus_demangle_fill_name (struct demangle_component
*p
, const char *s
, int len
)
864 if (p
== NULL
|| s
== NULL
|| len
<= 0)
868 p
->type
= DEMANGLE_COMPONENT_NAME
;
870 p
->u
.s_name
.len
= len
;
874 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
876 CP_STATIC_IF_GLIBCPP_V3
878 cplus_demangle_fill_extended_operator (struct demangle_component
*p
, int args
,
879 struct demangle_component
*name
)
881 if (p
== NULL
|| args
< 0 || name
== NULL
)
885 p
->type
= DEMANGLE_COMPONENT_EXTENDED_OPERATOR
;
886 p
->u
.s_extended_operator
.args
= args
;
887 p
->u
.s_extended_operator
.name
= name
;
891 /* Fill in a DEMANGLE_COMPONENT_CTOR. */
893 CP_STATIC_IF_GLIBCPP_V3
895 cplus_demangle_fill_ctor (struct demangle_component
*p
,
896 enum gnu_v3_ctor_kinds kind
,
897 struct demangle_component
*name
)
901 || (int) kind
< gnu_v3_complete_object_ctor
902 || (int) kind
> gnu_v3_object_ctor_group
)
906 p
->type
= DEMANGLE_COMPONENT_CTOR
;
907 p
->u
.s_ctor
.kind
= kind
;
908 p
->u
.s_ctor
.name
= name
;
912 /* Fill in a DEMANGLE_COMPONENT_DTOR. */
914 CP_STATIC_IF_GLIBCPP_V3
916 cplus_demangle_fill_dtor (struct demangle_component
*p
,
917 enum gnu_v3_dtor_kinds kind
,
918 struct demangle_component
*name
)
922 || (int) kind
< gnu_v3_deleting_dtor
923 || (int) kind
> gnu_v3_object_dtor_group
)
927 p
->type
= DEMANGLE_COMPONENT_DTOR
;
928 p
->u
.s_dtor
.kind
= kind
;
929 p
->u
.s_dtor
.name
= name
;
933 /* Add a new component. */
935 static struct demangle_component
*
936 d_make_empty (struct d_info
*di
)
938 struct demangle_component
*p
;
940 if (di
->next_comp
>= di
->num_comps
)
942 p
= &di
->comps
[di
->next_comp
];
949 /* Add a new generic component. */
951 static struct demangle_component
*
952 d_make_comp (struct d_info
*di
, enum demangle_component_type type
,
953 struct demangle_component
*left
,
954 struct demangle_component
*right
)
956 struct demangle_component
*p
;
958 /* We check for errors here. A typical error would be a NULL return
959 from a subroutine. We catch those here, and return NULL
963 /* These types require two parameters. */
964 case DEMANGLE_COMPONENT_QUAL_NAME
:
965 case DEMANGLE_COMPONENT_LOCAL_NAME
:
966 case DEMANGLE_COMPONENT_TYPED_NAME
:
967 case DEMANGLE_COMPONENT_TAGGED_NAME
:
968 case DEMANGLE_COMPONENT_TEMPLATE
:
969 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
970 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
971 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
972 case DEMANGLE_COMPONENT_UNARY
:
973 case DEMANGLE_COMPONENT_BINARY
:
974 case DEMANGLE_COMPONENT_BINARY_ARGS
:
975 case DEMANGLE_COMPONENT_TRINARY
:
976 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
977 case DEMANGLE_COMPONENT_LITERAL
:
978 case DEMANGLE_COMPONENT_LITERAL_NEG
:
979 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
980 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
981 case DEMANGLE_COMPONENT_CLONE
:
982 if (left
== NULL
|| right
== NULL
)
986 /* These types only require one parameter. */
987 case DEMANGLE_COMPONENT_VTABLE
:
988 case DEMANGLE_COMPONENT_VTT
:
989 case DEMANGLE_COMPONENT_TYPEINFO
:
990 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
991 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
992 case DEMANGLE_COMPONENT_THUNK
:
993 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
994 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
995 case DEMANGLE_COMPONENT_JAVA_CLASS
:
996 case DEMANGLE_COMPONENT_GUARD
:
997 case DEMANGLE_COMPONENT_TLS_INIT
:
998 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
999 case DEMANGLE_COMPONENT_REFTEMP
:
1000 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
1001 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
1002 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
1003 case DEMANGLE_COMPONENT_POINTER
:
1004 case DEMANGLE_COMPONENT_REFERENCE
:
1005 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
1006 case DEMANGLE_COMPONENT_COMPLEX
:
1007 case DEMANGLE_COMPONENT_IMAGINARY
:
1008 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
1009 case DEMANGLE_COMPONENT_CAST
:
1010 case DEMANGLE_COMPONENT_CONVERSION
:
1011 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
1012 case DEMANGLE_COMPONENT_DECLTYPE
:
1013 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
1014 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
1015 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
1016 case DEMANGLE_COMPONENT_NULLARY
:
1017 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
1018 case DEMANGLE_COMPONENT_TPARM_OBJ
:
1023 /* This needs a right parameter, but the left parameter can be
1025 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
1026 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
1031 /* These are allowed to have no parameters--in some cases they
1032 will be filled in later. */
1033 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
1034 case DEMANGLE_COMPONENT_RESTRICT
:
1035 case DEMANGLE_COMPONENT_VOLATILE
:
1036 case DEMANGLE_COMPONENT_CONST
:
1037 case DEMANGLE_COMPONENT_ARGLIST
:
1038 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
1039 FNQUAL_COMPONENT_CASE
:
1042 /* Other types should not be seen here. */
1047 p
= d_make_empty (di
);
1051 p
->u
.s_binary
.left
= left
;
1052 p
->u
.s_binary
.right
= right
;
1057 /* Add a new demangle mangled name component. */
1059 static struct demangle_component
*
1060 d_make_demangle_mangled_name (struct d_info
*di
, const char *s
)
1062 if (d_peek_char (di
) != '_' || d_peek_next_char (di
) != 'Z')
1063 return d_make_name (di
, s
, strlen (s
));
1065 return d_encoding (di
, 0);
1068 /* Add a new name component. */
1070 static struct demangle_component
*
1071 d_make_name (struct d_info
*di
, const char *s
, int len
)
1073 struct demangle_component
*p
;
1075 p
= d_make_empty (di
);
1076 if (! cplus_demangle_fill_name (p
, s
, len
))
1081 /* Add a new builtin type component. */
1083 static struct demangle_component
*
1084 d_make_builtin_type (struct d_info
*di
,
1085 const struct demangle_builtin_type_info
*type
)
1087 struct demangle_component
*p
;
1091 p
= d_make_empty (di
);
1094 p
->type
= DEMANGLE_COMPONENT_BUILTIN_TYPE
;
1095 p
->u
.s_builtin
.type
= type
;
1100 /* Add a new operator component. */
1102 static struct demangle_component
*
1103 d_make_operator (struct d_info
*di
, const struct demangle_operator_info
*op
)
1105 struct demangle_component
*p
;
1107 p
= d_make_empty (di
);
1110 p
->type
= DEMANGLE_COMPONENT_OPERATOR
;
1111 p
->u
.s_operator
.op
= op
;
1116 /* Add a new extended operator component. */
1118 static struct demangle_component
*
1119 d_make_extended_operator (struct d_info
*di
, int args
,
1120 struct demangle_component
*name
)
1122 struct demangle_component
*p
;
1124 p
= d_make_empty (di
);
1125 if (! cplus_demangle_fill_extended_operator (p
, args
, name
))
1130 static struct demangle_component
*
1131 d_make_default_arg (struct d_info
*di
, int num
,
1132 struct demangle_component
*sub
)
1134 struct demangle_component
*p
= d_make_empty (di
);
1137 p
->type
= DEMANGLE_COMPONENT_DEFAULT_ARG
;
1138 p
->u
.s_unary_num
.num
= num
;
1139 p
->u
.s_unary_num
.sub
= sub
;
1144 /* Add a new constructor component. */
1146 static struct demangle_component
*
1147 d_make_ctor (struct d_info
*di
, enum gnu_v3_ctor_kinds kind
,
1148 struct demangle_component
*name
)
1150 struct demangle_component
*p
;
1152 p
= d_make_empty (di
);
1153 if (! cplus_demangle_fill_ctor (p
, kind
, name
))
1158 /* Add a new destructor component. */
1160 static struct demangle_component
*
1161 d_make_dtor (struct d_info
*di
, enum gnu_v3_dtor_kinds kind
,
1162 struct demangle_component
*name
)
1164 struct demangle_component
*p
;
1166 p
= d_make_empty (di
);
1167 if (! cplus_demangle_fill_dtor (p
, kind
, name
))
1172 /* Add a new template parameter. */
1174 static struct demangle_component
*
1175 d_make_template_param (struct d_info
*di
, int i
)
1177 struct demangle_component
*p
;
1179 p
= d_make_empty (di
);
1182 p
->type
= DEMANGLE_COMPONENT_TEMPLATE_PARAM
;
1183 p
->u
.s_number
.number
= i
;
1188 /* Add a new function parameter. */
1190 static struct demangle_component
*
1191 d_make_function_param (struct d_info
*di
, int i
)
1193 struct demangle_component
*p
;
1195 p
= d_make_empty (di
);
1198 p
->type
= DEMANGLE_COMPONENT_FUNCTION_PARAM
;
1199 p
->u
.s_number
.number
= i
;
1204 /* Add a new standard substitution component. */
1206 static struct demangle_component
*
1207 d_make_sub (struct d_info
*di
, const char *name
, int len
)
1209 struct demangle_component
*p
;
1211 p
= d_make_empty (di
);
1214 p
->type
= DEMANGLE_COMPONENT_SUB_STD
;
1215 p
->u
.s_string
.string
= name
;
1216 p
->u
.s_string
.len
= len
;
1221 /* <mangled-name> ::= _Z <encoding> [<clone-suffix>]*
1223 TOP_LEVEL is non-zero when called at the top level. */
1225 CP_STATIC_IF_GLIBCPP_V3
1226 struct demangle_component
*
1227 cplus_demangle_mangled_name (struct d_info
*di
, int top_level
)
1229 struct demangle_component
*p
;
1231 if (! d_check_char (di
, '_')
1232 /* Allow missing _ if not at toplevel to work around a
1233 bug in G++ abi-version=2 mangling; see the comment in
1234 write_template_arg. */
1237 if (! d_check_char (di
, 'Z'))
1239 p
= d_encoding (di
, top_level
);
1241 /* If at top level and parsing parameters, check for a clone
1243 if (top_level
&& (di
->options
& DMGL_PARAMS
) != 0)
1244 while (d_peek_char (di
) == '.'
1245 && (IS_LOWER (d_peek_next_char (di
))
1246 || d_peek_next_char (di
) == '_'
1247 || IS_DIGIT (d_peek_next_char (di
))))
1248 p
= d_clone_suffix (di
, p
);
1253 /* Return whether a function should have a return type. The argument
1254 is the function name, which may be qualified in various ways. The
1255 rules are that template functions have return types with some
1256 exceptions, function types which are not part of a function name
1257 mangling have return types with some exceptions, and non-template
1258 function names do not have return types. The exceptions are that
1259 constructors, destructors, and conversion operators do not have
1263 has_return_type (struct demangle_component
*dc
)
1271 case DEMANGLE_COMPONENT_LOCAL_NAME
:
1272 return has_return_type (d_right (dc
));
1273 case DEMANGLE_COMPONENT_TEMPLATE
:
1274 return ! is_ctor_dtor_or_conversion (d_left (dc
));
1275 FNQUAL_COMPONENT_CASE
:
1276 return has_return_type (d_left (dc
));
1280 /* Return whether a name is a constructor, a destructor, or a
1281 conversion operator. */
1284 is_ctor_dtor_or_conversion (struct demangle_component
*dc
)
1292 case DEMANGLE_COMPONENT_QUAL_NAME
:
1293 case DEMANGLE_COMPONENT_LOCAL_NAME
:
1294 return is_ctor_dtor_or_conversion (d_right (dc
));
1295 case DEMANGLE_COMPONENT_CTOR
:
1296 case DEMANGLE_COMPONENT_DTOR
:
1297 case DEMANGLE_COMPONENT_CONVERSION
:
1302 /* <encoding> ::= <(function) name> <bare-function-type>
1306 TOP_LEVEL is non-zero when called at the top level, in which case
1307 if DMGL_PARAMS is not set we do not demangle the function
1308 parameters. We only set this at the top level, because otherwise
1309 we would not correctly demangle names in local scopes. */
1311 static struct demangle_component
*
1312 d_encoding (struct d_info
*di
, int top_level
)
1314 char peek
= d_peek_char (di
);
1315 struct demangle_component
*dc
;
1317 if (peek
== 'G' || peek
== 'T')
1318 dc
= d_special_name (di
);
1324 /* Failed already. */;
1325 else if (top_level
&& (di
->options
& DMGL_PARAMS
) == 0)
1327 /* Strip off any initial CV-qualifiers, as they really apply
1328 to the `this' parameter, and they were not output by the
1329 v2 demangler without DMGL_PARAMS. */
1330 while (is_fnqual_component_type (dc
->type
))
1333 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1334 there may be function-qualifiers on its right argument which
1335 really apply here; this happens when parsing a class
1336 which is local to a function. */
1337 if (dc
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
1339 while (d_right (dc
) != NULL
1340 && is_fnqual_component_type (d_right (dc
)->type
))
1341 d_right (dc
) = d_left (d_right (dc
));
1343 if (d_right (dc
) == NULL
)
1349 peek
= d_peek_char (di
);
1350 if (peek
!= '\0' && peek
!= 'E')
1352 struct demangle_component
*ftype
;
1354 ftype
= d_bare_function_type (di
, has_return_type (dc
));
1357 /* If this is a non-top-level local-name, clear the
1358 return type, so it doesn't confuse the user by
1359 being confused with the return type of whaever
1360 this is nested within. */
1361 if (!top_level
&& dc
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
1362 && ftype
->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
1363 d_left (ftype
) = NULL
;
1365 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TYPED_NAME
,
1377 /* <tagged-name> ::= <name> B <source-name> */
1379 static struct demangle_component
*
1380 d_abi_tags (struct d_info
*di
, struct demangle_component
*dc
)
1382 struct demangle_component
*hold_last_name
;
1385 /* Preserve the last name, so the ABI tag doesn't clobber it. */
1386 hold_last_name
= di
->last_name
;
1388 while (peek
= d_peek_char (di
),
1391 struct demangle_component
*tag
;
1393 tag
= d_source_name (di
);
1394 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TAGGED_NAME
, dc
, tag
);
1397 di
->last_name
= hold_last_name
;
1402 /* <name> ::= <nested-name>
1404 ::= <unscoped-template-name> <template-args>
1407 <unscoped-name> ::= <unqualified-name>
1408 ::= St <unqualified-name>
1410 <unscoped-template-name> ::= <unscoped-name>
1414 static struct demangle_component
*
1415 d_name (struct d_info
*di
)
1417 char peek
= d_peek_char (di
);
1418 struct demangle_component
*dc
;
1423 return d_nested_name (di
);
1426 return d_local_name (di
);
1429 return d_unqualified_name (di
);
1435 if (d_peek_next_char (di
) != 't')
1437 dc
= d_substitution (di
, 0);
1443 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_QUAL_NAME
,
1444 d_make_name (di
, "std", 3),
1445 d_unqualified_name (di
));
1450 if (d_peek_char (di
) != 'I')
1452 /* The grammar does not permit this case to occur if we
1453 called d_substitution() above (i.e., subst == 1). We
1454 don't bother to check. */
1458 /* This is <template-args>, which means that we just saw
1459 <unscoped-template-name>, which is a substitution
1460 candidate if we didn't just get it from a
1464 if (! d_add_substitution (di
, dc
))
1467 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, dc
,
1468 d_template_args (di
));
1476 dc
= d_unqualified_name (di
);
1477 if (d_peek_char (di
) == 'I')
1479 /* This is <template-args>, which means that we just saw
1480 <unscoped-template-name>, which is a substitution
1482 if (! d_add_substitution (di
, dc
))
1484 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, dc
,
1485 d_template_args (di
));
1491 /* <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
1492 ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
1495 static struct demangle_component
*
1496 d_nested_name (struct d_info
*di
)
1498 struct demangle_component
*ret
;
1499 struct demangle_component
**pret
;
1500 struct demangle_component
*rqual
;
1502 if (! d_check_char (di
, 'N'))
1505 pret
= d_cv_qualifiers (di
, &ret
, 1);
1509 /* Parse the ref-qualifier now and then attach it
1510 once we have something to attach it to. */
1511 rqual
= d_ref_qualifier (di
, NULL
);
1513 *pret
= d_prefix (di
);
1519 d_left (rqual
) = ret
;
1523 if (! d_check_char (di
, 'E'))
1529 /* <prefix> ::= <prefix> <unqualified-name>
1530 ::= <template-prefix> <template-args>
1531 ::= <template-param>
1536 <template-prefix> ::= <prefix> <(template) unqualified-name>
1537 ::= <template-param>
1541 static struct demangle_component
*
1542 d_prefix (struct d_info
*di
)
1544 struct demangle_component
*ret
= NULL
;
1549 enum demangle_component_type comb_type
;
1550 struct demangle_component
*dc
;
1552 peek
= d_peek_char (di
);
1556 /* The older code accepts a <local-name> here, but I don't see
1557 that in the grammar. The older code does not accept a
1558 <template-param> here. */
1560 comb_type
= DEMANGLE_COMPONENT_QUAL_NAME
;
1563 char peek2
= d_peek_next_char (di
);
1564 if (peek2
== 'T' || peek2
== 't')
1566 dc
= cplus_demangle_type (di
);
1568 /* Destructor name. */
1569 dc
= d_unqualified_name (di
);
1571 else if (IS_DIGIT (peek
)
1576 dc
= d_unqualified_name (di
);
1577 else if (peek
== 'S')
1578 dc
= d_substitution (di
, 1);
1579 else if (peek
== 'I')
1583 comb_type
= DEMANGLE_COMPONENT_TEMPLATE
;
1584 dc
= d_template_args (di
);
1586 else if (peek
== 'T')
1587 dc
= d_template_param (di
);
1588 else if (peek
== 'E')
1590 else if (peek
== 'M')
1592 /* Initializer scope for a lambda. We don't need to represent
1593 this; the normal code will just treat the variable as a type
1594 scope, which gives appropriate output. */
1606 ret
= d_make_comp (di
, comb_type
, ret
, dc
);
1608 if (peek
!= 'S' && d_peek_char (di
) != 'E')
1610 if (! d_add_substitution (di
, ret
))
1616 /* <unqualified-name> ::= <operator-name>
1617 ::= <ctor-dtor-name>
1619 ::= <local-source-name>
1621 <local-source-name> ::= L <source-name> <discriminator>
1624 static struct demangle_component
*
1625 d_unqualified_name (struct d_info
*di
)
1627 struct demangle_component
*ret
;
1630 peek
= d_peek_char (di
);
1631 if (IS_DIGIT (peek
))
1632 ret
= d_source_name (di
);
1633 else if (IS_LOWER (peek
))
1635 if (peek
== 'o' && d_peek_next_char (di
) == 'n')
1637 ret
= d_operator_name (di
);
1638 if (ret
!= NULL
&& ret
->type
== DEMANGLE_COMPONENT_OPERATOR
)
1640 di
->expansion
+= sizeof "operator" + ret
->u
.s_operator
.op
->len
- 2;
1641 if (!strcmp (ret
->u
.s_operator
.op
->code
, "li"))
1642 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, ret
,
1643 d_source_name (di
));
1646 else if (peek
== 'C' || peek
== 'D')
1647 ret
= d_ctor_dtor_name (di
);
1648 else if (peek
== 'L')
1652 ret
= d_source_name (di
);
1655 if (! d_discriminator (di
))
1658 else if (peek
== 'U')
1660 switch (d_peek_next_char (di
))
1663 ret
= d_lambda (di
);
1666 ret
= d_unnamed_type (di
);
1675 if (d_peek_char (di
) == 'B')
1676 ret
= d_abi_tags (di
, ret
);
1680 /* <source-name> ::= <(positive length) number> <identifier> */
1682 static struct demangle_component
*
1683 d_source_name (struct d_info
*di
)
1686 struct demangle_component
*ret
;
1688 len
= d_number (di
);
1691 ret
= d_identifier (di
, len
);
1692 di
->last_name
= ret
;
1696 /* number ::= [n] <(non-negative decimal integer)> */
1699 d_number (struct d_info
*di
)
1706 peek
= d_peek_char (di
);
1711 peek
= d_peek_char (di
);
1717 if (! IS_DIGIT (peek
))
1723 if (ret
> ((INT_MAX
- (peek
- '0')) / 10))
1725 ret
= ret
* 10 + (peek
- '0');
1727 peek
= d_peek_char (di
);
1731 /* Like d_number, but returns a demangle_component. */
1733 static struct demangle_component
*
1734 d_number_component (struct d_info
*di
)
1736 struct demangle_component
*ret
= d_make_empty (di
);
1739 ret
->type
= DEMANGLE_COMPONENT_NUMBER
;
1740 ret
->u
.s_number
.number
= d_number (di
);
1745 /* identifier ::= <(unqualified source code identifier)> */
1747 static struct demangle_component
*
1748 d_identifier (struct d_info
*di
, int len
)
1754 if (di
->send
- name
< len
)
1757 d_advance (di
, len
);
1759 /* A Java mangled name may have a trailing '$' if it is a C++
1760 keyword. This '$' is not included in the length count. We just
1762 if ((di
->options
& DMGL_JAVA
) != 0
1763 && d_peek_char (di
) == '$')
1766 /* Look for something which looks like a gcc encoding of an
1767 anonymous namespace, and replace it with a more user friendly
1769 if (len
>= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN
+ 2
1770 && memcmp (name
, ANONYMOUS_NAMESPACE_PREFIX
,
1771 ANONYMOUS_NAMESPACE_PREFIX_LEN
) == 0)
1775 s
= name
+ ANONYMOUS_NAMESPACE_PREFIX_LEN
;
1776 if ((*s
== '.' || *s
== '_' || *s
== '$')
1779 di
->expansion
-= len
- sizeof "(anonymous namespace)";
1780 return d_make_name (di
, "(anonymous namespace)",
1781 sizeof "(anonymous namespace)" - 1);
1785 return d_make_name (di
, name
, len
);
1788 /* operator_name ::= many different two character encodings.
1790 ::= v <digit> <source-name>
1792 This list is sorted for binary search. */
1794 #define NL(s) s, (sizeof s) - 1
1796 CP_STATIC_IF_GLIBCPP_V3
1797 const struct demangle_operator_info cplus_demangle_operators
[] =
1799 { "aN", NL ("&="), 2 },
1800 { "aS", NL ("="), 2 },
1801 { "aa", NL ("&&"), 2 },
1802 { "ad", NL ("&"), 1 },
1803 { "an", NL ("&"), 2 },
1804 { "at", NL ("alignof "), 1 },
1805 { "aw", NL ("co_await "), 1 },
1806 { "az", NL ("alignof "), 1 },
1807 { "cc", NL ("const_cast"), 2 },
1808 { "cl", NL ("()"), 2 },
1809 { "cm", NL (","), 2 },
1810 { "co", NL ("~"), 1 },
1811 { "dV", NL ("/="), 2 },
1812 { "dX", NL ("[...]="), 3 }, /* [expr...expr] = expr */
1813 { "da", NL ("delete[] "), 1 },
1814 { "dc", NL ("dynamic_cast"), 2 },
1815 { "de", NL ("*"), 1 },
1816 { "di", NL ("="), 2 }, /* .name = expr */
1817 { "dl", NL ("delete "), 1 },
1818 { "ds", NL (".*"), 2 },
1819 { "dt", NL ("."), 2 },
1820 { "dv", NL ("/"), 2 },
1821 { "dx", NL ("]="), 2 }, /* [expr] = expr */
1822 { "eO", NL ("^="), 2 },
1823 { "eo", NL ("^"), 2 },
1824 { "eq", NL ("=="), 2 },
1825 { "fL", NL ("..."), 3 },
1826 { "fR", NL ("..."), 3 },
1827 { "fl", NL ("..."), 2 },
1828 { "fr", NL ("..."), 2 },
1829 { "ge", NL (">="), 2 },
1830 { "gs", NL ("::"), 1 },
1831 { "gt", NL (">"), 2 },
1832 { "ix", NL ("[]"), 2 },
1833 { "lS", NL ("<<="), 2 },
1834 { "le", NL ("<="), 2 },
1835 { "li", NL ("operator\"\" "), 1 },
1836 { "ls", NL ("<<"), 2 },
1837 { "lt", NL ("<"), 2 },
1838 { "mI", NL ("-="), 2 },
1839 { "mL", NL ("*="), 2 },
1840 { "mi", NL ("-"), 2 },
1841 { "ml", NL ("*"), 2 },
1842 { "mm", NL ("--"), 1 },
1843 { "na", NL ("new[]"), 3 },
1844 { "ne", NL ("!="), 2 },
1845 { "ng", NL ("-"), 1 },
1846 { "nt", NL ("!"), 1 },
1847 { "nw", NL ("new"), 3 },
1848 { "oR", NL ("|="), 2 },
1849 { "oo", NL ("||"), 2 },
1850 { "or", NL ("|"), 2 },
1851 { "pL", NL ("+="), 2 },
1852 { "pl", NL ("+"), 2 },
1853 { "pm", NL ("->*"), 2 },
1854 { "pp", NL ("++"), 1 },
1855 { "ps", NL ("+"), 1 },
1856 { "pt", NL ("->"), 2 },
1857 { "qu", NL ("?"), 3 },
1858 { "rM", NL ("%="), 2 },
1859 { "rS", NL (">>="), 2 },
1860 { "rc", NL ("reinterpret_cast"), 2 },
1861 { "rm", NL ("%"), 2 },
1862 { "rs", NL (">>"), 2 },
1863 { "sP", NL ("sizeof..."), 1 },
1864 { "sZ", NL ("sizeof..."), 1 },
1865 { "sc", NL ("static_cast"), 2 },
1866 { "ss", NL ("<=>"), 2 },
1867 { "st", NL ("sizeof "), 1 },
1868 { "sz", NL ("sizeof "), 1 },
1869 { "tr", NL ("throw"), 0 },
1870 { "tw", NL ("throw "), 1 },
1871 { NULL
, NULL
, 0, 0 }
1874 static struct demangle_component
*
1875 d_operator_name (struct d_info
*di
)
1880 c1
= d_next_char (di
);
1881 c2
= d_next_char (di
);
1882 if (c1
== 'v' && IS_DIGIT (c2
))
1883 return d_make_extended_operator (di
, c2
- '0', d_source_name (di
));
1884 else if (c1
== 'c' && c2
== 'v')
1886 struct demangle_component
*type
;
1887 int was_conversion
= di
->is_conversion
;
1888 struct demangle_component
*res
;
1890 di
->is_conversion
= ! di
->is_expression
;
1891 type
= cplus_demangle_type (di
);
1892 if (di
->is_conversion
)
1893 res
= d_make_comp (di
, DEMANGLE_COMPONENT_CONVERSION
, type
, NULL
);
1895 res
= d_make_comp (di
, DEMANGLE_COMPONENT_CAST
, type
, NULL
);
1896 di
->is_conversion
= was_conversion
;
1901 /* LOW is the inclusive lower bound. */
1903 /* HIGH is the exclusive upper bound. We subtract one to ignore
1904 the sentinel at the end of the array. */
1905 int high
= ((sizeof (cplus_demangle_operators
)
1906 / sizeof (cplus_demangle_operators
[0]))
1912 const struct demangle_operator_info
*p
;
1914 i
= low
+ (high
- low
) / 2;
1915 p
= cplus_demangle_operators
+ i
;
1917 if (c1
== p
->code
[0] && c2
== p
->code
[1])
1918 return d_make_operator (di
, p
);
1920 if (c1
< p
->code
[0] || (c1
== p
->code
[0] && c2
< p
->code
[1]))
1930 static struct demangle_component
*
1931 d_make_character (struct d_info
*di
, int c
)
1933 struct demangle_component
*p
;
1934 p
= d_make_empty (di
);
1937 p
->type
= DEMANGLE_COMPONENT_CHARACTER
;
1938 p
->u
.s_character
.character
= c
;
1943 static struct demangle_component
*
1944 d_java_resource (struct d_info
*di
)
1946 struct demangle_component
*p
= NULL
;
1947 struct demangle_component
*next
= NULL
;
1952 len
= d_number (di
);
1956 /* Eat the leading '_'. */
1957 if (d_next_char (di
) != '_')
1970 /* Each chunk is either a '$' escape... */
1988 next
= d_make_character (di
, c
);
1996 /* ... or a sequence of characters. */
1999 while (i
< len
&& str
[i
] && str
[i
] != '$')
2002 next
= d_make_name (di
, str
, i
);
2015 p
= d_make_comp (di
, DEMANGLE_COMPONENT_COMPOUND_NAME
, p
, next
);
2021 p
= d_make_comp (di
, DEMANGLE_COMPONENT_JAVA_RESOURCE
, p
, NULL
);
2026 /* <special-name> ::= TV <type>
2030 ::= TA <template-arg>
2031 ::= GV <(object) name>
2032 ::= T <call-offset> <(base) encoding>
2033 ::= Tc <call-offset> <call-offset> <(base) encoding>
2034 Also g++ extensions:
2035 ::= TC <type> <(offset) number> _ <(base) type>
2040 ::= Gr <resource name>
2045 static struct demangle_component
*
2046 d_special_name (struct d_info
*di
)
2048 di
->expansion
+= 20;
2049 if (d_check_char (di
, 'T'))
2051 switch (d_next_char (di
))
2055 return d_make_comp (di
, DEMANGLE_COMPONENT_VTABLE
,
2056 cplus_demangle_type (di
), NULL
);
2058 di
->expansion
-= 10;
2059 return d_make_comp (di
, DEMANGLE_COMPONENT_VTT
,
2060 cplus_demangle_type (di
), NULL
);
2062 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO
,
2063 cplus_demangle_type (di
), NULL
);
2065 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO_NAME
,
2066 cplus_demangle_type (di
), NULL
);
2069 if (! d_call_offset (di
, 'h'))
2071 return d_make_comp (di
, DEMANGLE_COMPONENT_THUNK
,
2072 d_encoding (di
, 0), NULL
);
2075 if (! d_call_offset (di
, 'v'))
2077 return d_make_comp (di
, DEMANGLE_COMPONENT_VIRTUAL_THUNK
,
2078 d_encoding (di
, 0), NULL
);
2081 if (! d_call_offset (di
, '\0'))
2083 if (! d_call_offset (di
, '\0'))
2085 return d_make_comp (di
, DEMANGLE_COMPONENT_COVARIANT_THUNK
,
2086 d_encoding (di
, 0), NULL
);
2090 struct demangle_component
*derived_type
;
2092 struct demangle_component
*base_type
;
2094 derived_type
= cplus_demangle_type (di
);
2095 offset
= d_number (di
);
2098 if (! d_check_char (di
, '_'))
2100 base_type
= cplus_demangle_type (di
);
2101 /* We don't display the offset. FIXME: We should display
2102 it in verbose mode. */
2104 return d_make_comp (di
, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
,
2105 base_type
, derived_type
);
2109 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO_FN
,
2110 cplus_demangle_type (di
), NULL
);
2112 return d_make_comp (di
, DEMANGLE_COMPONENT_JAVA_CLASS
,
2113 cplus_demangle_type (di
), NULL
);
2116 return d_make_comp (di
, DEMANGLE_COMPONENT_TLS_INIT
,
2120 return d_make_comp (di
, DEMANGLE_COMPONENT_TLS_WRAPPER
,
2124 return d_make_comp (di
, DEMANGLE_COMPONENT_TPARM_OBJ
,
2125 d_template_arg (di
), NULL
);
2131 else if (d_check_char (di
, 'G'))
2133 switch (d_next_char (di
))
2136 return d_make_comp (di
, DEMANGLE_COMPONENT_GUARD
,
2141 struct demangle_component
*name
= d_name (di
);
2142 return d_make_comp (di
, DEMANGLE_COMPONENT_REFTEMP
, name
,
2143 d_number_component (di
));
2147 return d_make_comp (di
, DEMANGLE_COMPONENT_HIDDEN_ALIAS
,
2148 d_encoding (di
, 0), NULL
);
2151 switch (d_next_char (di
))
2154 return d_make_comp (di
, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
,
2155 d_encoding (di
, 0), NULL
);
2157 /* ??? The proposal is that other letters (such as 'h') stand
2158 for different variants of transaction cloning, such as
2159 compiling directly for hardware transaction support. But
2160 they still should all be transactional clones of some sort
2161 so go ahead and call them that. */
2163 return d_make_comp (di
, DEMANGLE_COMPONENT_TRANSACTION_CLONE
,
2164 d_encoding (di
, 0), NULL
);
2168 return d_java_resource (di
);
2178 /* <call-offset> ::= h <nv-offset> _
2181 <nv-offset> ::= <(offset) number>
2183 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
2185 The C parameter, if not '\0', is a character we just read which is
2186 the start of the <call-offset>.
2188 We don't display the offset information anywhere. FIXME: We should
2189 display it in verbose mode. */
2192 d_call_offset (struct d_info
*di
, int c
)
2195 c
= d_next_char (di
);
2202 if (! d_check_char (di
, '_'))
2209 if (! d_check_char (di
, '_'))
2215 /* <ctor-dtor-name> ::= C1
2223 static struct demangle_component
*
2224 d_ctor_dtor_name (struct d_info
*di
)
2226 if (di
->last_name
!= NULL
)
2228 if (di
->last_name
->type
== DEMANGLE_COMPONENT_NAME
)
2229 di
->expansion
+= di
->last_name
->u
.s_name
.len
;
2230 else if (di
->last_name
->type
== DEMANGLE_COMPONENT_SUB_STD
)
2231 di
->expansion
+= di
->last_name
->u
.s_string
.len
;
2233 switch (d_peek_char (di
))
2237 enum gnu_v3_ctor_kinds kind
;
2240 if (d_peek_next_char (di
) == 'I')
2246 switch (d_peek_next_char (di
))
2249 kind
= gnu_v3_complete_object_ctor
;
2252 kind
= gnu_v3_base_object_ctor
;
2255 kind
= gnu_v3_complete_object_allocating_ctor
;
2258 kind
= gnu_v3_unified_ctor
;
2261 kind
= gnu_v3_object_ctor_group
;
2270 cplus_demangle_type (di
);
2272 return d_make_ctor (di
, kind
, di
->last_name
);
2277 enum gnu_v3_dtor_kinds kind
;
2279 switch (d_peek_next_char (di
))
2282 kind
= gnu_v3_deleting_dtor
;
2285 kind
= gnu_v3_complete_object_dtor
;
2288 kind
= gnu_v3_base_object_dtor
;
2290 /* digit '3' is not used */
2292 kind
= gnu_v3_unified_dtor
;
2295 kind
= gnu_v3_object_dtor_group
;
2301 return d_make_dtor (di
, kind
, di
->last_name
);
2309 /* True iff we're looking at an order-insensitive type-qualifier, including
2310 function-type-qualifiers. */
2313 next_is_type_qual (struct d_info
*di
)
2315 char peek
= d_peek_char (di
);
2316 if (peek
== 'r' || peek
== 'V' || peek
== 'K')
2320 peek
= d_peek_next_char (di
);
2321 if (peek
== 'x' || peek
== 'o' || peek
== 'O' || peek
== 'w')
2327 /* <type> ::= <builtin-type>
2329 ::= <class-enum-type>
2331 ::= <pointer-to-member-type>
2332 ::= <template-param>
2333 ::= <template-template-param> <template-args>
2335 ::= <CV-qualifiers> <type>
2338 ::= O <type> (C++0x)
2341 ::= U <source-name> <type>
2343 <builtin-type> ::= various one letter codes
2347 CP_STATIC_IF_GLIBCPP_V3
2348 const struct demangle_builtin_type_info
2349 cplus_demangle_builtin_types
[D_BUILTIN_TYPE_COUNT
] =
2351 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT
},
2352 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL
},
2353 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT
},
2354 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT
},
2355 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT
},
2356 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT
},
2357 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT
},
2358 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT
},
2359 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT
},
2360 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED
},
2361 /* k */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2362 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG
},
2363 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG
},
2364 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT
},
2365 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2367 /* p */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2368 /* q */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2369 /* r */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2370 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT
},
2371 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT
},
2372 /* u */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2373 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID
},
2374 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT
},
2375 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG
},
2376 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2377 D_PRINT_UNSIGNED_LONG_LONG
},
2378 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT
},
2379 /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT
},
2380 /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT
},
2381 /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT
},
2382 /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT
},
2383 /* 30 */ { NL ("char8_t"), NL ("char8_t"), D_PRINT_DEFAULT
},
2384 /* 31 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT
},
2385 /* 32 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT
},
2386 /* 33 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"),
2390 CP_STATIC_IF_GLIBCPP_V3
2391 struct demangle_component
*
2392 cplus_demangle_type (struct d_info
*di
)
2395 struct demangle_component
*ret
;
2398 /* The ABI specifies that when CV-qualifiers are used, the base type
2399 is substitutable, and the fully qualified type is substitutable,
2400 but the base type with a strict subset of the CV-qualifiers is
2401 not substitutable. The natural recursive implementation of the
2402 CV-qualifiers would cause subsets to be substitutable, so instead
2403 we pull them all off now.
2405 FIXME: The ABI says that order-insensitive vendor qualifiers
2406 should be handled in the same way, but we have no way to tell
2407 which vendor qualifiers are order-insensitive and which are
2408 order-sensitive. So we just assume that they are all
2409 order-sensitive. g++ 3.4 supports only one vendor qualifier,
2410 __vector, and it treats it as order-sensitive when mangling
2413 if (next_is_type_qual (di
))
2415 struct demangle_component
**pret
;
2417 pret
= d_cv_qualifiers (di
, &ret
, 0);
2420 if (d_peek_char (di
) == 'F')
2422 /* cv-qualifiers before a function type apply to 'this',
2423 so avoid adding the unqualified function type to
2424 the substitution list. */
2425 *pret
= d_function_type (di
);
2428 *pret
= cplus_demangle_type (di
);
2431 if ((*pret
)->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
2432 || (*pret
)->type
== DEMANGLE_COMPONENT_REFERENCE_THIS
)
2434 /* Move the ref-qualifier outside the cv-qualifiers so that
2435 they are printed in the right order. */
2436 struct demangle_component
*fn
= d_left (*pret
);
2437 d_left (*pret
) = ret
;
2441 if (! d_add_substitution (di
, ret
))
2448 peek
= d_peek_char (di
);
2451 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2452 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
2453 case 'o': case 's': case 't':
2454 case 'v': case 'w': case 'x': case 'y': case 'z':
2455 ret
= d_make_builtin_type (di
,
2456 &cplus_demangle_builtin_types
[peek
- 'a']);
2457 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2464 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_VENDOR_TYPE
,
2465 d_source_name (di
), NULL
);
2469 ret
= d_function_type (di
);
2472 case '0': case '1': case '2': case '3': case '4':
2473 case '5': case '6': case '7': case '8': case '9':
2476 ret
= d_class_enum_type (di
);
2480 ret
= d_array_type (di
);
2484 ret
= d_pointer_to_member_type (di
);
2488 ret
= d_template_param (di
);
2489 if (d_peek_char (di
) == 'I')
2491 /* This may be <template-template-param> <template-args>.
2492 If this is the type for a conversion operator, we can
2493 have a <template-template-param> here only by following
2494 a derivation like this:
2497 -> <template-prefix> <template-args>
2498 -> <prefix> <template-unqualified-name> <template-args>
2499 -> <unqualified-name> <template-unqualified-name> <template-args>
2500 -> <source-name> <template-unqualified-name> <template-args>
2501 -> <source-name> <operator-name> <template-args>
2502 -> <source-name> cv <type> <template-args>
2503 -> <source-name> cv <template-template-param> <template-args> <template-args>
2505 where the <template-args> is followed by another.
2506 Otherwise, we must have a derivation like this:
2509 -> <template-prefix> <template-args>
2510 -> <prefix> <template-unqualified-name> <template-args>
2511 -> <unqualified-name> <template-unqualified-name> <template-args>
2512 -> <source-name> <template-unqualified-name> <template-args>
2513 -> <source-name> <operator-name> <template-args>
2514 -> <source-name> cv <type> <template-args>
2515 -> <source-name> cv <template-param> <template-args>
2517 where we need to leave the <template-args> to be processed
2518 by d_prefix (following the <template-prefix>).
2520 The <template-template-param> part is a substitution
2522 if (! di
->is_conversion
)
2524 if (! d_add_substitution (di
, ret
))
2526 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2527 d_template_args (di
));
2531 struct demangle_component
*args
;
2532 struct d_info_checkpoint checkpoint
;
2534 d_checkpoint (di
, &checkpoint
);
2535 args
= d_template_args (di
);
2536 if (d_peek_char (di
) == 'I')
2538 if (! d_add_substitution (di
, ret
))
2540 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2544 d_backtrack (di
, &checkpoint
);
2550 /* If this is a special substitution, then it is the start of
2551 <class-enum-type>. */
2555 peek_next
= d_peek_next_char (di
);
2556 if (IS_DIGIT (peek_next
)
2558 || IS_UPPER (peek_next
))
2560 ret
= d_substitution (di
, 0);
2561 /* The substituted name may have been a template name and
2562 may be followed by tepmlate args. */
2563 if (d_peek_char (di
) == 'I')
2564 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2565 d_template_args (di
));
2571 ret
= d_class_enum_type (di
);
2572 /* If the substitution was a complete type, then it is not
2573 a new substitution candidate. However, if the
2574 substitution was followed by template arguments, then
2575 the whole thing is a substitution candidate. */
2576 if (ret
!= NULL
&& ret
->type
== DEMANGLE_COMPONENT_SUB_STD
)
2584 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_RVALUE_REFERENCE
,
2585 cplus_demangle_type (di
), NULL
);
2590 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_POINTER
,
2591 cplus_demangle_type (di
), NULL
);
2596 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_REFERENCE
,
2597 cplus_demangle_type (di
), NULL
);
2602 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_COMPLEX
,
2603 cplus_demangle_type (di
), NULL
);
2608 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_IMAGINARY
,
2609 cplus_demangle_type (di
), NULL
);
2614 ret
= d_source_name (di
);
2615 if (d_peek_char (di
) == 'I')
2616 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2617 d_template_args (di
));
2618 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
,
2619 cplus_demangle_type (di
), ret
);
2625 peek
= d_next_char (di
);
2630 /* decltype (expression) */
2631 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_DECLTYPE
,
2632 d_expression (di
), NULL
);
2633 if (ret
&& d_next_char (di
) != 'E')
2639 /* Pack expansion. */
2640 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_PACK_EXPANSION
,
2641 cplus_demangle_type (di
), NULL
);
2647 ret
= d_make_name (di
, "auto", 4);
2650 /* decltype(auto) */
2651 ret
= d_make_name (di
, "decltype(auto)", 14);
2655 /* 32-bit decimal floating point */
2656 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[26]);
2657 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2661 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[27]);
2662 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2666 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[28]);
2667 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2670 /* 16-bit half-precision FP */
2671 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[29]);
2672 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2676 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[30]);
2677 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2681 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[31]);
2682 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2686 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[32]);
2687 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2691 /* Fixed point types. DF<int bits><length><fract bits><sat> */
2692 ret
= d_make_empty (di
);
2693 ret
->type
= DEMANGLE_COMPONENT_FIXED_TYPE
;
2694 if ((ret
->u
.s_fixed
.accum
= IS_DIGIT (d_peek_char (di
))))
2695 /* For demangling we don't care about the bits. */
2697 ret
->u
.s_fixed
.length
= cplus_demangle_type (di
);
2698 if (ret
->u
.s_fixed
.length
== NULL
)
2701 peek
= d_next_char (di
);
2702 ret
->u
.s_fixed
.sat
= (peek
== 's');
2706 ret
= d_vector_type (di
);
2711 /* decltype(nullptr) */
2712 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[33]);
2713 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2727 if (! d_add_substitution (di
, ret
))
2734 /* <CV-qualifiers> ::= [r] [V] [K] [Dx] */
2736 static struct demangle_component
**
2737 d_cv_qualifiers (struct d_info
*di
,
2738 struct demangle_component
**pret
, int member_fn
)
2740 struct demangle_component
**pstart
;
2744 peek
= d_peek_char (di
);
2745 while (next_is_type_qual (di
))
2747 enum demangle_component_type t
;
2748 struct demangle_component
*right
= NULL
;
2754 ? DEMANGLE_COMPONENT_RESTRICT_THIS
2755 : DEMANGLE_COMPONENT_RESTRICT
);
2756 di
->expansion
+= sizeof "restrict";
2758 else if (peek
== 'V')
2761 ? DEMANGLE_COMPONENT_VOLATILE_THIS
2762 : DEMANGLE_COMPONENT_VOLATILE
);
2763 di
->expansion
+= sizeof "volatile";
2765 else if (peek
== 'K')
2768 ? DEMANGLE_COMPONENT_CONST_THIS
2769 : DEMANGLE_COMPONENT_CONST
);
2770 di
->expansion
+= sizeof "const";
2774 peek
= d_next_char (di
);
2777 t
= DEMANGLE_COMPONENT_TRANSACTION_SAFE
;
2778 di
->expansion
+= sizeof "transaction_safe";
2780 else if (peek
== 'o'
2783 t
= DEMANGLE_COMPONENT_NOEXCEPT
;
2784 di
->expansion
+= sizeof "noexcept";
2787 right
= d_expression (di
);
2790 if (! d_check_char (di
, 'E'))
2794 else if (peek
== 'w')
2796 t
= DEMANGLE_COMPONENT_THROW_SPEC
;
2797 di
->expansion
+= sizeof "throw";
2798 right
= d_parmlist (di
);
2801 if (! d_check_char (di
, 'E'))
2808 *pret
= d_make_comp (di
, t
, NULL
, right
);
2811 pret
= &d_left (*pret
);
2813 peek
= d_peek_char (di
);
2816 if (!member_fn
&& peek
== 'F')
2818 while (pstart
!= pret
)
2820 switch ((*pstart
)->type
)
2822 case DEMANGLE_COMPONENT_RESTRICT
:
2823 (*pstart
)->type
= DEMANGLE_COMPONENT_RESTRICT_THIS
;
2825 case DEMANGLE_COMPONENT_VOLATILE
:
2826 (*pstart
)->type
= DEMANGLE_COMPONENT_VOLATILE_THIS
;
2828 case DEMANGLE_COMPONENT_CONST
:
2829 (*pstart
)->type
= DEMANGLE_COMPONENT_CONST_THIS
;
2834 pstart
= &d_left (*pstart
);
2841 /* <ref-qualifier> ::= R
2844 static struct demangle_component
*
2845 d_ref_qualifier (struct d_info
*di
, struct demangle_component
*sub
)
2847 struct demangle_component
*ret
= sub
;
2850 peek
= d_peek_char (di
);
2851 if (peek
== 'R' || peek
== 'O')
2853 enum demangle_component_type t
;
2856 t
= DEMANGLE_COMPONENT_REFERENCE_THIS
;
2857 di
->expansion
+= sizeof "&";
2861 t
= DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
;
2862 di
->expansion
+= sizeof "&&";
2866 ret
= d_make_comp (di
, t
, ret
, NULL
);
2872 /* <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] [T] E */
2874 static struct demangle_component
*
2875 d_function_type (struct d_info
*di
)
2877 struct demangle_component
*ret
= NULL
;
2879 if ((di
->options
& DMGL_NO_RECURSE_LIMIT
) == 0)
2881 if (di
->recursion_level
> DEMANGLE_RECURSION_LIMIT
)
2882 /* FIXME: There ought to be a way to report
2883 that the recursion limit has been reached. */
2886 di
->recursion_level
++;
2889 if (d_check_char (di
, 'F'))
2891 if (d_peek_char (di
) == 'Y')
2893 /* Function has C linkage. We don't print this information.
2894 FIXME: We should print it in verbose mode. */
2897 ret
= d_bare_function_type (di
, 1);
2898 ret
= d_ref_qualifier (di
, ret
);
2900 if (! d_check_char (di
, 'E'))
2904 if ((di
->options
& DMGL_NO_RECURSE_LIMIT
) == 0)
2905 di
->recursion_level
--;
2911 static struct demangle_component
*
2912 d_parmlist (struct d_info
*di
)
2914 struct demangle_component
*tl
;
2915 struct demangle_component
**ptl
;
2921 struct demangle_component
*type
;
2923 char peek
= d_peek_char (di
);
2924 if (peek
== '\0' || peek
== 'E' || peek
== '.')
2926 if ((peek
== 'R' || peek
== 'O')
2927 && d_peek_next_char (di
) == 'E')
2928 /* Function ref-qualifier, not a ref prefix for a parameter type. */
2930 type
= cplus_demangle_type (di
);
2933 *ptl
= d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, type
, NULL
);
2936 ptl
= &d_right (*ptl
);
2939 /* There should be at least one parameter type besides the optional
2940 return type. A function which takes no arguments will have a
2941 single parameter type void. */
2945 /* If we have a single parameter type void, omit it. */
2946 if (d_right (tl
) == NULL
2947 && d_left (tl
)->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
2948 && d_left (tl
)->u
.s_builtin
.type
->print
== D_PRINT_VOID
)
2950 di
->expansion
-= d_left (tl
)->u
.s_builtin
.type
->len
;
2957 /* <bare-function-type> ::= [J]<type>+ */
2959 static struct demangle_component
*
2960 d_bare_function_type (struct d_info
*di
, int has_return_type
)
2962 struct demangle_component
*return_type
;
2963 struct demangle_component
*tl
;
2966 /* Detect special qualifier indicating that the first argument
2967 is the return type. */
2968 peek
= d_peek_char (di
);
2972 has_return_type
= 1;
2975 if (has_return_type
)
2977 return_type
= cplus_demangle_type (di
);
2978 if (return_type
== NULL
)
2984 tl
= d_parmlist (di
);
2988 return d_make_comp (di
, DEMANGLE_COMPONENT_FUNCTION_TYPE
,
2992 /* <class-enum-type> ::= <name> */
2994 static struct demangle_component
*
2995 d_class_enum_type (struct d_info
*di
)
3000 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
3001 ::= A [<(dimension) expression>] _ <(element) type>
3004 static struct demangle_component
*
3005 d_array_type (struct d_info
*di
)
3008 struct demangle_component
*dim
;
3010 if (! d_check_char (di
, 'A'))
3013 peek
= d_peek_char (di
);
3016 else if (IS_DIGIT (peek
))
3024 peek
= d_peek_char (di
);
3026 while (IS_DIGIT (peek
));
3027 dim
= d_make_name (di
, s
, d_str (di
) - s
);
3033 dim
= d_expression (di
);
3038 if (! d_check_char (di
, '_'))
3041 return d_make_comp (di
, DEMANGLE_COMPONENT_ARRAY_TYPE
, dim
,
3042 cplus_demangle_type (di
));
3045 /* <vector-type> ::= Dv <number> _ <type>
3046 ::= Dv _ <expression> _ <type> */
3048 static struct demangle_component
*
3049 d_vector_type (struct d_info
*di
)
3052 struct demangle_component
*dim
;
3054 peek
= d_peek_char (di
);
3058 dim
= d_expression (di
);
3061 dim
= d_number_component (di
);
3066 if (! d_check_char (di
, '_'))
3069 return d_make_comp (di
, DEMANGLE_COMPONENT_VECTOR_TYPE
, dim
,
3070 cplus_demangle_type (di
));
3073 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
3075 static struct demangle_component
*
3076 d_pointer_to_member_type (struct d_info
*di
)
3078 struct demangle_component
*cl
;
3079 struct demangle_component
*mem
;
3081 if (! d_check_char (di
, 'M'))
3084 cl
= cplus_demangle_type (di
);
3088 /* The ABI says, "The type of a non-static member function is considered
3089 to be different, for the purposes of substitution, from the type of a
3090 namespace-scope or static member function whose type appears
3091 similar. The types of two non-static member functions are considered
3092 to be different, for the purposes of substitution, if the functions
3093 are members of different classes. In other words, for the purposes of
3094 substitution, the class of which the function is a member is
3095 considered part of the type of function."
3097 For a pointer to member function, this call to cplus_demangle_type
3098 will end up adding a (possibly qualified) non-member function type to
3099 the substitution table, which is not correct; however, the member
3100 function type will never be used in a substitution, so putting the
3101 wrong type in the substitution table is harmless. */
3103 mem
= cplus_demangle_type (di
);
3107 return d_make_comp (di
, DEMANGLE_COMPONENT_PTRMEM_TYPE
, cl
, mem
);
3110 /* <non-negative number> _ */
3113 d_compact_number (struct d_info
*di
)
3116 if (d_peek_char (di
) == '_')
3118 else if (d_peek_char (di
) == 'n')
3121 num
= d_number (di
) + 1;
3123 if (num
< 0 || ! d_check_char (di
, '_'))
3128 /* <template-param> ::= T_
3129 ::= T <(parameter-2 non-negative) number> _
3132 static struct demangle_component
*
3133 d_template_param (struct d_info
*di
)
3137 if (! d_check_char (di
, 'T'))
3140 param
= d_compact_number (di
);
3144 return d_make_template_param (di
, param
);
3147 /* <template-args> ::= I <template-arg>+ E */
3149 static struct demangle_component
*
3150 d_template_args (struct d_info
*di
)
3152 if (d_peek_char (di
) != 'I'
3153 && d_peek_char (di
) != 'J')
3157 return d_template_args_1 (di
);
3160 /* <template-arg>* E */
3162 static struct demangle_component
*
3163 d_template_args_1 (struct d_info
*di
)
3165 struct demangle_component
*hold_last_name
;
3166 struct demangle_component
*al
;
3167 struct demangle_component
**pal
;
3169 /* Preserve the last name we saw--don't let the template arguments
3170 clobber it, as that would give us the wrong name for a subsequent
3171 constructor or destructor. */
3172 hold_last_name
= di
->last_name
;
3174 if (d_peek_char (di
) == 'E')
3176 /* An argument pack can be empty. */
3178 return d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
, NULL
, NULL
);
3185 struct demangle_component
*a
;
3187 a
= d_template_arg (di
);
3191 *pal
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
, a
, NULL
);
3194 pal
= &d_right (*pal
);
3196 if (d_peek_char (di
) == 'E')
3203 di
->last_name
= hold_last_name
;
3208 /* <template-arg> ::= <type>
3209 ::= X <expression> E
3213 static struct demangle_component
*
3214 d_template_arg (struct d_info
*di
)
3216 struct demangle_component
*ret
;
3218 switch (d_peek_char (di
))
3222 ret
= d_expression (di
);
3223 if (! d_check_char (di
, 'E'))
3228 return d_expr_primary (di
);
3232 /* An argument pack. */
3233 return d_template_args (di
);
3236 return cplus_demangle_type (di
);
3240 /* Parse a sequence of expressions until we hit the terminator
3243 static struct demangle_component
*
3244 d_exprlist (struct d_info
*di
, char terminator
)
3246 struct demangle_component
*list
= NULL
;
3247 struct demangle_component
**p
= &list
;
3249 if (d_peek_char (di
) == terminator
)
3252 return d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, NULL
, NULL
);
3257 struct demangle_component
*arg
= d_expression (di
);
3261 *p
= d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, arg
, NULL
);
3266 if (d_peek_char (di
) == terminator
)
3276 /* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
3277 dynamic_cast, static_cast or reinterpret_cast. */
3280 op_is_new_cast (struct demangle_component
*op
)
3282 const char *code
= op
->u
.s_operator
.op
->code
;
3283 return (code
[1] == 'c'
3284 && (code
[0] == 's' || code
[0] == 'd'
3285 || code
[0] == 'c' || code
[0] == 'r'));
3288 /* <expression> ::= <(unary) operator-name> <expression>
3289 ::= <(binary) operator-name> <expression> <expression>
3290 ::= <(trinary) operator-name> <expression> <expression> <expression>
3291 ::= cl <expression>+ E
3293 ::= <template-param>
3294 ::= sr <type> <unqualified-name>
3295 ::= sr <type> <unqualified-name> <template-args>
3298 <braced-expression> ::= <expression>
3299 ::= di <field source-name> <braced-expression> # .name = expr
3300 ::= dx <index expression> <braced-expression> # [expr] = expr
3301 ::= dX <range begin expression> <range end expression> <braced-expression>
3302 # [expr ... expr] = expr
3305 static inline struct demangle_component
*
3306 d_expression_1 (struct d_info
*di
)
3310 peek
= d_peek_char (di
);
3312 return d_expr_primary (di
);
3313 else if (peek
== 'T')
3314 return d_template_param (di
);
3315 else if (peek
== 's' && d_peek_next_char (di
) == 'r')
3317 struct demangle_component
*type
;
3318 struct demangle_component
*name
;
3321 type
= cplus_demangle_type (di
);
3322 name
= d_unqualified_name (di
);
3323 if (d_peek_char (di
) != 'I')
3324 return d_make_comp (di
, DEMANGLE_COMPONENT_QUAL_NAME
, type
, name
);
3326 return d_make_comp (di
, DEMANGLE_COMPONENT_QUAL_NAME
, type
,
3327 d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, name
,
3328 d_template_args (di
)));
3330 else if (peek
== 's' && d_peek_next_char (di
) == 'p')
3333 return d_make_comp (di
, DEMANGLE_COMPONENT_PACK_EXPANSION
,
3334 d_expression_1 (di
), NULL
);
3336 else if (peek
== 'f' && d_peek_next_char (di
) == 'p')
3338 /* Function parameter used in a late-specified return type. */
3341 if (d_peek_char (di
) == 'T')
3343 /* 'this' parameter. */
3349 index
= d_compact_number (di
);
3350 if (index
== INT_MAX
|| index
== -1)
3354 return d_make_function_param (di
, index
);
3356 else if (IS_DIGIT (peek
)
3357 || (peek
== 'o' && d_peek_next_char (di
) == 'n'))
3359 /* We can get an unqualified name as an expression in the case of
3360 a dependent function call, i.e. decltype(f(t)). */
3361 struct demangle_component
*name
;
3364 /* operator-function-id, i.e. operator+(t). */
3367 name
= d_unqualified_name (di
);
3370 if (d_peek_char (di
) == 'I')
3371 return d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, name
,
3372 d_template_args (di
));
3376 else if ((peek
== 'i' || peek
== 't')
3377 && d_peek_next_char (di
) == 'l')
3379 /* Brace-enclosed initializer list, untyped or typed. */
3380 struct demangle_component
*type
= NULL
;
3383 type
= cplus_demangle_type (di
);
3384 if (!d_peek_char (di
) || !d_peek_next_char (di
))
3386 return d_make_comp (di
, DEMANGLE_COMPONENT_INITIALIZER_LIST
,
3387 type
, d_exprlist (di
, 'E'));
3391 struct demangle_component
*op
;
3392 const char *code
= NULL
;
3395 op
= d_operator_name (di
);
3399 if (op
->type
== DEMANGLE_COMPONENT_OPERATOR
)
3401 code
= op
->u
.s_operator
.op
->code
;
3402 di
->expansion
+= op
->u
.s_operator
.op
->len
- 2;
3403 if (strcmp (code
, "st") == 0)
3404 return d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, op
,
3405 cplus_demangle_type (di
));
3412 case DEMANGLE_COMPONENT_OPERATOR
:
3413 args
= op
->u
.s_operator
.op
->args
;
3415 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
3416 args
= op
->u
.s_extended_operator
.args
;
3418 case DEMANGLE_COMPONENT_CAST
:
3426 return d_make_comp (di
, DEMANGLE_COMPONENT_NULLARY
, op
, NULL
);
3430 struct demangle_component
*operand
;
3433 if (code
&& (code
[0] == 'p' || code
[0] == 'm')
3434 && code
[1] == code
[0])
3435 /* pp_ and mm_ are the prefix variants. */
3436 suffix
= !d_check_char (di
, '_');
3438 if (op
->type
== DEMANGLE_COMPONENT_CAST
3439 && d_check_char (di
, '_'))
3440 operand
= d_exprlist (di
, 'E');
3441 else if (code
&& !strcmp (code
, "sP"))
3442 operand
= d_template_args_1 (di
);
3444 operand
= d_expression_1 (di
);
3447 /* Indicate the suffix variant for d_print_comp. */
3448 operand
= d_make_comp (di
, DEMANGLE_COMPONENT_BINARY_ARGS
,
3451 return d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, op
, operand
);
3455 struct demangle_component
*left
;
3456 struct demangle_component
*right
;
3460 if (op_is_new_cast (op
))
3461 left
= cplus_demangle_type (di
);
3462 else if (code
[0] == 'f')
3463 /* fold-expression. */
3464 left
= d_operator_name (di
);
3465 else if (!strcmp (code
, "di"))
3466 left
= d_unqualified_name (di
);
3468 left
= d_expression_1 (di
);
3469 if (!strcmp (code
, "cl"))
3470 right
= d_exprlist (di
, 'E');
3471 else if (!strcmp (code
, "dt") || !strcmp (code
, "pt"))
3473 right
= d_unqualified_name (di
);
3474 if (d_peek_char (di
) == 'I')
3475 right
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
,
3476 right
, d_template_args (di
));
3479 right
= d_expression_1 (di
);
3481 return d_make_comp (di
, DEMANGLE_COMPONENT_BINARY
, op
,
3483 DEMANGLE_COMPONENT_BINARY_ARGS
,
3488 struct demangle_component
*first
;
3489 struct demangle_component
*second
;
3490 struct demangle_component
*third
;
3494 else if (!strcmp (code
, "qu")
3495 || !strcmp (code
, "dX"))
3497 /* ?: expression. */
3498 first
= d_expression_1 (di
);
3499 second
= d_expression_1 (di
);
3500 third
= d_expression_1 (di
);
3504 else if (code
[0] == 'f')
3506 /* fold-expression. */
3507 first
= d_operator_name (di
);
3508 second
= d_expression_1 (di
);
3509 third
= d_expression_1 (di
);
3513 else if (code
[0] == 'n')
3515 /* new-expression. */
3516 if (code
[1] != 'w' && code
[1] != 'a')
3518 first
= d_exprlist (di
, '_');
3519 second
= cplus_demangle_type (di
);
3520 if (d_peek_char (di
) == 'E')
3525 else if (d_peek_char (di
) == 'p'
3526 && d_peek_next_char (di
) == 'i')
3528 /* Parenthesized initializer. */
3530 third
= d_exprlist (di
, 'E');
3532 else if (d_peek_char (di
) == 'i'
3533 && d_peek_next_char (di
) == 'l')
3534 /* initializer-list. */
3535 third
= d_expression_1 (di
);
3541 return d_make_comp (di
, DEMANGLE_COMPONENT_TRINARY
, op
,
3543 DEMANGLE_COMPONENT_TRINARY_ARG1
,
3546 DEMANGLE_COMPONENT_TRINARY_ARG2
,
3555 static struct demangle_component
*
3556 d_expression (struct d_info
*di
)
3558 struct demangle_component
*ret
;
3559 int was_expression
= di
->is_expression
;
3561 di
->is_expression
= 1;
3562 ret
= d_expression_1 (di
);
3563 di
->is_expression
= was_expression
;
3567 /* <expr-primary> ::= L <type> <(value) number> E
3568 ::= L <type> <(value) float> E
3569 ::= L <mangled-name> E
3572 static struct demangle_component
*
3573 d_expr_primary (struct d_info
*di
)
3575 struct demangle_component
*ret
;
3577 if (! d_check_char (di
, 'L'))
3579 if (d_peek_char (di
) == '_'
3580 /* Workaround for G++ bug; see comment in write_template_arg. */
3581 || d_peek_char (di
) == 'Z')
3582 ret
= cplus_demangle_mangled_name (di
, 0);
3585 struct demangle_component
*type
;
3586 enum demangle_component_type t
;
3589 type
= cplus_demangle_type (di
);
3593 /* If we have a type we know how to print, we aren't going to
3594 print the type name itself. */
3595 if (type
->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
3596 && type
->u
.s_builtin
.type
->print
!= D_PRINT_DEFAULT
)
3597 di
->expansion
-= type
->u
.s_builtin
.type
->len
;
3599 if (type
->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
3600 && strcmp (type
->u
.s_builtin
.type
->name
,
3601 cplus_demangle_builtin_types
[33].name
) == 0)
3603 if (d_peek_char (di
) == 'E')
3610 /* Rather than try to interpret the literal value, we just
3611 collect it as a string. Note that it's possible to have a
3612 floating point literal here. The ABI specifies that the
3613 format of such literals is machine independent. That's fine,
3614 but what's not fine is that versions of g++ up to 3.2 with
3615 -fabi-version=1 used upper case letters in the hex constant,
3616 and dumped out gcc's internal representation. That makes it
3617 hard to tell where the constant ends, and hard to dump the
3618 constant in any readable form anyhow. We don't attempt to
3619 handle these cases. */
3621 t
= DEMANGLE_COMPONENT_LITERAL
;
3622 if (d_peek_char (di
) == 'n')
3624 t
= DEMANGLE_COMPONENT_LITERAL_NEG
;
3628 while (d_peek_char (di
) != 'E')
3630 if (d_peek_char (di
) == '\0')
3634 ret
= d_make_comp (di
, t
, type
, d_make_name (di
, s
, d_str (di
) - s
));
3636 if (! d_check_char (di
, 'E'))
3641 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3642 ::= Z <(function) encoding> E s [<discriminator>]
3643 ::= Z <(function) encoding> E d [<parameter> number>] _ <entity name>
3646 static struct demangle_component
*
3647 d_local_name (struct d_info
*di
)
3649 struct demangle_component
*function
;
3650 struct demangle_component
*name
;
3652 if (! d_check_char (di
, 'Z'))
3655 function
= d_encoding (di
, 0);
3659 if (! d_check_char (di
, 'E'))
3662 if (d_peek_char (di
) == 's')
3665 if (! d_discriminator (di
))
3667 name
= d_make_name (di
, "string literal", sizeof "string literal" - 1);
3673 if (d_peek_char (di
) == 'd')
3675 /* Default argument scope: d <number> _. */
3677 num
= d_compact_number (di
);
3685 /* Lambdas and unnamed types have internal discriminators
3686 and are not functions. */
3687 && name
->type
!= DEMANGLE_COMPONENT_LAMBDA
3688 && name
->type
!= DEMANGLE_COMPONENT_UNNAMED_TYPE
)
3690 /* Read and ignore an optional discriminator. */
3691 if (! d_discriminator (di
))
3696 name
= d_make_default_arg (di
, num
, name
);
3699 /* Elide the return type of the containing function so as to not
3700 confuse the user thinking it is the return type of whatever local
3701 function we might be containing. */
3702 if (function
->type
== DEMANGLE_COMPONENT_TYPED_NAME
3703 && d_right (function
)->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
3704 d_left (d_right (function
)) = NULL
;
3706 return d_make_comp (di
, DEMANGLE_COMPONENT_LOCAL_NAME
, function
, name
);
3709 /* <discriminator> ::= _ <number> # when number < 10
3710 ::= __ <number> _ # when number >= 10
3712 <discriminator> ::= _ <number> # when number >=10
3713 is also accepted to support gcc versions that wrongly mangled that way.
3715 We demangle the discriminator, but we don't print it out. FIXME:
3716 We should print it out in verbose mode. */
3719 d_discriminator (struct d_info
*di
)
3721 int discrim
, num_underscores
= 1;
3723 if (d_peek_char (di
) != '_')
3726 if (d_peek_char (di
) == '_')
3732 discrim
= d_number (di
);
3735 if (num_underscores
> 1 && discrim
>= 10)
3737 if (d_peek_char (di
) == '_')
3746 /* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */
3748 static struct demangle_component
*
3749 d_lambda (struct d_info
*di
)
3751 struct demangle_component
*tl
;
3752 struct demangle_component
*ret
;
3755 if (! d_check_char (di
, 'U'))
3757 if (! d_check_char (di
, 'l'))
3760 tl
= d_parmlist (di
);
3764 if (! d_check_char (di
, 'E'))
3767 num
= d_compact_number (di
);
3771 ret
= d_make_empty (di
);
3774 ret
->type
= DEMANGLE_COMPONENT_LAMBDA
;
3775 ret
->u
.s_unary_num
.sub
= tl
;
3776 ret
->u
.s_unary_num
.num
= num
;
3782 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
3784 static struct demangle_component
*
3785 d_unnamed_type (struct d_info
*di
)
3787 struct demangle_component
*ret
;
3790 if (! d_check_char (di
, 'U'))
3792 if (! d_check_char (di
, 't'))
3795 num
= d_compact_number (di
);
3799 ret
= d_make_empty (di
);
3802 ret
->type
= DEMANGLE_COMPONENT_UNNAMED_TYPE
;
3803 ret
->u
.s_number
.number
= num
;
3806 if (! d_add_substitution (di
, ret
))
3812 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
3815 static struct demangle_component
*
3816 d_clone_suffix (struct d_info
*di
, struct demangle_component
*encoding
)
3818 const char *suffix
= d_str (di
);
3819 const char *pend
= suffix
;
3820 struct demangle_component
*n
;
3822 if (*pend
== '.' && (IS_LOWER (pend
[1]) || pend
[1] == '_'))
3825 while (IS_LOWER (*pend
) || *pend
== '_')
3828 while (*pend
== '.' && IS_DIGIT (pend
[1]))
3831 while (IS_DIGIT (*pend
))
3834 d_advance (di
, pend
- suffix
);
3835 n
= d_make_name (di
, suffix
, pend
- suffix
);
3836 return d_make_comp (di
, DEMANGLE_COMPONENT_CLONE
, encoding
, n
);
3839 /* Add a new substitution. */
3842 d_add_substitution (struct d_info
*di
, struct demangle_component
*dc
)
3846 if (di
->next_sub
>= di
->num_subs
)
3848 di
->subs
[di
->next_sub
] = dc
;
3853 /* <substitution> ::= S <seq-id> _
3863 If PREFIX is non-zero, then this type is being used as a prefix in
3864 a qualified name. In this case, for the standard substitutions, we
3865 need to check whether we are being used as a prefix for a
3866 constructor or destructor, and return a full template name.
3867 Otherwise we will get something like std::iostream::~iostream()
3868 which does not correspond particularly well to any function which
3869 actually appears in the source.
3872 static const struct d_standard_sub_info standard_subs
[] =
3877 { 'a', NL ("std::allocator"),
3878 NL ("std::allocator"),
3880 { 'b', NL ("std::basic_string"),
3881 NL ("std::basic_string"),
3882 NL ("basic_string") },
3883 { 's', NL ("std::string"),
3884 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
3885 NL ("basic_string") },
3886 { 'i', NL ("std::istream"),
3887 NL ("std::basic_istream<char, std::char_traits<char> >"),
3888 NL ("basic_istream") },
3889 { 'o', NL ("std::ostream"),
3890 NL ("std::basic_ostream<char, std::char_traits<char> >"),
3891 NL ("basic_ostream") },
3892 { 'd', NL ("std::iostream"),
3893 NL ("std::basic_iostream<char, std::char_traits<char> >"),
3894 NL ("basic_iostream") }
3897 static struct demangle_component
*
3898 d_substitution (struct d_info
*di
, int prefix
)
3902 if (! d_check_char (di
, 'S'))
3905 c
= d_next_char (di
);
3906 if (c
== '_' || IS_DIGIT (c
) || IS_UPPER (c
))
3915 unsigned int new_id
;
3918 new_id
= id
* 36 + c
- '0';
3919 else if (IS_UPPER (c
))
3920 new_id
= id
* 36 + c
- 'A' + 10;
3926 c
= d_next_char (di
);
3933 if (id
>= (unsigned int) di
->next_sub
)
3936 return di
->subs
[id
];
3941 const struct d_standard_sub_info
*p
;
3942 const struct d_standard_sub_info
*pend
;
3944 verbose
= (di
->options
& DMGL_VERBOSE
) != 0;
3945 if (! verbose
&& prefix
)
3949 peek
= d_peek_char (di
);
3950 if (peek
== 'C' || peek
== 'D')
3954 pend
= (&standard_subs
[0]
3955 + sizeof standard_subs
/ sizeof standard_subs
[0]);
3956 for (p
= &standard_subs
[0]; p
< pend
; ++p
)
3962 struct demangle_component
*dc
;
3964 if (p
->set_last_name
!= NULL
)
3965 di
->last_name
= d_make_sub (di
, p
->set_last_name
,
3966 p
->set_last_name_len
);
3969 s
= p
->full_expansion
;
3974 s
= p
->simple_expansion
;
3975 len
= p
->simple_len
;
3977 di
->expansion
+= len
;
3978 dc
= d_make_sub (di
, s
, len
);
3979 if (d_peek_char (di
) == 'B')
3981 /* If there are ABI tags on the abbreviation, it becomes
3982 a substitution candidate. */
3983 dc
= d_abi_tags (di
, dc
);
3984 if (! d_add_substitution (di
, dc
))
3996 d_checkpoint (struct d_info
*di
, struct d_info_checkpoint
*checkpoint
)
3998 checkpoint
->n
= di
->n
;
3999 checkpoint
->next_comp
= di
->next_comp
;
4000 checkpoint
->next_sub
= di
->next_sub
;
4001 checkpoint
->expansion
= di
->expansion
;
4005 d_backtrack (struct d_info
*di
, struct d_info_checkpoint
*checkpoint
)
4007 di
->n
= checkpoint
->n
;
4008 di
->next_comp
= checkpoint
->next_comp
;
4009 di
->next_sub
= checkpoint
->next_sub
;
4010 di
->expansion
= checkpoint
->expansion
;
4013 /* Initialize a growable string. */
4016 d_growable_string_init (struct d_growable_string
*dgs
, size_t estimate
)
4021 dgs
->allocation_failure
= 0;
4024 d_growable_string_resize (dgs
, estimate
);
4027 /* Grow a growable string to a given size. */
4030 d_growable_string_resize (struct d_growable_string
*dgs
, size_t need
)
4035 if (dgs
->allocation_failure
)
4038 /* Start allocation at two bytes to avoid any possibility of confusion
4039 with the special value of 1 used as a return in *palc to indicate
4040 allocation failures. */
4041 newalc
= dgs
->alc
> 0 ? dgs
->alc
: 2;
4042 while (newalc
< need
)
4045 newbuf
= (char *) realloc (dgs
->buf
, newalc
);
4052 dgs
->allocation_failure
= 1;
4059 /* Append a buffer to a growable string. */
4062 d_growable_string_append_buffer (struct d_growable_string
*dgs
,
4063 const char *s
, size_t l
)
4067 need
= dgs
->len
+ l
+ 1;
4068 if (need
> dgs
->alc
)
4069 d_growable_string_resize (dgs
, need
);
4071 if (dgs
->allocation_failure
)
4074 memcpy (dgs
->buf
+ dgs
->len
, s
, l
);
4075 dgs
->buf
[dgs
->len
+ l
] = '\0';
4079 /* Bridge growable strings to the callback mechanism. */
4082 d_growable_string_callback_adapter (const char *s
, size_t l
, void *opaque
)
4084 struct d_growable_string
*dgs
= (struct d_growable_string
*) opaque
;
4086 d_growable_string_append_buffer (dgs
, s
, l
);
4089 /* Walk the tree, counting the number of templates encountered, and
4090 the number of times a scope might be saved. These counts will be
4091 used to allocate data structures for d_print_comp, so the logic
4092 here must mirror the logic d_print_comp will use. It is not
4093 important that the resulting numbers are exact, so long as they
4094 are larger than the actual numbers encountered. */
4097 d_count_templates_scopes (struct d_print_info
*dpi
,
4098 struct demangle_component
*dc
)
4100 if (dc
== NULL
|| dc
->d_counting
> 1 || dpi
->recursion
> MAX_RECURSION_COUNT
)
4107 case DEMANGLE_COMPONENT_NAME
:
4108 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
4109 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
4110 case DEMANGLE_COMPONENT_SUB_STD
:
4111 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
4112 case DEMANGLE_COMPONENT_OPERATOR
:
4113 case DEMANGLE_COMPONENT_CHARACTER
:
4114 case DEMANGLE_COMPONENT_NUMBER
:
4115 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
4118 case DEMANGLE_COMPONENT_TEMPLATE
:
4119 dpi
->num_copy_templates
++;
4120 goto recurse_left_right
;
4122 case DEMANGLE_COMPONENT_REFERENCE
:
4123 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
4124 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_TEMPLATE_PARAM
)
4125 dpi
->num_saved_scopes
++;
4126 goto recurse_left_right
;
4128 case DEMANGLE_COMPONENT_QUAL_NAME
:
4129 case DEMANGLE_COMPONENT_LOCAL_NAME
:
4130 case DEMANGLE_COMPONENT_TYPED_NAME
:
4131 case DEMANGLE_COMPONENT_VTABLE
:
4132 case DEMANGLE_COMPONENT_VTT
:
4133 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
4134 case DEMANGLE_COMPONENT_TYPEINFO
:
4135 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
4136 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
4137 case DEMANGLE_COMPONENT_THUNK
:
4138 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
4139 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
4140 case DEMANGLE_COMPONENT_JAVA_CLASS
:
4141 case DEMANGLE_COMPONENT_GUARD
:
4142 case DEMANGLE_COMPONENT_TLS_INIT
:
4143 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
4144 case DEMANGLE_COMPONENT_REFTEMP
:
4145 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
4146 case DEMANGLE_COMPONENT_RESTRICT
:
4147 case DEMANGLE_COMPONENT_VOLATILE
:
4148 case DEMANGLE_COMPONENT_CONST
:
4149 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
4150 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
4151 case DEMANGLE_COMPONENT_CONST_THIS
:
4152 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
4153 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
4154 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
4155 case DEMANGLE_COMPONENT_NOEXCEPT
:
4156 case DEMANGLE_COMPONENT_THROW_SPEC
:
4157 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
4158 case DEMANGLE_COMPONENT_POINTER
:
4159 case DEMANGLE_COMPONENT_COMPLEX
:
4160 case DEMANGLE_COMPONENT_IMAGINARY
:
4161 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
4162 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
4163 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
4164 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
4165 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
4166 case DEMANGLE_COMPONENT_ARGLIST
:
4167 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
4168 case DEMANGLE_COMPONENT_TPARM_OBJ
:
4169 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
4170 case DEMANGLE_COMPONENT_CAST
:
4171 case DEMANGLE_COMPONENT_CONVERSION
:
4172 case DEMANGLE_COMPONENT_NULLARY
:
4173 case DEMANGLE_COMPONENT_UNARY
:
4174 case DEMANGLE_COMPONENT_BINARY
:
4175 case DEMANGLE_COMPONENT_BINARY_ARGS
:
4176 case DEMANGLE_COMPONENT_TRINARY
:
4177 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
4178 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
4179 case DEMANGLE_COMPONENT_LITERAL
:
4180 case DEMANGLE_COMPONENT_LITERAL_NEG
:
4181 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
4182 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
4183 case DEMANGLE_COMPONENT_DECLTYPE
:
4184 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
4185 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
4186 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
4187 case DEMANGLE_COMPONENT_TAGGED_NAME
:
4188 case DEMANGLE_COMPONENT_CLONE
:
4190 /* PR 89394 - Check for too much recursion. */
4191 if (dpi
->recursion
> DEMANGLE_RECURSION_LIMIT
)
4192 /* FIXME: There ought to be a way to report to the
4193 user that the recursion limit has been reached. */
4197 d_count_templates_scopes (dpi
, d_left (dc
));
4198 d_count_templates_scopes (dpi
, d_right (dc
));
4202 case DEMANGLE_COMPONENT_CTOR
:
4203 d_count_templates_scopes (dpi
, dc
->u
.s_ctor
.name
);
4206 case DEMANGLE_COMPONENT_DTOR
:
4207 d_count_templates_scopes (dpi
, dc
->u
.s_dtor
.name
);
4210 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
4211 d_count_templates_scopes (dpi
, dc
->u
.s_extended_operator
.name
);
4214 case DEMANGLE_COMPONENT_FIXED_TYPE
:
4215 d_count_templates_scopes (dpi
, dc
->u
.s_fixed
.length
);
4218 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
4219 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
4220 d_count_templates_scopes (dpi
, d_left (dc
));
4223 case DEMANGLE_COMPONENT_LAMBDA
:
4224 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
4225 d_count_templates_scopes (dpi
, dc
->u
.s_unary_num
.sub
);
4230 /* Initialize a print information structure. */
4233 d_print_init (struct d_print_info
*dpi
, demangle_callbackref callback
,
4234 void *opaque
, struct demangle_component
*dc
)
4237 dpi
->last_char
= '\0';
4238 dpi
->templates
= NULL
;
4239 dpi
->modifiers
= NULL
;
4240 dpi
->pack_index
= 0;
4241 dpi
->flush_count
= 0;
4243 dpi
->callback
= callback
;
4244 dpi
->opaque
= opaque
;
4246 dpi
->demangle_failure
= 0;
4248 dpi
->is_lambda_arg
= 0;
4250 dpi
->component_stack
= NULL
;
4252 dpi
->saved_scopes
= NULL
;
4253 dpi
->next_saved_scope
= 0;
4254 dpi
->num_saved_scopes
= 0;
4256 dpi
->copy_templates
= NULL
;
4257 dpi
->next_copy_template
= 0;
4258 dpi
->num_copy_templates
= 0;
4260 d_count_templates_scopes (dpi
, dc
);
4261 /* If we did not reach the recursion limit, then reset the
4262 current recursion value back to 0, so that we can print
4264 if (dpi
->recursion
< DEMANGLE_RECURSION_LIMIT
)
4266 dpi
->num_copy_templates
*= dpi
->num_saved_scopes
;
4268 dpi
->current_template
= NULL
;
4271 /* Indicate that an error occurred during printing, and test for error. */
4274 d_print_error (struct d_print_info
*dpi
)
4276 dpi
->demangle_failure
= 1;
4280 d_print_saw_error (struct d_print_info
*dpi
)
4282 return dpi
->demangle_failure
!= 0;
4285 /* Flush buffered characters to the callback. */
4288 d_print_flush (struct d_print_info
*dpi
)
4290 dpi
->buf
[dpi
->len
] = '\0';
4291 dpi
->callback (dpi
->buf
, dpi
->len
, dpi
->opaque
);
4296 /* Append characters and buffers for printing. */
4299 d_append_char (struct d_print_info
*dpi
, char c
)
4301 if (dpi
->len
== sizeof (dpi
->buf
) - 1)
4302 d_print_flush (dpi
);
4304 dpi
->buf
[dpi
->len
++] = c
;
4309 d_append_buffer (struct d_print_info
*dpi
, const char *s
, size_t l
)
4313 for (i
= 0; i
< l
; i
++)
4314 d_append_char (dpi
, s
[i
]);
4318 d_append_string (struct d_print_info
*dpi
, const char *s
)
4320 d_append_buffer (dpi
, s
, strlen (s
));
4324 d_append_num (struct d_print_info
*dpi
, int l
)
4327 sprintf (buf
,"%d", l
);
4328 d_append_string (dpi
, buf
);
4332 d_last_char (struct d_print_info
*dpi
)
4334 return dpi
->last_char
;
4337 /* Turn components into a human readable string. OPTIONS is the
4338 options bits passed to the demangler. DC is the tree to print.
4339 CALLBACK is a function to call to flush demangled string segments
4340 as they fill the intermediate buffer, and OPAQUE is a generalized
4341 callback argument. On success, this returns 1. On failure,
4342 it returns 0, indicating a bad parse. It does not use heap
4343 memory to build an output string, so cannot encounter memory
4344 allocation failure. */
4346 CP_STATIC_IF_GLIBCPP_V3
4348 cplus_demangle_print_callback (int options
,
4349 struct demangle_component
*dc
,
4350 demangle_callbackref callback
, void *opaque
)
4352 struct d_print_info dpi
;
4354 d_print_init (&dpi
, callback
, opaque
, dc
);
4357 #ifdef CP_DYNAMIC_ARRAYS
4358 /* Avoid zero-length VLAs, which are prohibited by the C99 standard
4359 and flagged as errors by Address Sanitizer. */
4360 __extension__
struct d_saved_scope scopes
[(dpi
.num_saved_scopes
> 0)
4361 ? dpi
.num_saved_scopes
: 1];
4362 __extension__
struct d_print_template temps
[(dpi
.num_copy_templates
> 0)
4363 ? dpi
.num_copy_templates
: 1];
4365 dpi
.saved_scopes
= scopes
;
4366 dpi
.copy_templates
= temps
;
4368 dpi
.saved_scopes
= alloca (dpi
.num_saved_scopes
4369 * sizeof (*dpi
.saved_scopes
));
4370 dpi
.copy_templates
= alloca (dpi
.num_copy_templates
4371 * sizeof (*dpi
.copy_templates
));
4374 d_print_comp (&dpi
, options
, dc
);
4377 d_print_flush (&dpi
);
4379 return ! d_print_saw_error (&dpi
);
4382 /* Turn components into a human readable string. OPTIONS is the
4383 options bits passed to the demangler. DC is the tree to print.
4384 ESTIMATE is a guess at the length of the result. This returns a
4385 string allocated by malloc, or NULL on error. On success, this
4386 sets *PALC to the size of the allocated buffer. On failure, this
4387 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
4390 CP_STATIC_IF_GLIBCPP_V3
4392 cplus_demangle_print (int options
, struct demangle_component
*dc
,
4393 int estimate
, size_t *palc
)
4395 struct d_growable_string dgs
;
4397 d_growable_string_init (&dgs
, estimate
);
4399 if (! cplus_demangle_print_callback (options
, dc
,
4400 d_growable_string_callback_adapter
,
4408 *palc
= dgs
.allocation_failure
? 1 : dgs
.alc
;
4412 /* Returns the I'th element of the template arglist ARGS, or NULL on
4413 failure. If I is negative, return the entire arglist. */
4415 static struct demangle_component
*
4416 d_index_template_argument (struct demangle_component
*args
, int i
)
4418 struct demangle_component
*a
;
4421 /* Print the whole argument pack. */
4428 if (a
->type
!= DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4434 if (i
!= 0 || a
== NULL
)
4440 /* Returns the template argument from the current context indicated by DC,
4441 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
4443 static struct demangle_component
*
4444 d_lookup_template_argument (struct d_print_info
*dpi
,
4445 const struct demangle_component
*dc
)
4447 if (dpi
->templates
== NULL
)
4449 d_print_error (dpi
);
4453 return d_index_template_argument
4454 (d_right (dpi
->templates
->template_decl
),
4455 dc
->u
.s_number
.number
);
4458 /* Returns a template argument pack used in DC (any will do), or NULL. */
4460 static struct demangle_component
*
4461 d_find_pack (struct d_print_info
*dpi
,
4462 const struct demangle_component
*dc
)
4464 struct demangle_component
*a
;
4470 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
4471 a
= d_lookup_template_argument (dpi
, dc
);
4472 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4476 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
4479 case DEMANGLE_COMPONENT_LAMBDA
:
4480 case DEMANGLE_COMPONENT_NAME
:
4481 case DEMANGLE_COMPONENT_TAGGED_NAME
:
4482 case DEMANGLE_COMPONENT_OPERATOR
:
4483 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
4484 case DEMANGLE_COMPONENT_SUB_STD
:
4485 case DEMANGLE_COMPONENT_CHARACTER
:
4486 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
4487 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
4488 case DEMANGLE_COMPONENT_FIXED_TYPE
:
4489 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
4490 case DEMANGLE_COMPONENT_NUMBER
:
4493 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
4494 return d_find_pack (dpi
, dc
->u
.s_extended_operator
.name
);
4495 case DEMANGLE_COMPONENT_CTOR
:
4496 return d_find_pack (dpi
, dc
->u
.s_ctor
.name
);
4497 case DEMANGLE_COMPONENT_DTOR
:
4498 return d_find_pack (dpi
, dc
->u
.s_dtor
.name
);
4501 a
= d_find_pack (dpi
, d_left (dc
));
4504 return d_find_pack (dpi
, d_right (dc
));
4508 /* Returns the length of the template argument pack DC. */
4511 d_pack_length (const struct demangle_component
*dc
)
4514 while (dc
&& dc
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
4515 && d_left (dc
) != NULL
)
4523 /* Returns the number of template args in DC, expanding any pack expansions
4527 d_args_length (struct d_print_info
*dpi
, const struct demangle_component
*dc
)
4530 for (; dc
&& dc
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
;
4533 struct demangle_component
*elt
= d_left (dc
);
4536 if (elt
->type
== DEMANGLE_COMPONENT_PACK_EXPANSION
)
4538 struct demangle_component
*a
= d_find_pack (dpi
, d_left (elt
));
4539 count
+= d_pack_length (a
);
4547 /* DC is a component of a mangled expression. Print it, wrapped in parens
4551 d_print_subexpr (struct d_print_info
*dpi
, int options
,
4552 struct demangle_component
*dc
)
4555 if (dc
->type
== DEMANGLE_COMPONENT_NAME
4556 || dc
->type
== DEMANGLE_COMPONENT_QUAL_NAME
4557 || dc
->type
== DEMANGLE_COMPONENT_INITIALIZER_LIST
4558 || dc
->type
== DEMANGLE_COMPONENT_FUNCTION_PARAM
)
4561 d_append_char (dpi
, '(');
4562 d_print_comp (dpi
, options
, dc
);
4564 d_append_char (dpi
, ')');
4567 /* Save the current scope. */
4570 d_save_scope (struct d_print_info
*dpi
,
4571 const struct demangle_component
*container
)
4573 struct d_saved_scope
*scope
;
4574 struct d_print_template
*src
, **link
;
4576 if (dpi
->next_saved_scope
>= dpi
->num_saved_scopes
)
4578 d_print_error (dpi
);
4581 scope
= &dpi
->saved_scopes
[dpi
->next_saved_scope
];
4582 dpi
->next_saved_scope
++;
4584 scope
->container
= container
;
4585 link
= &scope
->templates
;
4587 for (src
= dpi
->templates
; src
!= NULL
; src
= src
->next
)
4589 struct d_print_template
*dst
;
4591 if (dpi
->next_copy_template
>= dpi
->num_copy_templates
)
4593 d_print_error (dpi
);
4596 dst
= &dpi
->copy_templates
[dpi
->next_copy_template
];
4597 dpi
->next_copy_template
++;
4599 dst
->template_decl
= src
->template_decl
;
4607 /* Attempt to locate a previously saved scope. Returns NULL if no
4608 corresponding saved scope was found. */
4610 static struct d_saved_scope
*
4611 d_get_saved_scope (struct d_print_info
*dpi
,
4612 const struct demangle_component
*container
)
4616 for (i
= 0; i
< dpi
->next_saved_scope
; i
++)
4617 if (dpi
->saved_scopes
[i
].container
== container
)
4618 return &dpi
->saved_scopes
[i
];
4623 /* If DC is a C++17 fold-expression, print it and return true; otherwise
4627 d_maybe_print_fold_expression (struct d_print_info
*dpi
, int options
,
4628 struct demangle_component
*dc
)
4630 struct demangle_component
*ops
, *operator_
, *op1
, *op2
;
4633 const char *fold_code
= d_left (dc
)->u
.s_operator
.op
->code
;
4634 if (fold_code
[0] != 'f')
4638 operator_
= d_left (ops
);
4639 op1
= d_right (ops
);
4641 if (op1
->type
== DEMANGLE_COMPONENT_TRINARY_ARG2
)
4643 op2
= d_right (op1
);
4647 /* Print the whole pack. */
4648 save_idx
= dpi
->pack_index
;
4649 dpi
->pack_index
= -1;
4651 switch (fold_code
[1])
4653 /* Unary left fold, (... + X). */
4655 d_append_string (dpi
, "(...");
4656 d_print_expr_op (dpi
, options
, operator_
);
4657 d_print_subexpr (dpi
, options
, op1
);
4658 d_append_char (dpi
, ')');
4661 /* Unary right fold, (X + ...). */
4663 d_append_char (dpi
, '(');
4664 d_print_subexpr (dpi
, options
, op1
);
4665 d_print_expr_op (dpi
, options
, operator_
);
4666 d_append_string (dpi
, "...)");
4669 /* Binary left fold, (42 + ... + X). */
4671 /* Binary right fold, (X + ... + 42). */
4673 d_append_char (dpi
, '(');
4674 d_print_subexpr (dpi
, options
, op1
);
4675 d_print_expr_op (dpi
, options
, operator_
);
4676 d_append_string (dpi
, "...");
4677 d_print_expr_op (dpi
, options
, operator_
);
4678 d_print_subexpr (dpi
, options
, op2
);
4679 d_append_char (dpi
, ')');
4683 dpi
->pack_index
= save_idx
;
4687 /* True iff DC represents a C99-style designated initializer. */
4690 is_designated_init (struct demangle_component
*dc
)
4692 if (dc
->type
!= DEMANGLE_COMPONENT_BINARY
4693 && dc
->type
!= DEMANGLE_COMPONENT_TRINARY
)
4696 struct demangle_component
*op
= d_left (dc
);
4697 const char *code
= op
->u
.s_operator
.op
->code
;
4698 return (code
[0] == 'd'
4699 && (code
[1] == 'i' || code
[1] == 'x' || code
[1] == 'X'));
4702 /* If DC represents a C99-style designated initializer, print it and return
4703 true; otherwise, return false. */
4706 d_maybe_print_designated_init (struct d_print_info
*dpi
, int options
,
4707 struct demangle_component
*dc
)
4709 if (!is_designated_init (dc
))
4712 const char *code
= d_left (dc
)->u
.s_operator
.op
->code
;
4714 struct demangle_component
*operands
= d_right (dc
);
4715 struct demangle_component
*op1
= d_left (operands
);
4716 struct demangle_component
*op2
= d_right (operands
);
4719 d_append_char (dpi
, '.');
4721 d_append_char (dpi
, '[');
4723 d_print_comp (dpi
, options
, op1
);
4726 d_append_string (dpi
, " ... ");
4727 d_print_comp (dpi
, options
, d_left (op2
));
4728 op2
= d_right (op2
);
4731 d_append_char (dpi
, ']');
4732 if (is_designated_init (op2
))
4734 /* Don't put '=' or '(' between chained designators. */
4735 d_print_comp (dpi
, options
, op2
);
4739 d_append_char (dpi
, '=');
4740 d_print_subexpr (dpi
, options
, op2
);
4745 /* Subroutine to handle components. */
4748 d_print_comp_inner (struct d_print_info
*dpi
, int options
,
4749 struct demangle_component
*dc
)
4751 /* Magic variable to let reference smashing skip over the next modifier
4752 without needing to modify *dc. */
4753 struct demangle_component
*mod_inner
= NULL
;
4755 /* Variable used to store the current templates while a previously
4756 captured scope is used. */
4757 struct d_print_template
*saved_templates
;
4759 /* Nonzero if templates have been stored in the above variable. */
4760 int need_template_restore
= 0;
4764 d_print_error (dpi
);
4767 if (d_print_saw_error (dpi
))
4772 case DEMANGLE_COMPONENT_NAME
:
4773 if ((options
& DMGL_JAVA
) == 0)
4774 d_append_buffer (dpi
, dc
->u
.s_name
.s
, dc
->u
.s_name
.len
);
4776 d_print_java_identifier (dpi
, dc
->u
.s_name
.s
, dc
->u
.s_name
.len
);
4779 case DEMANGLE_COMPONENT_TAGGED_NAME
:
4780 d_print_comp (dpi
, options
, d_left (dc
));
4781 d_append_string (dpi
, "[abi:");
4782 d_print_comp (dpi
, options
, d_right (dc
));
4783 d_append_char (dpi
, ']');
4786 case DEMANGLE_COMPONENT_QUAL_NAME
:
4787 case DEMANGLE_COMPONENT_LOCAL_NAME
:
4788 d_print_comp (dpi
, options
, d_left (dc
));
4789 if ((options
& DMGL_JAVA
) == 0)
4790 d_append_string (dpi
, "::");
4792 d_append_char (dpi
, '.');
4794 struct demangle_component
*local_name
= d_right (dc
);
4795 if (local_name
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
4797 d_append_string (dpi
, "{default arg#");
4798 d_append_num (dpi
, local_name
->u
.s_unary_num
.num
+ 1);
4799 d_append_string (dpi
, "}::");
4800 local_name
= local_name
->u
.s_unary_num
.sub
;
4802 d_print_comp (dpi
, options
, local_name
);
4806 case DEMANGLE_COMPONENT_TYPED_NAME
:
4808 struct d_print_mod
*hold_modifiers
;
4809 struct demangle_component
*typed_name
;
4810 struct d_print_mod adpm
[4];
4812 struct d_print_template dpt
;
4814 /* Pass the name down to the type so that it can be printed in
4815 the right place for the type. We also have to pass down
4816 any CV-qualifiers, which apply to the this parameter. */
4817 hold_modifiers
= dpi
->modifiers
;
4820 typed_name
= d_left (dc
);
4821 while (typed_name
!= NULL
)
4823 if (i
>= sizeof adpm
/ sizeof adpm
[0])
4825 d_print_error (dpi
);
4829 adpm
[i
].next
= dpi
->modifiers
;
4830 dpi
->modifiers
= &adpm
[i
];
4831 adpm
[i
].mod
= typed_name
;
4832 adpm
[i
].printed
= 0;
4833 adpm
[i
].templates
= dpi
->templates
;
4836 if (!is_fnqual_component_type (typed_name
->type
))
4839 typed_name
= d_left (typed_name
);
4842 if (typed_name
== NULL
)
4844 d_print_error (dpi
);
4848 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
4849 there may be CV-qualifiers on its right argument which
4850 really apply here; this happens when parsing a class that
4851 is local to a function. */
4852 if (typed_name
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
4854 typed_name
= d_right (typed_name
);
4855 if (typed_name
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
4856 typed_name
= typed_name
->u
.s_unary_num
.sub
;
4857 while (typed_name
!= NULL
4858 && is_fnqual_component_type (typed_name
->type
))
4860 if (i
>= sizeof adpm
/ sizeof adpm
[0])
4862 d_print_error (dpi
);
4866 adpm
[i
] = adpm
[i
- 1];
4867 adpm
[i
].next
= &adpm
[i
- 1];
4868 dpi
->modifiers
= &adpm
[i
];
4870 adpm
[i
- 1].mod
= typed_name
;
4871 adpm
[i
- 1].printed
= 0;
4872 adpm
[i
- 1].templates
= dpi
->templates
;
4875 typed_name
= d_left (typed_name
);
4877 if (typed_name
== NULL
)
4879 d_print_error (dpi
);
4884 /* If typed_name is a template, then it applies to the
4885 function type as well. */
4886 if (typed_name
->type
== DEMANGLE_COMPONENT_TEMPLATE
)
4888 dpt
.next
= dpi
->templates
;
4889 dpi
->templates
= &dpt
;
4890 dpt
.template_decl
= typed_name
;
4893 d_print_comp (dpi
, options
, d_right (dc
));
4895 if (typed_name
->type
== DEMANGLE_COMPONENT_TEMPLATE
)
4896 dpi
->templates
= dpt
.next
;
4898 /* If the modifiers didn't get printed by the type, print them
4903 if (! adpm
[i
].printed
)
4905 d_append_char (dpi
, ' ');
4906 d_print_mod (dpi
, options
, adpm
[i
].mod
);
4910 dpi
->modifiers
= hold_modifiers
;
4915 case DEMANGLE_COMPONENT_TEMPLATE
:
4917 struct d_print_mod
*hold_dpm
;
4918 struct demangle_component
*dcl
;
4919 const struct demangle_component
*hold_current
;
4921 /* This template may need to be referenced by a cast operator
4922 contained in its subtree. */
4923 hold_current
= dpi
->current_template
;
4924 dpi
->current_template
= dc
;
4926 /* Don't push modifiers into a template definition. Doing so
4927 could give the wrong definition for a template argument.
4928 Instead, treat the template essentially as a name. */
4930 hold_dpm
= dpi
->modifiers
;
4931 dpi
->modifiers
= NULL
;
4935 if ((options
& DMGL_JAVA
) != 0
4936 && dcl
->type
== DEMANGLE_COMPONENT_NAME
4937 && dcl
->u
.s_name
.len
== 6
4938 && strncmp (dcl
->u
.s_name
.s
, "JArray", 6) == 0)
4940 /* Special-case Java arrays, so that JArray<TYPE> appears
4941 instead as TYPE[]. */
4943 d_print_comp (dpi
, options
, d_right (dc
));
4944 d_append_string (dpi
, "[]");
4948 d_print_comp (dpi
, options
, dcl
);
4949 if (d_last_char (dpi
) == '<')
4950 d_append_char (dpi
, ' ');
4951 d_append_char (dpi
, '<');
4952 d_print_comp (dpi
, options
, d_right (dc
));
4953 /* Avoid generating two consecutive '>' characters, to avoid
4954 the C++ syntactic ambiguity. */
4955 if (d_last_char (dpi
) == '>')
4956 d_append_char (dpi
, ' ');
4957 d_append_char (dpi
, '>');
4960 dpi
->modifiers
= hold_dpm
;
4961 dpi
->current_template
= hold_current
;
4966 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
4967 if (dpi
->is_lambda_arg
)
4969 /* Show the template parm index, as that's how g++ displays
4970 these, and future proofs us against potential
4971 '[]<typename T> (T *a, T *b) {...}'. */
4972 d_append_buffer (dpi
, "auto:", 5);
4973 d_append_num (dpi
, dc
->u
.s_number
.number
+ 1);
4977 struct d_print_template
*hold_dpt
;
4978 struct demangle_component
*a
= d_lookup_template_argument (dpi
, dc
);
4980 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4981 a
= d_index_template_argument (a
, dpi
->pack_index
);
4985 d_print_error (dpi
);
4989 /* While processing this parameter, we need to pop the list
4990 of templates. This is because the template parameter may
4991 itself be a reference to a parameter of an outer
4994 hold_dpt
= dpi
->templates
;
4995 dpi
->templates
= hold_dpt
->next
;
4997 d_print_comp (dpi
, options
, a
);
4999 dpi
->templates
= hold_dpt
;
5003 case DEMANGLE_COMPONENT_TPARM_OBJ
:
5004 d_append_string (dpi
, "template parameter object for ");
5005 d_print_comp (dpi
, options
, d_left (dc
));
5008 case DEMANGLE_COMPONENT_CTOR
:
5009 d_print_comp (dpi
, options
, dc
->u
.s_ctor
.name
);
5012 case DEMANGLE_COMPONENT_DTOR
:
5013 d_append_char (dpi
, '~');
5014 d_print_comp (dpi
, options
, dc
->u
.s_dtor
.name
);
5017 case DEMANGLE_COMPONENT_VTABLE
:
5018 d_append_string (dpi
, "vtable for ");
5019 d_print_comp (dpi
, options
, d_left (dc
));
5022 case DEMANGLE_COMPONENT_VTT
:
5023 d_append_string (dpi
, "VTT for ");
5024 d_print_comp (dpi
, options
, d_left (dc
));
5027 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
5028 d_append_string (dpi
, "construction vtable for ");
5029 d_print_comp (dpi
, options
, d_left (dc
));
5030 d_append_string (dpi
, "-in-");
5031 d_print_comp (dpi
, options
, d_right (dc
));
5034 case DEMANGLE_COMPONENT_TYPEINFO
:
5035 d_append_string (dpi
, "typeinfo for ");
5036 d_print_comp (dpi
, options
, d_left (dc
));
5039 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
5040 d_append_string (dpi
, "typeinfo name for ");
5041 d_print_comp (dpi
, options
, d_left (dc
));
5044 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
5045 d_append_string (dpi
, "typeinfo fn for ");
5046 d_print_comp (dpi
, options
, d_left (dc
));
5049 case DEMANGLE_COMPONENT_THUNK
:
5050 d_append_string (dpi
, "non-virtual thunk to ");
5051 d_print_comp (dpi
, options
, d_left (dc
));
5054 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
5055 d_append_string (dpi
, "virtual thunk to ");
5056 d_print_comp (dpi
, options
, d_left (dc
));
5059 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
5060 d_append_string (dpi
, "covariant return thunk to ");
5061 d_print_comp (dpi
, options
, d_left (dc
));
5064 case DEMANGLE_COMPONENT_JAVA_CLASS
:
5065 d_append_string (dpi
, "java Class for ");
5066 d_print_comp (dpi
, options
, d_left (dc
));
5069 case DEMANGLE_COMPONENT_GUARD
:
5070 d_append_string (dpi
, "guard variable for ");
5071 d_print_comp (dpi
, options
, d_left (dc
));
5074 case DEMANGLE_COMPONENT_TLS_INIT
:
5075 d_append_string (dpi
, "TLS init function for ");
5076 d_print_comp (dpi
, options
, d_left (dc
));
5079 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
5080 d_append_string (dpi
, "TLS wrapper function for ");
5081 d_print_comp (dpi
, options
, d_left (dc
));
5084 case DEMANGLE_COMPONENT_REFTEMP
:
5085 d_append_string (dpi
, "reference temporary #");
5086 d_print_comp (dpi
, options
, d_right (dc
));
5087 d_append_string (dpi
, " for ");
5088 d_print_comp (dpi
, options
, d_left (dc
));
5091 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
5092 d_append_string (dpi
, "hidden alias for ");
5093 d_print_comp (dpi
, options
, d_left (dc
));
5096 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
5097 d_append_string (dpi
, "transaction clone for ");
5098 d_print_comp (dpi
, options
, d_left (dc
));
5101 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
5102 d_append_string (dpi
, "non-transaction clone for ");
5103 d_print_comp (dpi
, options
, d_left (dc
));
5106 case DEMANGLE_COMPONENT_SUB_STD
:
5107 d_append_buffer (dpi
, dc
->u
.s_string
.string
, dc
->u
.s_string
.len
);
5110 case DEMANGLE_COMPONENT_RESTRICT
:
5111 case DEMANGLE_COMPONENT_VOLATILE
:
5112 case DEMANGLE_COMPONENT_CONST
:
5114 struct d_print_mod
*pdpm
;
5116 /* When printing arrays, it's possible to have cases where the
5117 same CV-qualifier gets pushed on the stack multiple times.
5118 We only need to print it once. */
5120 for (pdpm
= dpi
->modifiers
; pdpm
!= NULL
; pdpm
= pdpm
->next
)
5122 if (! pdpm
->printed
)
5124 if (pdpm
->mod
->type
!= DEMANGLE_COMPONENT_RESTRICT
5125 && pdpm
->mod
->type
!= DEMANGLE_COMPONENT_VOLATILE
5126 && pdpm
->mod
->type
!= DEMANGLE_COMPONENT_CONST
)
5128 if (pdpm
->mod
->type
== dc
->type
)
5130 d_print_comp (dpi
, options
, d_left (dc
));
5138 case DEMANGLE_COMPONENT_REFERENCE
:
5139 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
5141 /* Handle reference smashing: & + && = &. */
5142 struct demangle_component
*sub
= d_left (dc
);
5143 if (!dpi
->is_lambda_arg
5144 && sub
->type
== DEMANGLE_COMPONENT_TEMPLATE_PARAM
)
5146 struct d_saved_scope
*scope
= d_get_saved_scope (dpi
, sub
);
5147 struct demangle_component
*a
;
5151 /* This is the first time SUB has been traversed.
5152 We need to capture the current templates so
5153 they can be restored if SUB is reentered as a
5155 d_save_scope (dpi
, sub
);
5156 if (d_print_saw_error (dpi
))
5161 const struct d_component_stack
*dcse
;
5162 int found_self_or_parent
= 0;
5164 /* This traversal is reentering SUB as a substition.
5165 If we are not beneath SUB or DC in the tree then we
5166 need to restore SUB's template stack temporarily. */
5167 for (dcse
= dpi
->component_stack
; dcse
!= NULL
;
5168 dcse
= dcse
->parent
)
5172 && dcse
!= dpi
->component_stack
))
5174 found_self_or_parent
= 1;
5179 if (!found_self_or_parent
)
5181 saved_templates
= dpi
->templates
;
5182 dpi
->templates
= scope
->templates
;
5183 need_template_restore
= 1;
5187 a
= d_lookup_template_argument (dpi
, sub
);
5188 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
5189 a
= d_index_template_argument (a
, dpi
->pack_index
);
5193 if (need_template_restore
)
5194 dpi
->templates
= saved_templates
;
5196 d_print_error (dpi
);
5203 if (sub
->type
== DEMANGLE_COMPONENT_REFERENCE
5204 || sub
->type
== dc
->type
)
5206 else if (sub
->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE
)
5207 mod_inner
= d_left (sub
);
5211 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
5212 case DEMANGLE_COMPONENT_POINTER
:
5213 case DEMANGLE_COMPONENT_COMPLEX
:
5214 case DEMANGLE_COMPONENT_IMAGINARY
:
5215 FNQUAL_COMPONENT_CASE
:
5218 /* We keep a list of modifiers on the stack. */
5219 struct d_print_mod dpm
;
5221 dpm
.next
= dpi
->modifiers
;
5222 dpi
->modifiers
= &dpm
;
5225 dpm
.templates
= dpi
->templates
;
5228 mod_inner
= d_left (dc
);
5230 d_print_comp (dpi
, options
, mod_inner
);
5232 /* If the modifier didn't get printed by the type, print it
5235 d_print_mod (dpi
, options
, dc
);
5237 dpi
->modifiers
= dpm
.next
;
5239 if (need_template_restore
)
5240 dpi
->templates
= saved_templates
;
5245 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
5246 if ((options
& DMGL_JAVA
) == 0)
5247 d_append_buffer (dpi
, dc
->u
.s_builtin
.type
->name
,
5248 dc
->u
.s_builtin
.type
->len
);
5250 d_append_buffer (dpi
, dc
->u
.s_builtin
.type
->java_name
,
5251 dc
->u
.s_builtin
.type
->java_len
);
5254 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
5255 d_print_comp (dpi
, options
, d_left (dc
));
5258 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
5260 if ((options
& DMGL_RET_POSTFIX
) != 0)
5261 d_print_function_type (dpi
,
5262 options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5263 dc
, dpi
->modifiers
);
5265 /* Print return type if present */
5266 if (d_left (dc
) != NULL
&& (options
& DMGL_RET_POSTFIX
) != 0)
5267 d_print_comp (dpi
, options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5269 else if (d_left (dc
) != NULL
&& (options
& DMGL_RET_DROP
) == 0)
5271 struct d_print_mod dpm
;
5273 /* We must pass this type down as a modifier in order to
5274 print it in the right location. */
5275 dpm
.next
= dpi
->modifiers
;
5276 dpi
->modifiers
= &dpm
;
5279 dpm
.templates
= dpi
->templates
;
5281 d_print_comp (dpi
, options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5284 dpi
->modifiers
= dpm
.next
;
5289 /* In standard prefix notation, there is a space between the
5290 return type and the function signature. */
5291 if ((options
& DMGL_RET_POSTFIX
) == 0)
5292 d_append_char (dpi
, ' ');
5295 if ((options
& DMGL_RET_POSTFIX
) == 0)
5296 d_print_function_type (dpi
,
5297 options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5298 dc
, dpi
->modifiers
);
5303 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
5305 struct d_print_mod
*hold_modifiers
;
5306 struct d_print_mod adpm
[4];
5308 struct d_print_mod
*pdpm
;
5310 /* We must pass this type down as a modifier in order to print
5311 multi-dimensional arrays correctly. If the array itself is
5312 CV-qualified, we act as though the element type were
5313 CV-qualified. We do this by copying the modifiers down
5314 rather than fiddling pointers, so that we don't wind up
5315 with a d_print_mod higher on the stack pointing into our
5316 stack frame after we return. */
5318 hold_modifiers
= dpi
->modifiers
;
5320 adpm
[0].next
= hold_modifiers
;
5321 dpi
->modifiers
= &adpm
[0];
5323 adpm
[0].printed
= 0;
5324 adpm
[0].templates
= dpi
->templates
;
5327 pdpm
= hold_modifiers
;
5329 && (pdpm
->mod
->type
== DEMANGLE_COMPONENT_RESTRICT
5330 || pdpm
->mod
->type
== DEMANGLE_COMPONENT_VOLATILE
5331 || pdpm
->mod
->type
== DEMANGLE_COMPONENT_CONST
))
5333 if (! pdpm
->printed
)
5335 if (i
>= sizeof adpm
/ sizeof adpm
[0])
5337 d_print_error (dpi
);
5342 adpm
[i
].next
= dpi
->modifiers
;
5343 dpi
->modifiers
= &adpm
[i
];
5351 d_print_comp (dpi
, options
, d_right (dc
));
5353 dpi
->modifiers
= hold_modifiers
;
5355 if (adpm
[0].printed
)
5361 d_print_mod (dpi
, options
, adpm
[i
].mod
);
5364 d_print_array_type (dpi
, options
, dc
, dpi
->modifiers
);
5369 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
5370 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
5372 struct d_print_mod dpm
;
5374 dpm
.next
= dpi
->modifiers
;
5375 dpi
->modifiers
= &dpm
;
5378 dpm
.templates
= dpi
->templates
;
5380 d_print_comp (dpi
, options
, d_right (dc
));
5382 /* If the modifier didn't get printed by the type, print it
5385 d_print_mod (dpi
, options
, dc
);
5387 dpi
->modifiers
= dpm
.next
;
5392 case DEMANGLE_COMPONENT_FIXED_TYPE
:
5393 if (dc
->u
.s_fixed
.sat
)
5394 d_append_string (dpi
, "_Sat ");
5395 /* Don't print "int _Accum". */
5396 if (dc
->u
.s_fixed
.length
->u
.s_builtin
.type
5397 != &cplus_demangle_builtin_types
['i'-'a'])
5399 d_print_comp (dpi
, options
, dc
->u
.s_fixed
.length
);
5400 d_append_char (dpi
, ' ');
5402 if (dc
->u
.s_fixed
.accum
)
5403 d_append_string (dpi
, "_Accum");
5405 d_append_string (dpi
, "_Fract");
5408 case DEMANGLE_COMPONENT_ARGLIST
:
5409 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
5410 if (d_left (dc
) != NULL
)
5411 d_print_comp (dpi
, options
, d_left (dc
));
5412 if (d_right (dc
) != NULL
)
5415 unsigned long int flush_count
;
5416 /* Make sure ", " isn't flushed by d_append_string, otherwise
5417 dpi->len -= 2 wouldn't work. */
5418 if (dpi
->len
>= sizeof (dpi
->buf
) - 2)
5419 d_print_flush (dpi
);
5420 d_append_string (dpi
, ", ");
5422 flush_count
= dpi
->flush_count
;
5423 d_print_comp (dpi
, options
, d_right (dc
));
5424 /* If that didn't print anything (which can happen with empty
5425 template argument packs), remove the comma and space. */
5426 if (dpi
->flush_count
== flush_count
&& dpi
->len
== len
)
5431 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
5433 struct demangle_component
*type
= d_left (dc
);
5434 struct demangle_component
*list
= d_right (dc
);
5437 d_print_comp (dpi
, options
, type
);
5438 d_append_char (dpi
, '{');
5439 d_print_comp (dpi
, options
, list
);
5440 d_append_char (dpi
, '}');
5444 case DEMANGLE_COMPONENT_OPERATOR
:
5446 const struct demangle_operator_info
*op
= dc
->u
.s_operator
.op
;
5449 d_append_string (dpi
, "operator");
5450 /* Add a space before new/delete. */
5451 if (IS_LOWER (op
->name
[0]))
5452 d_append_char (dpi
, ' ');
5453 /* Omit a trailing space. */
5454 if (op
->name
[len
-1] == ' ')
5456 d_append_buffer (dpi
, op
->name
, len
);
5460 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
5461 d_append_string (dpi
, "operator ");
5462 d_print_comp (dpi
, options
, dc
->u
.s_extended_operator
.name
);
5465 case DEMANGLE_COMPONENT_CONVERSION
:
5466 d_append_string (dpi
, "operator ");
5467 d_print_conversion (dpi
, options
, dc
);
5470 case DEMANGLE_COMPONENT_NULLARY
:
5471 d_print_expr_op (dpi
, options
, d_left (dc
));
5474 case DEMANGLE_COMPONENT_UNARY
:
5476 struct demangle_component
*op
= d_left (dc
);
5477 struct demangle_component
*operand
= d_right (dc
);
5478 const char *code
= NULL
;
5480 if (op
->type
== DEMANGLE_COMPONENT_OPERATOR
)
5482 code
= op
->u
.s_operator
.op
->code
;
5483 if (!strcmp (code
, "ad"))
5485 /* Don't print the argument list for the address of a
5487 if (operand
->type
== DEMANGLE_COMPONENT_TYPED_NAME
5488 && d_left (operand
)->type
== DEMANGLE_COMPONENT_QUAL_NAME
5489 && d_right (operand
)->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5490 operand
= d_left (operand
);
5492 if (operand
->type
== DEMANGLE_COMPONENT_BINARY_ARGS
)
5494 /* This indicates a suffix operator. */
5495 operand
= d_left (operand
);
5496 d_print_subexpr (dpi
, options
, operand
);
5497 d_print_expr_op (dpi
, options
, op
);
5502 /* For sizeof..., just print the pack length. */
5503 if (code
&& !strcmp (code
, "sZ"))
5505 struct demangle_component
*a
= d_find_pack (dpi
, operand
);
5506 int len
= d_pack_length (a
);
5507 d_append_num (dpi
, len
);
5510 else if (code
&& !strcmp (code
, "sP"))
5512 int len
= d_args_length (dpi
, operand
);
5513 d_append_num (dpi
, len
);
5517 if (op
->type
!= DEMANGLE_COMPONENT_CAST
)
5518 d_print_expr_op (dpi
, options
, op
);
5521 d_append_char (dpi
, '(');
5522 d_print_cast (dpi
, options
, op
);
5523 d_append_char (dpi
, ')');
5525 if (code
&& !strcmp (code
, "gs"))
5526 /* Avoid parens after '::'. */
5527 d_print_comp (dpi
, options
, operand
);
5528 else if (code
&& !strcmp (code
, "st"))
5529 /* Always print parens for sizeof (type). */
5531 d_append_char (dpi
, '(');
5532 d_print_comp (dpi
, options
, operand
);
5533 d_append_char (dpi
, ')');
5536 d_print_subexpr (dpi
, options
, operand
);
5540 case DEMANGLE_COMPONENT_BINARY
:
5541 if (d_right (dc
)->type
!= DEMANGLE_COMPONENT_BINARY_ARGS
)
5543 d_print_error (dpi
);
5547 if (op_is_new_cast (d_left (dc
)))
5549 d_print_expr_op (dpi
, options
, d_left (dc
));
5550 d_append_char (dpi
, '<');
5551 d_print_comp (dpi
, options
, d_left (d_right (dc
)));
5552 d_append_string (dpi
, ">(");
5553 d_print_comp (dpi
, options
, d_right (d_right (dc
)));
5554 d_append_char (dpi
, ')');
5558 if (d_maybe_print_fold_expression (dpi
, options
, dc
))
5561 if (d_maybe_print_designated_init (dpi
, options
, dc
))
5564 /* We wrap an expression which uses the greater-than operator in
5565 an extra layer of parens so that it does not get confused
5566 with the '>' which ends the template parameters. */
5567 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_OPERATOR
5568 && d_left (dc
)->u
.s_operator
.op
->len
== 1
5569 && d_left (dc
)->u
.s_operator
.op
->name
[0] == '>')
5570 d_append_char (dpi
, '(');
5572 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "cl") == 0
5573 && d_left (d_right (dc
))->type
== DEMANGLE_COMPONENT_TYPED_NAME
)
5575 /* Function call used in an expression should not have printed types
5576 of the function arguments. Values of the function arguments still
5577 get printed below. */
5579 const struct demangle_component
*func
= d_left (d_right (dc
));
5581 if (d_right (func
)->type
!= DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5582 d_print_error (dpi
);
5583 d_print_subexpr (dpi
, options
, d_left (func
));
5586 d_print_subexpr (dpi
, options
, d_left (d_right (dc
)));
5587 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "ix") == 0)
5589 d_append_char (dpi
, '[');
5590 d_print_comp (dpi
, options
, d_right (d_right (dc
)));
5591 d_append_char (dpi
, ']');
5595 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "cl") != 0)
5596 d_print_expr_op (dpi
, options
, d_left (dc
));
5597 d_print_subexpr (dpi
, options
, d_right (d_right (dc
)));
5600 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_OPERATOR
5601 && d_left (dc
)->u
.s_operator
.op
->len
== 1
5602 && d_left (dc
)->u
.s_operator
.op
->name
[0] == '>')
5603 d_append_char (dpi
, ')');
5607 case DEMANGLE_COMPONENT_BINARY_ARGS
:
5608 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
5609 d_print_error (dpi
);
5612 case DEMANGLE_COMPONENT_TRINARY
:
5613 if (d_right (dc
)->type
!= DEMANGLE_COMPONENT_TRINARY_ARG1
5614 || d_right (d_right (dc
))->type
!= DEMANGLE_COMPONENT_TRINARY_ARG2
)
5616 d_print_error (dpi
);
5619 if (d_maybe_print_fold_expression (dpi
, options
, dc
))
5621 if (d_maybe_print_designated_init (dpi
, options
, dc
))
5624 struct demangle_component
*op
= d_left (dc
);
5625 struct demangle_component
*first
= d_left (d_right (dc
));
5626 struct demangle_component
*second
= d_left (d_right (d_right (dc
)));
5627 struct demangle_component
*third
= d_right (d_right (d_right (dc
)));
5629 if (!strcmp (op
->u
.s_operator
.op
->code
, "qu"))
5631 d_print_subexpr (dpi
, options
, first
);
5632 d_print_expr_op (dpi
, options
, op
);
5633 d_print_subexpr (dpi
, options
, second
);
5634 d_append_string (dpi
, " : ");
5635 d_print_subexpr (dpi
, options
, third
);
5639 d_append_string (dpi
, "new ");
5640 if (d_left (first
) != NULL
)
5642 d_print_subexpr (dpi
, options
, first
);
5643 d_append_char (dpi
, ' ');
5645 d_print_comp (dpi
, options
, second
);
5647 d_print_subexpr (dpi
, options
, third
);
5652 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
5653 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
5654 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
5655 d_print_error (dpi
);
5658 case DEMANGLE_COMPONENT_LITERAL
:
5659 case DEMANGLE_COMPONENT_LITERAL_NEG
:
5661 enum d_builtin_type_print tp
;
5663 /* For some builtin types, produce simpler output. */
5664 tp
= D_PRINT_DEFAULT
;
5665 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
)
5667 tp
= d_left (dc
)->u
.s_builtin
.type
->print
;
5671 case D_PRINT_UNSIGNED
:
5673 case D_PRINT_UNSIGNED_LONG
:
5674 case D_PRINT_LONG_LONG
:
5675 case D_PRINT_UNSIGNED_LONG_LONG
:
5676 if (d_right (dc
)->type
== DEMANGLE_COMPONENT_NAME
)
5678 if (dc
->type
== DEMANGLE_COMPONENT_LITERAL_NEG
)
5679 d_append_char (dpi
, '-');
5680 d_print_comp (dpi
, options
, d_right (dc
));
5685 case D_PRINT_UNSIGNED
:
5686 d_append_char (dpi
, 'u');
5689 d_append_char (dpi
, 'l');
5691 case D_PRINT_UNSIGNED_LONG
:
5692 d_append_string (dpi
, "ul");
5694 case D_PRINT_LONG_LONG
:
5695 d_append_string (dpi
, "ll");
5697 case D_PRINT_UNSIGNED_LONG_LONG
:
5698 d_append_string (dpi
, "ull");
5706 if (d_right (dc
)->type
== DEMANGLE_COMPONENT_NAME
5707 && d_right (dc
)->u
.s_name
.len
== 1
5708 && dc
->type
== DEMANGLE_COMPONENT_LITERAL
)
5710 switch (d_right (dc
)->u
.s_name
.s
[0])
5713 d_append_string (dpi
, "false");
5716 d_append_string (dpi
, "true");
5729 d_append_char (dpi
, '(');
5730 d_print_comp (dpi
, options
, d_left (dc
));
5731 d_append_char (dpi
, ')');
5732 if (dc
->type
== DEMANGLE_COMPONENT_LITERAL_NEG
)
5733 d_append_char (dpi
, '-');
5734 if (tp
== D_PRINT_FLOAT
)
5735 d_append_char (dpi
, '[');
5736 d_print_comp (dpi
, options
, d_right (dc
));
5737 if (tp
== D_PRINT_FLOAT
)
5738 d_append_char (dpi
, ']');
5742 case DEMANGLE_COMPONENT_NUMBER
:
5743 d_append_num (dpi
, dc
->u
.s_number
.number
);
5746 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
5747 d_append_string (dpi
, "java resource ");
5748 d_print_comp (dpi
, options
, d_left (dc
));
5751 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
5752 d_print_comp (dpi
, options
, d_left (dc
));
5753 d_print_comp (dpi
, options
, d_right (dc
));
5756 case DEMANGLE_COMPONENT_CHARACTER
:
5757 d_append_char (dpi
, dc
->u
.s_character
.character
);
5760 case DEMANGLE_COMPONENT_DECLTYPE
:
5761 d_append_string (dpi
, "decltype (");
5762 d_print_comp (dpi
, options
, d_left (dc
));
5763 d_append_char (dpi
, ')');
5766 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
5770 struct demangle_component
*a
= d_find_pack (dpi
, d_left (dc
));
5773 /* d_find_pack won't find anything if the only packs involved
5774 in this expansion are function parameter packs; in that
5775 case, just print the pattern and "...". */
5776 d_print_subexpr (dpi
, options
, d_left (dc
));
5777 d_append_string (dpi
, "...");
5781 len
= d_pack_length (a
);
5783 for (i
= 0; i
< len
; ++i
)
5785 dpi
->pack_index
= i
;
5786 d_print_comp (dpi
, options
, dc
);
5788 d_append_string (dpi
, ", ");
5793 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
5795 long num
= dc
->u
.s_number
.number
;
5797 d_append_string (dpi
, "this");
5800 d_append_string (dpi
, "{parm#");
5801 d_append_num (dpi
, num
);
5802 d_append_char (dpi
, '}');
5807 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
5808 d_append_string (dpi
, "global constructors keyed to ");
5809 d_print_comp (dpi
, options
, dc
->u
.s_binary
.left
);
5812 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
5813 d_append_string (dpi
, "global destructors keyed to ");
5814 d_print_comp (dpi
, options
, dc
->u
.s_binary
.left
);
5817 case DEMANGLE_COMPONENT_LAMBDA
:
5818 d_append_string (dpi
, "{lambda(");
5819 /* Generic lambda auto parms are mangled as the template type
5821 dpi
->is_lambda_arg
++;
5822 d_print_comp (dpi
, options
, dc
->u
.s_unary_num
.sub
);
5823 dpi
->is_lambda_arg
--;
5824 d_append_string (dpi
, ")#");
5825 d_append_num (dpi
, dc
->u
.s_unary_num
.num
+ 1);
5826 d_append_char (dpi
, '}');
5829 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
5830 d_append_string (dpi
, "{unnamed type#");
5831 d_append_num (dpi
, dc
->u
.s_number
.number
+ 1);
5832 d_append_char (dpi
, '}');
5835 case DEMANGLE_COMPONENT_CLONE
:
5836 d_print_comp (dpi
, options
, d_left (dc
));
5837 d_append_string (dpi
, " [clone ");
5838 d_print_comp (dpi
, options
, d_right (dc
));
5839 d_append_char (dpi
, ']');
5843 d_print_error (dpi
);
5849 d_print_comp (struct d_print_info
*dpi
, int options
,
5850 struct demangle_component
*dc
)
5852 struct d_component_stack self
;
5853 if (dc
== NULL
|| dc
->d_printing
> 1 || dpi
->recursion
> MAX_RECURSION_COUNT
)
5855 d_print_error (dpi
);
5863 self
.parent
= dpi
->component_stack
;
5864 dpi
->component_stack
= &self
;
5866 d_print_comp_inner (dpi
, options
, dc
);
5868 dpi
->component_stack
= self
.parent
;
5873 /* Print a Java dentifier. For Java we try to handle encoded extended
5874 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
5875 so we don't it for C++. Characters are encoded as
5879 d_print_java_identifier (struct d_print_info
*dpi
, const char *name
, int len
)
5885 for (p
= name
; p
< end
; ++p
)
5896 for (q
= p
+ 3; q
< end
; ++q
)
5902 else if (*q
>= 'A' && *q
<= 'F')
5903 dig
= *q
- 'A' + 10;
5904 else if (*q
>= 'a' && *q
<= 'f')
5905 dig
= *q
- 'a' + 10;
5911 /* If the Unicode character is larger than 256, we don't try
5912 to deal with it here. FIXME. */
5913 if (q
< end
&& *q
== '_' && c
< 256)
5915 d_append_char (dpi
, c
);
5921 d_append_char (dpi
, *p
);
5925 /* Print a list of modifiers. SUFFIX is 1 if we are printing
5926 qualifiers on this after printing a function. */
5929 d_print_mod_list (struct d_print_info
*dpi
, int options
,
5930 struct d_print_mod
*mods
, int suffix
)
5932 struct d_print_template
*hold_dpt
;
5934 if (mods
== NULL
|| d_print_saw_error (dpi
))
5939 && (is_fnqual_component_type (mods
->mod
->type
))))
5941 d_print_mod_list (dpi
, options
, mods
->next
, suffix
);
5947 hold_dpt
= dpi
->templates
;
5948 dpi
->templates
= mods
->templates
;
5950 if (mods
->mod
->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5952 d_print_function_type (dpi
, options
, mods
->mod
, mods
->next
);
5953 dpi
->templates
= hold_dpt
;
5956 else if (mods
->mod
->type
== DEMANGLE_COMPONENT_ARRAY_TYPE
)
5958 d_print_array_type (dpi
, options
, mods
->mod
, mods
->next
);
5959 dpi
->templates
= hold_dpt
;
5962 else if (mods
->mod
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
5964 struct d_print_mod
*hold_modifiers
;
5965 struct demangle_component
*dc
;
5967 /* When this is on the modifier stack, we have pulled any
5968 qualifiers off the right argument already. Otherwise, we
5969 print it as usual, but don't let the left argument see any
5972 hold_modifiers
= dpi
->modifiers
;
5973 dpi
->modifiers
= NULL
;
5974 d_print_comp (dpi
, options
, d_left (mods
->mod
));
5975 dpi
->modifiers
= hold_modifiers
;
5977 if ((options
& DMGL_JAVA
) == 0)
5978 d_append_string (dpi
, "::");
5980 d_append_char (dpi
, '.');
5982 dc
= d_right (mods
->mod
);
5984 if (dc
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
5986 d_append_string (dpi
, "{default arg#");
5987 d_append_num (dpi
, dc
->u
.s_unary_num
.num
+ 1);
5988 d_append_string (dpi
, "}::");
5989 dc
= dc
->u
.s_unary_num
.sub
;
5992 while (is_fnqual_component_type (dc
->type
))
5995 d_print_comp (dpi
, options
, dc
);
5997 dpi
->templates
= hold_dpt
;
6001 d_print_mod (dpi
, options
, mods
->mod
);
6003 dpi
->templates
= hold_dpt
;
6005 d_print_mod_list (dpi
, options
, mods
->next
, suffix
);
6008 /* Print a modifier. */
6011 d_print_mod (struct d_print_info
*dpi
, int options
,
6012 struct demangle_component
*mod
)
6016 case DEMANGLE_COMPONENT_RESTRICT
:
6017 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
6018 d_append_string (dpi
, " restrict");
6020 case DEMANGLE_COMPONENT_VOLATILE
:
6021 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
6022 d_append_string (dpi
, " volatile");
6024 case DEMANGLE_COMPONENT_CONST
:
6025 case DEMANGLE_COMPONENT_CONST_THIS
:
6026 d_append_string (dpi
, " const");
6028 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
6029 d_append_string (dpi
, " transaction_safe");
6031 case DEMANGLE_COMPONENT_NOEXCEPT
:
6032 d_append_string (dpi
, " noexcept");
6035 d_append_char (dpi
, '(');
6036 d_print_comp (dpi
, options
, d_right (mod
));
6037 d_append_char (dpi
, ')');
6040 case DEMANGLE_COMPONENT_THROW_SPEC
:
6041 d_append_string (dpi
, " throw");
6044 d_append_char (dpi
, '(');
6045 d_print_comp (dpi
, options
, d_right (mod
));
6046 d_append_char (dpi
, ')');
6049 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
6050 d_append_char (dpi
, ' ');
6051 d_print_comp (dpi
, options
, d_right (mod
));
6053 case DEMANGLE_COMPONENT_POINTER
:
6054 /* There is no pointer symbol in Java. */
6055 if ((options
& DMGL_JAVA
) == 0)
6056 d_append_char (dpi
, '*');
6058 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
6059 /* For the ref-qualifier, put a space before the &. */
6060 d_append_char (dpi
, ' ');
6062 case DEMANGLE_COMPONENT_REFERENCE
:
6063 d_append_char (dpi
, '&');
6065 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
6066 d_append_char (dpi
, ' ');
6068 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
6069 d_append_string (dpi
, "&&");
6071 case DEMANGLE_COMPONENT_COMPLEX
:
6072 d_append_string (dpi
, " _Complex");
6074 case DEMANGLE_COMPONENT_IMAGINARY
:
6075 d_append_string (dpi
, " _Imaginary");
6077 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
6078 if (d_last_char (dpi
) != '(')
6079 d_append_char (dpi
, ' ');
6080 d_print_comp (dpi
, options
, d_left (mod
));
6081 d_append_string (dpi
, "::*");
6083 case DEMANGLE_COMPONENT_TYPED_NAME
:
6084 d_print_comp (dpi
, options
, d_left (mod
));
6086 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
6087 d_append_string (dpi
, " __vector(");
6088 d_print_comp (dpi
, options
, d_left (mod
));
6089 d_append_char (dpi
, ')');
6093 /* Otherwise, we have something that won't go back on the
6094 modifier stack, so we can just print it. */
6095 d_print_comp (dpi
, options
, mod
);
6100 /* Print a function type, except for the return type. */
6103 d_print_function_type (struct d_print_info
*dpi
, int options
,
6104 struct demangle_component
*dc
,
6105 struct d_print_mod
*mods
)
6109 struct d_print_mod
*p
;
6110 struct d_print_mod
*hold_modifiers
;
6114 for (p
= mods
; p
!= NULL
; p
= p
->next
)
6119 switch (p
->mod
->type
)
6121 case DEMANGLE_COMPONENT_POINTER
:
6122 case DEMANGLE_COMPONENT_REFERENCE
:
6123 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
6126 case DEMANGLE_COMPONENT_RESTRICT
:
6127 case DEMANGLE_COMPONENT_VOLATILE
:
6128 case DEMANGLE_COMPONENT_CONST
:
6129 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
6130 case DEMANGLE_COMPONENT_COMPLEX
:
6131 case DEMANGLE_COMPONENT_IMAGINARY
:
6132 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
6136 FNQUAL_COMPONENT_CASE
:
6149 if (d_last_char (dpi
) != '('
6150 && d_last_char (dpi
) != '*')
6153 if (need_space
&& d_last_char (dpi
) != ' ')
6154 d_append_char (dpi
, ' ');
6155 d_append_char (dpi
, '(');
6158 hold_modifiers
= dpi
->modifiers
;
6159 dpi
->modifiers
= NULL
;
6161 d_print_mod_list (dpi
, options
, mods
, 0);
6164 d_append_char (dpi
, ')');
6166 d_append_char (dpi
, '(');
6168 if (d_right (dc
) != NULL
)
6169 d_print_comp (dpi
, options
, d_right (dc
));
6171 d_append_char (dpi
, ')');
6173 d_print_mod_list (dpi
, options
, mods
, 1);
6175 dpi
->modifiers
= hold_modifiers
;
6178 /* Print an array type, except for the element type. */
6181 d_print_array_type (struct d_print_info
*dpi
, int options
,
6182 struct demangle_component
*dc
,
6183 struct d_print_mod
*mods
)
6191 struct d_print_mod
*p
;
6194 for (p
= mods
; p
!= NULL
; p
= p
->next
)
6198 if (p
->mod
->type
== DEMANGLE_COMPONENT_ARRAY_TYPE
)
6213 d_append_string (dpi
, " (");
6215 d_print_mod_list (dpi
, options
, mods
, 0);
6218 d_append_char (dpi
, ')');
6222 d_append_char (dpi
, ' ');
6224 d_append_char (dpi
, '[');
6226 if (d_left (dc
) != NULL
)
6227 d_print_comp (dpi
, options
, d_left (dc
));
6229 d_append_char (dpi
, ']');
6232 /* Print an operator in an expression. */
6235 d_print_expr_op (struct d_print_info
*dpi
, int options
,
6236 struct demangle_component
*dc
)
6238 if (dc
->type
== DEMANGLE_COMPONENT_OPERATOR
)
6239 d_append_buffer (dpi
, dc
->u
.s_operator
.op
->name
,
6240 dc
->u
.s_operator
.op
->len
);
6242 d_print_comp (dpi
, options
, dc
);
6248 d_print_cast (struct d_print_info
*dpi
, int options
,
6249 struct demangle_component
*dc
)
6251 d_print_comp (dpi
, options
, d_left (dc
));
6254 /* Print a conversion operator. */
6257 d_print_conversion (struct d_print_info
*dpi
, int options
,
6258 struct demangle_component
*dc
)
6260 struct d_print_template dpt
;
6262 /* For a conversion operator, we need the template parameters from
6263 the enclosing template in scope for processing the type. */
6264 if (dpi
->current_template
!= NULL
)
6266 dpt
.next
= dpi
->templates
;
6267 dpi
->templates
= &dpt
;
6268 dpt
.template_decl
= dpi
->current_template
;
6271 if (d_left (dc
)->type
!= DEMANGLE_COMPONENT_TEMPLATE
)
6273 d_print_comp (dpi
, options
, d_left (dc
));
6274 if (dpi
->current_template
!= NULL
)
6275 dpi
->templates
= dpt
.next
;
6279 d_print_comp (dpi
, options
, d_left (d_left (dc
)));
6281 /* For a templated cast operator, we need to remove the template
6282 parameters from scope after printing the operator name,
6283 so we need to handle the template printing here. */
6284 if (dpi
->current_template
!= NULL
)
6285 dpi
->templates
= dpt
.next
;
6287 if (d_last_char (dpi
) == '<')
6288 d_append_char (dpi
, ' ');
6289 d_append_char (dpi
, '<');
6290 d_print_comp (dpi
, options
, d_right (d_left (dc
)));
6291 /* Avoid generating two consecutive '>' characters, to avoid
6292 the C++ syntactic ambiguity. */
6293 if (d_last_char (dpi
) == '>')
6294 d_append_char (dpi
, ' ');
6295 d_append_char (dpi
, '>');
6299 /* Initialize the information structure we use to pass around
6302 CP_STATIC_IF_GLIBCPP_V3
6304 cplus_demangle_init_info (const char *mangled
, int options
, size_t len
,
6308 di
->send
= mangled
+ len
;
6309 di
->options
= options
;
6313 /* We cannot need more components than twice the number of chars in
6314 the mangled string. Most components correspond directly to
6315 chars, but the ARGLIST types are exceptions. */
6316 di
->num_comps
= 2 * len
;
6319 /* Similarly, we cannot need more substitutions than there are
6320 chars in the mangled string. */
6324 di
->last_name
= NULL
;
6327 di
->is_expression
= 0;
6328 di
->is_conversion
= 0;
6329 di
->recursion_level
= 0;
6332 /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
6333 mangled name, return strings in repeated callback giving the demangled
6334 name. OPTIONS is the usual libiberty demangler options. On success,
6335 this returns 1. On failure, returns 0. */
6338 d_demangle_callback (const char *mangled
, int options
,
6339 demangle_callbackref callback
, void *opaque
)
6350 struct demangle_component
*dc
;
6353 if (mangled
[0] == '_' && mangled
[1] == 'Z')
6355 else if (strncmp (mangled
, "_GLOBAL_", 8) == 0
6356 && (mangled
[8] == '.' || mangled
[8] == '_' || mangled
[8] == '$')
6357 && (mangled
[9] == 'D' || mangled
[9] == 'I')
6358 && mangled
[10] == '_')
6359 type
= mangled
[9] == 'I' ? DCT_GLOBAL_CTORS
: DCT_GLOBAL_DTORS
;
6362 if ((options
& DMGL_TYPES
) == 0)
6367 cplus_demangle_init_info (mangled
, options
, strlen (mangled
), &di
);
6369 /* PR 87675 - Check for a mangled string that is so long
6370 that we do not have enough stack space to demangle it. */
6371 if (((options
& DMGL_NO_RECURSE_LIMIT
) == 0)
6372 /* This check is a bit arbitrary, since what we really want to do is to
6373 compare the sizes of the di.comps and di.subs arrays against the
6374 amount of stack space remaining. But there is no portable way to do
6375 this, so instead we use the recursion limit as a guide to the maximum
6376 size of the arrays. */
6377 && (unsigned long) di
.num_comps
> DEMANGLE_RECURSION_LIMIT
)
6379 /* FIXME: We need a way to indicate that a stack limit has been reached. */
6384 #ifdef CP_DYNAMIC_ARRAYS
6385 __extension__
struct demangle_component comps
[di
.num_comps
];
6386 __extension__
struct demangle_component
*subs
[di
.num_subs
];
6391 di
.comps
= alloca (di
.num_comps
* sizeof (*di
.comps
));
6392 di
.subs
= alloca (di
.num_subs
* sizeof (*di
.subs
));
6398 dc
= cplus_demangle_type (&di
);
6401 dc
= cplus_demangle_mangled_name (&di
, 1);
6403 case DCT_GLOBAL_CTORS
:
6404 case DCT_GLOBAL_DTORS
:
6405 d_advance (&di
, 11);
6406 dc
= d_make_comp (&di
,
6407 (type
== DCT_GLOBAL_CTORS
6408 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
6409 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
),
6410 d_make_demangle_mangled_name (&di
, d_str (&di
)),
6412 d_advance (&di
, strlen (d_str (&di
)));
6415 abort (); /* We have listed all the cases. */
6418 /* If DMGL_PARAMS is set, then if we didn't consume the entire
6419 mangled string, then we didn't successfully demangle it. If
6420 DMGL_PARAMS is not set, we didn't look at the trailing
6422 if (((options
& DMGL_PARAMS
) != 0) && d_peek_char (&di
) != '\0')
6425 #ifdef CP_DEMANGLE_DEBUG
6429 status
= (dc
!= NULL
)
6430 ? cplus_demangle_print_callback (options
, dc
, callback
, opaque
)
6437 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
6438 name, return a buffer allocated with malloc holding the demangled
6439 name. OPTIONS is the usual libiberty demangler options. On
6440 success, this sets *PALC to the allocated size of the returned
6441 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
6442 a memory allocation failure, and returns NULL. */
6445 d_demangle (const char *mangled
, int options
, size_t *palc
)
6447 struct d_growable_string dgs
;
6450 d_growable_string_init (&dgs
, 0);
6452 status
= d_demangle_callback (mangled
, options
,
6453 d_growable_string_callback_adapter
, &dgs
);
6461 *palc
= dgs
.allocation_failure
? 1 : dgs
.alc
;
6465 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
6467 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
6469 /* ia64 ABI-mandated entry point in the C++ runtime library for
6470 performing demangling. MANGLED_NAME is a NUL-terminated character
6471 string containing the name to be demangled.
6473 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
6474 *LENGTH bytes, into which the demangled name is stored. If
6475 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
6476 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
6477 is placed in a region of memory allocated with malloc.
6479 If LENGTH is non-NULL, the length of the buffer containing the
6480 demangled name, is placed in *LENGTH.
6482 The return value is a pointer to the start of the NUL-terminated
6483 demangled name, or NULL if the demangling fails. The caller is
6484 responsible for deallocating this memory using free.
6486 *STATUS is set to one of the following values:
6487 0: The demangling operation succeeded.
6488 -1: A memory allocation failure occurred.
6489 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6490 -3: One of the arguments is invalid.
6492 The demangling is performed using the C++ ABI mangling rules, with
6496 __cxa_demangle (const char *mangled_name
, char *output_buffer
,
6497 size_t *length
, int *status
)
6502 if (mangled_name
== NULL
)
6509 if (output_buffer
!= NULL
&& length
== NULL
)
6516 demangled
= d_demangle (mangled_name
, DMGL_PARAMS
| DMGL_TYPES
, &alc
);
6518 if (demangled
== NULL
)
6530 if (output_buffer
== NULL
)
6537 if (strlen (demangled
) < *length
)
6539 strcpy (output_buffer
, demangled
);
6541 demangled
= output_buffer
;
6545 free (output_buffer
);
6556 extern int __gcclibcxx_demangle_callback (const char *,
6558 (const char *, size_t, void *),
6561 /* Alternative, allocationless entry point in the C++ runtime library
6562 for performing demangling. MANGLED_NAME is a NUL-terminated character
6563 string containing the name to be demangled.
6565 CALLBACK is a callback function, called with demangled string
6566 segments as demangling progresses; it is called at least once,
6567 but may be called more than once. OPAQUE is a generalized pointer
6568 used as a callback argument.
6570 The return code is one of the following values, equivalent to
6571 the STATUS values of __cxa_demangle() (excluding -1, since this
6572 function performs no memory allocations):
6573 0: The demangling operation succeeded.
6574 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6575 -3: One of the arguments is invalid.
6577 The demangling is performed using the C++ ABI mangling rules, with
6581 __gcclibcxx_demangle_callback (const char *mangled_name
,
6582 void (*callback
) (const char *, size_t, void *),
6587 if (mangled_name
== NULL
|| callback
== NULL
)
6590 status
= d_demangle_callback (mangled_name
, DMGL_PARAMS
| DMGL_TYPES
,
6598 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
6600 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
6601 mangled name, return a buffer allocated with malloc holding the
6602 demangled name. Otherwise, return NULL. */
6605 cplus_demangle_v3 (const char *mangled
, int options
)
6609 return d_demangle (mangled
, options
, &alc
);
6613 cplus_demangle_v3_callback (const char *mangled
, int options
,
6614 demangle_callbackref callback
, void *opaque
)
6616 return d_demangle_callback (mangled
, options
, callback
, opaque
);
6619 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
6620 conventions, but the output formatting is a little different.
6621 This instructs the C++ demangler not to emit pointer characters ("*"), to
6622 use Java's namespace separator symbol ("." instead of "::"), and to output
6623 JArray<TYPE> as TYPE[]. */
6626 java_demangle_v3 (const char *mangled
)
6630 return d_demangle (mangled
, DMGL_JAVA
| DMGL_PARAMS
| DMGL_RET_POSTFIX
, &alc
);
6634 java_demangle_v3_callback (const char *mangled
,
6635 demangle_callbackref callback
, void *opaque
)
6637 return d_demangle_callback (mangled
,
6638 DMGL_JAVA
| DMGL_PARAMS
| DMGL_RET_POSTFIX
,
6642 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
6644 #ifndef IN_GLIBCPP_V3
6646 /* Demangle a string in order to find out whether it is a constructor
6647 or destructor. Return non-zero on success. Set *CTOR_KIND and
6648 *DTOR_KIND appropriately. */
6651 is_ctor_or_dtor (const char *mangled
,
6652 enum gnu_v3_ctor_kinds
*ctor_kind
,
6653 enum gnu_v3_dtor_kinds
*dtor_kind
)
6656 struct demangle_component
*dc
;
6659 *ctor_kind
= (enum gnu_v3_ctor_kinds
) 0;
6660 *dtor_kind
= (enum gnu_v3_dtor_kinds
) 0;
6662 cplus_demangle_init_info (mangled
, DMGL_GNU_V3
, strlen (mangled
), &di
);
6665 #ifdef CP_DYNAMIC_ARRAYS
6666 __extension__
struct demangle_component comps
[di
.num_comps
];
6667 __extension__
struct demangle_component
*subs
[di
.num_subs
];
6672 di
.comps
= alloca (di
.num_comps
* sizeof (*di
.comps
));
6673 di
.subs
= alloca (di
.num_subs
* sizeof (*di
.subs
));
6676 dc
= cplus_demangle_mangled_name (&di
, 1);
6678 /* Note that because we did not pass DMGL_PARAMS, we don't expect
6679 to demangle the entire string. */
6686 /* These cannot appear on a constructor or destructor. */
6687 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
6688 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
6689 case DEMANGLE_COMPONENT_CONST_THIS
:
6690 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
6691 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
6695 case DEMANGLE_COMPONENT_TYPED_NAME
:
6696 case DEMANGLE_COMPONENT_TEMPLATE
:
6699 case DEMANGLE_COMPONENT_QUAL_NAME
:
6700 case DEMANGLE_COMPONENT_LOCAL_NAME
:
6703 case DEMANGLE_COMPONENT_CTOR
:
6704 *ctor_kind
= dc
->u
.s_ctor
.kind
;
6708 case DEMANGLE_COMPONENT_DTOR
:
6709 *dtor_kind
= dc
->u
.s_dtor
.kind
;
6720 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
6721 name. A non-zero return indicates the type of constructor. */
6723 enum gnu_v3_ctor_kinds
6724 is_gnu_v3_mangled_ctor (const char *name
)
6726 enum gnu_v3_ctor_kinds ctor_kind
;
6727 enum gnu_v3_dtor_kinds dtor_kind
;
6729 if (! is_ctor_or_dtor (name
, &ctor_kind
, &dtor_kind
))
6730 return (enum gnu_v3_ctor_kinds
) 0;
6735 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
6736 name. A non-zero return indicates the type of destructor. */
6738 enum gnu_v3_dtor_kinds
6739 is_gnu_v3_mangled_dtor (const char *name
)
6741 enum gnu_v3_ctor_kinds ctor_kind
;
6742 enum gnu_v3_dtor_kinds dtor_kind
;
6744 if (! is_ctor_or_dtor (name
, &ctor_kind
, &dtor_kind
))
6745 return (enum gnu_v3_dtor_kinds
) 0;
6749 #endif /* IN_GLIBCPP_V3 */
6751 #ifdef STANDALONE_DEMANGLER
6754 #include "dyn-string.h"
6756 static void print_usage (FILE* fp
, int exit_value
);
6758 #define IS_ALPHA(CHAR) \
6759 (((CHAR) >= 'a' && (CHAR) <= 'z') \
6760 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
6762 /* Non-zero if CHAR is a character than can occur in a mangled name. */
6763 #define is_mangled_char(CHAR) \
6764 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
6765 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
6767 /* The name of this program, as invoked. */
6768 const char* program_name
;
6770 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
6773 print_usage (FILE* fp
, int exit_value
)
6775 fprintf (fp
, "Usage: %s [options] [names ...]\n", program_name
);
6776 fprintf (fp
, "Options:\n");
6777 fprintf (fp
, " -h,--help Display this message.\n");
6778 fprintf (fp
, " -p,--no-params Don't display function parameters\n");
6779 fprintf (fp
, " -v,--verbose Produce verbose demanglings.\n");
6780 fprintf (fp
, "If names are provided, they are demangled. Otherwise filters standard input.\n");
6785 /* Option specification for getopt_long. */
6786 static const struct option long_options
[] =
6788 { "help", no_argument
, NULL
, 'h' },
6789 { "no-params", no_argument
, NULL
, 'p' },
6790 { "verbose", no_argument
, NULL
, 'v' },
6791 { NULL
, no_argument
, NULL
, 0 },
6794 /* Main entry for a demangling filter executable. It will demangle
6795 its command line arguments, if any. If none are provided, it will
6796 filter stdin to stdout, replacing any recognized mangled C++ names
6797 with their demangled equivalents. */
6800 main (int argc
, char *argv
[])
6804 int options
= DMGL_PARAMS
| DMGL_ANSI
| DMGL_TYPES
;
6806 /* Use the program name of this program, as invoked. */
6807 program_name
= argv
[0];
6809 /* Parse options. */
6812 opt_char
= getopt_long (argc
, argv
, "hpv", long_options
, NULL
);
6815 case '?': /* Unrecognized option. */
6816 print_usage (stderr
, 1);
6820 print_usage (stdout
, 0);
6824 options
&= ~ DMGL_PARAMS
;
6828 options
|= DMGL_VERBOSE
;
6832 while (opt_char
!= -1);
6835 /* No command line arguments were provided. Filter stdin. */
6837 dyn_string_t mangled
= dyn_string_new (3);
6840 /* Read all of input. */
6841 while (!feof (stdin
))
6845 /* Pile characters into mangled until we hit one that can't
6846 occur in a mangled name. */
6848 while (!feof (stdin
) && is_mangled_char (c
))
6850 dyn_string_append_char (mangled
, c
);
6856 if (dyn_string_length (mangled
) > 0)
6858 #ifdef IN_GLIBCPP_V3
6859 s
= __cxa_demangle (dyn_string_buf (mangled
), NULL
, NULL
, NULL
);
6861 s
= cplus_demangle_v3 (dyn_string_buf (mangled
), options
);
6871 /* It might not have been a mangled name. Print the
6873 fputs (dyn_string_buf (mangled
), stdout
);
6876 dyn_string_clear (mangled
);
6879 /* If we haven't hit EOF yet, we've read one character that
6880 can't occur in a mangled name, so print it out. */
6885 dyn_string_delete (mangled
);
6888 /* Demangle command line arguments. */
6890 /* Loop over command line arguments. */
6891 for (i
= optind
; i
< argc
; ++i
)
6894 #ifdef IN_GLIBCPP_V3
6898 /* Attempt to demangle. */
6899 #ifdef IN_GLIBCPP_V3
6900 s
= __cxa_demangle (argv
[i
], NULL
, NULL
, &status
);
6902 s
= cplus_demangle_v3 (argv
[i
], options
);
6905 /* If it worked, print the demangled name. */
6913 #ifdef IN_GLIBCPP_V3
6914 fprintf (stderr
, "Failed: %s (status %d)\n", argv
[i
], status
);
6916 fprintf (stderr
, "Failed: %s\n", argv
[i
]);
6925 #endif /* STANDALONE_DEMANGLER */