1 /* Demangler for g++ V3 ABI.
2 Copyright (C) 2003-2019 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 const 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)
867 p
->type
= DEMANGLE_COMPONENT_NAME
;
869 p
->u
.s_name
.len
= len
;
873 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
875 CP_STATIC_IF_GLIBCPP_V3
877 cplus_demangle_fill_extended_operator (struct demangle_component
*p
, int args
,
878 struct demangle_component
*name
)
880 if (p
== NULL
|| args
< 0 || name
== NULL
)
883 p
->type
= DEMANGLE_COMPONENT_EXTENDED_OPERATOR
;
884 p
->u
.s_extended_operator
.args
= args
;
885 p
->u
.s_extended_operator
.name
= name
;
889 /* Fill in a DEMANGLE_COMPONENT_CTOR. */
891 CP_STATIC_IF_GLIBCPP_V3
893 cplus_demangle_fill_ctor (struct demangle_component
*p
,
894 enum gnu_v3_ctor_kinds kind
,
895 struct demangle_component
*name
)
899 || (int) kind
< gnu_v3_complete_object_ctor
900 || (int) kind
> gnu_v3_object_ctor_group
)
903 p
->type
= DEMANGLE_COMPONENT_CTOR
;
904 p
->u
.s_ctor
.kind
= kind
;
905 p
->u
.s_ctor
.name
= name
;
909 /* Fill in a DEMANGLE_COMPONENT_DTOR. */
911 CP_STATIC_IF_GLIBCPP_V3
913 cplus_demangle_fill_dtor (struct demangle_component
*p
,
914 enum gnu_v3_dtor_kinds kind
,
915 struct demangle_component
*name
)
919 || (int) kind
< gnu_v3_deleting_dtor
920 || (int) kind
> gnu_v3_object_dtor_group
)
923 p
->type
= DEMANGLE_COMPONENT_DTOR
;
924 p
->u
.s_dtor
.kind
= kind
;
925 p
->u
.s_dtor
.name
= name
;
929 /* Add a new component. */
931 static struct demangle_component
*
932 d_make_empty (struct d_info
*di
)
934 struct demangle_component
*p
;
936 if (di
->next_comp
>= di
->num_comps
)
938 p
= &di
->comps
[di
->next_comp
];
944 /* Add a new generic component. */
946 static struct demangle_component
*
947 d_make_comp (struct d_info
*di
, enum demangle_component_type type
,
948 struct demangle_component
*left
,
949 struct demangle_component
*right
)
951 struct demangle_component
*p
;
953 /* We check for errors here. A typical error would be a NULL return
954 from a subroutine. We catch those here, and return NULL
958 /* These types require two parameters. */
959 case DEMANGLE_COMPONENT_QUAL_NAME
:
960 case DEMANGLE_COMPONENT_LOCAL_NAME
:
961 case DEMANGLE_COMPONENT_TYPED_NAME
:
962 case DEMANGLE_COMPONENT_TAGGED_NAME
:
963 case DEMANGLE_COMPONENT_TEMPLATE
:
964 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
965 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
966 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
967 case DEMANGLE_COMPONENT_UNARY
:
968 case DEMANGLE_COMPONENT_BINARY
:
969 case DEMANGLE_COMPONENT_BINARY_ARGS
:
970 case DEMANGLE_COMPONENT_TRINARY
:
971 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
972 case DEMANGLE_COMPONENT_LITERAL
:
973 case DEMANGLE_COMPONENT_LITERAL_NEG
:
974 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
975 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
976 case DEMANGLE_COMPONENT_CLONE
:
977 if (left
== NULL
|| right
== NULL
)
981 /* These types only require one parameter. */
982 case DEMANGLE_COMPONENT_VTABLE
:
983 case DEMANGLE_COMPONENT_VTT
:
984 case DEMANGLE_COMPONENT_TYPEINFO
:
985 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
986 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
987 case DEMANGLE_COMPONENT_THUNK
:
988 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
989 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
990 case DEMANGLE_COMPONENT_JAVA_CLASS
:
991 case DEMANGLE_COMPONENT_GUARD
:
992 case DEMANGLE_COMPONENT_TLS_INIT
:
993 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
994 case DEMANGLE_COMPONENT_REFTEMP
:
995 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
996 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
997 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
998 case DEMANGLE_COMPONENT_POINTER
:
999 case DEMANGLE_COMPONENT_REFERENCE
:
1000 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
1001 case DEMANGLE_COMPONENT_COMPLEX
:
1002 case DEMANGLE_COMPONENT_IMAGINARY
:
1003 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
1004 case DEMANGLE_COMPONENT_CAST
:
1005 case DEMANGLE_COMPONENT_CONVERSION
:
1006 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
1007 case DEMANGLE_COMPONENT_DECLTYPE
:
1008 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
1009 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
1010 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
1011 case DEMANGLE_COMPONENT_NULLARY
:
1012 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
1013 case DEMANGLE_COMPONENT_TPARM_OBJ
:
1018 /* This needs a right parameter, but the left parameter can be
1020 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
1021 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
1026 /* These are allowed to have no parameters--in some cases they
1027 will be filled in later. */
1028 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
1029 case DEMANGLE_COMPONENT_RESTRICT
:
1030 case DEMANGLE_COMPONENT_VOLATILE
:
1031 case DEMANGLE_COMPONENT_CONST
:
1032 case DEMANGLE_COMPONENT_ARGLIST
:
1033 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
1034 FNQUAL_COMPONENT_CASE
:
1037 /* Other types should not be seen here. */
1042 p
= d_make_empty (di
);
1046 p
->u
.s_binary
.left
= left
;
1047 p
->u
.s_binary
.right
= right
;
1052 /* Add a new demangle mangled name component. */
1054 static struct demangle_component
*
1055 d_make_demangle_mangled_name (struct d_info
*di
, const char *s
)
1057 if (d_peek_char (di
) != '_' || d_peek_next_char (di
) != 'Z')
1058 return d_make_name (di
, s
, strlen (s
));
1060 return d_encoding (di
, 0);
1063 /* Add a new name component. */
1065 static struct demangle_component
*
1066 d_make_name (struct d_info
*di
, const char *s
, int len
)
1068 struct demangle_component
*p
;
1070 p
= d_make_empty (di
);
1071 if (! cplus_demangle_fill_name (p
, s
, len
))
1076 /* Add a new builtin type component. */
1078 static struct demangle_component
*
1079 d_make_builtin_type (struct d_info
*di
,
1080 const struct demangle_builtin_type_info
*type
)
1082 struct demangle_component
*p
;
1086 p
= d_make_empty (di
);
1089 p
->type
= DEMANGLE_COMPONENT_BUILTIN_TYPE
;
1090 p
->u
.s_builtin
.type
= type
;
1095 /* Add a new operator component. */
1097 static struct demangle_component
*
1098 d_make_operator (struct d_info
*di
, const struct demangle_operator_info
*op
)
1100 struct demangle_component
*p
;
1102 p
= d_make_empty (di
);
1105 p
->type
= DEMANGLE_COMPONENT_OPERATOR
;
1106 p
->u
.s_operator
.op
= op
;
1111 /* Add a new extended operator component. */
1113 static struct demangle_component
*
1114 d_make_extended_operator (struct d_info
*di
, int args
,
1115 struct demangle_component
*name
)
1117 struct demangle_component
*p
;
1119 p
= d_make_empty (di
);
1120 if (! cplus_demangle_fill_extended_operator (p
, args
, name
))
1125 static struct demangle_component
*
1126 d_make_default_arg (struct d_info
*di
, int num
,
1127 struct demangle_component
*sub
)
1129 struct demangle_component
*p
= d_make_empty (di
);
1132 p
->type
= DEMANGLE_COMPONENT_DEFAULT_ARG
;
1133 p
->u
.s_unary_num
.num
= num
;
1134 p
->u
.s_unary_num
.sub
= sub
;
1139 /* Add a new constructor component. */
1141 static struct demangle_component
*
1142 d_make_ctor (struct d_info
*di
, enum gnu_v3_ctor_kinds kind
,
1143 struct demangle_component
*name
)
1145 struct demangle_component
*p
;
1147 p
= d_make_empty (di
);
1148 if (! cplus_demangle_fill_ctor (p
, kind
, name
))
1153 /* Add a new destructor component. */
1155 static struct demangle_component
*
1156 d_make_dtor (struct d_info
*di
, enum gnu_v3_dtor_kinds kind
,
1157 struct demangle_component
*name
)
1159 struct demangle_component
*p
;
1161 p
= d_make_empty (di
);
1162 if (! cplus_demangle_fill_dtor (p
, kind
, name
))
1167 /* Add a new template parameter. */
1169 static struct demangle_component
*
1170 d_make_template_param (struct d_info
*di
, int i
)
1172 struct demangle_component
*p
;
1174 p
= d_make_empty (di
);
1177 p
->type
= DEMANGLE_COMPONENT_TEMPLATE_PARAM
;
1178 p
->u
.s_number
.number
= i
;
1183 /* Add a new function parameter. */
1185 static struct demangle_component
*
1186 d_make_function_param (struct d_info
*di
, int i
)
1188 struct demangle_component
*p
;
1190 p
= d_make_empty (di
);
1193 p
->type
= DEMANGLE_COMPONENT_FUNCTION_PARAM
;
1194 p
->u
.s_number
.number
= i
;
1199 /* Add a new standard substitution component. */
1201 static struct demangle_component
*
1202 d_make_sub (struct d_info
*di
, const char *name
, int len
)
1204 struct demangle_component
*p
;
1206 p
= d_make_empty (di
);
1209 p
->type
= DEMANGLE_COMPONENT_SUB_STD
;
1210 p
->u
.s_string
.string
= name
;
1211 p
->u
.s_string
.len
= len
;
1216 /* <mangled-name> ::= _Z <encoding> [<clone-suffix>]*
1218 TOP_LEVEL is non-zero when called at the top level. */
1220 CP_STATIC_IF_GLIBCPP_V3
1221 struct demangle_component
*
1222 cplus_demangle_mangled_name (struct d_info
*di
, int top_level
)
1224 struct demangle_component
*p
;
1226 if (! d_check_char (di
, '_')
1227 /* Allow missing _ if not at toplevel to work around a
1228 bug in G++ abi-version=2 mangling; see the comment in
1229 write_template_arg. */
1232 if (! d_check_char (di
, 'Z'))
1234 p
= d_encoding (di
, top_level
);
1236 /* If at top level and parsing parameters, check for a clone
1238 if (top_level
&& (di
->options
& DMGL_PARAMS
) != 0)
1239 while (d_peek_char (di
) == '.'
1240 && (IS_LOWER (d_peek_next_char (di
))
1241 || d_peek_next_char (di
) == '_'
1242 || IS_DIGIT (d_peek_next_char (di
))))
1243 p
= d_clone_suffix (di
, p
);
1248 /* Return whether a function should have a return type. The argument
1249 is the function name, which may be qualified in various ways. The
1250 rules are that template functions have return types with some
1251 exceptions, function types which are not part of a function name
1252 mangling have return types with some exceptions, and non-template
1253 function names do not have return types. The exceptions are that
1254 constructors, destructors, and conversion operators do not have
1258 has_return_type (struct demangle_component
*dc
)
1266 case DEMANGLE_COMPONENT_LOCAL_NAME
:
1267 return has_return_type (d_right (dc
));
1268 case DEMANGLE_COMPONENT_TEMPLATE
:
1269 return ! is_ctor_dtor_or_conversion (d_left (dc
));
1270 FNQUAL_COMPONENT_CASE
:
1271 return has_return_type (d_left (dc
));
1275 /* Return whether a name is a constructor, a destructor, or a
1276 conversion operator. */
1279 is_ctor_dtor_or_conversion (struct demangle_component
*dc
)
1287 case DEMANGLE_COMPONENT_QUAL_NAME
:
1288 case DEMANGLE_COMPONENT_LOCAL_NAME
:
1289 return is_ctor_dtor_or_conversion (d_right (dc
));
1290 case DEMANGLE_COMPONENT_CTOR
:
1291 case DEMANGLE_COMPONENT_DTOR
:
1292 case DEMANGLE_COMPONENT_CONVERSION
:
1297 /* <encoding> ::= <(function) name> <bare-function-type>
1301 TOP_LEVEL is non-zero when called at the top level, in which case
1302 if DMGL_PARAMS is not set we do not demangle the function
1303 parameters. We only set this at the top level, because otherwise
1304 we would not correctly demangle names in local scopes. */
1306 static struct demangle_component
*
1307 d_encoding (struct d_info
*di
, int top_level
)
1309 char peek
= d_peek_char (di
);
1310 struct demangle_component
*dc
;
1312 if (peek
== 'G' || peek
== 'T')
1313 dc
= d_special_name (di
);
1319 /* Failed already. */;
1320 else if (top_level
&& (di
->options
& DMGL_PARAMS
) == 0)
1322 /* Strip off any initial CV-qualifiers, as they really apply
1323 to the `this' parameter, and they were not output by the
1324 v2 demangler without DMGL_PARAMS. */
1325 while (is_fnqual_component_type (dc
->type
))
1328 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1329 there may be function-qualifiers on its right argument which
1330 really apply here; this happens when parsing a class
1331 which is local to a function. */
1332 if (dc
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
1334 while (d_right (dc
) != NULL
1335 && is_fnqual_component_type (d_right (dc
)->type
))
1336 d_right (dc
) = d_left (d_right (dc
));
1338 if (d_right (dc
) == NULL
)
1344 peek
= d_peek_char (di
);
1345 if (peek
!= '\0' && peek
!= 'E')
1347 struct demangle_component
*ftype
;
1349 ftype
= d_bare_function_type (di
, has_return_type (dc
));
1352 /* If this is a non-top-level local-name, clear the
1353 return type, so it doesn't confuse the user by
1354 being confused with the return type of whaever
1355 this is nested within. */
1356 if (!top_level
&& dc
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
1357 && ftype
->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
1358 d_left (ftype
) = NULL
;
1360 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TYPED_NAME
,
1372 /* <tagged-name> ::= <name> B <source-name> */
1374 static struct demangle_component
*
1375 d_abi_tags (struct d_info
*di
, struct demangle_component
*dc
)
1377 struct demangle_component
*hold_last_name
;
1380 /* Preserve the last name, so the ABI tag doesn't clobber it. */
1381 hold_last_name
= di
->last_name
;
1383 while (peek
= d_peek_char (di
),
1386 struct demangle_component
*tag
;
1388 tag
= d_source_name (di
);
1389 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TAGGED_NAME
, dc
, tag
);
1392 di
->last_name
= hold_last_name
;
1397 /* <name> ::= <nested-name>
1399 ::= <unscoped-template-name> <template-args>
1402 <unscoped-name> ::= <unqualified-name>
1403 ::= St <unqualified-name>
1405 <unscoped-template-name> ::= <unscoped-name>
1409 static struct demangle_component
*
1410 d_name (struct d_info
*di
)
1412 char peek
= d_peek_char (di
);
1413 struct demangle_component
*dc
;
1418 return d_nested_name (di
);
1421 return d_local_name (di
);
1424 return d_unqualified_name (di
);
1430 if (d_peek_next_char (di
) != 't')
1432 dc
= d_substitution (di
, 0);
1438 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_QUAL_NAME
,
1439 d_make_name (di
, "std", 3),
1440 d_unqualified_name (di
));
1445 if (d_peek_char (di
) != 'I')
1447 /* The grammar does not permit this case to occur if we
1448 called d_substitution() above (i.e., subst == 1). We
1449 don't bother to check. */
1453 /* This is <template-args>, which means that we just saw
1454 <unscoped-template-name>, which is a substitution
1455 candidate if we didn't just get it from a
1459 if (! d_add_substitution (di
, dc
))
1462 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, dc
,
1463 d_template_args (di
));
1471 dc
= d_unqualified_name (di
);
1472 if (d_peek_char (di
) == 'I')
1474 /* This is <template-args>, which means that we just saw
1475 <unscoped-template-name>, which is a substitution
1477 if (! d_add_substitution (di
, dc
))
1479 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, dc
,
1480 d_template_args (di
));
1486 /* <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
1487 ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
1490 static struct demangle_component
*
1491 d_nested_name (struct d_info
*di
)
1493 struct demangle_component
*ret
;
1494 struct demangle_component
**pret
;
1495 struct demangle_component
*rqual
;
1497 if (! d_check_char (di
, 'N'))
1500 pret
= d_cv_qualifiers (di
, &ret
, 1);
1504 /* Parse the ref-qualifier now and then attach it
1505 once we have something to attach it to. */
1506 rqual
= d_ref_qualifier (di
, NULL
);
1508 *pret
= d_prefix (di
);
1514 d_left (rqual
) = ret
;
1518 if (! d_check_char (di
, 'E'))
1524 /* <prefix> ::= <prefix> <unqualified-name>
1525 ::= <template-prefix> <template-args>
1526 ::= <template-param>
1531 <template-prefix> ::= <prefix> <(template) unqualified-name>
1532 ::= <template-param>
1536 static struct demangle_component
*
1537 d_prefix (struct d_info
*di
)
1539 struct demangle_component
*ret
= NULL
;
1544 enum demangle_component_type comb_type
;
1545 struct demangle_component
*dc
;
1547 peek
= d_peek_char (di
);
1551 /* The older code accepts a <local-name> here, but I don't see
1552 that in the grammar. The older code does not accept a
1553 <template-param> here. */
1555 comb_type
= DEMANGLE_COMPONENT_QUAL_NAME
;
1558 char peek2
= d_peek_next_char (di
);
1559 if (peek2
== 'T' || peek2
== 't')
1561 dc
= cplus_demangle_type (di
);
1563 /* Destructor name. */
1564 dc
= d_unqualified_name (di
);
1566 else if (IS_DIGIT (peek
)
1571 dc
= d_unqualified_name (di
);
1572 else if (peek
== 'S')
1573 dc
= d_substitution (di
, 1);
1574 else if (peek
== 'I')
1578 comb_type
= DEMANGLE_COMPONENT_TEMPLATE
;
1579 dc
= d_template_args (di
);
1581 else if (peek
== 'T')
1582 dc
= d_template_param (di
);
1583 else if (peek
== 'E')
1585 else if (peek
== 'M')
1587 /* Initializer scope for a lambda. We don't need to represent
1588 this; the normal code will just treat the variable as a type
1589 scope, which gives appropriate output. */
1601 ret
= d_make_comp (di
, comb_type
, ret
, dc
);
1603 if (peek
!= 'S' && d_peek_char (di
) != 'E')
1605 if (! d_add_substitution (di
, ret
))
1611 /* <unqualified-name> ::= <operator-name>
1612 ::= <ctor-dtor-name>
1614 ::= <local-source-name>
1616 <local-source-name> ::= L <source-name> <discriminator>
1619 static struct demangle_component
*
1620 d_unqualified_name (struct d_info
*di
)
1622 struct demangle_component
*ret
;
1625 peek
= d_peek_char (di
);
1626 if (IS_DIGIT (peek
))
1627 ret
= d_source_name (di
);
1628 else if (IS_LOWER (peek
))
1630 if (peek
== 'o' && d_peek_next_char (di
) == 'n')
1632 ret
= d_operator_name (di
);
1633 if (ret
!= NULL
&& ret
->type
== DEMANGLE_COMPONENT_OPERATOR
)
1635 di
->expansion
+= sizeof "operator" + ret
->u
.s_operator
.op
->len
- 2;
1636 if (!strcmp (ret
->u
.s_operator
.op
->code
, "li"))
1637 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, ret
,
1638 d_source_name (di
));
1641 else if (peek
== 'C' || peek
== 'D')
1642 ret
= d_ctor_dtor_name (di
);
1643 else if (peek
== 'L')
1647 ret
= d_source_name (di
);
1650 if (! d_discriminator (di
))
1653 else if (peek
== 'U')
1655 switch (d_peek_next_char (di
))
1658 ret
= d_lambda (di
);
1661 ret
= d_unnamed_type (di
);
1670 if (d_peek_char (di
) == 'B')
1671 ret
= d_abi_tags (di
, ret
);
1675 /* <source-name> ::= <(positive length) number> <identifier> */
1677 static struct demangle_component
*
1678 d_source_name (struct d_info
*di
)
1681 struct demangle_component
*ret
;
1683 len
= d_number (di
);
1686 ret
= d_identifier (di
, len
);
1687 di
->last_name
= ret
;
1691 /* number ::= [n] <(non-negative decimal integer)> */
1694 d_number (struct d_info
*di
)
1701 peek
= d_peek_char (di
);
1706 peek
= d_peek_char (di
);
1712 if (! IS_DIGIT (peek
))
1718 if (ret
> ((INT_MAX
- (peek
- '0')) / 10))
1720 ret
= ret
* 10 + peek
- '0';
1722 peek
= d_peek_char (di
);
1726 /* Like d_number, but returns a demangle_component. */
1728 static struct demangle_component
*
1729 d_number_component (struct d_info
*di
)
1731 struct demangle_component
*ret
= d_make_empty (di
);
1734 ret
->type
= DEMANGLE_COMPONENT_NUMBER
;
1735 ret
->u
.s_number
.number
= d_number (di
);
1740 /* identifier ::= <(unqualified source code identifier)> */
1742 static struct demangle_component
*
1743 d_identifier (struct d_info
*di
, int len
)
1749 if (di
->send
- name
< len
)
1752 d_advance (di
, len
);
1754 /* A Java mangled name may have a trailing '$' if it is a C++
1755 keyword. This '$' is not included in the length count. We just
1757 if ((di
->options
& DMGL_JAVA
) != 0
1758 && d_peek_char (di
) == '$')
1761 /* Look for something which looks like a gcc encoding of an
1762 anonymous namespace, and replace it with a more user friendly
1764 if (len
>= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN
+ 2
1765 && memcmp (name
, ANONYMOUS_NAMESPACE_PREFIX
,
1766 ANONYMOUS_NAMESPACE_PREFIX_LEN
) == 0)
1770 s
= name
+ ANONYMOUS_NAMESPACE_PREFIX_LEN
;
1771 if ((*s
== '.' || *s
== '_' || *s
== '$')
1774 di
->expansion
-= len
- sizeof "(anonymous namespace)";
1775 return d_make_name (di
, "(anonymous namespace)",
1776 sizeof "(anonymous namespace)" - 1);
1780 return d_make_name (di
, name
, len
);
1783 /* operator_name ::= many different two character encodings.
1785 ::= v <digit> <source-name>
1787 This list is sorted for binary search. */
1789 #define NL(s) s, (sizeof s) - 1
1791 CP_STATIC_IF_GLIBCPP_V3
1792 const struct demangle_operator_info cplus_demangle_operators
[] =
1794 { "aN", NL ("&="), 2 },
1795 { "aS", NL ("="), 2 },
1796 { "aa", NL ("&&"), 2 },
1797 { "ad", NL ("&"), 1 },
1798 { "an", NL ("&"), 2 },
1799 { "at", NL ("alignof "), 1 },
1800 { "az", NL ("alignof "), 1 },
1801 { "cc", NL ("const_cast"), 2 },
1802 { "cl", NL ("()"), 2 },
1803 { "cm", NL (","), 2 },
1804 { "co", NL ("~"), 1 },
1805 { "dV", NL ("/="), 2 },
1806 { "da", NL ("delete[] "), 1 },
1807 { "dc", NL ("dynamic_cast"), 2 },
1808 { "de", NL ("*"), 1 },
1809 { "dl", NL ("delete "), 1 },
1810 { "ds", NL (".*"), 2 },
1811 { "dt", NL ("."), 2 },
1812 { "dv", NL ("/"), 2 },
1813 { "eO", NL ("^="), 2 },
1814 { "eo", NL ("^"), 2 },
1815 { "eq", NL ("=="), 2 },
1816 { "fL", NL ("..."), 3 },
1817 { "fR", NL ("..."), 3 },
1818 { "fl", NL ("..."), 2 },
1819 { "fr", NL ("..."), 2 },
1820 { "ge", NL (">="), 2 },
1821 { "gs", NL ("::"), 1 },
1822 { "gt", NL (">"), 2 },
1823 { "ix", NL ("[]"), 2 },
1824 { "lS", NL ("<<="), 2 },
1825 { "le", NL ("<="), 2 },
1826 { "li", NL ("operator\"\" "), 1 },
1827 { "ls", NL ("<<"), 2 },
1828 { "lt", NL ("<"), 2 },
1829 { "mI", NL ("-="), 2 },
1830 { "mL", NL ("*="), 2 },
1831 { "mi", NL ("-"), 2 },
1832 { "ml", NL ("*"), 2 },
1833 { "mm", NL ("--"), 1 },
1834 { "na", NL ("new[]"), 3 },
1835 { "ne", NL ("!="), 2 },
1836 { "ng", NL ("-"), 1 },
1837 { "nt", NL ("!"), 1 },
1838 { "nw", NL ("new"), 3 },
1839 { "oR", NL ("|="), 2 },
1840 { "oo", NL ("||"), 2 },
1841 { "or", NL ("|"), 2 },
1842 { "pL", NL ("+="), 2 },
1843 { "pl", NL ("+"), 2 },
1844 { "pm", NL ("->*"), 2 },
1845 { "pp", NL ("++"), 1 },
1846 { "ps", NL ("+"), 1 },
1847 { "pt", NL ("->"), 2 },
1848 { "qu", NL ("?"), 3 },
1849 { "rM", NL ("%="), 2 },
1850 { "rS", NL (">>="), 2 },
1851 { "rc", NL ("reinterpret_cast"), 2 },
1852 { "rm", NL ("%"), 2 },
1853 { "rs", NL (">>"), 2 },
1854 { "sP", NL ("sizeof..."), 1 },
1855 { "sZ", NL ("sizeof..."), 1 },
1856 { "sc", NL ("static_cast"), 2 },
1857 { "st", NL ("sizeof "), 1 },
1858 { "sz", NL ("sizeof "), 1 },
1859 { "tr", NL ("throw"), 0 },
1860 { "tw", NL ("throw "), 1 },
1861 { NULL
, NULL
, 0, 0 }
1864 static struct demangle_component
*
1865 d_operator_name (struct d_info
*di
)
1870 c1
= d_next_char (di
);
1871 c2
= d_next_char (di
);
1872 if (c1
== 'v' && IS_DIGIT (c2
))
1873 return d_make_extended_operator (di
, c2
- '0', d_source_name (di
));
1874 else if (c1
== 'c' && c2
== 'v')
1876 struct demangle_component
*type
;
1877 int was_conversion
= di
->is_conversion
;
1878 struct demangle_component
*res
;
1880 di
->is_conversion
= ! di
->is_expression
;
1881 type
= cplus_demangle_type (di
);
1882 if (di
->is_conversion
)
1883 res
= d_make_comp (di
, DEMANGLE_COMPONENT_CONVERSION
, type
, NULL
);
1885 res
= d_make_comp (di
, DEMANGLE_COMPONENT_CAST
, type
, NULL
);
1886 di
->is_conversion
= was_conversion
;
1891 /* LOW is the inclusive lower bound. */
1893 /* HIGH is the exclusive upper bound. We subtract one to ignore
1894 the sentinel at the end of the array. */
1895 int high
= ((sizeof (cplus_demangle_operators
)
1896 / sizeof (cplus_demangle_operators
[0]))
1902 const struct demangle_operator_info
*p
;
1904 i
= low
+ (high
- low
) / 2;
1905 p
= cplus_demangle_operators
+ i
;
1907 if (c1
== p
->code
[0] && c2
== p
->code
[1])
1908 return d_make_operator (di
, p
);
1910 if (c1
< p
->code
[0] || (c1
== p
->code
[0] && c2
< p
->code
[1]))
1920 static struct demangle_component
*
1921 d_make_character (struct d_info
*di
, int c
)
1923 struct demangle_component
*p
;
1924 p
= d_make_empty (di
);
1927 p
->type
= DEMANGLE_COMPONENT_CHARACTER
;
1928 p
->u
.s_character
.character
= c
;
1933 static struct demangle_component
*
1934 d_java_resource (struct d_info
*di
)
1936 struct demangle_component
*p
= NULL
;
1937 struct demangle_component
*next
= NULL
;
1942 len
= d_number (di
);
1946 /* Eat the leading '_'. */
1947 if (d_next_char (di
) != '_')
1960 /* Each chunk is either a '$' escape... */
1978 next
= d_make_character (di
, c
);
1986 /* ... or a sequence of characters. */
1989 while (i
< len
&& str
[i
] && str
[i
] != '$')
1992 next
= d_make_name (di
, str
, i
);
2005 p
= d_make_comp (di
, DEMANGLE_COMPONENT_COMPOUND_NAME
, p
, next
);
2011 p
= d_make_comp (di
, DEMANGLE_COMPONENT_JAVA_RESOURCE
, p
, NULL
);
2016 /* <special-name> ::= TV <type>
2020 ::= TA <template-arg>
2021 ::= GV <(object) name>
2022 ::= T <call-offset> <(base) encoding>
2023 ::= Tc <call-offset> <call-offset> <(base) encoding>
2024 Also g++ extensions:
2025 ::= TC <type> <(offset) number> _ <(base) type>
2030 ::= Gr <resource name>
2035 static struct demangle_component
*
2036 d_special_name (struct d_info
*di
)
2038 di
->expansion
+= 20;
2039 if (d_check_char (di
, 'T'))
2041 switch (d_next_char (di
))
2045 return d_make_comp (di
, DEMANGLE_COMPONENT_VTABLE
,
2046 cplus_demangle_type (di
), NULL
);
2048 di
->expansion
-= 10;
2049 return d_make_comp (di
, DEMANGLE_COMPONENT_VTT
,
2050 cplus_demangle_type (di
), NULL
);
2052 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO
,
2053 cplus_demangle_type (di
), NULL
);
2055 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO_NAME
,
2056 cplus_demangle_type (di
), NULL
);
2059 if (! d_call_offset (di
, 'h'))
2061 return d_make_comp (di
, DEMANGLE_COMPONENT_THUNK
,
2062 d_encoding (di
, 0), NULL
);
2065 if (! d_call_offset (di
, 'v'))
2067 return d_make_comp (di
, DEMANGLE_COMPONENT_VIRTUAL_THUNK
,
2068 d_encoding (di
, 0), NULL
);
2071 if (! d_call_offset (di
, '\0'))
2073 if (! d_call_offset (di
, '\0'))
2075 return d_make_comp (di
, DEMANGLE_COMPONENT_COVARIANT_THUNK
,
2076 d_encoding (di
, 0), NULL
);
2080 struct demangle_component
*derived_type
;
2082 struct demangle_component
*base_type
;
2084 derived_type
= cplus_demangle_type (di
);
2085 offset
= d_number (di
);
2088 if (! d_check_char (di
, '_'))
2090 base_type
= cplus_demangle_type (di
);
2091 /* We don't display the offset. FIXME: We should display
2092 it in verbose mode. */
2094 return d_make_comp (di
, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
,
2095 base_type
, derived_type
);
2099 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO_FN
,
2100 cplus_demangle_type (di
), NULL
);
2102 return d_make_comp (di
, DEMANGLE_COMPONENT_JAVA_CLASS
,
2103 cplus_demangle_type (di
), NULL
);
2106 return d_make_comp (di
, DEMANGLE_COMPONENT_TLS_INIT
,
2110 return d_make_comp (di
, DEMANGLE_COMPONENT_TLS_WRAPPER
,
2114 return d_make_comp (di
, DEMANGLE_COMPONENT_TPARM_OBJ
,
2115 d_template_arg (di
), NULL
);
2121 else if (d_check_char (di
, 'G'))
2123 switch (d_next_char (di
))
2126 return d_make_comp (di
, DEMANGLE_COMPONENT_GUARD
,
2131 struct demangle_component
*name
= d_name (di
);
2132 return d_make_comp (di
, DEMANGLE_COMPONENT_REFTEMP
, name
,
2133 d_number_component (di
));
2137 return d_make_comp (di
, DEMANGLE_COMPONENT_HIDDEN_ALIAS
,
2138 d_encoding (di
, 0), NULL
);
2141 switch (d_next_char (di
))
2144 return d_make_comp (di
, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
,
2145 d_encoding (di
, 0), NULL
);
2147 /* ??? The proposal is that other letters (such as 'h') stand
2148 for different variants of transaction cloning, such as
2149 compiling directly for hardware transaction support. But
2150 they still should all be transactional clones of some sort
2151 so go ahead and call them that. */
2153 return d_make_comp (di
, DEMANGLE_COMPONENT_TRANSACTION_CLONE
,
2154 d_encoding (di
, 0), NULL
);
2158 return d_java_resource (di
);
2168 /* <call-offset> ::= h <nv-offset> _
2171 <nv-offset> ::= <(offset) number>
2173 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
2175 The C parameter, if not '\0', is a character we just read which is
2176 the start of the <call-offset>.
2178 We don't display the offset information anywhere. FIXME: We should
2179 display it in verbose mode. */
2182 d_call_offset (struct d_info
*di
, int c
)
2185 c
= d_next_char (di
);
2192 if (! d_check_char (di
, '_'))
2199 if (! d_check_char (di
, '_'))
2205 /* <ctor-dtor-name> ::= C1
2213 static struct demangle_component
*
2214 d_ctor_dtor_name (struct d_info
*di
)
2216 if (di
->last_name
!= NULL
)
2218 if (di
->last_name
->type
== DEMANGLE_COMPONENT_NAME
)
2219 di
->expansion
+= di
->last_name
->u
.s_name
.len
;
2220 else if (di
->last_name
->type
== DEMANGLE_COMPONENT_SUB_STD
)
2221 di
->expansion
+= di
->last_name
->u
.s_string
.len
;
2223 switch (d_peek_char (di
))
2227 enum gnu_v3_ctor_kinds kind
;
2230 if (d_peek_next_char (di
) == 'I')
2236 switch (d_peek_next_char (di
))
2239 kind
= gnu_v3_complete_object_ctor
;
2242 kind
= gnu_v3_base_object_ctor
;
2245 kind
= gnu_v3_complete_object_allocating_ctor
;
2248 kind
= gnu_v3_unified_ctor
;
2251 kind
= gnu_v3_object_ctor_group
;
2260 cplus_demangle_type (di
);
2262 return d_make_ctor (di
, kind
, di
->last_name
);
2267 enum gnu_v3_dtor_kinds kind
;
2269 switch (d_peek_next_char (di
))
2272 kind
= gnu_v3_deleting_dtor
;
2275 kind
= gnu_v3_complete_object_dtor
;
2278 kind
= gnu_v3_base_object_dtor
;
2280 /* digit '3' is not used */
2282 kind
= gnu_v3_unified_dtor
;
2285 kind
= gnu_v3_object_dtor_group
;
2291 return d_make_dtor (di
, kind
, di
->last_name
);
2299 /* True iff we're looking at an order-insensitive type-qualifier, including
2300 function-type-qualifiers. */
2303 next_is_type_qual (struct d_info
*di
)
2305 char peek
= d_peek_char (di
);
2306 if (peek
== 'r' || peek
== 'V' || peek
== 'K')
2310 peek
= d_peek_next_char (di
);
2311 if (peek
== 'x' || peek
== 'o' || peek
== 'O' || peek
== 'w')
2317 /* <type> ::= <builtin-type>
2319 ::= <class-enum-type>
2321 ::= <pointer-to-member-type>
2322 ::= <template-param>
2323 ::= <template-template-param> <template-args>
2325 ::= <CV-qualifiers> <type>
2328 ::= O <type> (C++0x)
2331 ::= U <source-name> <type>
2333 <builtin-type> ::= various one letter codes
2337 CP_STATIC_IF_GLIBCPP_V3
2338 const struct demangle_builtin_type_info
2339 cplus_demangle_builtin_types
[D_BUILTIN_TYPE_COUNT
] =
2341 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT
},
2342 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL
},
2343 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT
},
2344 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT
},
2345 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT
},
2346 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT
},
2347 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT
},
2348 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT
},
2349 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT
},
2350 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED
},
2351 /* k */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2352 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG
},
2353 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG
},
2354 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT
},
2355 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2357 /* p */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2358 /* q */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2359 /* r */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2360 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT
},
2361 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT
},
2362 /* u */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2363 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID
},
2364 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT
},
2365 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG
},
2366 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2367 D_PRINT_UNSIGNED_LONG_LONG
},
2368 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT
},
2369 /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT
},
2370 /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT
},
2371 /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT
},
2372 /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT
},
2373 /* 30 */ { NL ("char8_t"), NL ("char8_t"), D_PRINT_DEFAULT
},
2374 /* 31 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT
},
2375 /* 32 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT
},
2376 /* 33 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"),
2380 CP_STATIC_IF_GLIBCPP_V3
2381 struct demangle_component
*
2382 cplus_demangle_type (struct d_info
*di
)
2385 struct demangle_component
*ret
;
2388 /* The ABI specifies that when CV-qualifiers are used, the base type
2389 is substitutable, and the fully qualified type is substitutable,
2390 but the base type with a strict subset of the CV-qualifiers is
2391 not substitutable. The natural recursive implementation of the
2392 CV-qualifiers would cause subsets to be substitutable, so instead
2393 we pull them all off now.
2395 FIXME: The ABI says that order-insensitive vendor qualifiers
2396 should be handled in the same way, but we have no way to tell
2397 which vendor qualifiers are order-insensitive and which are
2398 order-sensitive. So we just assume that they are all
2399 order-sensitive. g++ 3.4 supports only one vendor qualifier,
2400 __vector, and it treats it as order-sensitive when mangling
2403 if (next_is_type_qual (di
))
2405 struct demangle_component
**pret
;
2407 pret
= d_cv_qualifiers (di
, &ret
, 0);
2410 if (d_peek_char (di
) == 'F')
2412 /* cv-qualifiers before a function type apply to 'this',
2413 so avoid adding the unqualified function type to
2414 the substitution list. */
2415 *pret
= d_function_type (di
);
2418 *pret
= cplus_demangle_type (di
);
2421 if ((*pret
)->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
2422 || (*pret
)->type
== DEMANGLE_COMPONENT_REFERENCE_THIS
)
2424 /* Move the ref-qualifier outside the cv-qualifiers so that
2425 they are printed in the right order. */
2426 struct demangle_component
*fn
= d_left (*pret
);
2427 d_left (*pret
) = ret
;
2431 if (! d_add_substitution (di
, ret
))
2438 peek
= d_peek_char (di
);
2441 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2442 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
2443 case 'o': case 's': case 't':
2444 case 'v': case 'w': case 'x': case 'y': case 'z':
2445 ret
= d_make_builtin_type (di
,
2446 &cplus_demangle_builtin_types
[peek
- 'a']);
2447 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2454 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_VENDOR_TYPE
,
2455 d_source_name (di
), NULL
);
2459 ret
= d_function_type (di
);
2462 case '0': case '1': case '2': case '3': case '4':
2463 case '5': case '6': case '7': case '8': case '9':
2466 ret
= d_class_enum_type (di
);
2470 ret
= d_array_type (di
);
2474 ret
= d_pointer_to_member_type (di
);
2478 ret
= d_template_param (di
);
2479 if (d_peek_char (di
) == 'I')
2481 /* This may be <template-template-param> <template-args>.
2482 If this is the type for a conversion operator, we can
2483 have a <template-template-param> here only by following
2484 a derivation like this:
2487 -> <template-prefix> <template-args>
2488 -> <prefix> <template-unqualified-name> <template-args>
2489 -> <unqualified-name> <template-unqualified-name> <template-args>
2490 -> <source-name> <template-unqualified-name> <template-args>
2491 -> <source-name> <operator-name> <template-args>
2492 -> <source-name> cv <type> <template-args>
2493 -> <source-name> cv <template-template-param> <template-args> <template-args>
2495 where the <template-args> is followed by another.
2496 Otherwise, we must have a derivation like this:
2499 -> <template-prefix> <template-args>
2500 -> <prefix> <template-unqualified-name> <template-args>
2501 -> <unqualified-name> <template-unqualified-name> <template-args>
2502 -> <source-name> <template-unqualified-name> <template-args>
2503 -> <source-name> <operator-name> <template-args>
2504 -> <source-name> cv <type> <template-args>
2505 -> <source-name> cv <template-param> <template-args>
2507 where we need to leave the <template-args> to be processed
2508 by d_prefix (following the <template-prefix>).
2510 The <template-template-param> part is a substitution
2512 if (! di
->is_conversion
)
2514 if (! d_add_substitution (di
, ret
))
2516 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2517 d_template_args (di
));
2521 struct demangle_component
*args
;
2522 struct d_info_checkpoint checkpoint
;
2524 d_checkpoint (di
, &checkpoint
);
2525 args
= d_template_args (di
);
2526 if (d_peek_char (di
) == 'I')
2528 if (! d_add_substitution (di
, ret
))
2530 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2534 d_backtrack (di
, &checkpoint
);
2540 /* If this is a special substitution, then it is the start of
2541 <class-enum-type>. */
2545 peek_next
= d_peek_next_char (di
);
2546 if (IS_DIGIT (peek_next
)
2548 || IS_UPPER (peek_next
))
2550 ret
= d_substitution (di
, 0);
2551 /* The substituted name may have been a template name and
2552 may be followed by tepmlate args. */
2553 if (d_peek_char (di
) == 'I')
2554 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2555 d_template_args (di
));
2561 ret
= d_class_enum_type (di
);
2562 /* If the substitution was a complete type, then it is not
2563 a new substitution candidate. However, if the
2564 substitution was followed by template arguments, then
2565 the whole thing is a substitution candidate. */
2566 if (ret
!= NULL
&& ret
->type
== DEMANGLE_COMPONENT_SUB_STD
)
2574 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_RVALUE_REFERENCE
,
2575 cplus_demangle_type (di
), NULL
);
2580 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_POINTER
,
2581 cplus_demangle_type (di
), NULL
);
2586 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_REFERENCE
,
2587 cplus_demangle_type (di
), NULL
);
2592 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_COMPLEX
,
2593 cplus_demangle_type (di
), NULL
);
2598 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_IMAGINARY
,
2599 cplus_demangle_type (di
), NULL
);
2604 ret
= d_source_name (di
);
2605 if (d_peek_char (di
) == 'I')
2606 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2607 d_template_args (di
));
2608 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
,
2609 cplus_demangle_type (di
), ret
);
2615 peek
= d_next_char (di
);
2620 /* decltype (expression) */
2621 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_DECLTYPE
,
2622 d_expression (di
), NULL
);
2623 if (ret
&& d_next_char (di
) != 'E')
2629 /* Pack expansion. */
2630 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_PACK_EXPANSION
,
2631 cplus_demangle_type (di
), NULL
);
2637 ret
= d_make_name (di
, "auto", 4);
2640 /* decltype(auto) */
2641 ret
= d_make_name (di
, "decltype(auto)", 14);
2645 /* 32-bit decimal floating point */
2646 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[26]);
2647 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2651 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[27]);
2652 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2656 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[28]);
2657 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2660 /* 16-bit half-precision FP */
2661 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[29]);
2662 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2666 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[30]);
2667 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2671 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[31]);
2672 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2676 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[32]);
2677 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2681 /* Fixed point types. DF<int bits><length><fract bits><sat> */
2682 ret
= d_make_empty (di
);
2683 ret
->type
= DEMANGLE_COMPONENT_FIXED_TYPE
;
2684 if ((ret
->u
.s_fixed
.accum
= IS_DIGIT (d_peek_char (di
))))
2685 /* For demangling we don't care about the bits. */
2687 ret
->u
.s_fixed
.length
= cplus_demangle_type (di
);
2688 if (ret
->u
.s_fixed
.length
== NULL
)
2691 peek
= d_next_char (di
);
2692 ret
->u
.s_fixed
.sat
= (peek
== 's');
2696 ret
= d_vector_type (di
);
2701 /* decltype(nullptr) */
2702 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[33]);
2703 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2717 if (! d_add_substitution (di
, ret
))
2724 /* <CV-qualifiers> ::= [r] [V] [K] [Dx] */
2726 static struct demangle_component
**
2727 d_cv_qualifiers (struct d_info
*di
,
2728 struct demangle_component
**pret
, int member_fn
)
2730 struct demangle_component
**pstart
;
2734 peek
= d_peek_char (di
);
2735 while (next_is_type_qual (di
))
2737 enum demangle_component_type t
;
2738 struct demangle_component
*right
= NULL
;
2744 ? DEMANGLE_COMPONENT_RESTRICT_THIS
2745 : DEMANGLE_COMPONENT_RESTRICT
);
2746 di
->expansion
+= sizeof "restrict";
2748 else if (peek
== 'V')
2751 ? DEMANGLE_COMPONENT_VOLATILE_THIS
2752 : DEMANGLE_COMPONENT_VOLATILE
);
2753 di
->expansion
+= sizeof "volatile";
2755 else if (peek
== 'K')
2758 ? DEMANGLE_COMPONENT_CONST_THIS
2759 : DEMANGLE_COMPONENT_CONST
);
2760 di
->expansion
+= sizeof "const";
2764 peek
= d_next_char (di
);
2767 t
= DEMANGLE_COMPONENT_TRANSACTION_SAFE
;
2768 di
->expansion
+= sizeof "transaction_safe";
2770 else if (peek
== 'o'
2773 t
= DEMANGLE_COMPONENT_NOEXCEPT
;
2774 di
->expansion
+= sizeof "noexcept";
2777 right
= d_expression (di
);
2780 if (! d_check_char (di
, 'E'))
2784 else if (peek
== 'w')
2786 t
= DEMANGLE_COMPONENT_THROW_SPEC
;
2787 di
->expansion
+= sizeof "throw";
2788 right
= d_parmlist (di
);
2791 if (! d_check_char (di
, 'E'))
2798 *pret
= d_make_comp (di
, t
, NULL
, right
);
2801 pret
= &d_left (*pret
);
2803 peek
= d_peek_char (di
);
2806 if (!member_fn
&& peek
== 'F')
2808 while (pstart
!= pret
)
2810 switch ((*pstart
)->type
)
2812 case DEMANGLE_COMPONENT_RESTRICT
:
2813 (*pstart
)->type
= DEMANGLE_COMPONENT_RESTRICT_THIS
;
2815 case DEMANGLE_COMPONENT_VOLATILE
:
2816 (*pstart
)->type
= DEMANGLE_COMPONENT_VOLATILE_THIS
;
2818 case DEMANGLE_COMPONENT_CONST
:
2819 (*pstart
)->type
= DEMANGLE_COMPONENT_CONST_THIS
;
2824 pstart
= &d_left (*pstart
);
2831 /* <ref-qualifier> ::= R
2834 static struct demangle_component
*
2835 d_ref_qualifier (struct d_info
*di
, struct demangle_component
*sub
)
2837 struct demangle_component
*ret
= sub
;
2840 peek
= d_peek_char (di
);
2841 if (peek
== 'R' || peek
== 'O')
2843 enum demangle_component_type t
;
2846 t
= DEMANGLE_COMPONENT_REFERENCE_THIS
;
2847 di
->expansion
+= sizeof "&";
2851 t
= DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
;
2852 di
->expansion
+= sizeof "&&";
2856 ret
= d_make_comp (di
, t
, ret
, NULL
);
2862 /* <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] [T] E */
2864 static struct demangle_component
*
2865 d_function_type (struct d_info
*di
)
2867 struct demangle_component
*ret
= NULL
;
2869 if ((di
->options
& DMGL_NO_RECURSE_LIMIT
) == 0)
2871 if (di
->recursion_level
> DEMANGLE_RECURSION_LIMIT
)
2872 /* FIXME: There ought to be a way to report
2873 that the recursion limit has been reached. */
2876 di
->recursion_level
++;
2879 if (d_check_char (di
, 'F'))
2881 if (d_peek_char (di
) == 'Y')
2883 /* Function has C linkage. We don't print this information.
2884 FIXME: We should print it in verbose mode. */
2887 ret
= d_bare_function_type (di
, 1);
2888 ret
= d_ref_qualifier (di
, ret
);
2890 if (! d_check_char (di
, 'E'))
2894 if ((di
->options
& DMGL_NO_RECURSE_LIMIT
) == 0)
2895 di
->recursion_level
--;
2901 static struct demangle_component
*
2902 d_parmlist (struct d_info
*di
)
2904 struct demangle_component
*tl
;
2905 struct demangle_component
**ptl
;
2911 struct demangle_component
*type
;
2913 char peek
= d_peek_char (di
);
2914 if (peek
== '\0' || peek
== 'E' || peek
== '.')
2916 if ((peek
== 'R' || peek
== 'O')
2917 && d_peek_next_char (di
) == 'E')
2918 /* Function ref-qualifier, not a ref prefix for a parameter type. */
2920 type
= cplus_demangle_type (di
);
2923 *ptl
= d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, type
, NULL
);
2926 ptl
= &d_right (*ptl
);
2929 /* There should be at least one parameter type besides the optional
2930 return type. A function which takes no arguments will have a
2931 single parameter type void. */
2935 /* If we have a single parameter type void, omit it. */
2936 if (d_right (tl
) == NULL
2937 && d_left (tl
)->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
2938 && d_left (tl
)->u
.s_builtin
.type
->print
== D_PRINT_VOID
)
2940 di
->expansion
-= d_left (tl
)->u
.s_builtin
.type
->len
;
2947 /* <bare-function-type> ::= [J]<type>+ */
2949 static struct demangle_component
*
2950 d_bare_function_type (struct d_info
*di
, int has_return_type
)
2952 struct demangle_component
*return_type
;
2953 struct demangle_component
*tl
;
2956 /* Detect special qualifier indicating that the first argument
2957 is the return type. */
2958 peek
= d_peek_char (di
);
2962 has_return_type
= 1;
2965 if (has_return_type
)
2967 return_type
= cplus_demangle_type (di
);
2968 if (return_type
== NULL
)
2974 tl
= d_parmlist (di
);
2978 return d_make_comp (di
, DEMANGLE_COMPONENT_FUNCTION_TYPE
,
2982 /* <class-enum-type> ::= <name> */
2984 static struct demangle_component
*
2985 d_class_enum_type (struct d_info
*di
)
2990 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2991 ::= A [<(dimension) expression>] _ <(element) type>
2994 static struct demangle_component
*
2995 d_array_type (struct d_info
*di
)
2998 struct demangle_component
*dim
;
3000 if (! d_check_char (di
, 'A'))
3003 peek
= d_peek_char (di
);
3006 else if (IS_DIGIT (peek
))
3014 peek
= d_peek_char (di
);
3016 while (IS_DIGIT (peek
));
3017 dim
= d_make_name (di
, s
, d_str (di
) - s
);
3023 dim
= d_expression (di
);
3028 if (! d_check_char (di
, '_'))
3031 return d_make_comp (di
, DEMANGLE_COMPONENT_ARRAY_TYPE
, dim
,
3032 cplus_demangle_type (di
));
3035 /* <vector-type> ::= Dv <number> _ <type>
3036 ::= Dv _ <expression> _ <type> */
3038 static struct demangle_component
*
3039 d_vector_type (struct d_info
*di
)
3042 struct demangle_component
*dim
;
3044 peek
= d_peek_char (di
);
3048 dim
= d_expression (di
);
3051 dim
= d_number_component (di
);
3056 if (! d_check_char (di
, '_'))
3059 return d_make_comp (di
, DEMANGLE_COMPONENT_VECTOR_TYPE
, dim
,
3060 cplus_demangle_type (di
));
3063 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
3065 static struct demangle_component
*
3066 d_pointer_to_member_type (struct d_info
*di
)
3068 struct demangle_component
*cl
;
3069 struct demangle_component
*mem
;
3071 if (! d_check_char (di
, 'M'))
3074 cl
= cplus_demangle_type (di
);
3078 /* The ABI says, "The type of a non-static member function is considered
3079 to be different, for the purposes of substitution, from the type of a
3080 namespace-scope or static member function whose type appears
3081 similar. The types of two non-static member functions are considered
3082 to be different, for the purposes of substitution, if the functions
3083 are members of different classes. In other words, for the purposes of
3084 substitution, the class of which the function is a member is
3085 considered part of the type of function."
3087 For a pointer to member function, this call to cplus_demangle_type
3088 will end up adding a (possibly qualified) non-member function type to
3089 the substitution table, which is not correct; however, the member
3090 function type will never be used in a substitution, so putting the
3091 wrong type in the substitution table is harmless. */
3093 mem
= cplus_demangle_type (di
);
3097 return d_make_comp (di
, DEMANGLE_COMPONENT_PTRMEM_TYPE
, cl
, mem
);
3100 /* <non-negative number> _ */
3103 d_compact_number (struct d_info
*di
)
3106 if (d_peek_char (di
) == '_')
3108 else if (d_peek_char (di
) == 'n')
3111 num
= d_number (di
) + 1;
3113 if (num
< 0 || ! d_check_char (di
, '_'))
3118 /* <template-param> ::= T_
3119 ::= T <(parameter-2 non-negative) number> _
3122 static struct demangle_component
*
3123 d_template_param (struct d_info
*di
)
3127 if (! d_check_char (di
, 'T'))
3130 param
= d_compact_number (di
);
3134 return d_make_template_param (di
, param
);
3137 /* <template-args> ::= I <template-arg>+ E */
3139 static struct demangle_component
*
3140 d_template_args (struct d_info
*di
)
3142 if (d_peek_char (di
) != 'I'
3143 && d_peek_char (di
) != 'J')
3147 return d_template_args_1 (di
);
3150 /* <template-arg>* E */
3152 static struct demangle_component
*
3153 d_template_args_1 (struct d_info
*di
)
3155 struct demangle_component
*hold_last_name
;
3156 struct demangle_component
*al
;
3157 struct demangle_component
**pal
;
3159 /* Preserve the last name we saw--don't let the template arguments
3160 clobber it, as that would give us the wrong name for a subsequent
3161 constructor or destructor. */
3162 hold_last_name
= di
->last_name
;
3164 if (d_peek_char (di
) == 'E')
3166 /* An argument pack can be empty. */
3168 return d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
, NULL
, NULL
);
3175 struct demangle_component
*a
;
3177 a
= d_template_arg (di
);
3181 *pal
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
, a
, NULL
);
3184 pal
= &d_right (*pal
);
3186 if (d_peek_char (di
) == 'E')
3193 di
->last_name
= hold_last_name
;
3198 /* <template-arg> ::= <type>
3199 ::= X <expression> E
3203 static struct demangle_component
*
3204 d_template_arg (struct d_info
*di
)
3206 struct demangle_component
*ret
;
3208 switch (d_peek_char (di
))
3212 ret
= d_expression (di
);
3213 if (! d_check_char (di
, 'E'))
3218 return d_expr_primary (di
);
3222 /* An argument pack. */
3223 return d_template_args (di
);
3226 return cplus_demangle_type (di
);
3230 /* Parse a sequence of expressions until we hit the terminator
3233 static struct demangle_component
*
3234 d_exprlist (struct d_info
*di
, char terminator
)
3236 struct demangle_component
*list
= NULL
;
3237 struct demangle_component
**p
= &list
;
3239 if (d_peek_char (di
) == terminator
)
3242 return d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, NULL
, NULL
);
3247 struct demangle_component
*arg
= d_expression (di
);
3251 *p
= d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, arg
, NULL
);
3256 if (d_peek_char (di
) == terminator
)
3266 /* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
3267 dynamic_cast, static_cast or reinterpret_cast. */
3270 op_is_new_cast (struct demangle_component
*op
)
3272 const char *code
= op
->u
.s_operator
.op
->code
;
3273 return (code
[1] == 'c'
3274 && (code
[0] == 's' || code
[0] == 'd'
3275 || code
[0] == 'c' || code
[0] == 'r'));
3278 /* <expression> ::= <(unary) operator-name> <expression>
3279 ::= <(binary) operator-name> <expression> <expression>
3280 ::= <(trinary) operator-name> <expression> <expression> <expression>
3281 ::= cl <expression>+ E
3283 ::= <template-param>
3284 ::= sr <type> <unqualified-name>
3285 ::= sr <type> <unqualified-name> <template-args>
3289 static inline struct demangle_component
*
3290 d_expression_1 (struct d_info
*di
)
3294 peek
= d_peek_char (di
);
3296 return d_expr_primary (di
);
3297 else if (peek
== 'T')
3298 return d_template_param (di
);
3299 else if (peek
== 's' && d_peek_next_char (di
) == 'r')
3301 struct demangle_component
*type
;
3302 struct demangle_component
*name
;
3305 type
= cplus_demangle_type (di
);
3306 name
= d_unqualified_name (di
);
3307 if (d_peek_char (di
) != 'I')
3308 return d_make_comp (di
, DEMANGLE_COMPONENT_QUAL_NAME
, type
, name
);
3310 return d_make_comp (di
, DEMANGLE_COMPONENT_QUAL_NAME
, type
,
3311 d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, name
,
3312 d_template_args (di
)));
3314 else if (peek
== 's' && d_peek_next_char (di
) == 'p')
3317 return d_make_comp (di
, DEMANGLE_COMPONENT_PACK_EXPANSION
,
3318 d_expression_1 (di
), NULL
);
3320 else if (peek
== 'f' && d_peek_next_char (di
) == 'p')
3322 /* Function parameter used in a late-specified return type. */
3325 if (d_peek_char (di
) == 'T')
3327 /* 'this' parameter. */
3333 index
= d_compact_number (di
);
3334 if (index
== INT_MAX
|| index
== -1)
3338 return d_make_function_param (di
, index
);
3340 else if (IS_DIGIT (peek
)
3341 || (peek
== 'o' && d_peek_next_char (di
) == 'n'))
3343 /* We can get an unqualified name as an expression in the case of
3344 a dependent function call, i.e. decltype(f(t)). */
3345 struct demangle_component
*name
;
3348 /* operator-function-id, i.e. operator+(t). */
3351 name
= d_unqualified_name (di
);
3354 if (d_peek_char (di
) == 'I')
3355 return d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, name
,
3356 d_template_args (di
));
3360 else if ((peek
== 'i' || peek
== 't')
3361 && d_peek_next_char (di
) == 'l')
3363 /* Brace-enclosed initializer list, untyped or typed. */
3364 struct demangle_component
*type
= NULL
;
3367 type
= cplus_demangle_type (di
);
3368 if (!d_peek_char (di
) || !d_peek_next_char (di
))
3370 return d_make_comp (di
, DEMANGLE_COMPONENT_INITIALIZER_LIST
,
3371 type
, d_exprlist (di
, 'E'));
3375 struct demangle_component
*op
;
3376 const char *code
= NULL
;
3379 op
= d_operator_name (di
);
3383 if (op
->type
== DEMANGLE_COMPONENT_OPERATOR
)
3385 code
= op
->u
.s_operator
.op
->code
;
3386 di
->expansion
+= op
->u
.s_operator
.op
->len
- 2;
3387 if (strcmp (code
, "st") == 0)
3388 return d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, op
,
3389 cplus_demangle_type (di
));
3396 case DEMANGLE_COMPONENT_OPERATOR
:
3397 args
= op
->u
.s_operator
.op
->args
;
3399 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
3400 args
= op
->u
.s_extended_operator
.args
;
3402 case DEMANGLE_COMPONENT_CAST
:
3410 return d_make_comp (di
, DEMANGLE_COMPONENT_NULLARY
, op
, NULL
);
3414 struct demangle_component
*operand
;
3417 if (code
&& (code
[0] == 'p' || code
[0] == 'm')
3418 && code
[1] == code
[0])
3419 /* pp_ and mm_ are the prefix variants. */
3420 suffix
= !d_check_char (di
, '_');
3422 if (op
->type
== DEMANGLE_COMPONENT_CAST
3423 && d_check_char (di
, '_'))
3424 operand
= d_exprlist (di
, 'E');
3425 else if (code
&& !strcmp (code
, "sP"))
3426 operand
= d_template_args_1 (di
);
3428 operand
= d_expression_1 (di
);
3431 /* Indicate the suffix variant for d_print_comp. */
3432 operand
= d_make_comp (di
, DEMANGLE_COMPONENT_BINARY_ARGS
,
3435 return d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, op
, operand
);
3439 struct demangle_component
*left
;
3440 struct demangle_component
*right
;
3444 if (op_is_new_cast (op
))
3445 left
= cplus_demangle_type (di
);
3446 else if (code
[0] == 'f')
3447 /* fold-expression. */
3448 left
= d_operator_name (di
);
3450 left
= d_expression_1 (di
);
3451 if (!strcmp (code
, "cl"))
3452 right
= d_exprlist (di
, 'E');
3453 else if (!strcmp (code
, "dt") || !strcmp (code
, "pt"))
3455 right
= d_unqualified_name (di
);
3456 if (d_peek_char (di
) == 'I')
3457 right
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
,
3458 right
, d_template_args (di
));
3461 right
= d_expression_1 (di
);
3463 return d_make_comp (di
, DEMANGLE_COMPONENT_BINARY
, op
,
3465 DEMANGLE_COMPONENT_BINARY_ARGS
,
3470 struct demangle_component
*first
;
3471 struct demangle_component
*second
;
3472 struct demangle_component
*third
;
3476 else if (!strcmp (code
, "qu"))
3478 /* ?: expression. */
3479 first
= d_expression_1 (di
);
3480 second
= d_expression_1 (di
);
3481 third
= d_expression_1 (di
);
3485 else if (code
[0] == 'f')
3487 /* fold-expression. */
3488 first
= d_operator_name (di
);
3489 second
= d_expression_1 (di
);
3490 third
= d_expression_1 (di
);
3494 else if (code
[0] == 'n')
3496 /* new-expression. */
3497 if (code
[1] != 'w' && code
[1] != 'a')
3499 first
= d_exprlist (di
, '_');
3500 second
= cplus_demangle_type (di
);
3501 if (d_peek_char (di
) == 'E')
3506 else if (d_peek_char (di
) == 'p'
3507 && d_peek_next_char (di
) == 'i')
3509 /* Parenthesized initializer. */
3511 third
= d_exprlist (di
, 'E');
3513 else if (d_peek_char (di
) == 'i'
3514 && d_peek_next_char (di
) == 'l')
3515 /* initializer-list. */
3516 third
= d_expression_1 (di
);
3522 return d_make_comp (di
, DEMANGLE_COMPONENT_TRINARY
, op
,
3524 DEMANGLE_COMPONENT_TRINARY_ARG1
,
3527 DEMANGLE_COMPONENT_TRINARY_ARG2
,
3536 static struct demangle_component
*
3537 d_expression (struct d_info
*di
)
3539 struct demangle_component
*ret
;
3540 int was_expression
= di
->is_expression
;
3542 di
->is_expression
= 1;
3543 ret
= d_expression_1 (di
);
3544 di
->is_expression
= was_expression
;
3548 /* <expr-primary> ::= L <type> <(value) number> E
3549 ::= L <type> <(value) float> E
3550 ::= L <mangled-name> E
3553 static struct demangle_component
*
3554 d_expr_primary (struct d_info
*di
)
3556 struct demangle_component
*ret
;
3558 if (! d_check_char (di
, 'L'))
3560 if (d_peek_char (di
) == '_'
3561 /* Workaround for G++ bug; see comment in write_template_arg. */
3562 || d_peek_char (di
) == 'Z')
3563 ret
= cplus_demangle_mangled_name (di
, 0);
3566 struct demangle_component
*type
;
3567 enum demangle_component_type t
;
3570 type
= cplus_demangle_type (di
);
3574 /* If we have a type we know how to print, we aren't going to
3575 print the type name itself. */
3576 if (type
->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
3577 && type
->u
.s_builtin
.type
->print
!= D_PRINT_DEFAULT
)
3578 di
->expansion
-= type
->u
.s_builtin
.type
->len
;
3580 /* Rather than try to interpret the literal value, we just
3581 collect it as a string. Note that it's possible to have a
3582 floating point literal here. The ABI specifies that the
3583 format of such literals is machine independent. That's fine,
3584 but what's not fine is that versions of g++ up to 3.2 with
3585 -fabi-version=1 used upper case letters in the hex constant,
3586 and dumped out gcc's internal representation. That makes it
3587 hard to tell where the constant ends, and hard to dump the
3588 constant in any readable form anyhow. We don't attempt to
3589 handle these cases. */
3591 t
= DEMANGLE_COMPONENT_LITERAL
;
3592 if (d_peek_char (di
) == 'n')
3594 t
= DEMANGLE_COMPONENT_LITERAL_NEG
;
3598 while (d_peek_char (di
) != 'E')
3600 if (d_peek_char (di
) == '\0')
3604 ret
= d_make_comp (di
, t
, type
, d_make_name (di
, s
, d_str (di
) - s
));
3606 if (! d_check_char (di
, 'E'))
3611 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3612 ::= Z <(function) encoding> E s [<discriminator>]
3613 ::= Z <(function) encoding> E d [<parameter> number>] _ <entity name>
3616 static struct demangle_component
*
3617 d_local_name (struct d_info
*di
)
3619 struct demangle_component
*function
;
3620 struct demangle_component
*name
;
3622 if (! d_check_char (di
, 'Z'))
3625 function
= d_encoding (di
, 0);
3629 if (! d_check_char (di
, 'E'))
3632 if (d_peek_char (di
) == 's')
3635 if (! d_discriminator (di
))
3637 name
= d_make_name (di
, "string literal", sizeof "string literal" - 1);
3643 if (d_peek_char (di
) == 'd')
3645 /* Default argument scope: d <number> _. */
3647 num
= d_compact_number (di
);
3655 /* Lambdas and unnamed types have internal discriminators
3656 and are not functions. */
3657 && name
->type
!= DEMANGLE_COMPONENT_LAMBDA
3658 && name
->type
!= DEMANGLE_COMPONENT_UNNAMED_TYPE
)
3660 /* Read and ignore an optional discriminator. */
3661 if (! d_discriminator (di
))
3666 name
= d_make_default_arg (di
, num
, name
);
3669 /* Elide the return type of the containing function so as to not
3670 confuse the user thinking it is the return type of whatever local
3671 function we might be containing. */
3672 if (function
->type
== DEMANGLE_COMPONENT_TYPED_NAME
3673 && d_right (function
)->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
3674 d_left (d_right (function
)) = NULL
;
3676 return d_make_comp (di
, DEMANGLE_COMPONENT_LOCAL_NAME
, function
, name
);
3679 /* <discriminator> ::= _ <number> # when number < 10
3680 ::= __ <number> _ # when number >= 10
3682 <discriminator> ::= _ <number> # when number >=10
3683 is also accepted to support gcc versions that wrongly mangled that way.
3685 We demangle the discriminator, but we don't print it out. FIXME:
3686 We should print it out in verbose mode. */
3689 d_discriminator (struct d_info
*di
)
3691 int discrim
, num_underscores
= 1;
3693 if (d_peek_char (di
) != '_')
3696 if (d_peek_char (di
) == '_')
3702 discrim
= d_number (di
);
3705 if (num_underscores
> 1 && discrim
>= 10)
3707 if (d_peek_char (di
) == '_')
3716 /* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */
3718 static struct demangle_component
*
3719 d_lambda (struct d_info
*di
)
3721 struct demangle_component
*tl
;
3722 struct demangle_component
*ret
;
3725 if (! d_check_char (di
, 'U'))
3727 if (! d_check_char (di
, 'l'))
3730 tl
= d_parmlist (di
);
3734 if (! d_check_char (di
, 'E'))
3737 num
= d_compact_number (di
);
3741 ret
= d_make_empty (di
);
3744 ret
->type
= DEMANGLE_COMPONENT_LAMBDA
;
3745 ret
->u
.s_unary_num
.sub
= tl
;
3746 ret
->u
.s_unary_num
.num
= num
;
3749 if (! d_add_substitution (di
, ret
))
3755 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
3757 static struct demangle_component
*
3758 d_unnamed_type (struct d_info
*di
)
3760 struct demangle_component
*ret
;
3763 if (! d_check_char (di
, 'U'))
3765 if (! d_check_char (di
, 't'))
3768 num
= d_compact_number (di
);
3772 ret
= d_make_empty (di
);
3775 ret
->type
= DEMANGLE_COMPONENT_UNNAMED_TYPE
;
3776 ret
->u
.s_number
.number
= num
;
3779 if (! d_add_substitution (di
, ret
))
3785 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
3788 static struct demangle_component
*
3789 d_clone_suffix (struct d_info
*di
, struct demangle_component
*encoding
)
3791 const char *suffix
= d_str (di
);
3792 const char *pend
= suffix
;
3793 struct demangle_component
*n
;
3795 if (*pend
== '.' && (IS_LOWER (pend
[1]) || pend
[1] == '_'))
3798 while (IS_LOWER (*pend
) || *pend
== '_')
3801 while (*pend
== '.' && IS_DIGIT (pend
[1]))
3804 while (IS_DIGIT (*pend
))
3807 d_advance (di
, pend
- suffix
);
3808 n
= d_make_name (di
, suffix
, pend
- suffix
);
3809 return d_make_comp (di
, DEMANGLE_COMPONENT_CLONE
, encoding
, n
);
3812 /* Add a new substitution. */
3815 d_add_substitution (struct d_info
*di
, struct demangle_component
*dc
)
3819 if (di
->next_sub
>= di
->num_subs
)
3821 di
->subs
[di
->next_sub
] = dc
;
3826 /* <substitution> ::= S <seq-id> _
3836 If PREFIX is non-zero, then this type is being used as a prefix in
3837 a qualified name. In this case, for the standard substitutions, we
3838 need to check whether we are being used as a prefix for a
3839 constructor or destructor, and return a full template name.
3840 Otherwise we will get something like std::iostream::~iostream()
3841 which does not correspond particularly well to any function which
3842 actually appears in the source.
3845 static const struct d_standard_sub_info standard_subs
[] =
3850 { 'a', NL ("std::allocator"),
3851 NL ("std::allocator"),
3853 { 'b', NL ("std::basic_string"),
3854 NL ("std::basic_string"),
3855 NL ("basic_string") },
3856 { 's', NL ("std::string"),
3857 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
3858 NL ("basic_string") },
3859 { 'i', NL ("std::istream"),
3860 NL ("std::basic_istream<char, std::char_traits<char> >"),
3861 NL ("basic_istream") },
3862 { 'o', NL ("std::ostream"),
3863 NL ("std::basic_ostream<char, std::char_traits<char> >"),
3864 NL ("basic_ostream") },
3865 { 'd', NL ("std::iostream"),
3866 NL ("std::basic_iostream<char, std::char_traits<char> >"),
3867 NL ("basic_iostream") }
3870 static struct demangle_component
*
3871 d_substitution (struct d_info
*di
, int prefix
)
3875 if (! d_check_char (di
, 'S'))
3878 c
= d_next_char (di
);
3879 if (c
== '_' || IS_DIGIT (c
) || IS_UPPER (c
))
3888 unsigned int new_id
;
3891 new_id
= id
* 36 + c
- '0';
3892 else if (IS_UPPER (c
))
3893 new_id
= id
* 36 + c
- 'A' + 10;
3899 c
= d_next_char (di
);
3906 if (id
>= (unsigned int) di
->next_sub
)
3909 return di
->subs
[id
];
3914 const struct d_standard_sub_info
*p
;
3915 const struct d_standard_sub_info
*pend
;
3917 verbose
= (di
->options
& DMGL_VERBOSE
) != 0;
3918 if (! verbose
&& prefix
)
3922 peek
= d_peek_char (di
);
3923 if (peek
== 'C' || peek
== 'D')
3927 pend
= (&standard_subs
[0]
3928 + sizeof standard_subs
/ sizeof standard_subs
[0]);
3929 for (p
= &standard_subs
[0]; p
< pend
; ++p
)
3935 struct demangle_component
*dc
;
3937 if (p
->set_last_name
!= NULL
)
3938 di
->last_name
= d_make_sub (di
, p
->set_last_name
,
3939 p
->set_last_name_len
);
3942 s
= p
->full_expansion
;
3947 s
= p
->simple_expansion
;
3948 len
= p
->simple_len
;
3950 di
->expansion
+= len
;
3951 dc
= d_make_sub (di
, s
, len
);
3952 if (d_peek_char (di
) == 'B')
3954 /* If there are ABI tags on the abbreviation, it becomes
3955 a substitution candidate. */
3956 dc
= d_abi_tags (di
, dc
);
3957 if (! d_add_substitution (di
, dc
))
3969 d_checkpoint (struct d_info
*di
, struct d_info_checkpoint
*checkpoint
)
3971 checkpoint
->n
= di
->n
;
3972 checkpoint
->next_comp
= di
->next_comp
;
3973 checkpoint
->next_sub
= di
->next_sub
;
3974 checkpoint
->expansion
= di
->expansion
;
3978 d_backtrack (struct d_info
*di
, struct d_info_checkpoint
*checkpoint
)
3980 di
->n
= checkpoint
->n
;
3981 di
->next_comp
= checkpoint
->next_comp
;
3982 di
->next_sub
= checkpoint
->next_sub
;
3983 di
->expansion
= checkpoint
->expansion
;
3986 /* Initialize a growable string. */
3989 d_growable_string_init (struct d_growable_string
*dgs
, size_t estimate
)
3994 dgs
->allocation_failure
= 0;
3997 d_growable_string_resize (dgs
, estimate
);
4000 /* Grow a growable string to a given size. */
4003 d_growable_string_resize (struct d_growable_string
*dgs
, size_t need
)
4008 if (dgs
->allocation_failure
)
4011 /* Start allocation at two bytes to avoid any possibility of confusion
4012 with the special value of 1 used as a return in *palc to indicate
4013 allocation failures. */
4014 newalc
= dgs
->alc
> 0 ? dgs
->alc
: 2;
4015 while (newalc
< need
)
4018 newbuf
= (char *) realloc (dgs
->buf
, newalc
);
4025 dgs
->allocation_failure
= 1;
4032 /* Append a buffer to a growable string. */
4035 d_growable_string_append_buffer (struct d_growable_string
*dgs
,
4036 const char *s
, size_t l
)
4040 need
= dgs
->len
+ l
+ 1;
4041 if (need
> dgs
->alc
)
4042 d_growable_string_resize (dgs
, need
);
4044 if (dgs
->allocation_failure
)
4047 memcpy (dgs
->buf
+ dgs
->len
, s
, l
);
4048 dgs
->buf
[dgs
->len
+ l
] = '\0';
4052 /* Bridge growable strings to the callback mechanism. */
4055 d_growable_string_callback_adapter (const char *s
, size_t l
, void *opaque
)
4057 struct d_growable_string
*dgs
= (struct d_growable_string
*) opaque
;
4059 d_growable_string_append_buffer (dgs
, s
, l
);
4062 /* Walk the tree, counting the number of templates encountered, and
4063 the number of times a scope might be saved. These counts will be
4064 used to allocate data structures for d_print_comp, so the logic
4065 here must mirror the logic d_print_comp will use. It is not
4066 important that the resulting numbers are exact, so long as they
4067 are larger than the actual numbers encountered. */
4070 d_count_templates_scopes (struct d_print_info
*dpi
,
4071 const struct demangle_component
*dc
)
4078 case DEMANGLE_COMPONENT_NAME
:
4079 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
4080 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
4081 case DEMANGLE_COMPONENT_SUB_STD
:
4082 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
4083 case DEMANGLE_COMPONENT_OPERATOR
:
4084 case DEMANGLE_COMPONENT_CHARACTER
:
4085 case DEMANGLE_COMPONENT_NUMBER
:
4086 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
4089 case DEMANGLE_COMPONENT_TEMPLATE
:
4090 dpi
->num_copy_templates
++;
4091 goto recurse_left_right
;
4093 case DEMANGLE_COMPONENT_REFERENCE
:
4094 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
4095 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_TEMPLATE_PARAM
)
4096 dpi
->num_saved_scopes
++;
4097 goto recurse_left_right
;
4099 case DEMANGLE_COMPONENT_QUAL_NAME
:
4100 case DEMANGLE_COMPONENT_LOCAL_NAME
:
4101 case DEMANGLE_COMPONENT_TYPED_NAME
:
4102 case DEMANGLE_COMPONENT_VTABLE
:
4103 case DEMANGLE_COMPONENT_VTT
:
4104 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
4105 case DEMANGLE_COMPONENT_TYPEINFO
:
4106 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
4107 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
4108 case DEMANGLE_COMPONENT_THUNK
:
4109 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
4110 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
4111 case DEMANGLE_COMPONENT_JAVA_CLASS
:
4112 case DEMANGLE_COMPONENT_GUARD
:
4113 case DEMANGLE_COMPONENT_TLS_INIT
:
4114 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
4115 case DEMANGLE_COMPONENT_REFTEMP
:
4116 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
4117 case DEMANGLE_COMPONENT_RESTRICT
:
4118 case DEMANGLE_COMPONENT_VOLATILE
:
4119 case DEMANGLE_COMPONENT_CONST
:
4120 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
4121 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
4122 case DEMANGLE_COMPONENT_CONST_THIS
:
4123 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
4124 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
4125 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
4126 case DEMANGLE_COMPONENT_NOEXCEPT
:
4127 case DEMANGLE_COMPONENT_THROW_SPEC
:
4128 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
4129 case DEMANGLE_COMPONENT_POINTER
:
4130 case DEMANGLE_COMPONENT_COMPLEX
:
4131 case DEMANGLE_COMPONENT_IMAGINARY
:
4132 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
4133 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
4134 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
4135 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
4136 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
4137 case DEMANGLE_COMPONENT_ARGLIST
:
4138 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
4139 case DEMANGLE_COMPONENT_TPARM_OBJ
:
4140 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
4141 case DEMANGLE_COMPONENT_CAST
:
4142 case DEMANGLE_COMPONENT_CONVERSION
:
4143 case DEMANGLE_COMPONENT_NULLARY
:
4144 case DEMANGLE_COMPONENT_UNARY
:
4145 case DEMANGLE_COMPONENT_BINARY
:
4146 case DEMANGLE_COMPONENT_BINARY_ARGS
:
4147 case DEMANGLE_COMPONENT_TRINARY
:
4148 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
4149 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
4150 case DEMANGLE_COMPONENT_LITERAL
:
4151 case DEMANGLE_COMPONENT_LITERAL_NEG
:
4152 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
4153 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
4154 case DEMANGLE_COMPONENT_DECLTYPE
:
4155 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
4156 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
4157 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
4158 case DEMANGLE_COMPONENT_TAGGED_NAME
:
4159 case DEMANGLE_COMPONENT_CLONE
:
4161 /* PR 89394 - Check for too much recursion. */
4162 if (dpi
->recursion
> DEMANGLE_RECURSION_LIMIT
)
4163 /* FIXME: There ought to be a way to report to the
4164 user that the recursion limit has been reached. */
4168 d_count_templates_scopes (dpi
, d_left (dc
));
4169 d_count_templates_scopes (dpi
, d_right (dc
));
4173 case DEMANGLE_COMPONENT_CTOR
:
4174 d_count_templates_scopes (dpi
, dc
->u
.s_ctor
.name
);
4177 case DEMANGLE_COMPONENT_DTOR
:
4178 d_count_templates_scopes (dpi
, dc
->u
.s_dtor
.name
);
4181 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
4182 d_count_templates_scopes (dpi
, dc
->u
.s_extended_operator
.name
);
4185 case DEMANGLE_COMPONENT_FIXED_TYPE
:
4186 d_count_templates_scopes (dpi
, dc
->u
.s_fixed
.length
);
4189 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
4190 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
4191 d_count_templates_scopes (dpi
, d_left (dc
));
4194 case DEMANGLE_COMPONENT_LAMBDA
:
4195 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
4196 d_count_templates_scopes (dpi
, dc
->u
.s_unary_num
.sub
);
4201 /* Initialize a print information structure. */
4204 d_print_init (struct d_print_info
*dpi
, demangle_callbackref callback
,
4205 void *opaque
, const struct demangle_component
*dc
)
4208 dpi
->last_char
= '\0';
4209 dpi
->templates
= NULL
;
4210 dpi
->modifiers
= NULL
;
4211 dpi
->pack_index
= 0;
4212 dpi
->flush_count
= 0;
4214 dpi
->callback
= callback
;
4215 dpi
->opaque
= opaque
;
4217 dpi
->demangle_failure
= 0;
4219 dpi
->is_lambda_arg
= 0;
4221 dpi
->component_stack
= NULL
;
4223 dpi
->saved_scopes
= NULL
;
4224 dpi
->next_saved_scope
= 0;
4225 dpi
->num_saved_scopes
= 0;
4227 dpi
->copy_templates
= NULL
;
4228 dpi
->next_copy_template
= 0;
4229 dpi
->num_copy_templates
= 0;
4231 d_count_templates_scopes (dpi
, dc
);
4232 /* If we did not reach the recursion limit, then reset the
4233 current recursion value back to 0, so that we can print
4235 if (dpi
->recursion
< DEMANGLE_RECURSION_LIMIT
)
4237 dpi
->num_copy_templates
*= dpi
->num_saved_scopes
;
4239 dpi
->current_template
= NULL
;
4242 /* Indicate that an error occurred during printing, and test for error. */
4245 d_print_error (struct d_print_info
*dpi
)
4247 dpi
->demangle_failure
= 1;
4251 d_print_saw_error (struct d_print_info
*dpi
)
4253 return dpi
->demangle_failure
!= 0;
4256 /* Flush buffered characters to the callback. */
4259 d_print_flush (struct d_print_info
*dpi
)
4261 dpi
->buf
[dpi
->len
] = '\0';
4262 dpi
->callback (dpi
->buf
, dpi
->len
, dpi
->opaque
);
4267 /* Append characters and buffers for printing. */
4270 d_append_char (struct d_print_info
*dpi
, char c
)
4272 if (dpi
->len
== sizeof (dpi
->buf
) - 1)
4273 d_print_flush (dpi
);
4275 dpi
->buf
[dpi
->len
++] = c
;
4280 d_append_buffer (struct d_print_info
*dpi
, const char *s
, size_t l
)
4284 for (i
= 0; i
< l
; i
++)
4285 d_append_char (dpi
, s
[i
]);
4289 d_append_string (struct d_print_info
*dpi
, const char *s
)
4291 d_append_buffer (dpi
, s
, strlen (s
));
4295 d_append_num (struct d_print_info
*dpi
, int l
)
4298 sprintf (buf
,"%d", l
);
4299 d_append_string (dpi
, buf
);
4303 d_last_char (struct d_print_info
*dpi
)
4305 return dpi
->last_char
;
4308 /* Turn components into a human readable string. OPTIONS is the
4309 options bits passed to the demangler. DC is the tree to print.
4310 CALLBACK is a function to call to flush demangled string segments
4311 as they fill the intermediate buffer, and OPAQUE is a generalized
4312 callback argument. On success, this returns 1. On failure,
4313 it returns 0, indicating a bad parse. It does not use heap
4314 memory to build an output string, so cannot encounter memory
4315 allocation failure. */
4317 CP_STATIC_IF_GLIBCPP_V3
4319 cplus_demangle_print_callback (int options
,
4320 struct demangle_component
*dc
,
4321 demangle_callbackref callback
, void *opaque
)
4323 struct d_print_info dpi
;
4325 d_print_init (&dpi
, callback
, opaque
, dc
);
4328 #ifdef CP_DYNAMIC_ARRAYS
4329 /* Avoid zero-length VLAs, which are prohibited by the C99 standard
4330 and flagged as errors by Address Sanitizer. */
4331 __extension__
struct d_saved_scope scopes
[(dpi
.num_saved_scopes
> 0)
4332 ? dpi
.num_saved_scopes
: 1];
4333 __extension__
struct d_print_template temps
[(dpi
.num_copy_templates
> 0)
4334 ? dpi
.num_copy_templates
: 1];
4336 dpi
.saved_scopes
= scopes
;
4337 dpi
.copy_templates
= temps
;
4339 dpi
.saved_scopes
= alloca (dpi
.num_saved_scopes
4340 * sizeof (*dpi
.saved_scopes
));
4341 dpi
.copy_templates
= alloca (dpi
.num_copy_templates
4342 * sizeof (*dpi
.copy_templates
));
4345 d_print_comp (&dpi
, options
, dc
);
4348 d_print_flush (&dpi
);
4350 return ! d_print_saw_error (&dpi
);
4353 /* Turn components into a human readable string. OPTIONS is the
4354 options bits passed to the demangler. DC is the tree to print.
4355 ESTIMATE is a guess at the length of the result. This returns a
4356 string allocated by malloc, or NULL on error. On success, this
4357 sets *PALC to the size of the allocated buffer. On failure, this
4358 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
4361 CP_STATIC_IF_GLIBCPP_V3
4363 cplus_demangle_print (int options
, struct demangle_component
*dc
,
4364 int estimate
, size_t *palc
)
4366 struct d_growable_string dgs
;
4368 d_growable_string_init (&dgs
, estimate
);
4370 if (! cplus_demangle_print_callback (options
, dc
,
4371 d_growable_string_callback_adapter
,
4379 *palc
= dgs
.allocation_failure
? 1 : dgs
.alc
;
4383 /* Returns the I'th element of the template arglist ARGS, or NULL on
4384 failure. If I is negative, return the entire arglist. */
4386 static struct demangle_component
*
4387 d_index_template_argument (struct demangle_component
*args
, int i
)
4389 struct demangle_component
*a
;
4392 /* Print the whole argument pack. */
4399 if (a
->type
!= DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4405 if (i
!= 0 || a
== NULL
)
4411 /* Returns the template argument from the current context indicated by DC,
4412 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
4414 static struct demangle_component
*
4415 d_lookup_template_argument (struct d_print_info
*dpi
,
4416 const struct demangle_component
*dc
)
4418 if (dpi
->templates
== NULL
)
4420 d_print_error (dpi
);
4424 return d_index_template_argument
4425 (d_right (dpi
->templates
->template_decl
),
4426 dc
->u
.s_number
.number
);
4429 /* Returns a template argument pack used in DC (any will do), or NULL. */
4431 static struct demangle_component
*
4432 d_find_pack (struct d_print_info
*dpi
,
4433 const struct demangle_component
*dc
)
4435 struct demangle_component
*a
;
4441 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
4442 a
= d_lookup_template_argument (dpi
, dc
);
4443 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4447 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
4450 case DEMANGLE_COMPONENT_LAMBDA
:
4451 case DEMANGLE_COMPONENT_NAME
:
4452 case DEMANGLE_COMPONENT_TAGGED_NAME
:
4453 case DEMANGLE_COMPONENT_OPERATOR
:
4454 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
4455 case DEMANGLE_COMPONENT_SUB_STD
:
4456 case DEMANGLE_COMPONENT_CHARACTER
:
4457 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
4458 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
4459 case DEMANGLE_COMPONENT_FIXED_TYPE
:
4460 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
4461 case DEMANGLE_COMPONENT_NUMBER
:
4464 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
4465 return d_find_pack (dpi
, dc
->u
.s_extended_operator
.name
);
4466 case DEMANGLE_COMPONENT_CTOR
:
4467 return d_find_pack (dpi
, dc
->u
.s_ctor
.name
);
4468 case DEMANGLE_COMPONENT_DTOR
:
4469 return d_find_pack (dpi
, dc
->u
.s_dtor
.name
);
4472 a
= d_find_pack (dpi
, d_left (dc
));
4475 return d_find_pack (dpi
, d_right (dc
));
4479 /* Returns the length of the template argument pack DC. */
4482 d_pack_length (const struct demangle_component
*dc
)
4485 while (dc
&& dc
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
4486 && d_left (dc
) != NULL
)
4494 /* Returns the number of template args in DC, expanding any pack expansions
4498 d_args_length (struct d_print_info
*dpi
, const struct demangle_component
*dc
)
4501 for (; dc
&& dc
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
;
4504 struct demangle_component
*elt
= d_left (dc
);
4507 if (elt
->type
== DEMANGLE_COMPONENT_PACK_EXPANSION
)
4509 struct demangle_component
*a
= d_find_pack (dpi
, d_left (elt
));
4510 count
+= d_pack_length (a
);
4518 /* DC is a component of a mangled expression. Print it, wrapped in parens
4522 d_print_subexpr (struct d_print_info
*dpi
, int options
,
4523 struct demangle_component
*dc
)
4526 if (dc
->type
== DEMANGLE_COMPONENT_NAME
4527 || dc
->type
== DEMANGLE_COMPONENT_QUAL_NAME
4528 || dc
->type
== DEMANGLE_COMPONENT_INITIALIZER_LIST
4529 || dc
->type
== DEMANGLE_COMPONENT_FUNCTION_PARAM
)
4532 d_append_char (dpi
, '(');
4533 d_print_comp (dpi
, options
, dc
);
4535 d_append_char (dpi
, ')');
4538 /* Save the current scope. */
4541 d_save_scope (struct d_print_info
*dpi
,
4542 const struct demangle_component
*container
)
4544 struct d_saved_scope
*scope
;
4545 struct d_print_template
*src
, **link
;
4547 if (dpi
->next_saved_scope
>= dpi
->num_saved_scopes
)
4549 d_print_error (dpi
);
4552 scope
= &dpi
->saved_scopes
[dpi
->next_saved_scope
];
4553 dpi
->next_saved_scope
++;
4555 scope
->container
= container
;
4556 link
= &scope
->templates
;
4558 for (src
= dpi
->templates
; src
!= NULL
; src
= src
->next
)
4560 struct d_print_template
*dst
;
4562 if (dpi
->next_copy_template
>= dpi
->num_copy_templates
)
4564 d_print_error (dpi
);
4567 dst
= &dpi
->copy_templates
[dpi
->next_copy_template
];
4568 dpi
->next_copy_template
++;
4570 dst
->template_decl
= src
->template_decl
;
4578 /* Attempt to locate a previously saved scope. Returns NULL if no
4579 corresponding saved scope was found. */
4581 static struct d_saved_scope
*
4582 d_get_saved_scope (struct d_print_info
*dpi
,
4583 const struct demangle_component
*container
)
4587 for (i
= 0; i
< dpi
->next_saved_scope
; i
++)
4588 if (dpi
->saved_scopes
[i
].container
== container
)
4589 return &dpi
->saved_scopes
[i
];
4594 /* If DC is a C++17 fold-expression, print it and return true; otherwise
4598 d_maybe_print_fold_expression (struct d_print_info
*dpi
, int options
,
4599 struct demangle_component
*dc
)
4601 struct demangle_component
*ops
, *operator_
, *op1
, *op2
;
4604 const char *fold_code
= d_left (dc
)->u
.s_operator
.op
->code
;
4605 if (fold_code
[0] != 'f')
4609 operator_
= d_left (ops
);
4610 op1
= d_right (ops
);
4612 if (op1
->type
== DEMANGLE_COMPONENT_TRINARY_ARG2
)
4614 op2
= d_right (op1
);
4618 /* Print the whole pack. */
4619 save_idx
= dpi
->pack_index
;
4620 dpi
->pack_index
= -1;
4622 switch (fold_code
[1])
4624 /* Unary left fold, (... + X). */
4626 d_append_string (dpi
, "(...");
4627 d_print_expr_op (dpi
, options
, operator_
);
4628 d_print_subexpr (dpi
, options
, op1
);
4629 d_append_char (dpi
, ')');
4632 /* Unary right fold, (X + ...). */
4634 d_append_char (dpi
, '(');
4635 d_print_subexpr (dpi
, options
, op1
);
4636 d_print_expr_op (dpi
, options
, operator_
);
4637 d_append_string (dpi
, "...)");
4640 /* Binary left fold, (42 + ... + X). */
4642 /* Binary right fold, (X + ... + 42). */
4644 d_append_char (dpi
, '(');
4645 d_print_subexpr (dpi
, options
, op1
);
4646 d_print_expr_op (dpi
, options
, operator_
);
4647 d_append_string (dpi
, "...");
4648 d_print_expr_op (dpi
, options
, operator_
);
4649 d_print_subexpr (dpi
, options
, op2
);
4650 d_append_char (dpi
, ')');
4654 dpi
->pack_index
= save_idx
;
4658 /* Subroutine to handle components. */
4661 d_print_comp_inner (struct d_print_info
*dpi
, int options
,
4662 struct demangle_component
*dc
)
4664 /* Magic variable to let reference smashing skip over the next modifier
4665 without needing to modify *dc. */
4666 struct demangle_component
*mod_inner
= NULL
;
4668 /* Variable used to store the current templates while a previously
4669 captured scope is used. */
4670 struct d_print_template
*saved_templates
;
4672 /* Nonzero if templates have been stored in the above variable. */
4673 int need_template_restore
= 0;
4677 d_print_error (dpi
);
4680 if (d_print_saw_error (dpi
))
4685 case DEMANGLE_COMPONENT_NAME
:
4686 if ((options
& DMGL_JAVA
) == 0)
4687 d_append_buffer (dpi
, dc
->u
.s_name
.s
, dc
->u
.s_name
.len
);
4689 d_print_java_identifier (dpi
, dc
->u
.s_name
.s
, dc
->u
.s_name
.len
);
4692 case DEMANGLE_COMPONENT_TAGGED_NAME
:
4693 d_print_comp (dpi
, options
, d_left (dc
));
4694 d_append_string (dpi
, "[abi:");
4695 d_print_comp (dpi
, options
, d_right (dc
));
4696 d_append_char (dpi
, ']');
4699 case DEMANGLE_COMPONENT_QUAL_NAME
:
4700 case DEMANGLE_COMPONENT_LOCAL_NAME
:
4701 d_print_comp (dpi
, options
, d_left (dc
));
4702 if ((options
& DMGL_JAVA
) == 0)
4703 d_append_string (dpi
, "::");
4705 d_append_char (dpi
, '.');
4707 struct demangle_component
*local_name
= d_right (dc
);
4708 if (local_name
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
4710 d_append_string (dpi
, "{default arg#");
4711 d_append_num (dpi
, local_name
->u
.s_unary_num
.num
+ 1);
4712 d_append_string (dpi
, "}::");
4713 local_name
= local_name
->u
.s_unary_num
.sub
;
4715 d_print_comp (dpi
, options
, local_name
);
4719 case DEMANGLE_COMPONENT_TYPED_NAME
:
4721 struct d_print_mod
*hold_modifiers
;
4722 struct demangle_component
*typed_name
;
4723 struct d_print_mod adpm
[4];
4725 struct d_print_template dpt
;
4727 /* Pass the name down to the type so that it can be printed in
4728 the right place for the type. We also have to pass down
4729 any CV-qualifiers, which apply to the this parameter. */
4730 hold_modifiers
= dpi
->modifiers
;
4733 typed_name
= d_left (dc
);
4734 while (typed_name
!= NULL
)
4736 if (i
>= sizeof adpm
/ sizeof adpm
[0])
4738 d_print_error (dpi
);
4742 adpm
[i
].next
= dpi
->modifiers
;
4743 dpi
->modifiers
= &adpm
[i
];
4744 adpm
[i
].mod
= typed_name
;
4745 adpm
[i
].printed
= 0;
4746 adpm
[i
].templates
= dpi
->templates
;
4749 if (!is_fnqual_component_type (typed_name
->type
))
4752 typed_name
= d_left (typed_name
);
4755 if (typed_name
== NULL
)
4757 d_print_error (dpi
);
4761 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
4762 there may be CV-qualifiers on its right argument which
4763 really apply here; this happens when parsing a class that
4764 is local to a function. */
4765 if (typed_name
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
4767 typed_name
= d_right (typed_name
);
4768 if (typed_name
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
4769 typed_name
= typed_name
->u
.s_unary_num
.sub
;
4770 while (typed_name
!= NULL
4771 && is_fnqual_component_type (typed_name
->type
))
4773 if (i
>= sizeof adpm
/ sizeof adpm
[0])
4775 d_print_error (dpi
);
4779 adpm
[i
] = adpm
[i
- 1];
4780 adpm
[i
].next
= &adpm
[i
- 1];
4781 dpi
->modifiers
= &adpm
[i
];
4783 adpm
[i
- 1].mod
= typed_name
;
4784 adpm
[i
- 1].printed
= 0;
4785 adpm
[i
- 1].templates
= dpi
->templates
;
4788 typed_name
= d_left (typed_name
);
4790 if (typed_name
== NULL
)
4792 d_print_error (dpi
);
4797 /* If typed_name is a template, then it applies to the
4798 function type as well. */
4799 if (typed_name
->type
== DEMANGLE_COMPONENT_TEMPLATE
)
4801 dpt
.next
= dpi
->templates
;
4802 dpi
->templates
= &dpt
;
4803 dpt
.template_decl
= typed_name
;
4806 d_print_comp (dpi
, options
, d_right (dc
));
4808 if (typed_name
->type
== DEMANGLE_COMPONENT_TEMPLATE
)
4809 dpi
->templates
= dpt
.next
;
4811 /* If the modifiers didn't get printed by the type, print them
4816 if (! adpm
[i
].printed
)
4818 d_append_char (dpi
, ' ');
4819 d_print_mod (dpi
, options
, adpm
[i
].mod
);
4823 dpi
->modifiers
= hold_modifiers
;
4828 case DEMANGLE_COMPONENT_TEMPLATE
:
4830 struct d_print_mod
*hold_dpm
;
4831 struct demangle_component
*dcl
;
4832 const struct demangle_component
*hold_current
;
4834 /* This template may need to be referenced by a cast operator
4835 contained in its subtree. */
4836 hold_current
= dpi
->current_template
;
4837 dpi
->current_template
= dc
;
4839 /* Don't push modifiers into a template definition. Doing so
4840 could give the wrong definition for a template argument.
4841 Instead, treat the template essentially as a name. */
4843 hold_dpm
= dpi
->modifiers
;
4844 dpi
->modifiers
= NULL
;
4848 if ((options
& DMGL_JAVA
) != 0
4849 && dcl
->type
== DEMANGLE_COMPONENT_NAME
4850 && dcl
->u
.s_name
.len
== 6
4851 && strncmp (dcl
->u
.s_name
.s
, "JArray", 6) == 0)
4853 /* Special-case Java arrays, so that JArray<TYPE> appears
4854 instead as TYPE[]. */
4856 d_print_comp (dpi
, options
, d_right (dc
));
4857 d_append_string (dpi
, "[]");
4861 d_print_comp (dpi
, options
, dcl
);
4862 if (d_last_char (dpi
) == '<')
4863 d_append_char (dpi
, ' ');
4864 d_append_char (dpi
, '<');
4865 d_print_comp (dpi
, options
, d_right (dc
));
4866 /* Avoid generating two consecutive '>' characters, to avoid
4867 the C++ syntactic ambiguity. */
4868 if (d_last_char (dpi
) == '>')
4869 d_append_char (dpi
, ' ');
4870 d_append_char (dpi
, '>');
4873 dpi
->modifiers
= hold_dpm
;
4874 dpi
->current_template
= hold_current
;
4879 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
4880 if (dpi
->is_lambda_arg
)
4882 /* Show the template parm index, as that's how g++ displays
4883 these, and future proofs us against potential
4884 '[]<typename T> (T *a, T *b) {...}'. */
4885 d_append_buffer (dpi
, "auto:", 5);
4886 d_append_num (dpi
, dc
->u
.s_number
.number
+ 1);
4890 struct d_print_template
*hold_dpt
;
4891 struct demangle_component
*a
= d_lookup_template_argument (dpi
, dc
);
4893 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4894 a
= d_index_template_argument (a
, dpi
->pack_index
);
4898 d_print_error (dpi
);
4902 /* While processing this parameter, we need to pop the list
4903 of templates. This is because the template parameter may
4904 itself be a reference to a parameter of an outer
4907 hold_dpt
= dpi
->templates
;
4908 dpi
->templates
= hold_dpt
->next
;
4910 d_print_comp (dpi
, options
, a
);
4912 dpi
->templates
= hold_dpt
;
4916 case DEMANGLE_COMPONENT_TPARM_OBJ
:
4917 d_append_string (dpi
, "template parameter object for ");
4918 d_print_comp (dpi
, options
, d_left (dc
));
4921 case DEMANGLE_COMPONENT_CTOR
:
4922 d_print_comp (dpi
, options
, dc
->u
.s_ctor
.name
);
4925 case DEMANGLE_COMPONENT_DTOR
:
4926 d_append_char (dpi
, '~');
4927 d_print_comp (dpi
, options
, dc
->u
.s_dtor
.name
);
4930 case DEMANGLE_COMPONENT_VTABLE
:
4931 d_append_string (dpi
, "vtable for ");
4932 d_print_comp (dpi
, options
, d_left (dc
));
4935 case DEMANGLE_COMPONENT_VTT
:
4936 d_append_string (dpi
, "VTT for ");
4937 d_print_comp (dpi
, options
, d_left (dc
));
4940 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
4941 d_append_string (dpi
, "construction vtable for ");
4942 d_print_comp (dpi
, options
, d_left (dc
));
4943 d_append_string (dpi
, "-in-");
4944 d_print_comp (dpi
, options
, d_right (dc
));
4947 case DEMANGLE_COMPONENT_TYPEINFO
:
4948 d_append_string (dpi
, "typeinfo for ");
4949 d_print_comp (dpi
, options
, d_left (dc
));
4952 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
4953 d_append_string (dpi
, "typeinfo name for ");
4954 d_print_comp (dpi
, options
, d_left (dc
));
4957 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
4958 d_append_string (dpi
, "typeinfo fn for ");
4959 d_print_comp (dpi
, options
, d_left (dc
));
4962 case DEMANGLE_COMPONENT_THUNK
:
4963 d_append_string (dpi
, "non-virtual thunk to ");
4964 d_print_comp (dpi
, options
, d_left (dc
));
4967 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
4968 d_append_string (dpi
, "virtual thunk to ");
4969 d_print_comp (dpi
, options
, d_left (dc
));
4972 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
4973 d_append_string (dpi
, "covariant return thunk to ");
4974 d_print_comp (dpi
, options
, d_left (dc
));
4977 case DEMANGLE_COMPONENT_JAVA_CLASS
:
4978 d_append_string (dpi
, "java Class for ");
4979 d_print_comp (dpi
, options
, d_left (dc
));
4982 case DEMANGLE_COMPONENT_GUARD
:
4983 d_append_string (dpi
, "guard variable for ");
4984 d_print_comp (dpi
, options
, d_left (dc
));
4987 case DEMANGLE_COMPONENT_TLS_INIT
:
4988 d_append_string (dpi
, "TLS init function for ");
4989 d_print_comp (dpi
, options
, d_left (dc
));
4992 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
4993 d_append_string (dpi
, "TLS wrapper function for ");
4994 d_print_comp (dpi
, options
, d_left (dc
));
4997 case DEMANGLE_COMPONENT_REFTEMP
:
4998 d_append_string (dpi
, "reference temporary #");
4999 d_print_comp (dpi
, options
, d_right (dc
));
5000 d_append_string (dpi
, " for ");
5001 d_print_comp (dpi
, options
, d_left (dc
));
5004 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
5005 d_append_string (dpi
, "hidden alias for ");
5006 d_print_comp (dpi
, options
, d_left (dc
));
5009 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
5010 d_append_string (dpi
, "transaction clone for ");
5011 d_print_comp (dpi
, options
, d_left (dc
));
5014 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
5015 d_append_string (dpi
, "non-transaction clone for ");
5016 d_print_comp (dpi
, options
, d_left (dc
));
5019 case DEMANGLE_COMPONENT_SUB_STD
:
5020 d_append_buffer (dpi
, dc
->u
.s_string
.string
, dc
->u
.s_string
.len
);
5023 case DEMANGLE_COMPONENT_RESTRICT
:
5024 case DEMANGLE_COMPONENT_VOLATILE
:
5025 case DEMANGLE_COMPONENT_CONST
:
5027 struct d_print_mod
*pdpm
;
5029 /* When printing arrays, it's possible to have cases where the
5030 same CV-qualifier gets pushed on the stack multiple times.
5031 We only need to print it once. */
5033 for (pdpm
= dpi
->modifiers
; pdpm
!= NULL
; pdpm
= pdpm
->next
)
5035 if (! pdpm
->printed
)
5037 if (pdpm
->mod
->type
!= DEMANGLE_COMPONENT_RESTRICT
5038 && pdpm
->mod
->type
!= DEMANGLE_COMPONENT_VOLATILE
5039 && pdpm
->mod
->type
!= DEMANGLE_COMPONENT_CONST
)
5041 if (pdpm
->mod
->type
== dc
->type
)
5043 d_print_comp (dpi
, options
, d_left (dc
));
5051 case DEMANGLE_COMPONENT_REFERENCE
:
5052 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
5054 /* Handle reference smashing: & + && = &. */
5055 struct demangle_component
*sub
= d_left (dc
);
5056 if (!dpi
->is_lambda_arg
5057 && sub
->type
== DEMANGLE_COMPONENT_TEMPLATE_PARAM
)
5059 struct d_saved_scope
*scope
= d_get_saved_scope (dpi
, sub
);
5060 struct demangle_component
*a
;
5064 /* This is the first time SUB has been traversed.
5065 We need to capture the current templates so
5066 they can be restored if SUB is reentered as a
5068 d_save_scope (dpi
, sub
);
5069 if (d_print_saw_error (dpi
))
5074 const struct d_component_stack
*dcse
;
5075 int found_self_or_parent
= 0;
5077 /* This traversal is reentering SUB as a substition.
5078 If we are not beneath SUB or DC in the tree then we
5079 need to restore SUB's template stack temporarily. */
5080 for (dcse
= dpi
->component_stack
; dcse
!= NULL
;
5081 dcse
= dcse
->parent
)
5085 && dcse
!= dpi
->component_stack
))
5087 found_self_or_parent
= 1;
5092 if (!found_self_or_parent
)
5094 saved_templates
= dpi
->templates
;
5095 dpi
->templates
= scope
->templates
;
5096 need_template_restore
= 1;
5100 a
= d_lookup_template_argument (dpi
, sub
);
5101 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
5102 a
= d_index_template_argument (a
, dpi
->pack_index
);
5106 if (need_template_restore
)
5107 dpi
->templates
= saved_templates
;
5109 d_print_error (dpi
);
5116 if (sub
->type
== DEMANGLE_COMPONENT_REFERENCE
5117 || sub
->type
== dc
->type
)
5119 else if (sub
->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE
)
5120 mod_inner
= d_left (sub
);
5124 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
5125 case DEMANGLE_COMPONENT_POINTER
:
5126 case DEMANGLE_COMPONENT_COMPLEX
:
5127 case DEMANGLE_COMPONENT_IMAGINARY
:
5128 FNQUAL_COMPONENT_CASE
:
5131 /* We keep a list of modifiers on the stack. */
5132 struct d_print_mod dpm
;
5134 dpm
.next
= dpi
->modifiers
;
5135 dpi
->modifiers
= &dpm
;
5138 dpm
.templates
= dpi
->templates
;
5141 mod_inner
= d_left (dc
);
5143 d_print_comp (dpi
, options
, mod_inner
);
5145 /* If the modifier didn't get printed by the type, print it
5148 d_print_mod (dpi
, options
, dc
);
5150 dpi
->modifiers
= dpm
.next
;
5152 if (need_template_restore
)
5153 dpi
->templates
= saved_templates
;
5158 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
5159 if ((options
& DMGL_JAVA
) == 0)
5160 d_append_buffer (dpi
, dc
->u
.s_builtin
.type
->name
,
5161 dc
->u
.s_builtin
.type
->len
);
5163 d_append_buffer (dpi
, dc
->u
.s_builtin
.type
->java_name
,
5164 dc
->u
.s_builtin
.type
->java_len
);
5167 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
5168 d_print_comp (dpi
, options
, d_left (dc
));
5171 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
5173 if ((options
& DMGL_RET_POSTFIX
) != 0)
5174 d_print_function_type (dpi
,
5175 options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5176 dc
, dpi
->modifiers
);
5178 /* Print return type if present */
5179 if (d_left (dc
) != NULL
&& (options
& DMGL_RET_POSTFIX
) != 0)
5180 d_print_comp (dpi
, options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5182 else if (d_left (dc
) != NULL
&& (options
& DMGL_RET_DROP
) == 0)
5184 struct d_print_mod dpm
;
5186 /* We must pass this type down as a modifier in order to
5187 print it in the right location. */
5188 dpm
.next
= dpi
->modifiers
;
5189 dpi
->modifiers
= &dpm
;
5192 dpm
.templates
= dpi
->templates
;
5194 d_print_comp (dpi
, options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5197 dpi
->modifiers
= dpm
.next
;
5202 /* In standard prefix notation, there is a space between the
5203 return type and the function signature. */
5204 if ((options
& DMGL_RET_POSTFIX
) == 0)
5205 d_append_char (dpi
, ' ');
5208 if ((options
& DMGL_RET_POSTFIX
) == 0)
5209 d_print_function_type (dpi
,
5210 options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5211 dc
, dpi
->modifiers
);
5216 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
5218 struct d_print_mod
*hold_modifiers
;
5219 struct d_print_mod adpm
[4];
5221 struct d_print_mod
*pdpm
;
5223 /* We must pass this type down as a modifier in order to print
5224 multi-dimensional arrays correctly. If the array itself is
5225 CV-qualified, we act as though the element type were
5226 CV-qualified. We do this by copying the modifiers down
5227 rather than fiddling pointers, so that we don't wind up
5228 with a d_print_mod higher on the stack pointing into our
5229 stack frame after we return. */
5231 hold_modifiers
= dpi
->modifiers
;
5233 adpm
[0].next
= hold_modifiers
;
5234 dpi
->modifiers
= &adpm
[0];
5236 adpm
[0].printed
= 0;
5237 adpm
[0].templates
= dpi
->templates
;
5240 pdpm
= hold_modifiers
;
5242 && (pdpm
->mod
->type
== DEMANGLE_COMPONENT_RESTRICT
5243 || pdpm
->mod
->type
== DEMANGLE_COMPONENT_VOLATILE
5244 || pdpm
->mod
->type
== DEMANGLE_COMPONENT_CONST
))
5246 if (! pdpm
->printed
)
5248 if (i
>= sizeof adpm
/ sizeof adpm
[0])
5250 d_print_error (dpi
);
5255 adpm
[i
].next
= dpi
->modifiers
;
5256 dpi
->modifiers
= &adpm
[i
];
5264 d_print_comp (dpi
, options
, d_right (dc
));
5266 dpi
->modifiers
= hold_modifiers
;
5268 if (adpm
[0].printed
)
5274 d_print_mod (dpi
, options
, adpm
[i
].mod
);
5277 d_print_array_type (dpi
, options
, dc
, dpi
->modifiers
);
5282 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
5283 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
5285 struct d_print_mod dpm
;
5287 dpm
.next
= dpi
->modifiers
;
5288 dpi
->modifiers
= &dpm
;
5291 dpm
.templates
= dpi
->templates
;
5293 d_print_comp (dpi
, options
, d_right (dc
));
5295 /* If the modifier didn't get printed by the type, print it
5298 d_print_mod (dpi
, options
, dc
);
5300 dpi
->modifiers
= dpm
.next
;
5305 case DEMANGLE_COMPONENT_FIXED_TYPE
:
5306 if (dc
->u
.s_fixed
.sat
)
5307 d_append_string (dpi
, "_Sat ");
5308 /* Don't print "int _Accum". */
5309 if (dc
->u
.s_fixed
.length
->u
.s_builtin
.type
5310 != &cplus_demangle_builtin_types
['i'-'a'])
5312 d_print_comp (dpi
, options
, dc
->u
.s_fixed
.length
);
5313 d_append_char (dpi
, ' ');
5315 if (dc
->u
.s_fixed
.accum
)
5316 d_append_string (dpi
, "_Accum");
5318 d_append_string (dpi
, "_Fract");
5321 case DEMANGLE_COMPONENT_ARGLIST
:
5322 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
5323 if (d_left (dc
) != NULL
)
5324 d_print_comp (dpi
, options
, d_left (dc
));
5325 if (d_right (dc
) != NULL
)
5328 unsigned long int flush_count
;
5329 /* Make sure ", " isn't flushed by d_append_string, otherwise
5330 dpi->len -= 2 wouldn't work. */
5331 if (dpi
->len
>= sizeof (dpi
->buf
) - 2)
5332 d_print_flush (dpi
);
5333 d_append_string (dpi
, ", ");
5335 flush_count
= dpi
->flush_count
;
5336 d_print_comp (dpi
, options
, d_right (dc
));
5337 /* If that didn't print anything (which can happen with empty
5338 template argument packs), remove the comma and space. */
5339 if (dpi
->flush_count
== flush_count
&& dpi
->len
== len
)
5344 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
5346 struct demangle_component
*type
= d_left (dc
);
5347 struct demangle_component
*list
= d_right (dc
);
5350 d_print_comp (dpi
, options
, type
);
5351 d_append_char (dpi
, '{');
5352 d_print_comp (dpi
, options
, list
);
5353 d_append_char (dpi
, '}');
5357 case DEMANGLE_COMPONENT_OPERATOR
:
5359 const struct demangle_operator_info
*op
= dc
->u
.s_operator
.op
;
5362 d_append_string (dpi
, "operator");
5363 /* Add a space before new/delete. */
5364 if (IS_LOWER (op
->name
[0]))
5365 d_append_char (dpi
, ' ');
5366 /* Omit a trailing space. */
5367 if (op
->name
[len
-1] == ' ')
5369 d_append_buffer (dpi
, op
->name
, len
);
5373 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
5374 d_append_string (dpi
, "operator ");
5375 d_print_comp (dpi
, options
, dc
->u
.s_extended_operator
.name
);
5378 case DEMANGLE_COMPONENT_CONVERSION
:
5379 d_append_string (dpi
, "operator ");
5380 d_print_conversion (dpi
, options
, dc
);
5383 case DEMANGLE_COMPONENT_NULLARY
:
5384 d_print_expr_op (dpi
, options
, d_left (dc
));
5387 case DEMANGLE_COMPONENT_UNARY
:
5389 struct demangle_component
*op
= d_left (dc
);
5390 struct demangle_component
*operand
= d_right (dc
);
5391 const char *code
= NULL
;
5393 if (op
->type
== DEMANGLE_COMPONENT_OPERATOR
)
5395 code
= op
->u
.s_operator
.op
->code
;
5396 if (!strcmp (code
, "ad"))
5398 /* Don't print the argument list for the address of a
5400 if (operand
->type
== DEMANGLE_COMPONENT_TYPED_NAME
5401 && d_left (operand
)->type
== DEMANGLE_COMPONENT_QUAL_NAME
5402 && d_right (operand
)->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5403 operand
= d_left (operand
);
5405 if (operand
->type
== DEMANGLE_COMPONENT_BINARY_ARGS
)
5407 /* This indicates a suffix operator. */
5408 operand
= d_left (operand
);
5409 d_print_subexpr (dpi
, options
, operand
);
5410 d_print_expr_op (dpi
, options
, op
);
5415 /* For sizeof..., just print the pack length. */
5416 if (code
&& !strcmp (code
, "sZ"))
5418 struct demangle_component
*a
= d_find_pack (dpi
, operand
);
5419 int len
= d_pack_length (a
);
5420 d_append_num (dpi
, len
);
5423 else if (code
&& !strcmp (code
, "sP"))
5425 int len
= d_args_length (dpi
, operand
);
5426 d_append_num (dpi
, len
);
5430 if (op
->type
!= DEMANGLE_COMPONENT_CAST
)
5431 d_print_expr_op (dpi
, options
, op
);
5434 d_append_char (dpi
, '(');
5435 d_print_cast (dpi
, options
, op
);
5436 d_append_char (dpi
, ')');
5438 if (code
&& !strcmp (code
, "gs"))
5439 /* Avoid parens after '::'. */
5440 d_print_comp (dpi
, options
, operand
);
5441 else if (code
&& !strcmp (code
, "st"))
5442 /* Always print parens for sizeof (type). */
5444 d_append_char (dpi
, '(');
5445 d_print_comp (dpi
, options
, operand
);
5446 d_append_char (dpi
, ')');
5449 d_print_subexpr (dpi
, options
, operand
);
5453 case DEMANGLE_COMPONENT_BINARY
:
5454 if (d_right (dc
)->type
!= DEMANGLE_COMPONENT_BINARY_ARGS
)
5456 d_print_error (dpi
);
5460 if (op_is_new_cast (d_left (dc
)))
5462 d_print_expr_op (dpi
, options
, d_left (dc
));
5463 d_append_char (dpi
, '<');
5464 d_print_comp (dpi
, options
, d_left (d_right (dc
)));
5465 d_append_string (dpi
, ">(");
5466 d_print_comp (dpi
, options
, d_right (d_right (dc
)));
5467 d_append_char (dpi
, ')');
5471 if (d_maybe_print_fold_expression (dpi
, options
, dc
))
5474 /* We wrap an expression which uses the greater-than operator in
5475 an extra layer of parens so that it does not get confused
5476 with the '>' which ends the template parameters. */
5477 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_OPERATOR
5478 && d_left (dc
)->u
.s_operator
.op
->len
== 1
5479 && d_left (dc
)->u
.s_operator
.op
->name
[0] == '>')
5480 d_append_char (dpi
, '(');
5482 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "cl") == 0
5483 && d_left (d_right (dc
))->type
== DEMANGLE_COMPONENT_TYPED_NAME
)
5485 /* Function call used in an expression should not have printed types
5486 of the function arguments. Values of the function arguments still
5487 get printed below. */
5489 const struct demangle_component
*func
= d_left (d_right (dc
));
5491 if (d_right (func
)->type
!= DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5492 d_print_error (dpi
);
5493 d_print_subexpr (dpi
, options
, d_left (func
));
5496 d_print_subexpr (dpi
, options
, d_left (d_right (dc
)));
5497 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "ix") == 0)
5499 d_append_char (dpi
, '[');
5500 d_print_comp (dpi
, options
, d_right (d_right (dc
)));
5501 d_append_char (dpi
, ']');
5505 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "cl") != 0)
5506 d_print_expr_op (dpi
, options
, d_left (dc
));
5507 d_print_subexpr (dpi
, options
, d_right (d_right (dc
)));
5510 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_OPERATOR
5511 && d_left (dc
)->u
.s_operator
.op
->len
== 1
5512 && d_left (dc
)->u
.s_operator
.op
->name
[0] == '>')
5513 d_append_char (dpi
, ')');
5517 case DEMANGLE_COMPONENT_BINARY_ARGS
:
5518 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
5519 d_print_error (dpi
);
5522 case DEMANGLE_COMPONENT_TRINARY
:
5523 if (d_right (dc
)->type
!= DEMANGLE_COMPONENT_TRINARY_ARG1
5524 || d_right (d_right (dc
))->type
!= DEMANGLE_COMPONENT_TRINARY_ARG2
)
5526 d_print_error (dpi
);
5529 if (d_maybe_print_fold_expression (dpi
, options
, dc
))
5532 struct demangle_component
*op
= d_left (dc
);
5533 struct demangle_component
*first
= d_left (d_right (dc
));
5534 struct demangle_component
*second
= d_left (d_right (d_right (dc
)));
5535 struct demangle_component
*third
= d_right (d_right (d_right (dc
)));
5537 if (!strcmp (op
->u
.s_operator
.op
->code
, "qu"))
5539 d_print_subexpr (dpi
, options
, first
);
5540 d_print_expr_op (dpi
, options
, op
);
5541 d_print_subexpr (dpi
, options
, second
);
5542 d_append_string (dpi
, " : ");
5543 d_print_subexpr (dpi
, options
, third
);
5547 d_append_string (dpi
, "new ");
5548 if (d_left (first
) != NULL
)
5550 d_print_subexpr (dpi
, options
, first
);
5551 d_append_char (dpi
, ' ');
5553 d_print_comp (dpi
, options
, second
);
5555 d_print_subexpr (dpi
, options
, third
);
5560 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
5561 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
5562 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
5563 d_print_error (dpi
);
5566 case DEMANGLE_COMPONENT_LITERAL
:
5567 case DEMANGLE_COMPONENT_LITERAL_NEG
:
5569 enum d_builtin_type_print tp
;
5571 /* For some builtin types, produce simpler output. */
5572 tp
= D_PRINT_DEFAULT
;
5573 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
)
5575 tp
= d_left (dc
)->u
.s_builtin
.type
->print
;
5579 case D_PRINT_UNSIGNED
:
5581 case D_PRINT_UNSIGNED_LONG
:
5582 case D_PRINT_LONG_LONG
:
5583 case D_PRINT_UNSIGNED_LONG_LONG
:
5584 if (d_right (dc
)->type
== DEMANGLE_COMPONENT_NAME
)
5586 if (dc
->type
== DEMANGLE_COMPONENT_LITERAL_NEG
)
5587 d_append_char (dpi
, '-');
5588 d_print_comp (dpi
, options
, d_right (dc
));
5593 case D_PRINT_UNSIGNED
:
5594 d_append_char (dpi
, 'u');
5597 d_append_char (dpi
, 'l');
5599 case D_PRINT_UNSIGNED_LONG
:
5600 d_append_string (dpi
, "ul");
5602 case D_PRINT_LONG_LONG
:
5603 d_append_string (dpi
, "ll");
5605 case D_PRINT_UNSIGNED_LONG_LONG
:
5606 d_append_string (dpi
, "ull");
5614 if (d_right (dc
)->type
== DEMANGLE_COMPONENT_NAME
5615 && d_right (dc
)->u
.s_name
.len
== 1
5616 && dc
->type
== DEMANGLE_COMPONENT_LITERAL
)
5618 switch (d_right (dc
)->u
.s_name
.s
[0])
5621 d_append_string (dpi
, "false");
5624 d_append_string (dpi
, "true");
5637 d_append_char (dpi
, '(');
5638 d_print_comp (dpi
, options
, d_left (dc
));
5639 d_append_char (dpi
, ')');
5640 if (dc
->type
== DEMANGLE_COMPONENT_LITERAL_NEG
)
5641 d_append_char (dpi
, '-');
5642 if (tp
== D_PRINT_FLOAT
)
5643 d_append_char (dpi
, '[');
5644 d_print_comp (dpi
, options
, d_right (dc
));
5645 if (tp
== D_PRINT_FLOAT
)
5646 d_append_char (dpi
, ']');
5650 case DEMANGLE_COMPONENT_NUMBER
:
5651 d_append_num (dpi
, dc
->u
.s_number
.number
);
5654 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
5655 d_append_string (dpi
, "java resource ");
5656 d_print_comp (dpi
, options
, d_left (dc
));
5659 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
5660 d_print_comp (dpi
, options
, d_left (dc
));
5661 d_print_comp (dpi
, options
, d_right (dc
));
5664 case DEMANGLE_COMPONENT_CHARACTER
:
5665 d_append_char (dpi
, dc
->u
.s_character
.character
);
5668 case DEMANGLE_COMPONENT_DECLTYPE
:
5669 d_append_string (dpi
, "decltype (");
5670 d_print_comp (dpi
, options
, d_left (dc
));
5671 d_append_char (dpi
, ')');
5674 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
5678 struct demangle_component
*a
= d_find_pack (dpi
, d_left (dc
));
5681 /* d_find_pack won't find anything if the only packs involved
5682 in this expansion are function parameter packs; in that
5683 case, just print the pattern and "...". */
5684 d_print_subexpr (dpi
, options
, d_left (dc
));
5685 d_append_string (dpi
, "...");
5689 len
= d_pack_length (a
);
5691 for (i
= 0; i
< len
; ++i
)
5693 dpi
->pack_index
= i
;
5694 d_print_comp (dpi
, options
, dc
);
5696 d_append_string (dpi
, ", ");
5701 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
5703 long num
= dc
->u
.s_number
.number
;
5705 d_append_string (dpi
, "this");
5708 d_append_string (dpi
, "{parm#");
5709 d_append_num (dpi
, num
);
5710 d_append_char (dpi
, '}');
5715 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
5716 d_append_string (dpi
, "global constructors keyed to ");
5717 d_print_comp (dpi
, options
, dc
->u
.s_binary
.left
);
5720 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
5721 d_append_string (dpi
, "global destructors keyed to ");
5722 d_print_comp (dpi
, options
, dc
->u
.s_binary
.left
);
5725 case DEMANGLE_COMPONENT_LAMBDA
:
5726 d_append_string (dpi
, "{lambda(");
5727 /* Generic lambda auto parms are mangled as the template type
5729 dpi
->is_lambda_arg
++;
5730 d_print_comp (dpi
, options
, dc
->u
.s_unary_num
.sub
);
5731 dpi
->is_lambda_arg
--;
5732 d_append_string (dpi
, ")#");
5733 d_append_num (dpi
, dc
->u
.s_unary_num
.num
+ 1);
5734 d_append_char (dpi
, '}');
5737 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
5738 d_append_string (dpi
, "{unnamed type#");
5739 d_append_num (dpi
, dc
->u
.s_number
.number
+ 1);
5740 d_append_char (dpi
, '}');
5743 case DEMANGLE_COMPONENT_CLONE
:
5744 d_print_comp (dpi
, options
, d_left (dc
));
5745 d_append_string (dpi
, " [clone ");
5746 d_print_comp (dpi
, options
, d_right (dc
));
5747 d_append_char (dpi
, ']');
5751 d_print_error (dpi
);
5757 d_print_comp (struct d_print_info
*dpi
, int options
,
5758 struct demangle_component
*dc
)
5760 struct d_component_stack self
;
5761 if (dc
== NULL
|| dc
->d_printing
> 1 || dpi
->recursion
> MAX_RECURSION_COUNT
)
5763 d_print_error (dpi
);
5771 self
.parent
= dpi
->component_stack
;
5772 dpi
->component_stack
= &self
;
5774 d_print_comp_inner (dpi
, options
, dc
);
5776 dpi
->component_stack
= self
.parent
;
5781 /* Print a Java dentifier. For Java we try to handle encoded extended
5782 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
5783 so we don't it for C++. Characters are encoded as
5787 d_print_java_identifier (struct d_print_info
*dpi
, const char *name
, int len
)
5793 for (p
= name
; p
< end
; ++p
)
5804 for (q
= p
+ 3; q
< end
; ++q
)
5810 else if (*q
>= 'A' && *q
<= 'F')
5811 dig
= *q
- 'A' + 10;
5812 else if (*q
>= 'a' && *q
<= 'f')
5813 dig
= *q
- 'a' + 10;
5819 /* If the Unicode character is larger than 256, we don't try
5820 to deal with it here. FIXME. */
5821 if (q
< end
&& *q
== '_' && c
< 256)
5823 d_append_char (dpi
, c
);
5829 d_append_char (dpi
, *p
);
5833 /* Print a list of modifiers. SUFFIX is 1 if we are printing
5834 qualifiers on this after printing a function. */
5837 d_print_mod_list (struct d_print_info
*dpi
, int options
,
5838 struct d_print_mod
*mods
, int suffix
)
5840 struct d_print_template
*hold_dpt
;
5842 if (mods
== NULL
|| d_print_saw_error (dpi
))
5847 && (is_fnqual_component_type (mods
->mod
->type
))))
5849 d_print_mod_list (dpi
, options
, mods
->next
, suffix
);
5855 hold_dpt
= dpi
->templates
;
5856 dpi
->templates
= mods
->templates
;
5858 if (mods
->mod
->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5860 d_print_function_type (dpi
, options
, mods
->mod
, mods
->next
);
5861 dpi
->templates
= hold_dpt
;
5864 else if (mods
->mod
->type
== DEMANGLE_COMPONENT_ARRAY_TYPE
)
5866 d_print_array_type (dpi
, options
, mods
->mod
, mods
->next
);
5867 dpi
->templates
= hold_dpt
;
5870 else if (mods
->mod
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
5872 struct d_print_mod
*hold_modifiers
;
5873 struct demangle_component
*dc
;
5875 /* When this is on the modifier stack, we have pulled any
5876 qualifiers off the right argument already. Otherwise, we
5877 print it as usual, but don't let the left argument see any
5880 hold_modifiers
= dpi
->modifiers
;
5881 dpi
->modifiers
= NULL
;
5882 d_print_comp (dpi
, options
, d_left (mods
->mod
));
5883 dpi
->modifiers
= hold_modifiers
;
5885 if ((options
& DMGL_JAVA
) == 0)
5886 d_append_string (dpi
, "::");
5888 d_append_char (dpi
, '.');
5890 dc
= d_right (mods
->mod
);
5892 if (dc
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
5894 d_append_string (dpi
, "{default arg#");
5895 d_append_num (dpi
, dc
->u
.s_unary_num
.num
+ 1);
5896 d_append_string (dpi
, "}::");
5897 dc
= dc
->u
.s_unary_num
.sub
;
5900 while (is_fnqual_component_type (dc
->type
))
5903 d_print_comp (dpi
, options
, dc
);
5905 dpi
->templates
= hold_dpt
;
5909 d_print_mod (dpi
, options
, mods
->mod
);
5911 dpi
->templates
= hold_dpt
;
5913 d_print_mod_list (dpi
, options
, mods
->next
, suffix
);
5916 /* Print a modifier. */
5919 d_print_mod (struct d_print_info
*dpi
, int options
,
5920 struct demangle_component
*mod
)
5924 case DEMANGLE_COMPONENT_RESTRICT
:
5925 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
5926 d_append_string (dpi
, " restrict");
5928 case DEMANGLE_COMPONENT_VOLATILE
:
5929 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
5930 d_append_string (dpi
, " volatile");
5932 case DEMANGLE_COMPONENT_CONST
:
5933 case DEMANGLE_COMPONENT_CONST_THIS
:
5934 d_append_string (dpi
, " const");
5936 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
5937 d_append_string (dpi
, " transaction_safe");
5939 case DEMANGLE_COMPONENT_NOEXCEPT
:
5940 d_append_string (dpi
, " noexcept");
5943 d_append_char (dpi
, '(');
5944 d_print_comp (dpi
, options
, d_right (mod
));
5945 d_append_char (dpi
, ')');
5948 case DEMANGLE_COMPONENT_THROW_SPEC
:
5949 d_append_string (dpi
, " throw");
5952 d_append_char (dpi
, '(');
5953 d_print_comp (dpi
, options
, d_right (mod
));
5954 d_append_char (dpi
, ')');
5957 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
5958 d_append_char (dpi
, ' ');
5959 d_print_comp (dpi
, options
, d_right (mod
));
5961 case DEMANGLE_COMPONENT_POINTER
:
5962 /* There is no pointer symbol in Java. */
5963 if ((options
& DMGL_JAVA
) == 0)
5964 d_append_char (dpi
, '*');
5966 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
5967 /* For the ref-qualifier, put a space before the &. */
5968 d_append_char (dpi
, ' ');
5970 case DEMANGLE_COMPONENT_REFERENCE
:
5971 d_append_char (dpi
, '&');
5973 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
5974 d_append_char (dpi
, ' ');
5976 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
5977 d_append_string (dpi
, "&&");
5979 case DEMANGLE_COMPONENT_COMPLEX
:
5980 d_append_string (dpi
, "complex ");
5982 case DEMANGLE_COMPONENT_IMAGINARY
:
5983 d_append_string (dpi
, "imaginary ");
5985 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
5986 if (d_last_char (dpi
) != '(')
5987 d_append_char (dpi
, ' ');
5988 d_print_comp (dpi
, options
, d_left (mod
));
5989 d_append_string (dpi
, "::*");
5991 case DEMANGLE_COMPONENT_TYPED_NAME
:
5992 d_print_comp (dpi
, options
, d_left (mod
));
5994 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
5995 d_append_string (dpi
, " __vector(");
5996 d_print_comp (dpi
, options
, d_left (mod
));
5997 d_append_char (dpi
, ')');
6001 /* Otherwise, we have something that won't go back on the
6002 modifier stack, so we can just print it. */
6003 d_print_comp (dpi
, options
, mod
);
6008 /* Print a function type, except for the return type. */
6011 d_print_function_type (struct d_print_info
*dpi
, int options
,
6012 struct demangle_component
*dc
,
6013 struct d_print_mod
*mods
)
6017 struct d_print_mod
*p
;
6018 struct d_print_mod
*hold_modifiers
;
6022 for (p
= mods
; p
!= NULL
; p
= p
->next
)
6027 switch (p
->mod
->type
)
6029 case DEMANGLE_COMPONENT_POINTER
:
6030 case DEMANGLE_COMPONENT_REFERENCE
:
6031 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
6034 case DEMANGLE_COMPONENT_RESTRICT
:
6035 case DEMANGLE_COMPONENT_VOLATILE
:
6036 case DEMANGLE_COMPONENT_CONST
:
6037 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
6038 case DEMANGLE_COMPONENT_COMPLEX
:
6039 case DEMANGLE_COMPONENT_IMAGINARY
:
6040 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
6044 FNQUAL_COMPONENT_CASE
:
6057 if (d_last_char (dpi
) != '('
6058 && d_last_char (dpi
) != '*')
6061 if (need_space
&& d_last_char (dpi
) != ' ')
6062 d_append_char (dpi
, ' ');
6063 d_append_char (dpi
, '(');
6066 hold_modifiers
= dpi
->modifiers
;
6067 dpi
->modifiers
= NULL
;
6069 d_print_mod_list (dpi
, options
, mods
, 0);
6072 d_append_char (dpi
, ')');
6074 d_append_char (dpi
, '(');
6076 if (d_right (dc
) != NULL
)
6077 d_print_comp (dpi
, options
, d_right (dc
));
6079 d_append_char (dpi
, ')');
6081 d_print_mod_list (dpi
, options
, mods
, 1);
6083 dpi
->modifiers
= hold_modifiers
;
6086 /* Print an array type, except for the element type. */
6089 d_print_array_type (struct d_print_info
*dpi
, int options
,
6090 struct demangle_component
*dc
,
6091 struct d_print_mod
*mods
)
6099 struct d_print_mod
*p
;
6102 for (p
= mods
; p
!= NULL
; p
= p
->next
)
6106 if (p
->mod
->type
== DEMANGLE_COMPONENT_ARRAY_TYPE
)
6121 d_append_string (dpi
, " (");
6123 d_print_mod_list (dpi
, options
, mods
, 0);
6126 d_append_char (dpi
, ')');
6130 d_append_char (dpi
, ' ');
6132 d_append_char (dpi
, '[');
6134 if (d_left (dc
) != NULL
)
6135 d_print_comp (dpi
, options
, d_left (dc
));
6137 d_append_char (dpi
, ']');
6140 /* Print an operator in an expression. */
6143 d_print_expr_op (struct d_print_info
*dpi
, int options
,
6144 struct demangle_component
*dc
)
6146 if (dc
->type
== DEMANGLE_COMPONENT_OPERATOR
)
6147 d_append_buffer (dpi
, dc
->u
.s_operator
.op
->name
,
6148 dc
->u
.s_operator
.op
->len
);
6150 d_print_comp (dpi
, options
, dc
);
6156 d_print_cast (struct d_print_info
*dpi
, int options
,
6157 struct demangle_component
*dc
)
6159 d_print_comp (dpi
, options
, d_left (dc
));
6162 /* Print a conversion operator. */
6165 d_print_conversion (struct d_print_info
*dpi
, int options
,
6166 struct demangle_component
*dc
)
6168 struct d_print_template dpt
;
6170 /* For a conversion operator, we need the template parameters from
6171 the enclosing template in scope for processing the type. */
6172 if (dpi
->current_template
!= NULL
)
6174 dpt
.next
= dpi
->templates
;
6175 dpi
->templates
= &dpt
;
6176 dpt
.template_decl
= dpi
->current_template
;
6179 if (d_left (dc
)->type
!= DEMANGLE_COMPONENT_TEMPLATE
)
6181 d_print_comp (dpi
, options
, d_left (dc
));
6182 if (dpi
->current_template
!= NULL
)
6183 dpi
->templates
= dpt
.next
;
6187 d_print_comp (dpi
, options
, d_left (d_left (dc
)));
6189 /* For a templated cast operator, we need to remove the template
6190 parameters from scope after printing the operator name,
6191 so we need to handle the template printing here. */
6192 if (dpi
->current_template
!= NULL
)
6193 dpi
->templates
= dpt
.next
;
6195 if (d_last_char (dpi
) == '<')
6196 d_append_char (dpi
, ' ');
6197 d_append_char (dpi
, '<');
6198 d_print_comp (dpi
, options
, d_right (d_left (dc
)));
6199 /* Avoid generating two consecutive '>' characters, to avoid
6200 the C++ syntactic ambiguity. */
6201 if (d_last_char (dpi
) == '>')
6202 d_append_char (dpi
, ' ');
6203 d_append_char (dpi
, '>');
6207 /* Initialize the information structure we use to pass around
6210 CP_STATIC_IF_GLIBCPP_V3
6212 cplus_demangle_init_info (const char *mangled
, int options
, size_t len
,
6216 di
->send
= mangled
+ len
;
6217 di
->options
= options
;
6221 /* We cannot need more components than twice the number of chars in
6222 the mangled string. Most components correspond directly to
6223 chars, but the ARGLIST types are exceptions. */
6224 di
->num_comps
= 2 * len
;
6227 /* Similarly, we cannot need more substitutions than there are
6228 chars in the mangled string. */
6232 di
->last_name
= NULL
;
6235 di
->is_expression
= 0;
6236 di
->is_conversion
= 0;
6237 di
->recursion_level
= 0;
6240 /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
6241 mangled name, return strings in repeated callback giving the demangled
6242 name. OPTIONS is the usual libiberty demangler options. On success,
6243 this returns 1. On failure, returns 0. */
6246 d_demangle_callback (const char *mangled
, int options
,
6247 demangle_callbackref callback
, void *opaque
)
6258 struct demangle_component
*dc
;
6261 if (mangled
[0] == '_' && mangled
[1] == 'Z')
6263 else if (strncmp (mangled
, "_GLOBAL_", 8) == 0
6264 && (mangled
[8] == '.' || mangled
[8] == '_' || mangled
[8] == '$')
6265 && (mangled
[9] == 'D' || mangled
[9] == 'I')
6266 && mangled
[10] == '_')
6267 type
= mangled
[9] == 'I' ? DCT_GLOBAL_CTORS
: DCT_GLOBAL_DTORS
;
6270 if ((options
& DMGL_TYPES
) == 0)
6275 cplus_demangle_init_info (mangled
, options
, strlen (mangled
), &di
);
6277 /* PR 87675 - Check for a mangled string that is so long
6278 that we do not have enough stack space to demangle it. */
6279 if (((options
& DMGL_NO_RECURSE_LIMIT
) == 0)
6280 /* This check is a bit arbitrary, since what we really want to do is to
6281 compare the sizes of the di.comps and di.subs arrays against the
6282 amount of stack space remaining. But there is no portable way to do
6283 this, so instead we use the recursion limit as a guide to the maximum
6284 size of the arrays. */
6285 && (unsigned long) di
.num_comps
> DEMANGLE_RECURSION_LIMIT
)
6287 /* FIXME: We need a way to indicate that a stack limit has been reached. */
6292 #ifdef CP_DYNAMIC_ARRAYS
6293 __extension__
struct demangle_component comps
[di
.num_comps
];
6294 __extension__
struct demangle_component
*subs
[di
.num_subs
];
6299 di
.comps
= alloca (di
.num_comps
* sizeof (*di
.comps
));
6300 di
.subs
= alloca (di
.num_subs
* sizeof (*di
.subs
));
6306 dc
= cplus_demangle_type (&di
);
6309 dc
= cplus_demangle_mangled_name (&di
, 1);
6311 case DCT_GLOBAL_CTORS
:
6312 case DCT_GLOBAL_DTORS
:
6313 d_advance (&di
, 11);
6314 dc
= d_make_comp (&di
,
6315 (type
== DCT_GLOBAL_CTORS
6316 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
6317 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
),
6318 d_make_demangle_mangled_name (&di
, d_str (&di
)),
6320 d_advance (&di
, strlen (d_str (&di
)));
6323 abort (); /* We have listed all the cases. */
6326 /* If DMGL_PARAMS is set, then if we didn't consume the entire
6327 mangled string, then we didn't successfully demangle it. If
6328 DMGL_PARAMS is not set, we didn't look at the trailing
6330 if (((options
& DMGL_PARAMS
) != 0) && d_peek_char (&di
) != '\0')
6333 #ifdef CP_DEMANGLE_DEBUG
6337 status
= (dc
!= NULL
)
6338 ? cplus_demangle_print_callback (options
, dc
, callback
, opaque
)
6345 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
6346 name, return a buffer allocated with malloc holding the demangled
6347 name. OPTIONS is the usual libiberty demangler options. On
6348 success, this sets *PALC to the allocated size of the returned
6349 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
6350 a memory allocation failure, and returns NULL. */
6353 d_demangle (const char *mangled
, int options
, size_t *palc
)
6355 struct d_growable_string dgs
;
6358 d_growable_string_init (&dgs
, 0);
6360 status
= d_demangle_callback (mangled
, options
,
6361 d_growable_string_callback_adapter
, &dgs
);
6369 *palc
= dgs
.allocation_failure
? 1 : dgs
.alc
;
6373 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
6375 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
6377 /* ia64 ABI-mandated entry point in the C++ runtime library for
6378 performing demangling. MANGLED_NAME is a NUL-terminated character
6379 string containing the name to be demangled.
6381 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
6382 *LENGTH bytes, into which the demangled name is stored. If
6383 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
6384 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
6385 is placed in a region of memory allocated with malloc.
6387 If LENGTH is non-NULL, the length of the buffer containing the
6388 demangled name, is placed in *LENGTH.
6390 The return value is a pointer to the start of the NUL-terminated
6391 demangled name, or NULL if the demangling fails. The caller is
6392 responsible for deallocating this memory using free.
6394 *STATUS is set to one of the following values:
6395 0: The demangling operation succeeded.
6396 -1: A memory allocation failure occurred.
6397 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6398 -3: One of the arguments is invalid.
6400 The demangling is performed using the C++ ABI mangling rules, with
6404 __cxa_demangle (const char *mangled_name
, char *output_buffer
,
6405 size_t *length
, int *status
)
6410 if (mangled_name
== NULL
)
6417 if (output_buffer
!= NULL
&& length
== NULL
)
6424 demangled
= d_demangle (mangled_name
, DMGL_PARAMS
| DMGL_TYPES
, &alc
);
6426 if (demangled
== NULL
)
6438 if (output_buffer
== NULL
)
6445 if (strlen (demangled
) < *length
)
6447 strcpy (output_buffer
, demangled
);
6449 demangled
= output_buffer
;
6453 free (output_buffer
);
6464 extern int __gcclibcxx_demangle_callback (const char *,
6466 (const char *, size_t, void *),
6469 /* Alternative, allocationless entry point in the C++ runtime library
6470 for performing demangling. MANGLED_NAME is a NUL-terminated character
6471 string containing the name to be demangled.
6473 CALLBACK is a callback function, called with demangled string
6474 segments as demangling progresses; it is called at least once,
6475 but may be called more than once. OPAQUE is a generalized pointer
6476 used as a callback argument.
6478 The return code is one of the following values, equivalent to
6479 the STATUS values of __cxa_demangle() (excluding -1, since this
6480 function performs no memory allocations):
6481 0: The demangling operation succeeded.
6482 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6483 -3: One of the arguments is invalid.
6485 The demangling is performed using the C++ ABI mangling rules, with
6489 __gcclibcxx_demangle_callback (const char *mangled_name
,
6490 void (*callback
) (const char *, size_t, void *),
6495 if (mangled_name
== NULL
|| callback
== NULL
)
6498 status
= d_demangle_callback (mangled_name
, DMGL_PARAMS
| DMGL_TYPES
,
6506 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
6508 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
6509 mangled name, return a buffer allocated with malloc holding the
6510 demangled name. Otherwise, return NULL. */
6513 cplus_demangle_v3 (const char *mangled
, int options
)
6517 return d_demangle (mangled
, options
, &alc
);
6521 cplus_demangle_v3_callback (const char *mangled
, int options
,
6522 demangle_callbackref callback
, void *opaque
)
6524 return d_demangle_callback (mangled
, options
, callback
, opaque
);
6527 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
6528 conventions, but the output formatting is a little different.
6529 This instructs the C++ demangler not to emit pointer characters ("*"), to
6530 use Java's namespace separator symbol ("." instead of "::"), and to output
6531 JArray<TYPE> as TYPE[]. */
6534 java_demangle_v3 (const char *mangled
)
6538 return d_demangle (mangled
, DMGL_JAVA
| DMGL_PARAMS
| DMGL_RET_POSTFIX
, &alc
);
6542 java_demangle_v3_callback (const char *mangled
,
6543 demangle_callbackref callback
, void *opaque
)
6545 return d_demangle_callback (mangled
,
6546 DMGL_JAVA
| DMGL_PARAMS
| DMGL_RET_POSTFIX
,
6550 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
6552 #ifndef IN_GLIBCPP_V3
6554 /* Demangle a string in order to find out whether it is a constructor
6555 or destructor. Return non-zero on success. Set *CTOR_KIND and
6556 *DTOR_KIND appropriately. */
6559 is_ctor_or_dtor (const char *mangled
,
6560 enum gnu_v3_ctor_kinds
*ctor_kind
,
6561 enum gnu_v3_dtor_kinds
*dtor_kind
)
6564 struct demangle_component
*dc
;
6567 *ctor_kind
= (enum gnu_v3_ctor_kinds
) 0;
6568 *dtor_kind
= (enum gnu_v3_dtor_kinds
) 0;
6570 cplus_demangle_init_info (mangled
, DMGL_GNU_V3
, strlen (mangled
), &di
);
6573 #ifdef CP_DYNAMIC_ARRAYS
6574 __extension__
struct demangle_component comps
[di
.num_comps
];
6575 __extension__
struct demangle_component
*subs
[di
.num_subs
];
6580 di
.comps
= alloca (di
.num_comps
* sizeof (*di
.comps
));
6581 di
.subs
= alloca (di
.num_subs
* sizeof (*di
.subs
));
6584 dc
= cplus_demangle_mangled_name (&di
, 1);
6586 /* Note that because we did not pass DMGL_PARAMS, we don't expect
6587 to demangle the entire string. */
6594 /* These cannot appear on a constructor or destructor. */
6595 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
6596 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
6597 case DEMANGLE_COMPONENT_CONST_THIS
:
6598 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
6599 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
6603 case DEMANGLE_COMPONENT_TYPED_NAME
:
6604 case DEMANGLE_COMPONENT_TEMPLATE
:
6607 case DEMANGLE_COMPONENT_QUAL_NAME
:
6608 case DEMANGLE_COMPONENT_LOCAL_NAME
:
6611 case DEMANGLE_COMPONENT_CTOR
:
6612 *ctor_kind
= dc
->u
.s_ctor
.kind
;
6616 case DEMANGLE_COMPONENT_DTOR
:
6617 *dtor_kind
= dc
->u
.s_dtor
.kind
;
6628 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
6629 name. A non-zero return indicates the type of constructor. */
6631 enum gnu_v3_ctor_kinds
6632 is_gnu_v3_mangled_ctor (const char *name
)
6634 enum gnu_v3_ctor_kinds ctor_kind
;
6635 enum gnu_v3_dtor_kinds dtor_kind
;
6637 if (! is_ctor_or_dtor (name
, &ctor_kind
, &dtor_kind
))
6638 return (enum gnu_v3_ctor_kinds
) 0;
6643 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
6644 name. A non-zero return indicates the type of destructor. */
6646 enum gnu_v3_dtor_kinds
6647 is_gnu_v3_mangled_dtor (const char *name
)
6649 enum gnu_v3_ctor_kinds ctor_kind
;
6650 enum gnu_v3_dtor_kinds dtor_kind
;
6652 if (! is_ctor_or_dtor (name
, &ctor_kind
, &dtor_kind
))
6653 return (enum gnu_v3_dtor_kinds
) 0;
6657 #endif /* IN_GLIBCPP_V3 */
6659 #ifdef STANDALONE_DEMANGLER
6662 #include "dyn-string.h"
6664 static void print_usage (FILE* fp
, int exit_value
);
6666 #define IS_ALPHA(CHAR) \
6667 (((CHAR) >= 'a' && (CHAR) <= 'z') \
6668 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
6670 /* Non-zero if CHAR is a character than can occur in a mangled name. */
6671 #define is_mangled_char(CHAR) \
6672 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
6673 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
6675 /* The name of this program, as invoked. */
6676 const char* program_name
;
6678 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
6681 print_usage (FILE* fp
, int exit_value
)
6683 fprintf (fp
, "Usage: %s [options] [names ...]\n", program_name
);
6684 fprintf (fp
, "Options:\n");
6685 fprintf (fp
, " -h,--help Display this message.\n");
6686 fprintf (fp
, " -p,--no-params Don't display function parameters\n");
6687 fprintf (fp
, " -v,--verbose Produce verbose demanglings.\n");
6688 fprintf (fp
, "If names are provided, they are demangled. Otherwise filters standard input.\n");
6693 /* Option specification for getopt_long. */
6694 static const struct option long_options
[] =
6696 { "help", no_argument
, NULL
, 'h' },
6697 { "no-params", no_argument
, NULL
, 'p' },
6698 { "verbose", no_argument
, NULL
, 'v' },
6699 { NULL
, no_argument
, NULL
, 0 },
6702 /* Main entry for a demangling filter executable. It will demangle
6703 its command line arguments, if any. If none are provided, it will
6704 filter stdin to stdout, replacing any recognized mangled C++ names
6705 with their demangled equivalents. */
6708 main (int argc
, char *argv
[])
6712 int options
= DMGL_PARAMS
| DMGL_ANSI
| DMGL_TYPES
;
6714 /* Use the program name of this program, as invoked. */
6715 program_name
= argv
[0];
6717 /* Parse options. */
6720 opt_char
= getopt_long (argc
, argv
, "hpv", long_options
, NULL
);
6723 case '?': /* Unrecognized option. */
6724 print_usage (stderr
, 1);
6728 print_usage (stdout
, 0);
6732 options
&= ~ DMGL_PARAMS
;
6736 options
|= DMGL_VERBOSE
;
6740 while (opt_char
!= -1);
6743 /* No command line arguments were provided. Filter stdin. */
6745 dyn_string_t mangled
= dyn_string_new (3);
6748 /* Read all of input. */
6749 while (!feof (stdin
))
6753 /* Pile characters into mangled until we hit one that can't
6754 occur in a mangled name. */
6756 while (!feof (stdin
) && is_mangled_char (c
))
6758 dyn_string_append_char (mangled
, c
);
6764 if (dyn_string_length (mangled
) > 0)
6766 #ifdef IN_GLIBCPP_V3
6767 s
= __cxa_demangle (dyn_string_buf (mangled
), NULL
, NULL
, NULL
);
6769 s
= cplus_demangle_v3 (dyn_string_buf (mangled
), options
);
6779 /* It might not have been a mangled name. Print the
6781 fputs (dyn_string_buf (mangled
), stdout
);
6784 dyn_string_clear (mangled
);
6787 /* If we haven't hit EOF yet, we've read one character that
6788 can't occur in a mangled name, so print it out. */
6793 dyn_string_delete (mangled
);
6796 /* Demangle command line arguments. */
6798 /* Loop over command line arguments. */
6799 for (i
= optind
; i
< argc
; ++i
)
6802 #ifdef IN_GLIBCPP_V3
6806 /* Attempt to demangle. */
6807 #ifdef IN_GLIBCPP_V3
6808 s
= __cxa_demangle (argv
[i
], NULL
, NULL
, &status
);
6810 s
= cplus_demangle_v3 (argv
[i
], options
);
6813 /* If it worked, print the demangled name. */
6821 #ifdef IN_GLIBCPP_V3
6822 fprintf (stderr
, "Failed: %s (status %d)\n", argv
[i
], status
);
6824 fprintf (stderr
, "Failed: %s\n", argv
[i
]);
6833 #endif /* STANDALONE_DEMANGLER */