1 /* Demangler for g++ V3 ABI.
2 Copyright (C) 2003-2017 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor <ian@wasabisystems.com>.
5 This file is part of the libiberty library, which is part of GCC.
7 This file is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 In addition to the permissions in the GNU General Public License, the
13 Free Software Foundation gives you unlimited permission to link the
14 compiled version of this file into combinations with other programs,
15 and to distribute those combinations without any restriction coming
16 from the use of this file. (The General Public License restrictions
17 do apply in other respects; for example, they cover modification of
18 the file, and distribution when not linked into a combined
21 This program is distributed in the hope that it will be useful,
22 but WITHOUT ANY WARRANTY; without even the implied warranty of
23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 GNU General Public License for more details.
26 You should have received a copy of the GNU General Public License
27 along with this program; if not, write to the Free Software
28 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
31 /* This code implements a demangler for the g++ V3 ABI. The ABI is
32 described on this web page:
33 http://www.codesourcery.com/cxx-abi/abi.html#mangling
35 This code was written while looking at the demangler written by
36 Alex Samuel <samuel@codesourcery.com>.
38 This code first pulls the mangled name apart into a list of
39 components, and then walks the list generating the demangled
42 This file will normally define the following functions, q.v.:
43 char *cplus_demangle_v3(const char *mangled, int options)
44 char *java_demangle_v3(const char *mangled)
45 int cplus_demangle_v3_callback(const char *mangled, int options,
46 demangle_callbackref callback)
47 int java_demangle_v3_callback(const char *mangled,
48 demangle_callbackref callback)
49 enum gnu_v3_ctor_kinds is_gnu_v3_mangled_ctor (const char *name)
50 enum gnu_v3_dtor_kinds is_gnu_v3_mangled_dtor (const char *name)
52 Also, the interface to the component list is public, and defined in
53 demangle.h. The interface consists of these types, which are
54 defined in demangle.h:
55 enum demangle_component_type
56 struct demangle_component
58 and these functions defined in this file:
59 cplus_demangle_fill_name
60 cplus_demangle_fill_extended_operator
61 cplus_demangle_fill_ctor
62 cplus_demangle_fill_dtor
64 cplus_demangle_print_callback
65 and other functions defined in the file cp-demint.c.
67 This file also defines some other functions and variables which are
68 only to be used by the file cp-demint.c.
70 Preprocessor macros you can define while compiling this file:
73 If defined, this file defines the following functions, q.v.:
74 char *__cxa_demangle (const char *mangled, char *buf, size_t *len,
76 int __gcclibcxx_demangle_callback (const char *,
78 (const char *, size_t, void *),
80 instead of cplus_demangle_v3[_callback]() and
81 java_demangle_v3[_callback]().
84 If defined, this file defines only __cxa_demangle() and
85 __gcclibcxx_demangle_callback(), and no other publically visible
86 functions or variables.
89 If defined, this file defines a main() function which demangles
90 any arguments, or, if none, demangles stdin.
93 If defined, turns on debugging mode, which prints information on
94 stdout about the mangled string. This is not generally useful.
97 If defined, additional sanity checks will be performed. It will
98 cause some slowdown, but will allow to catch out-of-bound access
99 errors earlier. This macro is intended for testing and debugging. */
101 #if defined (_AIX) && !defined (__GNUC__)
123 # define alloca __builtin_alloca
125 extern char *alloca ();
126 # endif /* __GNUC__ */
128 #endif /* HAVE_ALLOCA_H */
134 # define INT_MAX (int)(((unsigned int) ~0) >> 1) /* 0x7FFFFFFF */
137 #include "ansidecl.h"
138 #include "libiberty.h"
139 #include "demangle.h"
140 #include "cp-demangle.h"
142 /* If IN_GLIBCPP_V3 is defined, some functions are made static. We
143 also rename them via #define to avoid compiler errors when the
144 static definition conflicts with the extern declaration in a header
148 #define CP_STATIC_IF_GLIBCPP_V3 static
150 #define cplus_demangle_fill_name d_fill_name
151 static int d_fill_name (struct demangle_component
*, const char *, int);
153 #define cplus_demangle_fill_extended_operator d_fill_extended_operator
155 d_fill_extended_operator (struct demangle_component
*, int,
156 struct demangle_component
*);
158 #define cplus_demangle_fill_ctor d_fill_ctor
160 d_fill_ctor (struct demangle_component
*, enum gnu_v3_ctor_kinds
,
161 struct demangle_component
*);
163 #define cplus_demangle_fill_dtor d_fill_dtor
165 d_fill_dtor (struct demangle_component
*, enum gnu_v3_dtor_kinds
,
166 struct demangle_component
*);
168 #define cplus_demangle_mangled_name d_mangled_name
169 static struct demangle_component
*d_mangled_name (struct d_info
*, int);
171 #define cplus_demangle_type d_type
172 static struct demangle_component
*d_type (struct d_info
*);
174 #define cplus_demangle_print d_print
175 static char *d_print (int, struct demangle_component
*, int, size_t *);
177 #define cplus_demangle_print_callback d_print_callback
178 static int d_print_callback (int, struct demangle_component
*,
179 demangle_callbackref
, void *);
181 #define cplus_demangle_init_info d_init_info
182 static void d_init_info (const char *, int, size_t, struct d_info
*);
184 #else /* ! defined(IN_GLIBCPP_V3) */
185 #define CP_STATIC_IF_GLIBCPP_V3
186 #endif /* ! defined(IN_GLIBCPP_V3) */
188 /* See if the compiler supports dynamic arrays. */
191 #define CP_DYNAMIC_ARRAYS
194 #ifdef __STDC_VERSION__
195 #if __STDC_VERSION__ >= 199901L
196 #define CP_DYNAMIC_ARRAYS
197 #endif /* __STDC__VERSION >= 199901L */
198 #endif /* defined (__STDC_VERSION__) */
199 #endif /* defined (__STDC__) */
200 #endif /* ! defined (__GNUC__) */
202 /* We avoid pulling in the ctype tables, to prevent pulling in
203 additional unresolved symbols when this code is used in a library.
204 FIXME: Is this really a valid reason? This comes from the original
207 As of this writing this file has the following undefined references
208 when compiled with -DIN_GLIBCPP_V3: realloc, free, memcpy, strcpy,
211 #define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
212 #define IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z')
213 #define IS_LOWER(c) ((c) >= 'a' && (c) <= 'z')
215 /* The prefix prepended by GCC to an identifier represnting the
216 anonymous namespace. */
217 #define ANONYMOUS_NAMESPACE_PREFIX "_GLOBAL_"
218 #define ANONYMOUS_NAMESPACE_PREFIX_LEN \
219 (sizeof (ANONYMOUS_NAMESPACE_PREFIX) - 1)
221 /* Information we keep for the standard substitutions. */
223 struct d_standard_sub_info
225 /* The code for this substitution. */
227 /* The simple string it expands to. */
228 const char *simple_expansion
;
229 /* The length of the simple expansion. */
231 /* The results of a full, verbose, expansion. This is used when
232 qualifying a constructor/destructor, or when in verbose mode. */
233 const char *full_expansion
;
234 /* The length of the full expansion. */
236 /* What to set the last_name field of d_info to; NULL if we should
237 not set it. This is only relevant when qualifying a
238 constructor/destructor. */
239 const char *set_last_name
;
240 /* The length of set_last_name. */
241 int set_last_name_len
;
244 /* Accessors for subtrees of struct demangle_component. */
246 #define d_left(dc) ((dc)->u.s_binary.left)
247 #define d_right(dc) ((dc)->u.s_binary.right)
249 /* A list of templates. This is used while printing. */
251 struct d_print_template
253 /* Next template on the list. */
254 struct d_print_template
*next
;
256 const struct demangle_component
*template_decl
;
259 /* A list of type modifiers. This is used while printing. */
263 /* Next modifier on the list. These are in the reverse of the order
264 in which they appeared in the mangled string. */
265 struct d_print_mod
*next
;
267 struct demangle_component
*mod
;
268 /* Whether this modifier was printed. */
270 /* The list of templates which applies to this modifier. */
271 struct d_print_template
*templates
;
274 /* We use these structures to hold information during printing. */
276 struct d_growable_string
278 /* Buffer holding the result. */
280 /* Current length of data in buffer. */
282 /* Allocated size of buffer. */
284 /* Set to 1 if we had a memory allocation failure. */
285 int allocation_failure
;
288 /* Stack of components, innermost first, used to avoid loops. */
290 struct d_component_stack
292 /* This component. */
293 const struct demangle_component
*dc
;
294 /* This component's parent. */
295 const struct d_component_stack
*parent
;
298 /* A demangle component and some scope captured when it was first
303 /* The component whose scope this is. */
304 const struct demangle_component
*container
;
305 /* The list of templates, if any, that was current when this
306 scope was captured. */
307 struct d_print_template
*templates
;
310 /* Checkpoint structure to allow backtracking. This holds copies
311 of the fields of struct d_info that need to be restored
312 if a trial parse needs to be backtracked over. */
314 struct d_info_checkpoint
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
*, int);
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
*, int);
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_FUNCTION_PARAM
:
629 printf ("function parameter %ld\n", dc
->u
.s_number
.number
);
631 case DEMANGLE_COMPONENT_CTOR
:
632 printf ("constructor %d\n", (int) dc
->u
.s_ctor
.kind
);
633 d_dump (dc
->u
.s_ctor
.name
, indent
+ 2);
635 case DEMANGLE_COMPONENT_DTOR
:
636 printf ("destructor %d\n", (int) dc
->u
.s_dtor
.kind
);
637 d_dump (dc
->u
.s_dtor
.name
, indent
+ 2);
639 case DEMANGLE_COMPONENT_SUB_STD
:
640 printf ("standard substitution %s\n", dc
->u
.s_string
.string
);
642 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
643 printf ("builtin type %s\n", dc
->u
.s_builtin
.type
->name
);
645 case DEMANGLE_COMPONENT_OPERATOR
:
646 printf ("operator %s\n", dc
->u
.s_operator
.op
->name
);
648 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
649 printf ("extended operator with %d args\n",
650 dc
->u
.s_extended_operator
.args
);
651 d_dump (dc
->u
.s_extended_operator
.name
, indent
+ 2);
654 case DEMANGLE_COMPONENT_QUAL_NAME
:
655 printf ("qualified name\n");
657 case DEMANGLE_COMPONENT_LOCAL_NAME
:
658 printf ("local name\n");
660 case DEMANGLE_COMPONENT_TYPED_NAME
:
661 printf ("typed name\n");
663 case DEMANGLE_COMPONENT_TEMPLATE
:
664 printf ("template\n");
666 case DEMANGLE_COMPONENT_VTABLE
:
669 case DEMANGLE_COMPONENT_VTT
:
672 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
673 printf ("construction vtable\n");
675 case DEMANGLE_COMPONENT_TYPEINFO
:
676 printf ("typeinfo\n");
678 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
679 printf ("typeinfo name\n");
681 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
682 printf ("typeinfo function\n");
684 case DEMANGLE_COMPONENT_THUNK
:
687 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
688 printf ("virtual thunk\n");
690 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
691 printf ("covariant thunk\n");
693 case DEMANGLE_COMPONENT_JAVA_CLASS
:
694 printf ("java class\n");
696 case DEMANGLE_COMPONENT_GUARD
:
699 case DEMANGLE_COMPONENT_REFTEMP
:
700 printf ("reference temporary\n");
702 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
703 printf ("hidden alias\n");
705 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
706 printf ("transaction clone\n");
708 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
709 printf ("non-transaction clone\n");
711 case DEMANGLE_COMPONENT_RESTRICT
:
712 printf ("restrict\n");
714 case DEMANGLE_COMPONENT_VOLATILE
:
715 printf ("volatile\n");
717 case DEMANGLE_COMPONENT_CONST
:
720 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
721 printf ("restrict this\n");
723 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
724 printf ("volatile this\n");
726 case DEMANGLE_COMPONENT_CONST_THIS
:
727 printf ("const this\n");
729 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
730 printf ("reference this\n");
732 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
733 printf ("rvalue reference this\n");
735 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
736 printf ("transaction_safe this\n");
738 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
739 printf ("vendor type qualifier\n");
741 case DEMANGLE_COMPONENT_POINTER
:
742 printf ("pointer\n");
744 case DEMANGLE_COMPONENT_REFERENCE
:
745 printf ("reference\n");
747 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
748 printf ("rvalue reference\n");
750 case DEMANGLE_COMPONENT_COMPLEX
:
751 printf ("complex\n");
753 case DEMANGLE_COMPONENT_IMAGINARY
:
754 printf ("imaginary\n");
756 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
757 printf ("vendor type\n");
759 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
760 printf ("function type\n");
762 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
763 printf ("array type\n");
765 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
766 printf ("pointer to member type\n");
768 case DEMANGLE_COMPONENT_FIXED_TYPE
:
769 printf ("fixed-point type, accum? %d, sat? %d\n",
770 dc
->u
.s_fixed
.accum
, dc
->u
.s_fixed
.sat
);
771 d_dump (dc
->u
.s_fixed
.length
, indent
+ 2);
773 case DEMANGLE_COMPONENT_ARGLIST
:
774 printf ("argument list\n");
776 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
777 printf ("template argument list\n");
779 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
780 printf ("initializer list\n");
782 case DEMANGLE_COMPONENT_CAST
:
785 case DEMANGLE_COMPONENT_CONVERSION
:
786 printf ("conversion operator\n");
788 case DEMANGLE_COMPONENT_NULLARY
:
789 printf ("nullary operator\n");
791 case DEMANGLE_COMPONENT_UNARY
:
792 printf ("unary operator\n");
794 case DEMANGLE_COMPONENT_BINARY
:
795 printf ("binary operator\n");
797 case DEMANGLE_COMPONENT_BINARY_ARGS
:
798 printf ("binary operator arguments\n");
800 case DEMANGLE_COMPONENT_TRINARY
:
801 printf ("trinary operator\n");
803 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
804 printf ("trinary operator arguments 1\n");
806 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
807 printf ("trinary operator arguments 1\n");
809 case DEMANGLE_COMPONENT_LITERAL
:
810 printf ("literal\n");
812 case DEMANGLE_COMPONENT_LITERAL_NEG
:
813 printf ("negative literal\n");
815 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
816 printf ("java resource\n");
818 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
819 printf ("compound name\n");
821 case DEMANGLE_COMPONENT_CHARACTER
:
822 printf ("character '%c'\n", dc
->u
.s_character
.character
);
824 case DEMANGLE_COMPONENT_NUMBER
:
825 printf ("number %ld\n", dc
->u
.s_number
.number
);
827 case DEMANGLE_COMPONENT_DECLTYPE
:
828 printf ("decltype\n");
830 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
831 printf ("pack expansion\n");
833 case DEMANGLE_COMPONENT_TLS_INIT
:
834 printf ("tls init function\n");
836 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
837 printf ("tls wrapper function\n");
839 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
840 printf ("default argument %d\n", dc
->u
.s_unary_num
.num
);
841 d_dump (dc
->u
.s_unary_num
.sub
, indent
+2);
843 case DEMANGLE_COMPONENT_LAMBDA
:
844 printf ("lambda %d\n", dc
->u
.s_unary_num
.num
);
845 d_dump (dc
->u
.s_unary_num
.sub
, indent
+2);
849 d_dump (d_left (dc
), indent
+ 2);
850 d_dump (d_right (dc
), indent
+ 2);
853 #endif /* CP_DEMANGLE_DEBUG */
855 /* Fill in a DEMANGLE_COMPONENT_NAME. */
857 CP_STATIC_IF_GLIBCPP_V3
859 cplus_demangle_fill_name (struct demangle_component
*p
, const char *s
, int len
)
861 if (p
== NULL
|| s
== NULL
|| len
== 0)
864 p
->type
= DEMANGLE_COMPONENT_NAME
;
866 p
->u
.s_name
.len
= len
;
870 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
872 CP_STATIC_IF_GLIBCPP_V3
874 cplus_demangle_fill_extended_operator (struct demangle_component
*p
, int args
,
875 struct demangle_component
*name
)
877 if (p
== NULL
|| args
< 0 || name
== NULL
)
880 p
->type
= DEMANGLE_COMPONENT_EXTENDED_OPERATOR
;
881 p
->u
.s_extended_operator
.args
= args
;
882 p
->u
.s_extended_operator
.name
= name
;
886 /* Fill in a DEMANGLE_COMPONENT_CTOR. */
888 CP_STATIC_IF_GLIBCPP_V3
890 cplus_demangle_fill_ctor (struct demangle_component
*p
,
891 enum gnu_v3_ctor_kinds kind
,
892 struct demangle_component
*name
)
896 || (int) kind
< gnu_v3_complete_object_ctor
897 || (int) kind
> gnu_v3_object_ctor_group
)
900 p
->type
= DEMANGLE_COMPONENT_CTOR
;
901 p
->u
.s_ctor
.kind
= kind
;
902 p
->u
.s_ctor
.name
= name
;
906 /* Fill in a DEMANGLE_COMPONENT_DTOR. */
908 CP_STATIC_IF_GLIBCPP_V3
910 cplus_demangle_fill_dtor (struct demangle_component
*p
,
911 enum gnu_v3_dtor_kinds kind
,
912 struct demangle_component
*name
)
916 || (int) kind
< gnu_v3_deleting_dtor
917 || (int) kind
> gnu_v3_object_dtor_group
)
920 p
->type
= DEMANGLE_COMPONENT_DTOR
;
921 p
->u
.s_dtor
.kind
= kind
;
922 p
->u
.s_dtor
.name
= name
;
926 /* Add a new component. */
928 static struct demangle_component
*
929 d_make_empty (struct d_info
*di
)
931 struct demangle_component
*p
;
933 if (di
->next_comp
>= di
->num_comps
)
935 p
= &di
->comps
[di
->next_comp
];
941 /* Add a new generic component. */
943 static struct demangle_component
*
944 d_make_comp (struct d_info
*di
, enum demangle_component_type type
,
945 struct demangle_component
*left
,
946 struct demangle_component
*right
)
948 struct demangle_component
*p
;
950 /* We check for errors here. A typical error would be a NULL return
951 from a subroutine. We catch those here, and return NULL
955 /* These types require two parameters. */
956 case DEMANGLE_COMPONENT_QUAL_NAME
:
957 case DEMANGLE_COMPONENT_LOCAL_NAME
:
958 case DEMANGLE_COMPONENT_TYPED_NAME
:
959 case DEMANGLE_COMPONENT_TAGGED_NAME
:
960 case DEMANGLE_COMPONENT_TEMPLATE
:
961 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
962 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
963 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
964 case DEMANGLE_COMPONENT_UNARY
:
965 case DEMANGLE_COMPONENT_BINARY
:
966 case DEMANGLE_COMPONENT_BINARY_ARGS
:
967 case DEMANGLE_COMPONENT_TRINARY
:
968 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
969 case DEMANGLE_COMPONENT_LITERAL
:
970 case DEMANGLE_COMPONENT_LITERAL_NEG
:
971 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
972 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
973 case DEMANGLE_COMPONENT_CLONE
:
974 if (left
== NULL
|| right
== NULL
)
978 /* These types only require one parameter. */
979 case DEMANGLE_COMPONENT_VTABLE
:
980 case DEMANGLE_COMPONENT_VTT
:
981 case DEMANGLE_COMPONENT_TYPEINFO
:
982 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
983 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
984 case DEMANGLE_COMPONENT_THUNK
:
985 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
986 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
987 case DEMANGLE_COMPONENT_JAVA_CLASS
:
988 case DEMANGLE_COMPONENT_GUARD
:
989 case DEMANGLE_COMPONENT_TLS_INIT
:
990 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
991 case DEMANGLE_COMPONENT_REFTEMP
:
992 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
993 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
994 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
995 case DEMANGLE_COMPONENT_POINTER
:
996 case DEMANGLE_COMPONENT_REFERENCE
:
997 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
998 case DEMANGLE_COMPONENT_COMPLEX
:
999 case DEMANGLE_COMPONENT_IMAGINARY
:
1000 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
1001 case DEMANGLE_COMPONENT_CAST
:
1002 case DEMANGLE_COMPONENT_CONVERSION
:
1003 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
1004 case DEMANGLE_COMPONENT_DECLTYPE
:
1005 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
1006 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
1007 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
1008 case DEMANGLE_COMPONENT_NULLARY
:
1009 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
1014 /* This needs a right parameter, but the left parameter can be
1016 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
1017 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
1022 /* These are allowed to have no parameters--in some cases they
1023 will be filled in later. */
1024 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
1025 case DEMANGLE_COMPONENT_RESTRICT
:
1026 case DEMANGLE_COMPONENT_VOLATILE
:
1027 case DEMANGLE_COMPONENT_CONST
:
1028 case DEMANGLE_COMPONENT_ARGLIST
:
1029 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
1030 FNQUAL_COMPONENT_CASE
:
1033 /* Other types should not be seen here. */
1038 p
= d_make_empty (di
);
1042 p
->u
.s_binary
.left
= left
;
1043 p
->u
.s_binary
.right
= right
;
1048 /* Add a new demangle mangled name component. */
1050 static struct demangle_component
*
1051 d_make_demangle_mangled_name (struct d_info
*di
, const char *s
)
1053 if (d_peek_char (di
) != '_' || d_peek_next_char (di
) != 'Z')
1054 return d_make_name (di
, s
, strlen (s
));
1056 return d_encoding (di
, 0);
1059 /* Add a new name component. */
1061 static struct demangle_component
*
1062 d_make_name (struct d_info
*di
, const char *s
, int len
)
1064 struct demangle_component
*p
;
1066 p
= d_make_empty (di
);
1067 if (! cplus_demangle_fill_name (p
, s
, len
))
1072 /* Add a new builtin type component. */
1074 static struct demangle_component
*
1075 d_make_builtin_type (struct d_info
*di
,
1076 const struct demangle_builtin_type_info
*type
)
1078 struct demangle_component
*p
;
1082 p
= d_make_empty (di
);
1085 p
->type
= DEMANGLE_COMPONENT_BUILTIN_TYPE
;
1086 p
->u
.s_builtin
.type
= type
;
1091 /* Add a new operator component. */
1093 static struct demangle_component
*
1094 d_make_operator (struct d_info
*di
, const struct demangle_operator_info
*op
)
1096 struct demangle_component
*p
;
1098 p
= d_make_empty (di
);
1101 p
->type
= DEMANGLE_COMPONENT_OPERATOR
;
1102 p
->u
.s_operator
.op
= op
;
1107 /* Add a new extended operator component. */
1109 static struct demangle_component
*
1110 d_make_extended_operator (struct d_info
*di
, int args
,
1111 struct demangle_component
*name
)
1113 struct demangle_component
*p
;
1115 p
= d_make_empty (di
);
1116 if (! cplus_demangle_fill_extended_operator (p
, args
, name
))
1121 static struct demangle_component
*
1122 d_make_default_arg (struct d_info
*di
, int num
,
1123 struct demangle_component
*sub
)
1125 struct demangle_component
*p
= d_make_empty (di
);
1128 p
->type
= DEMANGLE_COMPONENT_DEFAULT_ARG
;
1129 p
->u
.s_unary_num
.num
= num
;
1130 p
->u
.s_unary_num
.sub
= sub
;
1135 /* Add a new constructor component. */
1137 static struct demangle_component
*
1138 d_make_ctor (struct d_info
*di
, enum gnu_v3_ctor_kinds kind
,
1139 struct demangle_component
*name
)
1141 struct demangle_component
*p
;
1143 p
= d_make_empty (di
);
1144 if (! cplus_demangle_fill_ctor (p
, kind
, name
))
1149 /* Add a new destructor component. */
1151 static struct demangle_component
*
1152 d_make_dtor (struct d_info
*di
, enum gnu_v3_dtor_kinds kind
,
1153 struct demangle_component
*name
)
1155 struct demangle_component
*p
;
1157 p
= d_make_empty (di
);
1158 if (! cplus_demangle_fill_dtor (p
, kind
, name
))
1163 /* Add a new template parameter. */
1165 static struct demangle_component
*
1166 d_make_template_param (struct d_info
*di
, int i
)
1168 struct demangle_component
*p
;
1170 p
= d_make_empty (di
);
1173 p
->type
= DEMANGLE_COMPONENT_TEMPLATE_PARAM
;
1174 p
->u
.s_number
.number
= i
;
1179 /* Add a new function parameter. */
1181 static struct demangle_component
*
1182 d_make_function_param (struct d_info
*di
, int i
)
1184 struct demangle_component
*p
;
1186 p
= d_make_empty (di
);
1189 p
->type
= DEMANGLE_COMPONENT_FUNCTION_PARAM
;
1190 p
->u
.s_number
.number
= i
;
1195 /* Add a new standard substitution component. */
1197 static struct demangle_component
*
1198 d_make_sub (struct d_info
*di
, const char *name
, int len
)
1200 struct demangle_component
*p
;
1202 p
= d_make_empty (di
);
1205 p
->type
= DEMANGLE_COMPONENT_SUB_STD
;
1206 p
->u
.s_string
.string
= name
;
1207 p
->u
.s_string
.len
= len
;
1212 /* <mangled-name> ::= _Z <encoding> [<clone-suffix>]*
1214 TOP_LEVEL is non-zero when called at the top level. */
1216 CP_STATIC_IF_GLIBCPP_V3
1217 struct demangle_component
*
1218 cplus_demangle_mangled_name (struct d_info
*di
, int top_level
)
1220 struct demangle_component
*p
;
1222 if (! d_check_char (di
, '_')
1223 /* Allow missing _ if not at toplevel to work around a
1224 bug in G++ abi-version=2 mangling; see the comment in
1225 write_template_arg. */
1228 if (! d_check_char (di
, 'Z'))
1230 p
= d_encoding (di
, top_level
);
1232 /* If at top level and parsing parameters, check for a clone
1234 if (top_level
&& (di
->options
& DMGL_PARAMS
) != 0)
1235 while (d_peek_char (di
) == '.'
1236 && (IS_LOWER (d_peek_next_char (di
))
1237 || d_peek_next_char (di
) == '_'
1238 || IS_DIGIT (d_peek_next_char (di
))))
1239 p
= d_clone_suffix (di
, p
);
1244 /* Return whether a function should have a return type. The argument
1245 is the function name, which may be qualified in various ways. The
1246 rules are that template functions have return types with some
1247 exceptions, function types which are not part of a function name
1248 mangling have return types with some exceptions, and non-template
1249 function names do not have return types. The exceptions are that
1250 constructors, destructors, and conversion operators do not have
1254 has_return_type (struct demangle_component
*dc
)
1262 case DEMANGLE_COMPONENT_TEMPLATE
:
1263 return ! is_ctor_dtor_or_conversion (d_left (dc
));
1264 FNQUAL_COMPONENT_CASE
:
1265 return has_return_type (d_left (dc
));
1269 /* Return whether a name is a constructor, a destructor, or a
1270 conversion operator. */
1273 is_ctor_dtor_or_conversion (struct demangle_component
*dc
)
1281 case DEMANGLE_COMPONENT_QUAL_NAME
:
1282 case DEMANGLE_COMPONENT_LOCAL_NAME
:
1283 return is_ctor_dtor_or_conversion (d_right (dc
));
1284 case DEMANGLE_COMPONENT_CTOR
:
1285 case DEMANGLE_COMPONENT_DTOR
:
1286 case DEMANGLE_COMPONENT_CONVERSION
:
1291 /* <encoding> ::= <(function) name> <bare-function-type>
1295 TOP_LEVEL is non-zero when called at the top level, in which case
1296 if DMGL_PARAMS is not set we do not demangle the function
1297 parameters. We only set this at the top level, because otherwise
1298 we would not correctly demangle names in local scopes. */
1300 static struct demangle_component
*
1301 d_encoding (struct d_info
*di
, int top_level
)
1303 char peek
= d_peek_char (di
);
1305 if (peek
== 'G' || peek
== 'T')
1306 return d_special_name (di
);
1309 struct demangle_component
*dc
, *dcr
;
1311 dc
= d_name (di
, top_level
);
1313 if (dc
!= NULL
&& top_level
&& (di
->options
& DMGL_PARAMS
) == 0)
1315 /* Strip off any initial CV-qualifiers, as they really apply
1316 to the `this' parameter, and they were not output by the
1317 v2 demangler without DMGL_PARAMS. */
1318 while (dc
->type
== DEMANGLE_COMPONENT_RESTRICT_THIS
1319 || dc
->type
== DEMANGLE_COMPONENT_VOLATILE_THIS
1320 || dc
->type
== DEMANGLE_COMPONENT_CONST_THIS
1321 || dc
->type
== DEMANGLE_COMPONENT_REFERENCE_THIS
1322 || dc
->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
)
1325 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1326 there may be function-qualifiers on its right argument which
1327 really apply here; this happens when parsing a class
1328 which is local to a function. */
1329 if (dc
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
1332 while (is_fnqual_component_type (dcr
->type
))
1334 dc
->u
.s_binary
.right
= dcr
;
1340 peek
= d_peek_char (di
);
1341 if (dc
== NULL
|| peek
== '\0' || peek
== 'E')
1343 dcr
= d_bare_function_type (di
, has_return_type (dc
));
1344 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPED_NAME
, dc
, dcr
);
1348 /* <tagged-name> ::= <name> B <source-name> */
1350 static struct demangle_component
*
1351 d_abi_tags (struct d_info
*di
, struct demangle_component
*dc
)
1353 struct demangle_component
*hold_last_name
;
1356 /* Preserve the last name, so the ABI tag doesn't clobber it. */
1357 hold_last_name
= di
->last_name
;
1359 while (peek
= d_peek_char (di
),
1362 struct demangle_component
*tag
;
1364 tag
= d_source_name (di
);
1365 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TAGGED_NAME
, dc
, tag
);
1368 di
->last_name
= hold_last_name
;
1373 /* <name> ::= <nested-name>
1375 ::= <unscoped-template-name> <template-args>
1378 <unscoped-name> ::= <unqualified-name>
1379 ::= St <unqualified-name>
1381 <unscoped-template-name> ::= <unscoped-name>
1385 static struct demangle_component
*
1386 d_name (struct d_info
*di
, int top_level
)
1388 char peek
= d_peek_char (di
);
1389 struct demangle_component
*dc
;
1394 return d_nested_name (di
);
1397 return d_local_name (di
, top_level
);
1400 return d_unqualified_name (di
);
1406 if (d_peek_next_char (di
) != 't')
1408 dc
= d_substitution (di
, 0);
1414 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_QUAL_NAME
,
1415 d_make_name (di
, "std", 3),
1416 d_unqualified_name (di
));
1421 if (d_peek_char (di
) != 'I')
1423 /* The grammar does not permit this case to occur if we
1424 called d_substitution() above (i.e., subst == 1). We
1425 don't bother to check. */
1429 /* This is <template-args>, which means that we just saw
1430 <unscoped-template-name>, which is a substitution
1431 candidate if we didn't just get it from a
1435 if (! d_add_substitution (di
, dc
))
1438 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, dc
,
1439 d_template_args (di
));
1447 dc
= d_unqualified_name (di
);
1448 if (d_peek_char (di
) == 'I')
1450 /* This is <template-args>, which means that we just saw
1451 <unscoped-template-name>, which is a substitution
1453 if (! d_add_substitution (di
, dc
))
1455 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, dc
,
1456 d_template_args (di
));
1462 /* <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
1463 ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
1466 static struct demangle_component
*
1467 d_nested_name (struct d_info
*di
)
1469 struct demangle_component
*ret
;
1470 struct demangle_component
**pret
;
1471 struct demangle_component
*rqual
;
1473 if (! d_check_char (di
, 'N'))
1476 pret
= d_cv_qualifiers (di
, &ret
, 1);
1480 /* Parse the ref-qualifier now and then attach it
1481 once we have something to attach it to. */
1482 rqual
= d_ref_qualifier (di
, NULL
);
1484 *pret
= d_prefix (di
);
1490 d_left (rqual
) = ret
;
1494 if (! d_check_char (di
, 'E'))
1500 /* <prefix> ::= <prefix> <unqualified-name>
1501 ::= <template-prefix> <template-args>
1502 ::= <template-param>
1507 <template-prefix> ::= <prefix> <(template) unqualified-name>
1508 ::= <template-param>
1512 static struct demangle_component
*
1513 d_prefix (struct d_info
*di
)
1515 struct demangle_component
*ret
= NULL
;
1520 enum demangle_component_type comb_type
;
1521 struct demangle_component
*dc
;
1523 peek
= d_peek_char (di
);
1527 /* The older code accepts a <local-name> here, but I don't see
1528 that in the grammar. The older code does not accept a
1529 <template-param> here. */
1531 comb_type
= DEMANGLE_COMPONENT_QUAL_NAME
;
1534 char peek2
= d_peek_next_char (di
);
1535 if (peek2
== 'T' || peek2
== 't')
1537 dc
= cplus_demangle_type (di
);
1539 /* Destructor name. */
1540 dc
= d_unqualified_name (di
);
1542 else if (IS_DIGIT (peek
)
1547 dc
= d_unqualified_name (di
);
1548 else if (peek
== 'S')
1549 dc
= d_substitution (di
, 1);
1550 else if (peek
== 'I')
1554 comb_type
= DEMANGLE_COMPONENT_TEMPLATE
;
1555 dc
= d_template_args (di
);
1557 else if (peek
== 'T')
1558 dc
= d_template_param (di
);
1559 else if (peek
== 'E')
1561 else if (peek
== 'M')
1563 /* Initializer scope for a lambda. We don't need to represent
1564 this; the normal code will just treat the variable as a type
1565 scope, which gives appropriate output. */
1577 ret
= d_make_comp (di
, comb_type
, ret
, dc
);
1579 if (peek
!= 'S' && d_peek_char (di
) != 'E')
1581 if (! d_add_substitution (di
, ret
))
1587 /* <unqualified-name> ::= <operator-name>
1588 ::= <ctor-dtor-name>
1590 ::= <local-source-name>
1592 <local-source-name> ::= L <source-name> <discriminator>
1595 static struct demangle_component
*
1596 d_unqualified_name (struct d_info
*di
)
1598 struct demangle_component
*ret
;
1601 peek
= d_peek_char (di
);
1602 if (IS_DIGIT (peek
))
1603 ret
= d_source_name (di
);
1604 else if (IS_LOWER (peek
))
1606 if (peek
== 'o' && d_peek_next_char (di
) == 'n')
1608 ret
= d_operator_name (di
);
1609 if (ret
!= NULL
&& ret
->type
== DEMANGLE_COMPONENT_OPERATOR
)
1611 di
->expansion
+= sizeof "operator" + ret
->u
.s_operator
.op
->len
- 2;
1612 if (!strcmp (ret
->u
.s_operator
.op
->code
, "li"))
1613 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, ret
,
1614 d_source_name (di
));
1617 else if (peek
== 'C' || peek
== 'D')
1618 ret
= d_ctor_dtor_name (di
);
1619 else if (peek
== 'L')
1623 ret
= d_source_name (di
);
1626 if (! d_discriminator (di
))
1629 else if (peek
== 'U')
1631 switch (d_peek_next_char (di
))
1634 ret
= d_lambda (di
);
1637 ret
= d_unnamed_type (di
);
1646 if (d_peek_char (di
) == 'B')
1647 ret
= d_abi_tags (di
, ret
);
1651 /* <source-name> ::= <(positive length) number> <identifier> */
1653 static struct demangle_component
*
1654 d_source_name (struct d_info
*di
)
1657 struct demangle_component
*ret
;
1659 len
= d_number (di
);
1662 ret
= d_identifier (di
, len
);
1663 di
->last_name
= ret
;
1667 /* number ::= [n] <(non-negative decimal integer)> */
1670 d_number (struct d_info
*di
)
1677 peek
= d_peek_char (di
);
1682 peek
= d_peek_char (di
);
1688 if (! IS_DIGIT (peek
))
1694 if (ret
> ((INT_MAX
- (peek
- '0')) / 10))
1696 ret
= ret
* 10 + peek
- '0';
1698 peek
= d_peek_char (di
);
1702 /* Like d_number, but returns a demangle_component. */
1704 static struct demangle_component
*
1705 d_number_component (struct d_info
*di
)
1707 struct demangle_component
*ret
= d_make_empty (di
);
1710 ret
->type
= DEMANGLE_COMPONENT_NUMBER
;
1711 ret
->u
.s_number
.number
= d_number (di
);
1716 /* identifier ::= <(unqualified source code identifier)> */
1718 static struct demangle_component
*
1719 d_identifier (struct d_info
*di
, int len
)
1725 if (di
->send
- name
< len
)
1728 d_advance (di
, len
);
1730 /* A Java mangled name may have a trailing '$' if it is a C++
1731 keyword. This '$' is not included in the length count. We just
1733 if ((di
->options
& DMGL_JAVA
) != 0
1734 && d_peek_char (di
) == '$')
1737 /* Look for something which looks like a gcc encoding of an
1738 anonymous namespace, and replace it with a more user friendly
1740 if (len
>= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN
+ 2
1741 && memcmp (name
, ANONYMOUS_NAMESPACE_PREFIX
,
1742 ANONYMOUS_NAMESPACE_PREFIX_LEN
) == 0)
1746 s
= name
+ ANONYMOUS_NAMESPACE_PREFIX_LEN
;
1747 if ((*s
== '.' || *s
== '_' || *s
== '$')
1750 di
->expansion
-= len
- sizeof "(anonymous namespace)";
1751 return d_make_name (di
, "(anonymous namespace)",
1752 sizeof "(anonymous namespace)" - 1);
1756 return d_make_name (di
, name
, len
);
1759 /* operator_name ::= many different two character encodings.
1761 ::= v <digit> <source-name>
1763 This list is sorted for binary search. */
1765 #define NL(s) s, (sizeof s) - 1
1767 CP_STATIC_IF_GLIBCPP_V3
1768 const struct demangle_operator_info cplus_demangle_operators
[] =
1770 { "aN", NL ("&="), 2 },
1771 { "aS", NL ("="), 2 },
1772 { "aa", NL ("&&"), 2 },
1773 { "ad", NL ("&"), 1 },
1774 { "an", NL ("&"), 2 },
1775 { "at", NL ("alignof "), 1 },
1776 { "az", NL ("alignof "), 1 },
1777 { "cc", NL ("const_cast"), 2 },
1778 { "cl", NL ("()"), 2 },
1779 { "cm", NL (","), 2 },
1780 { "co", NL ("~"), 1 },
1781 { "dV", NL ("/="), 2 },
1782 { "da", NL ("delete[] "), 1 },
1783 { "dc", NL ("dynamic_cast"), 2 },
1784 { "de", NL ("*"), 1 },
1785 { "dl", NL ("delete "), 1 },
1786 { "ds", NL (".*"), 2 },
1787 { "dt", NL ("."), 2 },
1788 { "dv", NL ("/"), 2 },
1789 { "eO", NL ("^="), 2 },
1790 { "eo", NL ("^"), 2 },
1791 { "eq", NL ("=="), 2 },
1792 { "fL", NL ("..."), 3 },
1793 { "fR", NL ("..."), 3 },
1794 { "fl", NL ("..."), 2 },
1795 { "fr", NL ("..."), 2 },
1796 { "ge", NL (">="), 2 },
1797 { "gs", NL ("::"), 1 },
1798 { "gt", NL (">"), 2 },
1799 { "ix", NL ("[]"), 2 },
1800 { "lS", NL ("<<="), 2 },
1801 { "le", NL ("<="), 2 },
1802 { "li", NL ("operator\"\" "), 1 },
1803 { "ls", NL ("<<"), 2 },
1804 { "lt", NL ("<"), 2 },
1805 { "mI", NL ("-="), 2 },
1806 { "mL", NL ("*="), 2 },
1807 { "mi", NL ("-"), 2 },
1808 { "ml", NL ("*"), 2 },
1809 { "mm", NL ("--"), 1 },
1810 { "na", NL ("new[]"), 3 },
1811 { "ne", NL ("!="), 2 },
1812 { "ng", NL ("-"), 1 },
1813 { "nt", NL ("!"), 1 },
1814 { "nw", NL ("new"), 3 },
1815 { "oR", NL ("|="), 2 },
1816 { "oo", NL ("||"), 2 },
1817 { "or", NL ("|"), 2 },
1818 { "pL", NL ("+="), 2 },
1819 { "pl", NL ("+"), 2 },
1820 { "pm", NL ("->*"), 2 },
1821 { "pp", NL ("++"), 1 },
1822 { "ps", NL ("+"), 1 },
1823 { "pt", NL ("->"), 2 },
1824 { "qu", NL ("?"), 3 },
1825 { "rM", NL ("%="), 2 },
1826 { "rS", NL (">>="), 2 },
1827 { "rc", NL ("reinterpret_cast"), 2 },
1828 { "rm", NL ("%"), 2 },
1829 { "rs", NL (">>"), 2 },
1830 { "sP", NL ("sizeof..."), 1 },
1831 { "sZ", NL ("sizeof..."), 1 },
1832 { "sc", NL ("static_cast"), 2 },
1833 { "st", NL ("sizeof "), 1 },
1834 { "sz", NL ("sizeof "), 1 },
1835 { "tr", NL ("throw"), 0 },
1836 { "tw", NL ("throw "), 1 },
1837 { NULL
, NULL
, 0, 0 }
1840 static struct demangle_component
*
1841 d_operator_name (struct d_info
*di
)
1846 c1
= d_next_char (di
);
1847 c2
= d_next_char (di
);
1848 if (c1
== 'v' && IS_DIGIT (c2
))
1849 return d_make_extended_operator (di
, c2
- '0', d_source_name (di
));
1850 else if (c1
== 'c' && c2
== 'v')
1852 struct demangle_component
*type
;
1853 int was_conversion
= di
->is_conversion
;
1854 struct demangle_component
*res
;
1856 di
->is_conversion
= ! di
->is_expression
;
1857 type
= cplus_demangle_type (di
);
1858 if (di
->is_conversion
)
1859 res
= d_make_comp (di
, DEMANGLE_COMPONENT_CONVERSION
, type
, NULL
);
1861 res
= d_make_comp (di
, DEMANGLE_COMPONENT_CAST
, type
, NULL
);
1862 di
->is_conversion
= was_conversion
;
1867 /* LOW is the inclusive lower bound. */
1869 /* HIGH is the exclusive upper bound. We subtract one to ignore
1870 the sentinel at the end of the array. */
1871 int high
= ((sizeof (cplus_demangle_operators
)
1872 / sizeof (cplus_demangle_operators
[0]))
1878 const struct demangle_operator_info
*p
;
1880 i
= low
+ (high
- low
) / 2;
1881 p
= cplus_demangle_operators
+ i
;
1883 if (c1
== p
->code
[0] && c2
== p
->code
[1])
1884 return d_make_operator (di
, p
);
1886 if (c1
< p
->code
[0] || (c1
== p
->code
[0] && c2
< p
->code
[1]))
1896 static struct demangle_component
*
1897 d_make_character (struct d_info
*di
, int c
)
1899 struct demangle_component
*p
;
1900 p
= d_make_empty (di
);
1903 p
->type
= DEMANGLE_COMPONENT_CHARACTER
;
1904 p
->u
.s_character
.character
= c
;
1909 static struct demangle_component
*
1910 d_java_resource (struct d_info
*di
)
1912 struct demangle_component
*p
= NULL
;
1913 struct demangle_component
*next
= NULL
;
1918 len
= d_number (di
);
1922 /* Eat the leading '_'. */
1923 if (d_next_char (di
) != '_')
1936 /* Each chunk is either a '$' escape... */
1954 next
= d_make_character (di
, c
);
1962 /* ... or a sequence of characters. */
1965 while (i
< len
&& str
[i
] && str
[i
] != '$')
1968 next
= d_make_name (di
, str
, i
);
1981 p
= d_make_comp (di
, DEMANGLE_COMPONENT_COMPOUND_NAME
, p
, next
);
1987 p
= d_make_comp (di
, DEMANGLE_COMPONENT_JAVA_RESOURCE
, p
, NULL
);
1992 /* <special-name> ::= TV <type>
1996 ::= GV <(object) name>
1997 ::= T <call-offset> <(base) encoding>
1998 ::= Tc <call-offset> <call-offset> <(base) encoding>
1999 Also g++ extensions:
2000 ::= TC <type> <(offset) number> _ <(base) type>
2005 ::= Gr <resource name>
2010 static struct demangle_component
*
2011 d_special_name (struct d_info
*di
)
2013 di
->expansion
+= 20;
2014 if (d_check_char (di
, 'T'))
2016 switch (d_next_char (di
))
2020 return d_make_comp (di
, DEMANGLE_COMPONENT_VTABLE
,
2021 cplus_demangle_type (di
), NULL
);
2023 di
->expansion
-= 10;
2024 return d_make_comp (di
, DEMANGLE_COMPONENT_VTT
,
2025 cplus_demangle_type (di
), NULL
);
2027 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO
,
2028 cplus_demangle_type (di
), NULL
);
2030 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO_NAME
,
2031 cplus_demangle_type (di
), NULL
);
2034 if (! d_call_offset (di
, 'h'))
2036 return d_make_comp (di
, DEMANGLE_COMPONENT_THUNK
,
2037 d_encoding (di
, 0), NULL
);
2040 if (! d_call_offset (di
, 'v'))
2042 return d_make_comp (di
, DEMANGLE_COMPONENT_VIRTUAL_THUNK
,
2043 d_encoding (di
, 0), NULL
);
2046 if (! d_call_offset (di
, '\0'))
2048 if (! d_call_offset (di
, '\0'))
2050 return d_make_comp (di
, DEMANGLE_COMPONENT_COVARIANT_THUNK
,
2051 d_encoding (di
, 0), NULL
);
2055 struct demangle_component
*derived_type
;
2057 struct demangle_component
*base_type
;
2059 derived_type
= cplus_demangle_type (di
);
2060 offset
= d_number (di
);
2063 if (! d_check_char (di
, '_'))
2065 base_type
= cplus_demangle_type (di
);
2066 /* We don't display the offset. FIXME: We should display
2067 it in verbose mode. */
2069 return d_make_comp (di
, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
,
2070 base_type
, derived_type
);
2074 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO_FN
,
2075 cplus_demangle_type (di
), NULL
);
2077 return d_make_comp (di
, DEMANGLE_COMPONENT_JAVA_CLASS
,
2078 cplus_demangle_type (di
), NULL
);
2081 return d_make_comp (di
, DEMANGLE_COMPONENT_TLS_INIT
,
2082 d_name (di
, 0), NULL
);
2085 return d_make_comp (di
, DEMANGLE_COMPONENT_TLS_WRAPPER
,
2086 d_name (di
, 0), NULL
);
2092 else if (d_check_char (di
, 'G'))
2094 switch (d_next_char (di
))
2097 return d_make_comp (di
, DEMANGLE_COMPONENT_GUARD
,
2098 d_name (di
, 0), NULL
);
2102 struct demangle_component
*name
= d_name (di
, 0);
2103 return d_make_comp (di
, DEMANGLE_COMPONENT_REFTEMP
, name
,
2104 d_number_component (di
));
2108 return d_make_comp (di
, DEMANGLE_COMPONENT_HIDDEN_ALIAS
,
2109 d_encoding (di
, 0), NULL
);
2112 switch (d_next_char (di
))
2115 return d_make_comp (di
, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
,
2116 d_encoding (di
, 0), NULL
);
2118 /* ??? The proposal is that other letters (such as 'h') stand
2119 for different variants of transaction cloning, such as
2120 compiling directly for hardware transaction support. But
2121 they still should all be transactional clones of some sort
2122 so go ahead and call them that. */
2124 return d_make_comp (di
, DEMANGLE_COMPONENT_TRANSACTION_CLONE
,
2125 d_encoding (di
, 0), NULL
);
2129 return d_java_resource (di
);
2139 /* <call-offset> ::= h <nv-offset> _
2142 <nv-offset> ::= <(offset) number>
2144 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
2146 The C parameter, if not '\0', is a character we just read which is
2147 the start of the <call-offset>.
2149 We don't display the offset information anywhere. FIXME: We should
2150 display it in verbose mode. */
2153 d_call_offset (struct d_info
*di
, int c
)
2156 c
= d_next_char (di
);
2163 if (! d_check_char (di
, '_'))
2170 if (! d_check_char (di
, '_'))
2176 /* <ctor-dtor-name> ::= C1
2184 static struct demangle_component
*
2185 d_ctor_dtor_name (struct d_info
*di
)
2187 if (di
->last_name
!= NULL
)
2189 if (di
->last_name
->type
== DEMANGLE_COMPONENT_NAME
)
2190 di
->expansion
+= di
->last_name
->u
.s_name
.len
;
2191 else if (di
->last_name
->type
== DEMANGLE_COMPONENT_SUB_STD
)
2192 di
->expansion
+= di
->last_name
->u
.s_string
.len
;
2194 switch (d_peek_char (di
))
2198 enum gnu_v3_ctor_kinds kind
;
2201 if (d_peek_next_char (di
) == 'I')
2207 switch (d_peek_next_char (di
))
2210 kind
= gnu_v3_complete_object_ctor
;
2213 kind
= gnu_v3_base_object_ctor
;
2216 kind
= gnu_v3_complete_object_allocating_ctor
;
2219 kind
= gnu_v3_unified_ctor
;
2222 kind
= gnu_v3_object_ctor_group
;
2231 cplus_demangle_type (di
);
2233 return d_make_ctor (di
, kind
, di
->last_name
);
2238 enum gnu_v3_dtor_kinds kind
;
2240 switch (d_peek_next_char (di
))
2243 kind
= gnu_v3_deleting_dtor
;
2246 kind
= gnu_v3_complete_object_dtor
;
2249 kind
= gnu_v3_base_object_dtor
;
2251 /* digit '3' is not used */
2253 kind
= gnu_v3_unified_dtor
;
2256 kind
= gnu_v3_object_dtor_group
;
2262 return d_make_dtor (di
, kind
, di
->last_name
);
2270 /* True iff we're looking at an order-insensitive type-qualifier, including
2271 function-type-qualifiers. */
2274 next_is_type_qual (struct d_info
*di
)
2276 char peek
= d_peek_char (di
);
2277 if (peek
== 'r' || peek
== 'V' || peek
== 'K')
2281 peek
= d_peek_next_char (di
);
2282 if (peek
== 'x' || peek
== 'o' || peek
== 'O' || peek
== 'w')
2288 /* <type> ::= <builtin-type>
2290 ::= <class-enum-type>
2292 ::= <pointer-to-member-type>
2293 ::= <template-param>
2294 ::= <template-template-param> <template-args>
2296 ::= <CV-qualifiers> <type>
2299 ::= O <type> (C++0x)
2302 ::= U <source-name> <type>
2304 <builtin-type> ::= various one letter codes
2308 CP_STATIC_IF_GLIBCPP_V3
2309 const struct demangle_builtin_type_info
2310 cplus_demangle_builtin_types
[D_BUILTIN_TYPE_COUNT
] =
2312 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT
},
2313 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL
},
2314 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT
},
2315 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT
},
2316 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT
},
2317 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT
},
2318 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT
},
2319 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT
},
2320 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT
},
2321 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED
},
2322 /* k */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2323 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG
},
2324 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG
},
2325 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT
},
2326 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2328 /* p */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2329 /* q */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2330 /* r */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2331 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT
},
2332 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT
},
2333 /* u */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2334 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID
},
2335 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT
},
2336 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG
},
2337 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2338 D_PRINT_UNSIGNED_LONG_LONG
},
2339 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT
},
2340 /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT
},
2341 /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT
},
2342 /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT
},
2343 /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT
},
2344 /* 30 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT
},
2345 /* 31 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT
},
2346 /* 32 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"),
2350 CP_STATIC_IF_GLIBCPP_V3
2351 struct demangle_component
*
2352 cplus_demangle_type (struct d_info
*di
)
2355 struct demangle_component
*ret
;
2358 /* The ABI specifies that when CV-qualifiers are used, the base type
2359 is substitutable, and the fully qualified type is substitutable,
2360 but the base type with a strict subset of the CV-qualifiers is
2361 not substitutable. The natural recursive implementation of the
2362 CV-qualifiers would cause subsets to be substitutable, so instead
2363 we pull them all off now.
2365 FIXME: The ABI says that order-insensitive vendor qualifiers
2366 should be handled in the same way, but we have no way to tell
2367 which vendor qualifiers are order-insensitive and which are
2368 order-sensitive. So we just assume that they are all
2369 order-sensitive. g++ 3.4 supports only one vendor qualifier,
2370 __vector, and it treats it as order-sensitive when mangling
2373 if (next_is_type_qual (di
))
2375 struct demangle_component
**pret
;
2377 pret
= d_cv_qualifiers (di
, &ret
, 0);
2380 if (d_peek_char (di
) == 'F')
2382 /* cv-qualifiers before a function type apply to 'this',
2383 so avoid adding the unqualified function type to
2384 the substitution list. */
2385 *pret
= d_function_type (di
);
2388 *pret
= cplus_demangle_type (di
);
2391 if ((*pret
)->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
2392 || (*pret
)->type
== DEMANGLE_COMPONENT_REFERENCE_THIS
)
2394 /* Move the ref-qualifier outside the cv-qualifiers so that
2395 they are printed in the right order. */
2396 struct demangle_component
*fn
= d_left (*pret
);
2397 d_left (*pret
) = ret
;
2401 if (! d_add_substitution (di
, ret
))
2408 peek
= d_peek_char (di
);
2411 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2412 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
2413 case 'o': case 's': case 't':
2414 case 'v': case 'w': case 'x': case 'y': case 'z':
2415 ret
= d_make_builtin_type (di
,
2416 &cplus_demangle_builtin_types
[peek
- 'a']);
2417 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2424 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_VENDOR_TYPE
,
2425 d_source_name (di
), NULL
);
2429 ret
= d_function_type (di
);
2432 case '0': case '1': case '2': case '3': case '4':
2433 case '5': case '6': case '7': case '8': case '9':
2436 ret
= d_class_enum_type (di
);
2440 ret
= d_array_type (di
);
2444 ret
= d_pointer_to_member_type (di
);
2448 ret
= d_template_param (di
);
2449 if (d_peek_char (di
) == 'I')
2451 /* This may be <template-template-param> <template-args>.
2452 If this is the type for a conversion operator, we can
2453 have a <template-template-param> here only by following
2454 a derivation like this:
2457 -> <template-prefix> <template-args>
2458 -> <prefix> <template-unqualified-name> <template-args>
2459 -> <unqualified-name> <template-unqualified-name> <template-args>
2460 -> <source-name> <template-unqualified-name> <template-args>
2461 -> <source-name> <operator-name> <template-args>
2462 -> <source-name> cv <type> <template-args>
2463 -> <source-name> cv <template-template-param> <template-args> <template-args>
2465 where the <template-args> is followed by another.
2466 Otherwise, we must have a derivation like this:
2469 -> <template-prefix> <template-args>
2470 -> <prefix> <template-unqualified-name> <template-args>
2471 -> <unqualified-name> <template-unqualified-name> <template-args>
2472 -> <source-name> <template-unqualified-name> <template-args>
2473 -> <source-name> <operator-name> <template-args>
2474 -> <source-name> cv <type> <template-args>
2475 -> <source-name> cv <template-param> <template-args>
2477 where we need to leave the <template-args> to be processed
2478 by d_prefix (following the <template-prefix>).
2480 The <template-template-param> part is a substitution
2482 if (! di
->is_conversion
)
2484 if (! d_add_substitution (di
, ret
))
2486 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2487 d_template_args (di
));
2491 struct demangle_component
*args
;
2492 struct d_info_checkpoint checkpoint
;
2494 d_checkpoint (di
, &checkpoint
);
2495 args
= d_template_args (di
);
2496 if (d_peek_char (di
) == 'I')
2498 if (! d_add_substitution (di
, ret
))
2500 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2504 d_backtrack (di
, &checkpoint
);
2510 /* If this is a special substitution, then it is the start of
2511 <class-enum-type>. */
2515 peek_next
= d_peek_next_char (di
);
2516 if (IS_DIGIT (peek_next
)
2518 || IS_UPPER (peek_next
))
2520 ret
= d_substitution (di
, 0);
2521 /* The substituted name may have been a template name and
2522 may be followed by tepmlate args. */
2523 if (d_peek_char (di
) == 'I')
2524 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2525 d_template_args (di
));
2531 ret
= d_class_enum_type (di
);
2532 /* If the substitution was a complete type, then it is not
2533 a new substitution candidate. However, if the
2534 substitution was followed by template arguments, then
2535 the whole thing is a substitution candidate. */
2536 if (ret
!= NULL
&& ret
->type
== DEMANGLE_COMPONENT_SUB_STD
)
2544 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_RVALUE_REFERENCE
,
2545 cplus_demangle_type (di
), NULL
);
2550 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_POINTER
,
2551 cplus_demangle_type (di
), NULL
);
2556 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_REFERENCE
,
2557 cplus_demangle_type (di
), NULL
);
2562 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_COMPLEX
,
2563 cplus_demangle_type (di
), NULL
);
2568 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_IMAGINARY
,
2569 cplus_demangle_type (di
), NULL
);
2574 ret
= d_source_name (di
);
2575 if (d_peek_char (di
) == 'I')
2576 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2577 d_template_args (di
));
2578 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
,
2579 cplus_demangle_type (di
), ret
);
2585 peek
= d_next_char (di
);
2590 /* decltype (expression) */
2591 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_DECLTYPE
,
2592 d_expression (di
), NULL
);
2593 if (ret
&& d_next_char (di
) != 'E')
2599 /* Pack expansion. */
2600 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_PACK_EXPANSION
,
2601 cplus_demangle_type (di
), NULL
);
2607 ret
= d_make_name (di
, "auto", 4);
2610 /* decltype(auto) */
2611 ret
= d_make_name (di
, "decltype(auto)", 14);
2615 /* 32-bit decimal floating point */
2616 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[26]);
2617 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2621 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[27]);
2622 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2626 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[28]);
2627 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2630 /* 16-bit half-precision FP */
2631 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[29]);
2632 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2636 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[30]);
2637 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2641 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[31]);
2642 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2646 /* Fixed point types. DF<int bits><length><fract bits><sat> */
2647 ret
= d_make_empty (di
);
2648 ret
->type
= DEMANGLE_COMPONENT_FIXED_TYPE
;
2649 if ((ret
->u
.s_fixed
.accum
= IS_DIGIT (d_peek_char (di
))))
2650 /* For demangling we don't care about the bits. */
2652 ret
->u
.s_fixed
.length
= cplus_demangle_type (di
);
2653 if (ret
->u
.s_fixed
.length
== NULL
)
2656 peek
= d_next_char (di
);
2657 ret
->u
.s_fixed
.sat
= (peek
== 's');
2661 ret
= d_vector_type (di
);
2666 /* decltype(nullptr) */
2667 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[32]);
2668 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2682 if (! d_add_substitution (di
, ret
))
2689 /* <CV-qualifiers> ::= [r] [V] [K] [Dx] */
2691 static struct demangle_component
**
2692 d_cv_qualifiers (struct d_info
*di
,
2693 struct demangle_component
**pret
, int member_fn
)
2695 struct demangle_component
**pstart
;
2699 peek
= d_peek_char (di
);
2700 while (next_is_type_qual (di
))
2702 enum demangle_component_type t
;
2703 struct demangle_component
*right
= NULL
;
2709 ? DEMANGLE_COMPONENT_RESTRICT_THIS
2710 : DEMANGLE_COMPONENT_RESTRICT
);
2711 di
->expansion
+= sizeof "restrict";
2713 else if (peek
== 'V')
2716 ? DEMANGLE_COMPONENT_VOLATILE_THIS
2717 : DEMANGLE_COMPONENT_VOLATILE
);
2718 di
->expansion
+= sizeof "volatile";
2720 else if (peek
== 'K')
2723 ? DEMANGLE_COMPONENT_CONST_THIS
2724 : DEMANGLE_COMPONENT_CONST
);
2725 di
->expansion
+= sizeof "const";
2729 peek
= d_next_char (di
);
2732 t
= DEMANGLE_COMPONENT_TRANSACTION_SAFE
;
2733 di
->expansion
+= sizeof "transaction_safe";
2735 else if (peek
== 'o'
2738 t
= DEMANGLE_COMPONENT_NOEXCEPT
;
2739 di
->expansion
+= sizeof "noexcept";
2742 right
= d_expression (di
);
2745 if (! d_check_char (di
, 'E'))
2749 else if (peek
== 'w')
2751 t
= DEMANGLE_COMPONENT_THROW_SPEC
;
2752 di
->expansion
+= sizeof "throw";
2753 right
= d_parmlist (di
);
2756 if (! d_check_char (di
, 'E'))
2763 *pret
= d_make_comp (di
, t
, NULL
, right
);
2766 pret
= &d_left (*pret
);
2768 peek
= d_peek_char (di
);
2771 if (!member_fn
&& peek
== 'F')
2773 while (pstart
!= pret
)
2775 switch ((*pstart
)->type
)
2777 case DEMANGLE_COMPONENT_RESTRICT
:
2778 (*pstart
)->type
= DEMANGLE_COMPONENT_RESTRICT_THIS
;
2780 case DEMANGLE_COMPONENT_VOLATILE
:
2781 (*pstart
)->type
= DEMANGLE_COMPONENT_VOLATILE_THIS
;
2783 case DEMANGLE_COMPONENT_CONST
:
2784 (*pstart
)->type
= DEMANGLE_COMPONENT_CONST_THIS
;
2789 pstart
= &d_left (*pstart
);
2796 /* <ref-qualifier> ::= R
2799 static struct demangle_component
*
2800 d_ref_qualifier (struct d_info
*di
, struct demangle_component
*sub
)
2802 struct demangle_component
*ret
= sub
;
2805 peek
= d_peek_char (di
);
2806 if (peek
== 'R' || peek
== 'O')
2808 enum demangle_component_type t
;
2811 t
= DEMANGLE_COMPONENT_REFERENCE_THIS
;
2812 di
->expansion
+= sizeof "&";
2816 t
= DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
;
2817 di
->expansion
+= sizeof "&&";
2821 ret
= d_make_comp (di
, t
, ret
, NULL
);
2827 /* <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] [T] E */
2829 static struct demangle_component
*
2830 d_function_type (struct d_info
*di
)
2832 struct demangle_component
*ret
;
2834 if (! d_check_char (di
, 'F'))
2836 if (d_peek_char (di
) == 'Y')
2838 /* Function has C linkage. We don't print this information.
2839 FIXME: We should print it in verbose mode. */
2842 ret
= d_bare_function_type (di
, 1);
2843 ret
= d_ref_qualifier (di
, ret
);
2845 if (! d_check_char (di
, 'E'))
2852 static struct demangle_component
*
2853 d_parmlist (struct d_info
*di
)
2855 struct demangle_component
*tl
;
2856 struct demangle_component
**ptl
;
2862 struct demangle_component
*type
;
2864 char peek
= d_peek_char (di
);
2865 if (peek
== '\0' || peek
== 'E' || peek
== '.')
2867 if ((peek
== 'R' || peek
== 'O')
2868 && d_peek_next_char (di
) == 'E')
2869 /* Function ref-qualifier, not a ref prefix for a parameter type. */
2871 type
= cplus_demangle_type (di
);
2874 *ptl
= d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, type
, NULL
);
2877 ptl
= &d_right (*ptl
);
2880 /* There should be at least one parameter type besides the optional
2881 return type. A function which takes no arguments will have a
2882 single parameter type void. */
2886 /* If we have a single parameter type void, omit it. */
2887 if (d_right (tl
) == NULL
2888 && d_left (tl
)->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
2889 && d_left (tl
)->u
.s_builtin
.type
->print
== D_PRINT_VOID
)
2891 di
->expansion
-= d_left (tl
)->u
.s_builtin
.type
->len
;
2898 /* <bare-function-type> ::= [J]<type>+ */
2900 static struct demangle_component
*
2901 d_bare_function_type (struct d_info
*di
, int has_return_type
)
2903 struct demangle_component
*return_type
;
2904 struct demangle_component
*tl
;
2907 /* Detect special qualifier indicating that the first argument
2908 is the return type. */
2909 peek
= d_peek_char (di
);
2913 has_return_type
= 1;
2916 if (has_return_type
)
2918 return_type
= cplus_demangle_type (di
);
2919 if (return_type
== NULL
)
2925 tl
= d_parmlist (di
);
2929 return d_make_comp (di
, DEMANGLE_COMPONENT_FUNCTION_TYPE
,
2933 /* <class-enum-type> ::= <name> */
2935 static struct demangle_component
*
2936 d_class_enum_type (struct d_info
*di
)
2938 return d_name (di
, 0);
2941 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2942 ::= A [<(dimension) expression>] _ <(element) type>
2945 static struct demangle_component
*
2946 d_array_type (struct d_info
*di
)
2949 struct demangle_component
*dim
;
2951 if (! d_check_char (di
, 'A'))
2954 peek
= d_peek_char (di
);
2957 else if (IS_DIGIT (peek
))
2965 peek
= d_peek_char (di
);
2967 while (IS_DIGIT (peek
));
2968 dim
= d_make_name (di
, s
, d_str (di
) - s
);
2974 dim
= d_expression (di
);
2979 if (! d_check_char (di
, '_'))
2982 return d_make_comp (di
, DEMANGLE_COMPONENT_ARRAY_TYPE
, dim
,
2983 cplus_demangle_type (di
));
2986 /* <vector-type> ::= Dv <number> _ <type>
2987 ::= Dv _ <expression> _ <type> */
2989 static struct demangle_component
*
2990 d_vector_type (struct d_info
*di
)
2993 struct demangle_component
*dim
;
2995 peek
= d_peek_char (di
);
2999 dim
= d_expression (di
);
3002 dim
= d_number_component (di
);
3007 if (! d_check_char (di
, '_'))
3010 return d_make_comp (di
, DEMANGLE_COMPONENT_VECTOR_TYPE
, dim
,
3011 cplus_demangle_type (di
));
3014 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
3016 static struct demangle_component
*
3017 d_pointer_to_member_type (struct d_info
*di
)
3019 struct demangle_component
*cl
;
3020 struct demangle_component
*mem
;
3022 if (! d_check_char (di
, 'M'))
3025 cl
= cplus_demangle_type (di
);
3029 /* The ABI says, "The type of a non-static member function is considered
3030 to be different, for the purposes of substitution, from the type of a
3031 namespace-scope or static member function whose type appears
3032 similar. The types of two non-static member functions are considered
3033 to be different, for the purposes of substitution, if the functions
3034 are members of different classes. In other words, for the purposes of
3035 substitution, the class of which the function is a member is
3036 considered part of the type of function."
3038 For a pointer to member function, this call to cplus_demangle_type
3039 will end up adding a (possibly qualified) non-member function type to
3040 the substitution table, which is not correct; however, the member
3041 function type will never be used in a substitution, so putting the
3042 wrong type in the substitution table is harmless. */
3044 mem
= cplus_demangle_type (di
);
3048 return d_make_comp (di
, DEMANGLE_COMPONENT_PTRMEM_TYPE
, cl
, mem
);
3051 /* <non-negative number> _ */
3054 d_compact_number (struct d_info
*di
)
3057 if (d_peek_char (di
) == '_')
3059 else if (d_peek_char (di
) == 'n')
3062 num
= d_number (di
) + 1;
3064 if (num
< 0 || ! d_check_char (di
, '_'))
3069 /* <template-param> ::= T_
3070 ::= T <(parameter-2 non-negative) number> _
3073 static struct demangle_component
*
3074 d_template_param (struct d_info
*di
)
3078 if (! d_check_char (di
, 'T'))
3081 param
= d_compact_number (di
);
3085 return d_make_template_param (di
, param
);
3088 /* <template-args> ::= I <template-arg>+ E */
3090 static struct demangle_component
*
3091 d_template_args (struct d_info
*di
)
3093 if (d_peek_char (di
) != 'I'
3094 && d_peek_char (di
) != 'J')
3098 return d_template_args_1 (di
);
3101 /* <template-arg>* E */
3103 static struct demangle_component
*
3104 d_template_args_1 (struct d_info
*di
)
3106 struct demangle_component
*hold_last_name
;
3107 struct demangle_component
*al
;
3108 struct demangle_component
**pal
;
3110 /* Preserve the last name we saw--don't let the template arguments
3111 clobber it, as that would give us the wrong name for a subsequent
3112 constructor or destructor. */
3113 hold_last_name
= di
->last_name
;
3115 if (d_peek_char (di
) == 'E')
3117 /* An argument pack can be empty. */
3119 return d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
, NULL
, NULL
);
3126 struct demangle_component
*a
;
3128 a
= d_template_arg (di
);
3132 *pal
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
, a
, NULL
);
3135 pal
= &d_right (*pal
);
3137 if (d_peek_char (di
) == 'E')
3144 di
->last_name
= hold_last_name
;
3149 /* <template-arg> ::= <type>
3150 ::= X <expression> E
3154 static struct demangle_component
*
3155 d_template_arg (struct d_info
*di
)
3157 struct demangle_component
*ret
;
3159 switch (d_peek_char (di
))
3163 ret
= d_expression (di
);
3164 if (! d_check_char (di
, 'E'))
3169 return d_expr_primary (di
);
3173 /* An argument pack. */
3174 return d_template_args (di
);
3177 return cplus_demangle_type (di
);
3181 /* Parse a sequence of expressions until we hit the terminator
3184 static struct demangle_component
*
3185 d_exprlist (struct d_info
*di
, char terminator
)
3187 struct demangle_component
*list
= NULL
;
3188 struct demangle_component
**p
= &list
;
3190 if (d_peek_char (di
) == terminator
)
3193 return d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, NULL
, NULL
);
3198 struct demangle_component
*arg
= d_expression (di
);
3202 *p
= d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, arg
, NULL
);
3207 if (d_peek_char (di
) == terminator
)
3217 /* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
3218 dynamic_cast, static_cast or reinterpret_cast. */
3221 op_is_new_cast (struct demangle_component
*op
)
3223 const char *code
= op
->u
.s_operator
.op
->code
;
3224 return (code
[1] == 'c'
3225 && (code
[0] == 's' || code
[0] == 'd'
3226 || code
[0] == 'c' || code
[0] == 'r'));
3229 /* <expression> ::= <(unary) operator-name> <expression>
3230 ::= <(binary) operator-name> <expression> <expression>
3231 ::= <(trinary) operator-name> <expression> <expression> <expression>
3232 ::= cl <expression>+ E
3234 ::= <template-param>
3235 ::= sr <type> <unqualified-name>
3236 ::= sr <type> <unqualified-name> <template-args>
3240 static inline struct demangle_component
*
3241 d_expression_1 (struct d_info
*di
)
3245 peek
= d_peek_char (di
);
3247 return d_expr_primary (di
);
3248 else if (peek
== 'T')
3249 return d_template_param (di
);
3250 else if (peek
== 's' && d_peek_next_char (di
) == 'r')
3252 struct demangle_component
*type
;
3253 struct demangle_component
*name
;
3256 type
= cplus_demangle_type (di
);
3257 name
= d_unqualified_name (di
);
3258 if (d_peek_char (di
) != 'I')
3259 return d_make_comp (di
, DEMANGLE_COMPONENT_QUAL_NAME
, type
, name
);
3261 return d_make_comp (di
, DEMANGLE_COMPONENT_QUAL_NAME
, type
,
3262 d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, name
,
3263 d_template_args (di
)));
3265 else if (peek
== 's' && d_peek_next_char (di
) == 'p')
3268 return d_make_comp (di
, DEMANGLE_COMPONENT_PACK_EXPANSION
,
3269 d_expression_1 (di
), NULL
);
3271 else if (peek
== 'f' && d_peek_next_char (di
) == 'p')
3273 /* Function parameter used in a late-specified return type. */
3276 if (d_peek_char (di
) == 'T')
3278 /* 'this' parameter. */
3284 index
= d_compact_number (di
);
3285 if (index
== INT_MAX
|| index
== -1)
3289 return d_make_function_param (di
, index
);
3291 else if (IS_DIGIT (peek
)
3292 || (peek
== 'o' && d_peek_next_char (di
) == 'n'))
3294 /* We can get an unqualified name as an expression in the case of
3295 a dependent function call, i.e. decltype(f(t)). */
3296 struct demangle_component
*name
;
3299 /* operator-function-id, i.e. operator+(t). */
3302 name
= d_unqualified_name (di
);
3305 if (d_peek_char (di
) == 'I')
3306 return d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, name
,
3307 d_template_args (di
));
3311 else if ((peek
== 'i' || peek
== 't')
3312 && d_peek_next_char (di
) == 'l')
3314 /* Brace-enclosed initializer list, untyped or typed. */
3315 struct demangle_component
*type
= NULL
;
3317 type
= cplus_demangle_type (di
);
3318 if (!d_peek_next_char (di
))
3321 return d_make_comp (di
, DEMANGLE_COMPONENT_INITIALIZER_LIST
,
3322 type
, d_exprlist (di
, 'E'));
3326 struct demangle_component
*op
;
3327 const char *code
= NULL
;
3330 op
= d_operator_name (di
);
3334 if (op
->type
== DEMANGLE_COMPONENT_OPERATOR
)
3336 code
= op
->u
.s_operator
.op
->code
;
3337 di
->expansion
+= op
->u
.s_operator
.op
->len
- 2;
3338 if (strcmp (code
, "st") == 0)
3339 return d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, op
,
3340 cplus_demangle_type (di
));
3347 case DEMANGLE_COMPONENT_OPERATOR
:
3348 args
= op
->u
.s_operator
.op
->args
;
3350 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
3351 args
= op
->u
.s_extended_operator
.args
;
3353 case DEMANGLE_COMPONENT_CAST
:
3361 return d_make_comp (di
, DEMANGLE_COMPONENT_NULLARY
, op
, NULL
);
3365 struct demangle_component
*operand
;
3368 if (code
&& (code
[0] == 'p' || code
[0] == 'm')
3369 && code
[1] == code
[0])
3370 /* pp_ and mm_ are the prefix variants. */
3371 suffix
= !d_check_char (di
, '_');
3373 if (op
->type
== DEMANGLE_COMPONENT_CAST
3374 && d_check_char (di
, '_'))
3375 operand
= d_exprlist (di
, 'E');
3376 else if (code
&& !strcmp (code
, "sP"))
3377 operand
= d_template_args_1 (di
);
3379 operand
= d_expression_1 (di
);
3382 /* Indicate the suffix variant for d_print_comp. */
3383 return d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, op
,
3385 DEMANGLE_COMPONENT_BINARY_ARGS
,
3388 return d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, op
,
3393 struct demangle_component
*left
;
3394 struct demangle_component
*right
;
3398 if (op_is_new_cast (op
))
3399 left
= cplus_demangle_type (di
);
3400 else if (code
[0] == 'f')
3401 /* fold-expression. */
3402 left
= d_operator_name (di
);
3404 left
= d_expression_1 (di
);
3405 if (!strcmp (code
, "cl"))
3406 right
= d_exprlist (di
, 'E');
3407 else if (!strcmp (code
, "dt") || !strcmp (code
, "pt"))
3409 right
= d_unqualified_name (di
);
3410 if (d_peek_char (di
) == 'I')
3411 right
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
,
3412 right
, d_template_args (di
));
3415 right
= d_expression_1 (di
);
3417 return d_make_comp (di
, DEMANGLE_COMPONENT_BINARY
, op
,
3419 DEMANGLE_COMPONENT_BINARY_ARGS
,
3424 struct demangle_component
*first
;
3425 struct demangle_component
*second
;
3426 struct demangle_component
*third
;
3430 else if (!strcmp (code
, "qu"))
3432 /* ?: expression. */
3433 first
= d_expression_1 (di
);
3434 second
= d_expression_1 (di
);
3435 third
= d_expression_1 (di
);
3439 else if (code
[0] == 'f')
3441 /* fold-expression. */
3442 first
= d_operator_name (di
);
3443 second
= d_expression_1 (di
);
3444 third
= d_expression_1 (di
);
3448 else if (code
[0] == 'n')
3450 /* new-expression. */
3451 if (code
[1] != 'w' && code
[1] != 'a')
3453 first
= d_exprlist (di
, '_');
3454 second
= cplus_demangle_type (di
);
3455 if (d_peek_char (di
) == 'E')
3460 else if (d_peek_char (di
) == 'p'
3461 && d_peek_next_char (di
) == 'i')
3463 /* Parenthesized initializer. */
3465 third
= d_exprlist (di
, 'E');
3467 else if (d_peek_char (di
) == 'i'
3468 && d_peek_next_char (di
) == 'l')
3469 /* initializer-list. */
3470 third
= d_expression_1 (di
);
3476 return d_make_comp (di
, DEMANGLE_COMPONENT_TRINARY
, op
,
3478 DEMANGLE_COMPONENT_TRINARY_ARG1
,
3481 DEMANGLE_COMPONENT_TRINARY_ARG2
,
3490 static struct demangle_component
*
3491 d_expression (struct d_info
*di
)
3493 struct demangle_component
*ret
;
3494 int was_expression
= di
->is_expression
;
3496 di
->is_expression
= 1;
3497 ret
= d_expression_1 (di
);
3498 di
->is_expression
= was_expression
;
3502 /* <expr-primary> ::= L <type> <(value) number> E
3503 ::= L <type> <(value) float> E
3504 ::= L <mangled-name> E
3507 static struct demangle_component
*
3508 d_expr_primary (struct d_info
*di
)
3510 struct demangle_component
*ret
;
3512 if (! d_check_char (di
, 'L'))
3514 if (d_peek_char (di
) == '_'
3515 /* Workaround for G++ bug; see comment in write_template_arg. */
3516 || d_peek_char (di
) == 'Z')
3517 ret
= cplus_demangle_mangled_name (di
, 0);
3520 struct demangle_component
*type
;
3521 enum demangle_component_type t
;
3524 type
= cplus_demangle_type (di
);
3528 /* If we have a type we know how to print, we aren't going to
3529 print the type name itself. */
3530 if (type
->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
3531 && type
->u
.s_builtin
.type
->print
!= D_PRINT_DEFAULT
)
3532 di
->expansion
-= type
->u
.s_builtin
.type
->len
;
3534 /* Rather than try to interpret the literal value, we just
3535 collect it as a string. Note that it's possible to have a
3536 floating point literal here. The ABI specifies that the
3537 format of such literals is machine independent. That's fine,
3538 but what's not fine is that versions of g++ up to 3.2 with
3539 -fabi-version=1 used upper case letters in the hex constant,
3540 and dumped out gcc's internal representation. That makes it
3541 hard to tell where the constant ends, and hard to dump the
3542 constant in any readable form anyhow. We don't attempt to
3543 handle these cases. */
3545 t
= DEMANGLE_COMPONENT_LITERAL
;
3546 if (d_peek_char (di
) == 'n')
3548 t
= DEMANGLE_COMPONENT_LITERAL_NEG
;
3552 while (d_peek_char (di
) != 'E')
3554 if (d_peek_char (di
) == '\0')
3558 ret
= d_make_comp (di
, t
, type
, d_make_name (di
, s
, d_str (di
) - s
));
3560 if (! d_check_char (di
, 'E'))
3565 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3566 ::= Z <(function) encoding> E s [<discriminator>]
3567 ::= Z <(function) encoding> E d [<parameter> number>] _ <entity name>
3570 static struct demangle_component
*
3571 d_local_name (struct d_info
*di
, int top_level
)
3573 struct demangle_component
*function
;
3574 struct demangle_component
*name
;
3576 if (! d_check_char (di
, 'Z'))
3579 function
= d_encoding (di
, 0);
3581 if (! d_check_char (di
, 'E'))
3584 if (d_peek_char (di
) == 's')
3587 if (! d_discriminator (di
))
3589 name
= d_make_name (di
, "string literal", sizeof "string literal" - 1);
3595 if (d_peek_char (di
) == 'd')
3597 /* Default argument scope: d <number> _. */
3599 num
= d_compact_number (di
);
3604 name
= d_name (di
, 0);
3607 /* Lambdas and unnamed types have internal discriminators
3608 and are not functions. */
3609 && name
->type
!= DEMANGLE_COMPONENT_LAMBDA
3610 && name
->type
!= DEMANGLE_COMPONENT_UNNAMED_TYPE
)
3613 && d_peek_char (di
) != 0 /* Not end of string. */
3614 && d_peek_char (di
) != 'E' /* Not end of nested encoding. */
3615 && d_peek_char (di
) != '_') /* Not discriminator. */
3617 struct demangle_component
*args
;
3619 args
= d_bare_function_type (di
, has_return_type (name
));
3620 name
= d_make_comp (di
, DEMANGLE_COMPONENT_TYPED_NAME
,
3624 /* Read and ignore an optional discriminator. */
3625 if (! d_discriminator (di
))
3630 name
= d_make_default_arg (di
, num
, name
);
3633 return d_make_comp (di
, DEMANGLE_COMPONENT_LOCAL_NAME
, function
, name
);
3636 /* <discriminator> ::= _ <number> # when number < 10
3637 ::= __ <number> _ # when number >= 10
3639 <discriminator> ::= _ <number> # when number >=10
3640 is also accepted to support gcc versions that wrongly mangled that way.
3642 We demangle the discriminator, but we don't print it out. FIXME:
3643 We should print it out in verbose mode. */
3646 d_discriminator (struct d_info
*di
)
3648 int discrim
, num_underscores
= 1;
3650 if (d_peek_char (di
) != '_')
3653 if (d_peek_char (di
) == '_')
3659 discrim
= d_number (di
);
3662 if (num_underscores
> 1 && discrim
>= 10)
3664 if (d_peek_char (di
) == '_')
3673 /* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */
3675 static struct demangle_component
*
3676 d_lambda (struct d_info
*di
)
3678 struct demangle_component
*tl
;
3679 struct demangle_component
*ret
;
3682 if (! d_check_char (di
, 'U'))
3684 if (! d_check_char (di
, 'l'))
3687 tl
= d_parmlist (di
);
3691 if (! d_check_char (di
, 'E'))
3694 num
= d_compact_number (di
);
3698 ret
= d_make_empty (di
);
3701 ret
->type
= DEMANGLE_COMPONENT_LAMBDA
;
3702 ret
->u
.s_unary_num
.sub
= tl
;
3703 ret
->u
.s_unary_num
.num
= num
;
3706 if (! d_add_substitution (di
, ret
))
3712 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
3714 static struct demangle_component
*
3715 d_unnamed_type (struct d_info
*di
)
3717 struct demangle_component
*ret
;
3720 if (! d_check_char (di
, 'U'))
3722 if (! d_check_char (di
, 't'))
3725 num
= d_compact_number (di
);
3729 ret
= d_make_empty (di
);
3732 ret
->type
= DEMANGLE_COMPONENT_UNNAMED_TYPE
;
3733 ret
->u
.s_number
.number
= num
;
3736 if (! d_add_substitution (di
, ret
))
3742 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
3745 static struct demangle_component
*
3746 d_clone_suffix (struct d_info
*di
, struct demangle_component
*encoding
)
3748 const char *suffix
= d_str (di
);
3749 const char *pend
= suffix
;
3750 struct demangle_component
*n
;
3752 if (*pend
== '.' && (IS_LOWER (pend
[1]) || pend
[1] == '_'))
3755 while (IS_LOWER (*pend
) || *pend
== '_')
3758 while (*pend
== '.' && IS_DIGIT (pend
[1]))
3761 while (IS_DIGIT (*pend
))
3764 d_advance (di
, pend
- suffix
);
3765 n
= d_make_name (di
, suffix
, pend
- suffix
);
3766 return d_make_comp (di
, DEMANGLE_COMPONENT_CLONE
, encoding
, n
);
3769 /* Add a new substitution. */
3772 d_add_substitution (struct d_info
*di
, struct demangle_component
*dc
)
3776 if (di
->next_sub
>= di
->num_subs
)
3778 di
->subs
[di
->next_sub
] = dc
;
3783 /* <substitution> ::= S <seq-id> _
3793 If PREFIX is non-zero, then this type is being used as a prefix in
3794 a qualified name. In this case, for the standard substitutions, we
3795 need to check whether we are being used as a prefix for a
3796 constructor or destructor, and return a full template name.
3797 Otherwise we will get something like std::iostream::~iostream()
3798 which does not correspond particularly well to any function which
3799 actually appears in the source.
3802 static const struct d_standard_sub_info standard_subs
[] =
3807 { 'a', NL ("std::allocator"),
3808 NL ("std::allocator"),
3810 { 'b', NL ("std::basic_string"),
3811 NL ("std::basic_string"),
3812 NL ("basic_string") },
3813 { 's', NL ("std::string"),
3814 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
3815 NL ("basic_string") },
3816 { 'i', NL ("std::istream"),
3817 NL ("std::basic_istream<char, std::char_traits<char> >"),
3818 NL ("basic_istream") },
3819 { 'o', NL ("std::ostream"),
3820 NL ("std::basic_ostream<char, std::char_traits<char> >"),
3821 NL ("basic_ostream") },
3822 { 'd', NL ("std::iostream"),
3823 NL ("std::basic_iostream<char, std::char_traits<char> >"),
3824 NL ("basic_iostream") }
3827 static struct demangle_component
*
3828 d_substitution (struct d_info
*di
, int prefix
)
3832 if (! d_check_char (di
, 'S'))
3835 c
= d_next_char (di
);
3836 if (c
== '_' || IS_DIGIT (c
) || IS_UPPER (c
))
3845 unsigned int new_id
;
3848 new_id
= id
* 36 + c
- '0';
3849 else if (IS_UPPER (c
))
3850 new_id
= id
* 36 + c
- 'A' + 10;
3856 c
= d_next_char (di
);
3863 if (id
>= (unsigned int) di
->next_sub
)
3866 return di
->subs
[id
];
3871 const struct d_standard_sub_info
*p
;
3872 const struct d_standard_sub_info
*pend
;
3874 verbose
= (di
->options
& DMGL_VERBOSE
) != 0;
3875 if (! verbose
&& prefix
)
3879 peek
= d_peek_char (di
);
3880 if (peek
== 'C' || peek
== 'D')
3884 pend
= (&standard_subs
[0]
3885 + sizeof standard_subs
/ sizeof standard_subs
[0]);
3886 for (p
= &standard_subs
[0]; p
< pend
; ++p
)
3892 struct demangle_component
*dc
;
3894 if (p
->set_last_name
!= NULL
)
3895 di
->last_name
= d_make_sub (di
, p
->set_last_name
,
3896 p
->set_last_name_len
);
3899 s
= p
->full_expansion
;
3904 s
= p
->simple_expansion
;
3905 len
= p
->simple_len
;
3907 di
->expansion
+= len
;
3908 dc
= d_make_sub (di
, s
, len
);
3909 if (d_peek_char (di
) == 'B')
3911 /* If there are ABI tags on the abbreviation, it becomes
3912 a substitution candidate. */
3913 dc
= d_abi_tags (di
, dc
);
3914 if (! d_add_substitution (di
, dc
))
3926 d_checkpoint (struct d_info
*di
, struct d_info_checkpoint
*checkpoint
)
3928 checkpoint
->n
= di
->n
;
3929 checkpoint
->next_comp
= di
->next_comp
;
3930 checkpoint
->next_sub
= di
->next_sub
;
3931 checkpoint
->expansion
= di
->expansion
;
3935 d_backtrack (struct d_info
*di
, struct d_info_checkpoint
*checkpoint
)
3937 di
->n
= checkpoint
->n
;
3938 di
->next_comp
= checkpoint
->next_comp
;
3939 di
->next_sub
= checkpoint
->next_sub
;
3940 di
->expansion
= checkpoint
->expansion
;
3943 /* Initialize a growable string. */
3946 d_growable_string_init (struct d_growable_string
*dgs
, size_t estimate
)
3951 dgs
->allocation_failure
= 0;
3954 d_growable_string_resize (dgs
, estimate
);
3957 /* Grow a growable string to a given size. */
3960 d_growable_string_resize (struct d_growable_string
*dgs
, size_t need
)
3965 if (dgs
->allocation_failure
)
3968 /* Start allocation at two bytes to avoid any possibility of confusion
3969 with the special value of 1 used as a return in *palc to indicate
3970 allocation failures. */
3971 newalc
= dgs
->alc
> 0 ? dgs
->alc
: 2;
3972 while (newalc
< need
)
3975 newbuf
= (char *) realloc (dgs
->buf
, newalc
);
3982 dgs
->allocation_failure
= 1;
3989 /* Append a buffer to a growable string. */
3992 d_growable_string_append_buffer (struct d_growable_string
*dgs
,
3993 const char *s
, size_t l
)
3997 need
= dgs
->len
+ l
+ 1;
3998 if (need
> dgs
->alc
)
3999 d_growable_string_resize (dgs
, need
);
4001 if (dgs
->allocation_failure
)
4004 memcpy (dgs
->buf
+ dgs
->len
, s
, l
);
4005 dgs
->buf
[dgs
->len
+ l
] = '\0';
4009 /* Bridge growable strings to the callback mechanism. */
4012 d_growable_string_callback_adapter (const char *s
, size_t l
, void *opaque
)
4014 struct d_growable_string
*dgs
= (struct d_growable_string
*) opaque
;
4016 d_growable_string_append_buffer (dgs
, s
, l
);
4019 /* Walk the tree, counting the number of templates encountered, and
4020 the number of times a scope might be saved. These counts will be
4021 used to allocate data structures for d_print_comp, so the logic
4022 here must mirror the logic d_print_comp will use. It is not
4023 important that the resulting numbers are exact, so long as they
4024 are larger than the actual numbers encountered. */
4027 d_count_templates_scopes (int *num_templates
, int *num_scopes
,
4028 const struct demangle_component
*dc
)
4035 case DEMANGLE_COMPONENT_NAME
:
4036 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
4037 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
4038 case DEMANGLE_COMPONENT_SUB_STD
:
4039 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
4040 case DEMANGLE_COMPONENT_OPERATOR
:
4041 case DEMANGLE_COMPONENT_CHARACTER
:
4042 case DEMANGLE_COMPONENT_NUMBER
:
4043 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
4046 case DEMANGLE_COMPONENT_TEMPLATE
:
4048 goto recurse_left_right
;
4050 case DEMANGLE_COMPONENT_REFERENCE
:
4051 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
4052 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_TEMPLATE_PARAM
)
4054 goto recurse_left_right
;
4056 case DEMANGLE_COMPONENT_QUAL_NAME
:
4057 case DEMANGLE_COMPONENT_LOCAL_NAME
:
4058 case DEMANGLE_COMPONENT_TYPED_NAME
:
4059 case DEMANGLE_COMPONENT_VTABLE
:
4060 case DEMANGLE_COMPONENT_VTT
:
4061 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
4062 case DEMANGLE_COMPONENT_TYPEINFO
:
4063 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
4064 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
4065 case DEMANGLE_COMPONENT_THUNK
:
4066 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
4067 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
4068 case DEMANGLE_COMPONENT_JAVA_CLASS
:
4069 case DEMANGLE_COMPONENT_GUARD
:
4070 case DEMANGLE_COMPONENT_TLS_INIT
:
4071 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
4072 case DEMANGLE_COMPONENT_REFTEMP
:
4073 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
4074 case DEMANGLE_COMPONENT_RESTRICT
:
4075 case DEMANGLE_COMPONENT_VOLATILE
:
4076 case DEMANGLE_COMPONENT_CONST
:
4077 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
4078 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
4079 case DEMANGLE_COMPONENT_CONST_THIS
:
4080 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
4081 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
4082 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
4083 case DEMANGLE_COMPONENT_NOEXCEPT
:
4084 case DEMANGLE_COMPONENT_THROW_SPEC
:
4085 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
4086 case DEMANGLE_COMPONENT_POINTER
:
4087 case DEMANGLE_COMPONENT_COMPLEX
:
4088 case DEMANGLE_COMPONENT_IMAGINARY
:
4089 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
4090 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
4091 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
4092 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
4093 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
4094 case DEMANGLE_COMPONENT_ARGLIST
:
4095 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
4096 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
4097 case DEMANGLE_COMPONENT_CAST
:
4098 case DEMANGLE_COMPONENT_CONVERSION
:
4099 case DEMANGLE_COMPONENT_NULLARY
:
4100 case DEMANGLE_COMPONENT_UNARY
:
4101 case DEMANGLE_COMPONENT_BINARY
:
4102 case DEMANGLE_COMPONENT_BINARY_ARGS
:
4103 case DEMANGLE_COMPONENT_TRINARY
:
4104 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
4105 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
4106 case DEMANGLE_COMPONENT_LITERAL
:
4107 case DEMANGLE_COMPONENT_LITERAL_NEG
:
4108 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
4109 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
4110 case DEMANGLE_COMPONENT_DECLTYPE
:
4111 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
4112 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
4113 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
4114 case DEMANGLE_COMPONENT_TAGGED_NAME
:
4115 case DEMANGLE_COMPONENT_CLONE
:
4117 d_count_templates_scopes (num_templates
, num_scopes
,
4119 d_count_templates_scopes (num_templates
, num_scopes
,
4123 case DEMANGLE_COMPONENT_CTOR
:
4124 d_count_templates_scopes (num_templates
, num_scopes
,
4128 case DEMANGLE_COMPONENT_DTOR
:
4129 d_count_templates_scopes (num_templates
, num_scopes
,
4133 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
4134 d_count_templates_scopes (num_templates
, num_scopes
,
4135 dc
->u
.s_extended_operator
.name
);
4138 case DEMANGLE_COMPONENT_FIXED_TYPE
:
4139 d_count_templates_scopes (num_templates
, num_scopes
,
4140 dc
->u
.s_fixed
.length
);
4143 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
4144 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
4145 d_count_templates_scopes (num_templates
, num_scopes
,
4149 case DEMANGLE_COMPONENT_LAMBDA
:
4150 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
4151 d_count_templates_scopes (num_templates
, num_scopes
,
4152 dc
->u
.s_unary_num
.sub
);
4157 /* Initialize a print information structure. */
4160 d_print_init (struct d_print_info
*dpi
, demangle_callbackref callback
,
4161 void *opaque
, const struct demangle_component
*dc
)
4164 dpi
->last_char
= '\0';
4165 dpi
->templates
= NULL
;
4166 dpi
->modifiers
= NULL
;
4167 dpi
->pack_index
= 0;
4168 dpi
->flush_count
= 0;
4170 dpi
->callback
= callback
;
4171 dpi
->opaque
= opaque
;
4173 dpi
->demangle_failure
= 0;
4175 dpi
->is_lambda_arg
= 0;
4177 dpi
->component_stack
= NULL
;
4179 dpi
->saved_scopes
= NULL
;
4180 dpi
->next_saved_scope
= 0;
4181 dpi
->num_saved_scopes
= 0;
4183 dpi
->copy_templates
= NULL
;
4184 dpi
->next_copy_template
= 0;
4185 dpi
->num_copy_templates
= 0;
4187 d_count_templates_scopes (&dpi
->num_copy_templates
,
4188 &dpi
->num_saved_scopes
, dc
);
4189 dpi
->num_copy_templates
*= dpi
->num_saved_scopes
;
4191 dpi
->current_template
= NULL
;
4194 /* Indicate that an error occurred during printing, and test for error. */
4197 d_print_error (struct d_print_info
*dpi
)
4199 dpi
->demangle_failure
= 1;
4203 d_print_saw_error (struct d_print_info
*dpi
)
4205 return dpi
->demangle_failure
!= 0;
4208 /* Flush buffered characters to the callback. */
4211 d_print_flush (struct d_print_info
*dpi
)
4213 dpi
->buf
[dpi
->len
] = '\0';
4214 dpi
->callback (dpi
->buf
, dpi
->len
, dpi
->opaque
);
4219 /* Append characters and buffers for printing. */
4222 d_append_char (struct d_print_info
*dpi
, char c
)
4224 if (dpi
->len
== sizeof (dpi
->buf
) - 1)
4225 d_print_flush (dpi
);
4227 dpi
->buf
[dpi
->len
++] = c
;
4232 d_append_buffer (struct d_print_info
*dpi
, const char *s
, size_t l
)
4236 for (i
= 0; i
< l
; i
++)
4237 d_append_char (dpi
, s
[i
]);
4241 d_append_string (struct d_print_info
*dpi
, const char *s
)
4243 d_append_buffer (dpi
, s
, strlen (s
));
4247 d_append_num (struct d_print_info
*dpi
, int l
)
4250 sprintf (buf
,"%d", l
);
4251 d_append_string (dpi
, buf
);
4255 d_last_char (struct d_print_info
*dpi
)
4257 return dpi
->last_char
;
4260 /* Turn components into a human readable string. OPTIONS is the
4261 options bits passed to the demangler. DC is the tree to print.
4262 CALLBACK is a function to call to flush demangled string segments
4263 as they fill the intermediate buffer, and OPAQUE is a generalized
4264 callback argument. On success, this returns 1. On failure,
4265 it returns 0, indicating a bad parse. It does not use heap
4266 memory to build an output string, so cannot encounter memory
4267 allocation failure. */
4269 CP_STATIC_IF_GLIBCPP_V3
4271 cplus_demangle_print_callback (int options
,
4272 struct demangle_component
*dc
,
4273 demangle_callbackref callback
, void *opaque
)
4275 struct d_print_info dpi
;
4277 d_print_init (&dpi
, callback
, opaque
, dc
);
4280 #ifdef CP_DYNAMIC_ARRAYS
4281 /* Avoid zero-length VLAs, which are prohibited by the C99 standard
4282 and flagged as errors by Address Sanitizer. */
4283 __extension__
struct d_saved_scope scopes
[(dpi
.num_saved_scopes
> 0)
4284 ? dpi
.num_saved_scopes
: 1];
4285 __extension__
struct d_print_template temps
[(dpi
.num_copy_templates
> 0)
4286 ? dpi
.num_copy_templates
: 1];
4288 dpi
.saved_scopes
= scopes
;
4289 dpi
.copy_templates
= temps
;
4291 dpi
.saved_scopes
= alloca (dpi
.num_saved_scopes
4292 * sizeof (*dpi
.saved_scopes
));
4293 dpi
.copy_templates
= alloca (dpi
.num_copy_templates
4294 * sizeof (*dpi
.copy_templates
));
4297 d_print_comp (&dpi
, options
, dc
);
4300 d_print_flush (&dpi
);
4302 return ! d_print_saw_error (&dpi
);
4305 /* Turn components into a human readable string. OPTIONS is the
4306 options bits passed to the demangler. DC is the tree to print.
4307 ESTIMATE is a guess at the length of the result. This returns a
4308 string allocated by malloc, or NULL on error. On success, this
4309 sets *PALC to the size of the allocated buffer. On failure, this
4310 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
4313 CP_STATIC_IF_GLIBCPP_V3
4315 cplus_demangle_print (int options
, struct demangle_component
*dc
,
4316 int estimate
, size_t *palc
)
4318 struct d_growable_string dgs
;
4320 d_growable_string_init (&dgs
, estimate
);
4322 if (! cplus_demangle_print_callback (options
, dc
,
4323 d_growable_string_callback_adapter
,
4331 *palc
= dgs
.allocation_failure
? 1 : dgs
.alc
;
4335 /* Returns the I'th element of the template arglist ARGS, or NULL on
4336 failure. If I is negative, return the entire arglist. */
4338 static struct demangle_component
*
4339 d_index_template_argument (struct demangle_component
*args
, int i
)
4341 struct demangle_component
*a
;
4344 /* Print the whole argument pack. */
4351 if (a
->type
!= DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4357 if (i
!= 0 || a
== NULL
)
4363 /* Returns the template argument from the current context indicated by DC,
4364 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
4366 static struct demangle_component
*
4367 d_lookup_template_argument (struct d_print_info
*dpi
,
4368 const struct demangle_component
*dc
)
4370 if (dpi
->templates
== NULL
)
4372 d_print_error (dpi
);
4376 return d_index_template_argument
4377 (d_right (dpi
->templates
->template_decl
),
4378 dc
->u
.s_number
.number
);
4381 /* Returns a template argument pack used in DC (any will do), or NULL. */
4383 static struct demangle_component
*
4384 d_find_pack (struct d_print_info
*dpi
,
4385 const struct demangle_component
*dc
)
4387 struct demangle_component
*a
;
4393 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
4394 a
= d_lookup_template_argument (dpi
, dc
);
4395 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4399 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
4402 case DEMANGLE_COMPONENT_LAMBDA
:
4403 case DEMANGLE_COMPONENT_NAME
:
4404 case DEMANGLE_COMPONENT_TAGGED_NAME
:
4405 case DEMANGLE_COMPONENT_OPERATOR
:
4406 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
4407 case DEMANGLE_COMPONENT_SUB_STD
:
4408 case DEMANGLE_COMPONENT_CHARACTER
:
4409 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
4410 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
4411 case DEMANGLE_COMPONENT_FIXED_TYPE
:
4412 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
4413 case DEMANGLE_COMPONENT_NUMBER
:
4416 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
4417 return d_find_pack (dpi
, dc
->u
.s_extended_operator
.name
);
4418 case DEMANGLE_COMPONENT_CTOR
:
4419 return d_find_pack (dpi
, dc
->u
.s_ctor
.name
);
4420 case DEMANGLE_COMPONENT_DTOR
:
4421 return d_find_pack (dpi
, dc
->u
.s_dtor
.name
);
4424 a
= d_find_pack (dpi
, d_left (dc
));
4427 return d_find_pack (dpi
, d_right (dc
));
4431 /* Returns the length of the template argument pack DC. */
4434 d_pack_length (const struct demangle_component
*dc
)
4437 while (dc
&& dc
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
4438 && d_left (dc
) != NULL
)
4446 /* Returns the number of template args in DC, expanding any pack expansions
4450 d_args_length (struct d_print_info
*dpi
, const struct demangle_component
*dc
)
4453 for (; dc
&& dc
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
;
4456 struct demangle_component
*elt
= d_left (dc
);
4459 if (elt
->type
== DEMANGLE_COMPONENT_PACK_EXPANSION
)
4461 struct demangle_component
*a
= d_find_pack (dpi
, d_left (elt
));
4462 count
+= d_pack_length (a
);
4470 /* DC is a component of a mangled expression. Print it, wrapped in parens
4474 d_print_subexpr (struct d_print_info
*dpi
, int options
,
4475 struct demangle_component
*dc
)
4478 if (dc
->type
== DEMANGLE_COMPONENT_NAME
4479 || dc
->type
== DEMANGLE_COMPONENT_QUAL_NAME
4480 || dc
->type
== DEMANGLE_COMPONENT_INITIALIZER_LIST
4481 || dc
->type
== DEMANGLE_COMPONENT_FUNCTION_PARAM
)
4484 d_append_char (dpi
, '(');
4485 d_print_comp (dpi
, options
, dc
);
4487 d_append_char (dpi
, ')');
4490 /* Save the current scope. */
4493 d_save_scope (struct d_print_info
*dpi
,
4494 const struct demangle_component
*container
)
4496 struct d_saved_scope
*scope
;
4497 struct d_print_template
*src
, **link
;
4499 if (dpi
->next_saved_scope
>= dpi
->num_saved_scopes
)
4501 d_print_error (dpi
);
4504 scope
= &dpi
->saved_scopes
[dpi
->next_saved_scope
];
4505 dpi
->next_saved_scope
++;
4507 scope
->container
= container
;
4508 link
= &scope
->templates
;
4510 for (src
= dpi
->templates
; src
!= NULL
; src
= src
->next
)
4512 struct d_print_template
*dst
;
4514 if (dpi
->next_copy_template
>= dpi
->num_copy_templates
)
4516 d_print_error (dpi
);
4519 dst
= &dpi
->copy_templates
[dpi
->next_copy_template
];
4520 dpi
->next_copy_template
++;
4522 dst
->template_decl
= src
->template_decl
;
4530 /* Attempt to locate a previously saved scope. Returns NULL if no
4531 corresponding saved scope was found. */
4533 static struct d_saved_scope
*
4534 d_get_saved_scope (struct d_print_info
*dpi
,
4535 const struct demangle_component
*container
)
4539 for (i
= 0; i
< dpi
->next_saved_scope
; i
++)
4540 if (dpi
->saved_scopes
[i
].container
== container
)
4541 return &dpi
->saved_scopes
[i
];
4546 /* If DC is a C++17 fold-expression, print it and return true; otherwise
4550 d_maybe_print_fold_expression (struct d_print_info
*dpi
, int options
,
4551 struct demangle_component
*dc
)
4553 struct demangle_component
*ops
, *operator_
, *op1
, *op2
;
4556 const char *fold_code
= d_left (dc
)->u
.s_operator
.op
->code
;
4557 if (fold_code
[0] != 'f')
4561 operator_
= d_left (ops
);
4562 op1
= d_right (ops
);
4564 if (op1
->type
== DEMANGLE_COMPONENT_TRINARY_ARG2
)
4566 op2
= d_right (op1
);
4570 /* Print the whole pack. */
4571 save_idx
= dpi
->pack_index
;
4572 dpi
->pack_index
= -1;
4574 switch (fold_code
[1])
4576 /* Unary left fold, (... + X). */
4578 d_append_string (dpi
, "(...");
4579 d_print_expr_op (dpi
, options
, operator_
);
4580 d_print_subexpr (dpi
, options
, op1
);
4581 d_append_char (dpi
, ')');
4584 /* Unary right fold, (X + ...). */
4586 d_append_char (dpi
, '(');
4587 d_print_subexpr (dpi
, options
, op1
);
4588 d_print_expr_op (dpi
, options
, operator_
);
4589 d_append_string (dpi
, "...)");
4592 /* Binary left fold, (42 + ... + X). */
4594 /* Binary right fold, (X + ... + 42). */
4596 d_append_char (dpi
, '(');
4597 d_print_subexpr (dpi
, options
, op1
);
4598 d_print_expr_op (dpi
, options
, operator_
);
4599 d_append_string (dpi
, "...");
4600 d_print_expr_op (dpi
, options
, operator_
);
4601 d_print_subexpr (dpi
, options
, op2
);
4602 d_append_char (dpi
, ')');
4606 dpi
->pack_index
= save_idx
;
4610 /* Subroutine to handle components. */
4613 d_print_comp_inner (struct d_print_info
*dpi
, int options
,
4614 struct demangle_component
*dc
)
4616 /* Magic variable to let reference smashing skip over the next modifier
4617 without needing to modify *dc. */
4618 struct demangle_component
*mod_inner
= NULL
;
4620 /* Variable used to store the current templates while a previously
4621 captured scope is used. */
4622 struct d_print_template
*saved_templates
;
4624 /* Nonzero if templates have been stored in the above variable. */
4625 int need_template_restore
= 0;
4629 d_print_error (dpi
);
4632 if (d_print_saw_error (dpi
))
4637 case DEMANGLE_COMPONENT_NAME
:
4638 if ((options
& DMGL_JAVA
) == 0)
4639 d_append_buffer (dpi
, dc
->u
.s_name
.s
, dc
->u
.s_name
.len
);
4641 d_print_java_identifier (dpi
, dc
->u
.s_name
.s
, dc
->u
.s_name
.len
);
4644 case DEMANGLE_COMPONENT_TAGGED_NAME
:
4645 d_print_comp (dpi
, options
, d_left (dc
));
4646 d_append_string (dpi
, "[abi:");
4647 d_print_comp (dpi
, options
, d_right (dc
));
4648 d_append_char (dpi
, ']');
4651 case DEMANGLE_COMPONENT_QUAL_NAME
:
4652 case DEMANGLE_COMPONENT_LOCAL_NAME
:
4653 d_print_comp (dpi
, options
, d_left (dc
));
4654 if ((options
& DMGL_JAVA
) == 0)
4655 d_append_string (dpi
, "::");
4657 d_append_char (dpi
, '.');
4659 struct demangle_component
*local_name
= d_right (dc
);
4660 if (local_name
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
4662 d_append_string (dpi
, "{default arg#");
4663 d_append_num (dpi
, local_name
->u
.s_unary_num
.num
+ 1);
4664 d_append_string (dpi
, "}::");
4665 local_name
= local_name
->u
.s_unary_num
.sub
;
4667 d_print_comp (dpi
, options
, local_name
);
4671 case DEMANGLE_COMPONENT_TYPED_NAME
:
4673 struct d_print_mod
*hold_modifiers
;
4674 struct demangle_component
*typed_name
;
4675 struct d_print_mod adpm
[4];
4677 struct d_print_template dpt
;
4679 /* Pass the name down to the type so that it can be printed in
4680 the right place for the type. We also have to pass down
4681 any CV-qualifiers, which apply to the this parameter. */
4682 hold_modifiers
= dpi
->modifiers
;
4685 typed_name
= d_left (dc
);
4686 while (typed_name
!= NULL
)
4688 if (i
>= sizeof adpm
/ sizeof adpm
[0])
4690 d_print_error (dpi
);
4694 adpm
[i
].next
= dpi
->modifiers
;
4695 dpi
->modifiers
= &adpm
[i
];
4696 adpm
[i
].mod
= typed_name
;
4697 adpm
[i
].printed
= 0;
4698 adpm
[i
].templates
= dpi
->templates
;
4701 if (!is_fnqual_component_type (typed_name
->type
))
4704 typed_name
= d_left (typed_name
);
4707 if (typed_name
== NULL
)
4709 d_print_error (dpi
);
4713 /* If typed_name is a template, then it applies to the
4714 function type as well. */
4715 if (typed_name
->type
== DEMANGLE_COMPONENT_TEMPLATE
)
4717 dpt
.next
= dpi
->templates
;
4718 dpi
->templates
= &dpt
;
4719 dpt
.template_decl
= typed_name
;
4722 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
4723 there may be CV-qualifiers on its right argument which
4724 really apply here; this happens when parsing a class which
4725 is local to a function. */
4726 if (typed_name
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
4728 struct demangle_component
*local_name
;
4730 local_name
= d_right (typed_name
);
4731 if (local_name
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
4732 local_name
= local_name
->u
.s_unary_num
.sub
;
4733 if (local_name
== NULL
)
4735 d_print_error (dpi
);
4738 while (is_fnqual_component_type (local_name
->type
))
4740 if (i
>= sizeof adpm
/ sizeof adpm
[0])
4742 d_print_error (dpi
);
4746 adpm
[i
] = adpm
[i
- 1];
4747 adpm
[i
].next
= &adpm
[i
- 1];
4748 dpi
->modifiers
= &adpm
[i
];
4750 adpm
[i
- 1].mod
= local_name
;
4751 adpm
[i
- 1].printed
= 0;
4752 adpm
[i
- 1].templates
= dpi
->templates
;
4755 local_name
= d_left (local_name
);
4759 d_print_comp (dpi
, options
, d_right (dc
));
4761 if (typed_name
->type
== DEMANGLE_COMPONENT_TEMPLATE
)
4762 dpi
->templates
= dpt
.next
;
4764 /* If the modifiers didn't get printed by the type, print them
4769 if (! adpm
[i
].printed
)
4771 d_append_char (dpi
, ' ');
4772 d_print_mod (dpi
, options
, adpm
[i
].mod
);
4776 dpi
->modifiers
= hold_modifiers
;
4781 case DEMANGLE_COMPONENT_TEMPLATE
:
4783 struct d_print_mod
*hold_dpm
;
4784 struct demangle_component
*dcl
;
4785 const struct demangle_component
*hold_current
;
4787 /* This template may need to be referenced by a cast operator
4788 contained in its subtree. */
4789 hold_current
= dpi
->current_template
;
4790 dpi
->current_template
= dc
;
4792 /* Don't push modifiers into a template definition. Doing so
4793 could give the wrong definition for a template argument.
4794 Instead, treat the template essentially as a name. */
4796 hold_dpm
= dpi
->modifiers
;
4797 dpi
->modifiers
= NULL
;
4801 if ((options
& DMGL_JAVA
) != 0
4802 && dcl
->type
== DEMANGLE_COMPONENT_NAME
4803 && dcl
->u
.s_name
.len
== 6
4804 && strncmp (dcl
->u
.s_name
.s
, "JArray", 6) == 0)
4806 /* Special-case Java arrays, so that JArray<TYPE> appears
4807 instead as TYPE[]. */
4809 d_print_comp (dpi
, options
, d_right (dc
));
4810 d_append_string (dpi
, "[]");
4814 d_print_comp (dpi
, options
, dcl
);
4815 if (d_last_char (dpi
) == '<')
4816 d_append_char (dpi
, ' ');
4817 d_append_char (dpi
, '<');
4818 d_print_comp (dpi
, options
, d_right (dc
));
4819 /* Avoid generating two consecutive '>' characters, to avoid
4820 the C++ syntactic ambiguity. */
4821 if (d_last_char (dpi
) == '>')
4822 d_append_char (dpi
, ' ');
4823 d_append_char (dpi
, '>');
4826 dpi
->modifiers
= hold_dpm
;
4827 dpi
->current_template
= hold_current
;
4832 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
4833 if (dpi
->is_lambda_arg
)
4835 /* Show the template parm index, as that's how g++ displays
4836 these, and future proofs us against potential
4837 '[]<typename T> (T *a, T *b) {...}'. */
4838 d_append_buffer (dpi
, "auto:", 5);
4839 d_append_num (dpi
, dc
->u
.s_number
.number
+ 1);
4843 struct d_print_template
*hold_dpt
;
4844 struct demangle_component
*a
= d_lookup_template_argument (dpi
, dc
);
4846 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4847 a
= d_index_template_argument (a
, dpi
->pack_index
);
4851 d_print_error (dpi
);
4855 /* While processing this parameter, we need to pop the list
4856 of templates. This is because the template parameter may
4857 itself be a reference to a parameter of an outer
4860 hold_dpt
= dpi
->templates
;
4861 dpi
->templates
= hold_dpt
->next
;
4863 d_print_comp (dpi
, options
, a
);
4865 dpi
->templates
= hold_dpt
;
4869 case DEMANGLE_COMPONENT_CTOR
:
4870 d_print_comp (dpi
, options
, dc
->u
.s_ctor
.name
);
4873 case DEMANGLE_COMPONENT_DTOR
:
4874 d_append_char (dpi
, '~');
4875 d_print_comp (dpi
, options
, dc
->u
.s_dtor
.name
);
4878 case DEMANGLE_COMPONENT_VTABLE
:
4879 d_append_string (dpi
, "vtable for ");
4880 d_print_comp (dpi
, options
, d_left (dc
));
4883 case DEMANGLE_COMPONENT_VTT
:
4884 d_append_string (dpi
, "VTT for ");
4885 d_print_comp (dpi
, options
, d_left (dc
));
4888 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
4889 d_append_string (dpi
, "construction vtable for ");
4890 d_print_comp (dpi
, options
, d_left (dc
));
4891 d_append_string (dpi
, "-in-");
4892 d_print_comp (dpi
, options
, d_right (dc
));
4895 case DEMANGLE_COMPONENT_TYPEINFO
:
4896 d_append_string (dpi
, "typeinfo for ");
4897 d_print_comp (dpi
, options
, d_left (dc
));
4900 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
4901 d_append_string (dpi
, "typeinfo name for ");
4902 d_print_comp (dpi
, options
, d_left (dc
));
4905 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
4906 d_append_string (dpi
, "typeinfo fn for ");
4907 d_print_comp (dpi
, options
, d_left (dc
));
4910 case DEMANGLE_COMPONENT_THUNK
:
4911 d_append_string (dpi
, "non-virtual thunk to ");
4912 d_print_comp (dpi
, options
, d_left (dc
));
4915 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
4916 d_append_string (dpi
, "virtual thunk to ");
4917 d_print_comp (dpi
, options
, d_left (dc
));
4920 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
4921 d_append_string (dpi
, "covariant return thunk to ");
4922 d_print_comp (dpi
, options
, d_left (dc
));
4925 case DEMANGLE_COMPONENT_JAVA_CLASS
:
4926 d_append_string (dpi
, "java Class for ");
4927 d_print_comp (dpi
, options
, d_left (dc
));
4930 case DEMANGLE_COMPONENT_GUARD
:
4931 d_append_string (dpi
, "guard variable for ");
4932 d_print_comp (dpi
, options
, d_left (dc
));
4935 case DEMANGLE_COMPONENT_TLS_INIT
:
4936 d_append_string (dpi
, "TLS init function for ");
4937 d_print_comp (dpi
, options
, d_left (dc
));
4940 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
4941 d_append_string (dpi
, "TLS wrapper function for ");
4942 d_print_comp (dpi
, options
, d_left (dc
));
4945 case DEMANGLE_COMPONENT_REFTEMP
:
4946 d_append_string (dpi
, "reference temporary #");
4947 d_print_comp (dpi
, options
, d_right (dc
));
4948 d_append_string (dpi
, " for ");
4949 d_print_comp (dpi
, options
, d_left (dc
));
4952 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
4953 d_append_string (dpi
, "hidden alias for ");
4954 d_print_comp (dpi
, options
, d_left (dc
));
4957 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
4958 d_append_string (dpi
, "transaction clone for ");
4959 d_print_comp (dpi
, options
, d_left (dc
));
4962 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
4963 d_append_string (dpi
, "non-transaction clone for ");
4964 d_print_comp (dpi
, options
, d_left (dc
));
4967 case DEMANGLE_COMPONENT_SUB_STD
:
4968 d_append_buffer (dpi
, dc
->u
.s_string
.string
, dc
->u
.s_string
.len
);
4971 case DEMANGLE_COMPONENT_RESTRICT
:
4972 case DEMANGLE_COMPONENT_VOLATILE
:
4973 case DEMANGLE_COMPONENT_CONST
:
4975 struct d_print_mod
*pdpm
;
4977 /* When printing arrays, it's possible to have cases where the
4978 same CV-qualifier gets pushed on the stack multiple times.
4979 We only need to print it once. */
4981 for (pdpm
= dpi
->modifiers
; pdpm
!= NULL
; pdpm
= pdpm
->next
)
4983 if (! pdpm
->printed
)
4985 if (pdpm
->mod
->type
!= DEMANGLE_COMPONENT_RESTRICT
4986 && pdpm
->mod
->type
!= DEMANGLE_COMPONENT_VOLATILE
4987 && pdpm
->mod
->type
!= DEMANGLE_COMPONENT_CONST
)
4989 if (pdpm
->mod
->type
== dc
->type
)
4991 d_print_comp (dpi
, options
, d_left (dc
));
4999 case DEMANGLE_COMPONENT_REFERENCE
:
5000 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
5002 /* Handle reference smashing: & + && = &. */
5003 struct demangle_component
*sub
= d_left (dc
);
5004 if (!dpi
->is_lambda_arg
5005 && sub
->type
== DEMANGLE_COMPONENT_TEMPLATE_PARAM
)
5007 struct d_saved_scope
*scope
= d_get_saved_scope (dpi
, sub
);
5008 struct demangle_component
*a
;
5012 /* This is the first time SUB has been traversed.
5013 We need to capture the current templates so
5014 they can be restored if SUB is reentered as a
5016 d_save_scope (dpi
, sub
);
5017 if (d_print_saw_error (dpi
))
5022 const struct d_component_stack
*dcse
;
5023 int found_self_or_parent
= 0;
5025 /* This traversal is reentering SUB as a substition.
5026 If we are not beneath SUB or DC in the tree then we
5027 need to restore SUB's template stack temporarily. */
5028 for (dcse
= dpi
->component_stack
; dcse
!= NULL
;
5029 dcse
= dcse
->parent
)
5033 && dcse
!= dpi
->component_stack
))
5035 found_self_or_parent
= 1;
5040 if (!found_self_or_parent
)
5042 saved_templates
= dpi
->templates
;
5043 dpi
->templates
= scope
->templates
;
5044 need_template_restore
= 1;
5048 a
= d_lookup_template_argument (dpi
, sub
);
5049 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
5050 a
= d_index_template_argument (a
, dpi
->pack_index
);
5054 if (need_template_restore
)
5055 dpi
->templates
= saved_templates
;
5057 d_print_error (dpi
);
5064 if (sub
->type
== DEMANGLE_COMPONENT_REFERENCE
5065 || sub
->type
== dc
->type
)
5067 else if (sub
->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE
)
5068 mod_inner
= d_left (sub
);
5072 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
5073 case DEMANGLE_COMPONENT_POINTER
:
5074 case DEMANGLE_COMPONENT_COMPLEX
:
5075 case DEMANGLE_COMPONENT_IMAGINARY
:
5076 FNQUAL_COMPONENT_CASE
:
5079 /* We keep a list of modifiers on the stack. */
5080 struct d_print_mod dpm
;
5082 dpm
.next
= dpi
->modifiers
;
5083 dpi
->modifiers
= &dpm
;
5086 dpm
.templates
= dpi
->templates
;
5089 mod_inner
= d_left (dc
);
5091 d_print_comp (dpi
, options
, mod_inner
);
5093 /* If the modifier didn't get printed by the type, print it
5096 d_print_mod (dpi
, options
, dc
);
5098 dpi
->modifiers
= dpm
.next
;
5100 if (need_template_restore
)
5101 dpi
->templates
= saved_templates
;
5106 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
5107 if ((options
& DMGL_JAVA
) == 0)
5108 d_append_buffer (dpi
, dc
->u
.s_builtin
.type
->name
,
5109 dc
->u
.s_builtin
.type
->len
);
5111 d_append_buffer (dpi
, dc
->u
.s_builtin
.type
->java_name
,
5112 dc
->u
.s_builtin
.type
->java_len
);
5115 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
5116 d_print_comp (dpi
, options
, d_left (dc
));
5119 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
5121 if ((options
& DMGL_RET_POSTFIX
) != 0)
5122 d_print_function_type (dpi
,
5123 options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5124 dc
, dpi
->modifiers
);
5126 /* Print return type if present */
5127 if (d_left (dc
) != NULL
&& (options
& DMGL_RET_POSTFIX
) != 0)
5128 d_print_comp (dpi
, options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5130 else if (d_left (dc
) != NULL
&& (options
& DMGL_RET_DROP
) == 0)
5132 struct d_print_mod dpm
;
5134 /* We must pass this type down as a modifier in order to
5135 print it in the right location. */
5136 dpm
.next
= dpi
->modifiers
;
5137 dpi
->modifiers
= &dpm
;
5140 dpm
.templates
= dpi
->templates
;
5142 d_print_comp (dpi
, options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5145 dpi
->modifiers
= dpm
.next
;
5150 /* In standard prefix notation, there is a space between the
5151 return type and the function signature. */
5152 if ((options
& DMGL_RET_POSTFIX
) == 0)
5153 d_append_char (dpi
, ' ');
5156 if ((options
& DMGL_RET_POSTFIX
) == 0)
5157 d_print_function_type (dpi
,
5158 options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5159 dc
, dpi
->modifiers
);
5164 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
5166 struct d_print_mod
*hold_modifiers
;
5167 struct d_print_mod adpm
[4];
5169 struct d_print_mod
*pdpm
;
5171 /* We must pass this type down as a modifier in order to print
5172 multi-dimensional arrays correctly. If the array itself is
5173 CV-qualified, we act as though the element type were
5174 CV-qualified. We do this by copying the modifiers down
5175 rather than fiddling pointers, so that we don't wind up
5176 with a d_print_mod higher on the stack pointing into our
5177 stack frame after we return. */
5179 hold_modifiers
= dpi
->modifiers
;
5181 adpm
[0].next
= hold_modifiers
;
5182 dpi
->modifiers
= &adpm
[0];
5184 adpm
[0].printed
= 0;
5185 adpm
[0].templates
= dpi
->templates
;
5188 pdpm
= hold_modifiers
;
5190 && (pdpm
->mod
->type
== DEMANGLE_COMPONENT_RESTRICT
5191 || pdpm
->mod
->type
== DEMANGLE_COMPONENT_VOLATILE
5192 || pdpm
->mod
->type
== DEMANGLE_COMPONENT_CONST
))
5194 if (! pdpm
->printed
)
5196 if (i
>= sizeof adpm
/ sizeof adpm
[0])
5198 d_print_error (dpi
);
5203 adpm
[i
].next
= dpi
->modifiers
;
5204 dpi
->modifiers
= &adpm
[i
];
5212 d_print_comp (dpi
, options
, d_right (dc
));
5214 dpi
->modifiers
= hold_modifiers
;
5216 if (adpm
[0].printed
)
5222 d_print_mod (dpi
, options
, adpm
[i
].mod
);
5225 d_print_array_type (dpi
, options
, dc
, dpi
->modifiers
);
5230 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
5231 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
5233 struct d_print_mod dpm
;
5235 dpm
.next
= dpi
->modifiers
;
5236 dpi
->modifiers
= &dpm
;
5239 dpm
.templates
= dpi
->templates
;
5241 d_print_comp (dpi
, options
, d_right (dc
));
5243 /* If the modifier didn't get printed by the type, print it
5246 d_print_mod (dpi
, options
, dc
);
5248 dpi
->modifiers
= dpm
.next
;
5253 case DEMANGLE_COMPONENT_FIXED_TYPE
:
5254 if (dc
->u
.s_fixed
.sat
)
5255 d_append_string (dpi
, "_Sat ");
5256 /* Don't print "int _Accum". */
5257 if (dc
->u
.s_fixed
.length
->u
.s_builtin
.type
5258 != &cplus_demangle_builtin_types
['i'-'a'])
5260 d_print_comp (dpi
, options
, dc
->u
.s_fixed
.length
);
5261 d_append_char (dpi
, ' ');
5263 if (dc
->u
.s_fixed
.accum
)
5264 d_append_string (dpi
, "_Accum");
5266 d_append_string (dpi
, "_Fract");
5269 case DEMANGLE_COMPONENT_ARGLIST
:
5270 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
5271 if (d_left (dc
) != NULL
)
5272 d_print_comp (dpi
, options
, d_left (dc
));
5273 if (d_right (dc
) != NULL
)
5276 unsigned long int flush_count
;
5277 /* Make sure ", " isn't flushed by d_append_string, otherwise
5278 dpi->len -= 2 wouldn't work. */
5279 if (dpi
->len
>= sizeof (dpi
->buf
) - 2)
5280 d_print_flush (dpi
);
5281 d_append_string (dpi
, ", ");
5283 flush_count
= dpi
->flush_count
;
5284 d_print_comp (dpi
, options
, d_right (dc
));
5285 /* If that didn't print anything (which can happen with empty
5286 template argument packs), remove the comma and space. */
5287 if (dpi
->flush_count
== flush_count
&& dpi
->len
== len
)
5292 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
5294 struct demangle_component
*type
= d_left (dc
);
5295 struct demangle_component
*list
= d_right (dc
);
5298 d_print_comp (dpi
, options
, type
);
5299 d_append_char (dpi
, '{');
5300 d_print_comp (dpi
, options
, list
);
5301 d_append_char (dpi
, '}');
5305 case DEMANGLE_COMPONENT_OPERATOR
:
5307 const struct demangle_operator_info
*op
= dc
->u
.s_operator
.op
;
5310 d_append_string (dpi
, "operator");
5311 /* Add a space before new/delete. */
5312 if (IS_LOWER (op
->name
[0]))
5313 d_append_char (dpi
, ' ');
5314 /* Omit a trailing space. */
5315 if (op
->name
[len
-1] == ' ')
5317 d_append_buffer (dpi
, op
->name
, len
);
5321 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
5322 d_append_string (dpi
, "operator ");
5323 d_print_comp (dpi
, options
, dc
->u
.s_extended_operator
.name
);
5326 case DEMANGLE_COMPONENT_CONVERSION
:
5327 d_append_string (dpi
, "operator ");
5328 d_print_conversion (dpi
, options
, dc
);
5331 case DEMANGLE_COMPONENT_NULLARY
:
5332 d_print_expr_op (dpi
, options
, d_left (dc
));
5335 case DEMANGLE_COMPONENT_UNARY
:
5337 struct demangle_component
*op
= d_left (dc
);
5338 struct demangle_component
*operand
= d_right (dc
);
5339 const char *code
= NULL
;
5341 if (op
->type
== DEMANGLE_COMPONENT_OPERATOR
)
5343 code
= op
->u
.s_operator
.op
->code
;
5344 if (!strcmp (code
, "ad"))
5346 /* Don't print the argument list for the address of a
5348 if (operand
->type
== DEMANGLE_COMPONENT_TYPED_NAME
5349 && d_left (operand
)->type
== DEMANGLE_COMPONENT_QUAL_NAME
5350 && d_right (operand
)->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5351 operand
= d_left (operand
);
5353 if (operand
->type
== DEMANGLE_COMPONENT_BINARY_ARGS
)
5355 /* This indicates a suffix operator. */
5356 operand
= d_left (operand
);
5357 d_print_subexpr (dpi
, options
, operand
);
5358 d_print_expr_op (dpi
, options
, op
);
5363 /* For sizeof..., just print the pack length. */
5364 if (code
&& !strcmp (code
, "sZ"))
5366 struct demangle_component
*a
= d_find_pack (dpi
, operand
);
5367 int len
= d_pack_length (a
);
5368 d_append_num (dpi
, len
);
5371 else if (code
&& !strcmp (code
, "sP"))
5373 int len
= d_args_length (dpi
, operand
);
5374 d_append_num (dpi
, len
);
5378 if (op
->type
!= DEMANGLE_COMPONENT_CAST
)
5379 d_print_expr_op (dpi
, options
, op
);
5382 d_append_char (dpi
, '(');
5383 d_print_cast (dpi
, options
, op
);
5384 d_append_char (dpi
, ')');
5386 if (code
&& !strcmp (code
, "gs"))
5387 /* Avoid parens after '::'. */
5388 d_print_comp (dpi
, options
, operand
);
5389 else if (code
&& !strcmp (code
, "st"))
5390 /* Always print parens for sizeof (type). */
5392 d_append_char (dpi
, '(');
5393 d_print_comp (dpi
, options
, operand
);
5394 d_append_char (dpi
, ')');
5397 d_print_subexpr (dpi
, options
, operand
);
5401 case DEMANGLE_COMPONENT_BINARY
:
5402 if (d_right (dc
)->type
!= DEMANGLE_COMPONENT_BINARY_ARGS
)
5404 d_print_error (dpi
);
5408 if (op_is_new_cast (d_left (dc
)))
5410 d_print_expr_op (dpi
, options
, d_left (dc
));
5411 d_append_char (dpi
, '<');
5412 d_print_comp (dpi
, options
, d_left (d_right (dc
)));
5413 d_append_string (dpi
, ">(");
5414 d_print_comp (dpi
, options
, d_right (d_right (dc
)));
5415 d_append_char (dpi
, ')');
5419 if (d_maybe_print_fold_expression (dpi
, options
, dc
))
5422 /* We wrap an expression which uses the greater-than operator in
5423 an extra layer of parens so that it does not get confused
5424 with the '>' which ends the template parameters. */
5425 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_OPERATOR
5426 && d_left (dc
)->u
.s_operator
.op
->len
== 1
5427 && d_left (dc
)->u
.s_operator
.op
->name
[0] == '>')
5428 d_append_char (dpi
, '(');
5430 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "cl") == 0
5431 && d_left (d_right (dc
))->type
== DEMANGLE_COMPONENT_TYPED_NAME
)
5433 /* Function call used in an expression should not have printed types
5434 of the function arguments. Values of the function arguments still
5435 get printed below. */
5437 const struct demangle_component
*func
= d_left (d_right (dc
));
5439 if (d_right (func
)->type
!= DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5440 d_print_error (dpi
);
5441 d_print_subexpr (dpi
, options
, d_left (func
));
5444 d_print_subexpr (dpi
, options
, d_left (d_right (dc
)));
5445 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "ix") == 0)
5447 d_append_char (dpi
, '[');
5448 d_print_comp (dpi
, options
, d_right (d_right (dc
)));
5449 d_append_char (dpi
, ']');
5453 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "cl") != 0)
5454 d_print_expr_op (dpi
, options
, d_left (dc
));
5455 d_print_subexpr (dpi
, options
, d_right (d_right (dc
)));
5458 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_OPERATOR
5459 && d_left (dc
)->u
.s_operator
.op
->len
== 1
5460 && d_left (dc
)->u
.s_operator
.op
->name
[0] == '>')
5461 d_append_char (dpi
, ')');
5465 case DEMANGLE_COMPONENT_BINARY_ARGS
:
5466 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
5467 d_print_error (dpi
);
5470 case DEMANGLE_COMPONENT_TRINARY
:
5471 if (d_right (dc
)->type
!= DEMANGLE_COMPONENT_TRINARY_ARG1
5472 || d_right (d_right (dc
))->type
!= DEMANGLE_COMPONENT_TRINARY_ARG2
)
5474 d_print_error (dpi
);
5477 if (d_maybe_print_fold_expression (dpi
, options
, dc
))
5480 struct demangle_component
*op
= d_left (dc
);
5481 struct demangle_component
*first
= d_left (d_right (dc
));
5482 struct demangle_component
*second
= d_left (d_right (d_right (dc
)));
5483 struct demangle_component
*third
= d_right (d_right (d_right (dc
)));
5485 if (!strcmp (op
->u
.s_operator
.op
->code
, "qu"))
5487 d_print_subexpr (dpi
, options
, first
);
5488 d_print_expr_op (dpi
, options
, op
);
5489 d_print_subexpr (dpi
, options
, second
);
5490 d_append_string (dpi
, " : ");
5491 d_print_subexpr (dpi
, options
, third
);
5495 d_append_string (dpi
, "new ");
5496 if (d_left (first
) != NULL
)
5498 d_print_subexpr (dpi
, options
, first
);
5499 d_append_char (dpi
, ' ');
5501 d_print_comp (dpi
, options
, second
);
5503 d_print_subexpr (dpi
, options
, third
);
5508 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
5509 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
5510 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
5511 d_print_error (dpi
);
5514 case DEMANGLE_COMPONENT_LITERAL
:
5515 case DEMANGLE_COMPONENT_LITERAL_NEG
:
5517 enum d_builtin_type_print tp
;
5519 /* For some builtin types, produce simpler output. */
5520 tp
= D_PRINT_DEFAULT
;
5521 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
)
5523 tp
= d_left (dc
)->u
.s_builtin
.type
->print
;
5527 case D_PRINT_UNSIGNED
:
5529 case D_PRINT_UNSIGNED_LONG
:
5530 case D_PRINT_LONG_LONG
:
5531 case D_PRINT_UNSIGNED_LONG_LONG
:
5532 if (d_right (dc
)->type
== DEMANGLE_COMPONENT_NAME
)
5534 if (dc
->type
== DEMANGLE_COMPONENT_LITERAL_NEG
)
5535 d_append_char (dpi
, '-');
5536 d_print_comp (dpi
, options
, d_right (dc
));
5541 case D_PRINT_UNSIGNED
:
5542 d_append_char (dpi
, 'u');
5545 d_append_char (dpi
, 'l');
5547 case D_PRINT_UNSIGNED_LONG
:
5548 d_append_string (dpi
, "ul");
5550 case D_PRINT_LONG_LONG
:
5551 d_append_string (dpi
, "ll");
5553 case D_PRINT_UNSIGNED_LONG_LONG
:
5554 d_append_string (dpi
, "ull");
5562 if (d_right (dc
)->type
== DEMANGLE_COMPONENT_NAME
5563 && d_right (dc
)->u
.s_name
.len
== 1
5564 && dc
->type
== DEMANGLE_COMPONENT_LITERAL
)
5566 switch (d_right (dc
)->u
.s_name
.s
[0])
5569 d_append_string (dpi
, "false");
5572 d_append_string (dpi
, "true");
5585 d_append_char (dpi
, '(');
5586 d_print_comp (dpi
, options
, d_left (dc
));
5587 d_append_char (dpi
, ')');
5588 if (dc
->type
== DEMANGLE_COMPONENT_LITERAL_NEG
)
5589 d_append_char (dpi
, '-');
5590 if (tp
== D_PRINT_FLOAT
)
5591 d_append_char (dpi
, '[');
5592 d_print_comp (dpi
, options
, d_right (dc
));
5593 if (tp
== D_PRINT_FLOAT
)
5594 d_append_char (dpi
, ']');
5598 case DEMANGLE_COMPONENT_NUMBER
:
5599 d_append_num (dpi
, dc
->u
.s_number
.number
);
5602 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
5603 d_append_string (dpi
, "java resource ");
5604 d_print_comp (dpi
, options
, d_left (dc
));
5607 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
5608 d_print_comp (dpi
, options
, d_left (dc
));
5609 d_print_comp (dpi
, options
, d_right (dc
));
5612 case DEMANGLE_COMPONENT_CHARACTER
:
5613 d_append_char (dpi
, dc
->u
.s_character
.character
);
5616 case DEMANGLE_COMPONENT_DECLTYPE
:
5617 d_append_string (dpi
, "decltype (");
5618 d_print_comp (dpi
, options
, d_left (dc
));
5619 d_append_char (dpi
, ')');
5622 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
5626 struct demangle_component
*a
= d_find_pack (dpi
, d_left (dc
));
5629 /* d_find_pack won't find anything if the only packs involved
5630 in this expansion are function parameter packs; in that
5631 case, just print the pattern and "...". */
5632 d_print_subexpr (dpi
, options
, d_left (dc
));
5633 d_append_string (dpi
, "...");
5637 len
= d_pack_length (a
);
5639 for (i
= 0; i
< len
; ++i
)
5641 dpi
->pack_index
= i
;
5642 d_print_comp (dpi
, options
, dc
);
5644 d_append_string (dpi
, ", ");
5649 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
5651 long num
= dc
->u
.s_number
.number
;
5653 d_append_string (dpi
, "this");
5656 d_append_string (dpi
, "{parm#");
5657 d_append_num (dpi
, num
);
5658 d_append_char (dpi
, '}');
5663 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
5664 d_append_string (dpi
, "global constructors keyed to ");
5665 d_print_comp (dpi
, options
, dc
->u
.s_binary
.left
);
5668 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
5669 d_append_string (dpi
, "global destructors keyed to ");
5670 d_print_comp (dpi
, options
, dc
->u
.s_binary
.left
);
5673 case DEMANGLE_COMPONENT_LAMBDA
:
5674 d_append_string (dpi
, "{lambda(");
5675 /* Generic lambda auto parms are mangled as the template type
5677 dpi
->is_lambda_arg
++;
5678 d_print_comp (dpi
, options
, dc
->u
.s_unary_num
.sub
);
5679 dpi
->is_lambda_arg
--;
5680 d_append_string (dpi
, ")#");
5681 d_append_num (dpi
, dc
->u
.s_unary_num
.num
+ 1);
5682 d_append_char (dpi
, '}');
5685 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
5686 d_append_string (dpi
, "{unnamed type#");
5687 d_append_num (dpi
, dc
->u
.s_number
.number
+ 1);
5688 d_append_char (dpi
, '}');
5691 case DEMANGLE_COMPONENT_CLONE
:
5692 d_print_comp (dpi
, options
, d_left (dc
));
5693 d_append_string (dpi
, " [clone ");
5694 d_print_comp (dpi
, options
, d_right (dc
));
5695 d_append_char (dpi
, ']');
5699 d_print_error (dpi
);
5705 d_print_comp (struct d_print_info
*dpi
, int options
,
5706 struct demangle_component
*dc
)
5708 struct d_component_stack self
;
5709 if (dc
== NULL
|| dc
->d_printing
> 1 || dpi
->recursion
> MAX_RECURSION_COUNT
)
5711 d_print_error (dpi
);
5719 self
.parent
= dpi
->component_stack
;
5720 dpi
->component_stack
= &self
;
5722 d_print_comp_inner (dpi
, options
, dc
);
5724 dpi
->component_stack
= self
.parent
;
5729 /* Print a Java dentifier. For Java we try to handle encoded extended
5730 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
5731 so we don't it for C++. Characters are encoded as
5735 d_print_java_identifier (struct d_print_info
*dpi
, const char *name
, int len
)
5741 for (p
= name
; p
< end
; ++p
)
5752 for (q
= p
+ 3; q
< end
; ++q
)
5758 else if (*q
>= 'A' && *q
<= 'F')
5759 dig
= *q
- 'A' + 10;
5760 else if (*q
>= 'a' && *q
<= 'f')
5761 dig
= *q
- 'a' + 10;
5767 /* If the Unicode character is larger than 256, we don't try
5768 to deal with it here. FIXME. */
5769 if (q
< end
&& *q
== '_' && c
< 256)
5771 d_append_char (dpi
, c
);
5777 d_append_char (dpi
, *p
);
5781 /* Print a list of modifiers. SUFFIX is 1 if we are printing
5782 qualifiers on this after printing a function. */
5785 d_print_mod_list (struct d_print_info
*dpi
, int options
,
5786 struct d_print_mod
*mods
, int suffix
)
5788 struct d_print_template
*hold_dpt
;
5790 if (mods
== NULL
|| d_print_saw_error (dpi
))
5795 && (is_fnqual_component_type (mods
->mod
->type
))))
5797 d_print_mod_list (dpi
, options
, mods
->next
, suffix
);
5803 hold_dpt
= dpi
->templates
;
5804 dpi
->templates
= mods
->templates
;
5806 if (mods
->mod
->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5808 d_print_function_type (dpi
, options
, mods
->mod
, mods
->next
);
5809 dpi
->templates
= hold_dpt
;
5812 else if (mods
->mod
->type
== DEMANGLE_COMPONENT_ARRAY_TYPE
)
5814 d_print_array_type (dpi
, options
, mods
->mod
, mods
->next
);
5815 dpi
->templates
= hold_dpt
;
5818 else if (mods
->mod
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
5820 struct d_print_mod
*hold_modifiers
;
5821 struct demangle_component
*dc
;
5823 /* When this is on the modifier stack, we have pulled any
5824 qualifiers off the right argument already. Otherwise, we
5825 print it as usual, but don't let the left argument see any
5828 hold_modifiers
= dpi
->modifiers
;
5829 dpi
->modifiers
= NULL
;
5830 d_print_comp (dpi
, options
, d_left (mods
->mod
));
5831 dpi
->modifiers
= hold_modifiers
;
5833 if ((options
& DMGL_JAVA
) == 0)
5834 d_append_string (dpi
, "::");
5836 d_append_char (dpi
, '.');
5838 dc
= d_right (mods
->mod
);
5840 if (dc
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
5842 d_append_string (dpi
, "{default arg#");
5843 d_append_num (dpi
, dc
->u
.s_unary_num
.num
+ 1);
5844 d_append_string (dpi
, "}::");
5845 dc
= dc
->u
.s_unary_num
.sub
;
5848 while (is_fnqual_component_type (dc
->type
))
5851 d_print_comp (dpi
, options
, dc
);
5853 dpi
->templates
= hold_dpt
;
5857 d_print_mod (dpi
, options
, mods
->mod
);
5859 dpi
->templates
= hold_dpt
;
5861 d_print_mod_list (dpi
, options
, mods
->next
, suffix
);
5864 /* Print a modifier. */
5867 d_print_mod (struct d_print_info
*dpi
, int options
,
5868 struct demangle_component
*mod
)
5872 case DEMANGLE_COMPONENT_RESTRICT
:
5873 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
5874 d_append_string (dpi
, " restrict");
5876 case DEMANGLE_COMPONENT_VOLATILE
:
5877 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
5878 d_append_string (dpi
, " volatile");
5880 case DEMANGLE_COMPONENT_CONST
:
5881 case DEMANGLE_COMPONENT_CONST_THIS
:
5882 d_append_string (dpi
, " const");
5884 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
5885 d_append_string (dpi
, " transaction_safe");
5887 case DEMANGLE_COMPONENT_NOEXCEPT
:
5888 d_append_string (dpi
, " noexcept");
5891 d_append_char (dpi
, '(');
5892 d_print_comp (dpi
, options
, d_right (mod
));
5893 d_append_char (dpi
, ')');
5896 case DEMANGLE_COMPONENT_THROW_SPEC
:
5897 d_append_string (dpi
, " throw");
5900 d_append_char (dpi
, '(');
5901 d_print_comp (dpi
, options
, d_right (mod
));
5902 d_append_char (dpi
, ')');
5905 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
5906 d_append_char (dpi
, ' ');
5907 d_print_comp (dpi
, options
, d_right (mod
));
5909 case DEMANGLE_COMPONENT_POINTER
:
5910 /* There is no pointer symbol in Java. */
5911 if ((options
& DMGL_JAVA
) == 0)
5912 d_append_char (dpi
, '*');
5914 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
5915 /* For the ref-qualifier, put a space before the &. */
5916 d_append_char (dpi
, ' ');
5918 case DEMANGLE_COMPONENT_REFERENCE
:
5919 d_append_char (dpi
, '&');
5921 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
5922 d_append_char (dpi
, ' ');
5924 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
5925 d_append_string (dpi
, "&&");
5927 case DEMANGLE_COMPONENT_COMPLEX
:
5928 d_append_string (dpi
, "complex ");
5930 case DEMANGLE_COMPONENT_IMAGINARY
:
5931 d_append_string (dpi
, "imaginary ");
5933 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
5934 if (d_last_char (dpi
) != '(')
5935 d_append_char (dpi
, ' ');
5936 d_print_comp (dpi
, options
, d_left (mod
));
5937 d_append_string (dpi
, "::*");
5939 case DEMANGLE_COMPONENT_TYPED_NAME
:
5940 d_print_comp (dpi
, options
, d_left (mod
));
5942 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
5943 d_append_string (dpi
, " __vector(");
5944 d_print_comp (dpi
, options
, d_left (mod
));
5945 d_append_char (dpi
, ')');
5949 /* Otherwise, we have something that won't go back on the
5950 modifier stack, so we can just print it. */
5951 d_print_comp (dpi
, options
, mod
);
5956 /* Print a function type, except for the return type. */
5959 d_print_function_type (struct d_print_info
*dpi
, int options
,
5960 struct demangle_component
*dc
,
5961 struct d_print_mod
*mods
)
5965 struct d_print_mod
*p
;
5966 struct d_print_mod
*hold_modifiers
;
5970 for (p
= mods
; p
!= NULL
; p
= p
->next
)
5975 switch (p
->mod
->type
)
5977 case DEMANGLE_COMPONENT_POINTER
:
5978 case DEMANGLE_COMPONENT_REFERENCE
:
5979 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
5982 case DEMANGLE_COMPONENT_RESTRICT
:
5983 case DEMANGLE_COMPONENT_VOLATILE
:
5984 case DEMANGLE_COMPONENT_CONST
:
5985 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
5986 case DEMANGLE_COMPONENT_COMPLEX
:
5987 case DEMANGLE_COMPONENT_IMAGINARY
:
5988 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
5992 FNQUAL_COMPONENT_CASE
:
6005 if (d_last_char (dpi
) != '('
6006 && d_last_char (dpi
) != '*')
6009 if (need_space
&& d_last_char (dpi
) != ' ')
6010 d_append_char (dpi
, ' ');
6011 d_append_char (dpi
, '(');
6014 hold_modifiers
= dpi
->modifiers
;
6015 dpi
->modifiers
= NULL
;
6017 d_print_mod_list (dpi
, options
, mods
, 0);
6020 d_append_char (dpi
, ')');
6022 d_append_char (dpi
, '(');
6024 if (d_right (dc
) != NULL
)
6025 d_print_comp (dpi
, options
, d_right (dc
));
6027 d_append_char (dpi
, ')');
6029 d_print_mod_list (dpi
, options
, mods
, 1);
6031 dpi
->modifiers
= hold_modifiers
;
6034 /* Print an array type, except for the element type. */
6037 d_print_array_type (struct d_print_info
*dpi
, int options
,
6038 struct demangle_component
*dc
,
6039 struct d_print_mod
*mods
)
6047 struct d_print_mod
*p
;
6050 for (p
= mods
; p
!= NULL
; p
= p
->next
)
6054 if (p
->mod
->type
== DEMANGLE_COMPONENT_ARRAY_TYPE
)
6069 d_append_string (dpi
, " (");
6071 d_print_mod_list (dpi
, options
, mods
, 0);
6074 d_append_char (dpi
, ')');
6078 d_append_char (dpi
, ' ');
6080 d_append_char (dpi
, '[');
6082 if (d_left (dc
) != NULL
)
6083 d_print_comp (dpi
, options
, d_left (dc
));
6085 d_append_char (dpi
, ']');
6088 /* Print an operator in an expression. */
6091 d_print_expr_op (struct d_print_info
*dpi
, int options
,
6092 struct demangle_component
*dc
)
6094 if (dc
->type
== DEMANGLE_COMPONENT_OPERATOR
)
6095 d_append_buffer (dpi
, dc
->u
.s_operator
.op
->name
,
6096 dc
->u
.s_operator
.op
->len
);
6098 d_print_comp (dpi
, options
, dc
);
6104 d_print_cast (struct d_print_info
*dpi
, int options
,
6105 struct demangle_component
*dc
)
6107 d_print_comp (dpi
, options
, d_left (dc
));
6110 /* Print a conversion operator. */
6113 d_print_conversion (struct d_print_info
*dpi
, int options
,
6114 struct demangle_component
*dc
)
6116 struct d_print_template dpt
;
6118 /* For a conversion operator, we need the template parameters from
6119 the enclosing template in scope for processing the type. */
6120 if (dpi
->current_template
!= NULL
)
6122 dpt
.next
= dpi
->templates
;
6123 dpi
->templates
= &dpt
;
6124 dpt
.template_decl
= dpi
->current_template
;
6127 if (d_left (dc
)->type
!= DEMANGLE_COMPONENT_TEMPLATE
)
6129 d_print_comp (dpi
, options
, d_left (dc
));
6130 if (dpi
->current_template
!= NULL
)
6131 dpi
->templates
= dpt
.next
;
6135 d_print_comp (dpi
, options
, d_left (d_left (dc
)));
6137 /* For a templated cast operator, we need to remove the template
6138 parameters from scope after printing the operator name,
6139 so we need to handle the template printing here. */
6140 if (dpi
->current_template
!= NULL
)
6141 dpi
->templates
= dpt
.next
;
6143 if (d_last_char (dpi
) == '<')
6144 d_append_char (dpi
, ' ');
6145 d_append_char (dpi
, '<');
6146 d_print_comp (dpi
, options
, d_right (d_left (dc
)));
6147 /* Avoid generating two consecutive '>' characters, to avoid
6148 the C++ syntactic ambiguity. */
6149 if (d_last_char (dpi
) == '>')
6150 d_append_char (dpi
, ' ');
6151 d_append_char (dpi
, '>');
6155 /* Initialize the information structure we use to pass around
6158 CP_STATIC_IF_GLIBCPP_V3
6160 cplus_demangle_init_info (const char *mangled
, int options
, size_t len
,
6164 di
->send
= mangled
+ len
;
6165 di
->options
= options
;
6169 /* We can not need more components than twice the number of chars in
6170 the mangled string. Most components correspond directly to
6171 chars, but the ARGLIST types are exceptions. */
6172 di
->num_comps
= 2 * len
;
6175 /* Similarly, we can not need more substitutions than there are
6176 chars in the mangled string. */
6180 di
->last_name
= NULL
;
6183 di
->is_expression
= 0;
6184 di
->is_conversion
= 0;
6187 /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
6188 mangled name, return strings in repeated callback giving the demangled
6189 name. OPTIONS is the usual libiberty demangler options. On success,
6190 this returns 1. On failure, returns 0. */
6193 d_demangle_callback (const char *mangled
, int options
,
6194 demangle_callbackref callback
, void *opaque
)
6205 struct demangle_component
*dc
;
6208 if (mangled
[0] == '_' && mangled
[1] == 'Z')
6210 else if (strncmp (mangled
, "_GLOBAL_", 8) == 0
6211 && (mangled
[8] == '.' || mangled
[8] == '_' || mangled
[8] == '$')
6212 && (mangled
[9] == 'D' || mangled
[9] == 'I')
6213 && mangled
[10] == '_')
6214 type
= mangled
[9] == 'I' ? DCT_GLOBAL_CTORS
: DCT_GLOBAL_DTORS
;
6217 if ((options
& DMGL_TYPES
) == 0)
6222 cplus_demangle_init_info (mangled
, options
, strlen (mangled
), &di
);
6225 #ifdef CP_DYNAMIC_ARRAYS
6226 __extension__
struct demangle_component comps
[di
.num_comps
];
6227 __extension__
struct demangle_component
*subs
[di
.num_subs
];
6232 di
.comps
= alloca (di
.num_comps
* sizeof (*di
.comps
));
6233 di
.subs
= alloca (di
.num_subs
* sizeof (*di
.subs
));
6239 dc
= cplus_demangle_type (&di
);
6242 dc
= cplus_demangle_mangled_name (&di
, 1);
6244 case DCT_GLOBAL_CTORS
:
6245 case DCT_GLOBAL_DTORS
:
6246 d_advance (&di
, 11);
6247 dc
= d_make_comp (&di
,
6248 (type
== DCT_GLOBAL_CTORS
6249 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
6250 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
),
6251 d_make_demangle_mangled_name (&di
, d_str (&di
)),
6253 d_advance (&di
, strlen (d_str (&di
)));
6256 abort (); /* We have listed all the cases. */
6259 /* If DMGL_PARAMS is set, then if we didn't consume the entire
6260 mangled string, then we didn't successfully demangle it. If
6261 DMGL_PARAMS is not set, we didn't look at the trailing
6263 if (((options
& DMGL_PARAMS
) != 0) && d_peek_char (&di
) != '\0')
6266 #ifdef CP_DEMANGLE_DEBUG
6270 status
= (dc
!= NULL
)
6271 ? cplus_demangle_print_callback (options
, dc
, callback
, opaque
)
6278 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
6279 name, return a buffer allocated with malloc holding the demangled
6280 name. OPTIONS is the usual libiberty demangler options. On
6281 success, this sets *PALC to the allocated size of the returned
6282 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
6283 a memory allocation failure, and returns NULL. */
6286 d_demangle (const char *mangled
, int options
, size_t *palc
)
6288 struct d_growable_string dgs
;
6291 d_growable_string_init (&dgs
, 0);
6293 status
= d_demangle_callback (mangled
, options
,
6294 d_growable_string_callback_adapter
, &dgs
);
6302 *palc
= dgs
.allocation_failure
? 1 : dgs
.alc
;
6306 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
6308 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
6310 /* ia64 ABI-mandated entry point in the C++ runtime library for
6311 performing demangling. MANGLED_NAME is a NUL-terminated character
6312 string containing the name to be demangled.
6314 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
6315 *LENGTH bytes, into which the demangled name is stored. If
6316 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
6317 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
6318 is placed in a region of memory allocated with malloc.
6320 If LENGTH is non-NULL, the length of the buffer containing the
6321 demangled name, is placed in *LENGTH.
6323 The return value is a pointer to the start of the NUL-terminated
6324 demangled name, or NULL if the demangling fails. The caller is
6325 responsible for deallocating this memory using free.
6327 *STATUS is set to one of the following values:
6328 0: The demangling operation succeeded.
6329 -1: A memory allocation failure occurred.
6330 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6331 -3: One of the arguments is invalid.
6333 The demangling is performed using the C++ ABI mangling rules, with
6337 __cxa_demangle (const char *mangled_name
, char *output_buffer
,
6338 size_t *length
, int *status
)
6343 if (mangled_name
== NULL
)
6350 if (output_buffer
!= NULL
&& length
== NULL
)
6357 demangled
= d_demangle (mangled_name
, DMGL_PARAMS
| DMGL_TYPES
, &alc
);
6359 if (demangled
== NULL
)
6371 if (output_buffer
== NULL
)
6378 if (strlen (demangled
) < *length
)
6380 strcpy (output_buffer
, demangled
);
6382 demangled
= output_buffer
;
6386 free (output_buffer
);
6397 extern int __gcclibcxx_demangle_callback (const char *,
6399 (const char *, size_t, void *),
6402 /* Alternative, allocationless entry point in the C++ runtime library
6403 for performing demangling. MANGLED_NAME is a NUL-terminated character
6404 string containing the name to be demangled.
6406 CALLBACK is a callback function, called with demangled string
6407 segments as demangling progresses; it is called at least once,
6408 but may be called more than once. OPAQUE is a generalized pointer
6409 used as a callback argument.
6411 The return code is one of the following values, equivalent to
6412 the STATUS values of __cxa_demangle() (excluding -1, since this
6413 function performs no memory allocations):
6414 0: The demangling operation succeeded.
6415 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6416 -3: One of the arguments is invalid.
6418 The demangling is performed using the C++ ABI mangling rules, with
6422 __gcclibcxx_demangle_callback (const char *mangled_name
,
6423 void (*callback
) (const char *, size_t, void *),
6428 if (mangled_name
== NULL
|| callback
== NULL
)
6431 status
= d_demangle_callback (mangled_name
, DMGL_PARAMS
| DMGL_TYPES
,
6439 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
6441 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
6442 mangled name, return a buffer allocated with malloc holding the
6443 demangled name. Otherwise, return NULL. */
6446 cplus_demangle_v3 (const char *mangled
, int options
)
6450 return d_demangle (mangled
, options
, &alc
);
6454 cplus_demangle_v3_callback (const char *mangled
, int options
,
6455 demangle_callbackref callback
, void *opaque
)
6457 return d_demangle_callback (mangled
, options
, callback
, opaque
);
6460 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
6461 conventions, but the output formatting is a little different.
6462 This instructs the C++ demangler not to emit pointer characters ("*"), to
6463 use Java's namespace separator symbol ("." instead of "::"), and to output
6464 JArray<TYPE> as TYPE[]. */
6467 java_demangle_v3 (const char *mangled
)
6471 return d_demangle (mangled
, DMGL_JAVA
| DMGL_PARAMS
| DMGL_RET_POSTFIX
, &alc
);
6475 java_demangle_v3_callback (const char *mangled
,
6476 demangle_callbackref callback
, void *opaque
)
6478 return d_demangle_callback (mangled
,
6479 DMGL_JAVA
| DMGL_PARAMS
| DMGL_RET_POSTFIX
,
6483 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
6485 #ifndef IN_GLIBCPP_V3
6487 /* Demangle a string in order to find out whether it is a constructor
6488 or destructor. Return non-zero on success. Set *CTOR_KIND and
6489 *DTOR_KIND appropriately. */
6492 is_ctor_or_dtor (const char *mangled
,
6493 enum gnu_v3_ctor_kinds
*ctor_kind
,
6494 enum gnu_v3_dtor_kinds
*dtor_kind
)
6497 struct demangle_component
*dc
;
6500 *ctor_kind
= (enum gnu_v3_ctor_kinds
) 0;
6501 *dtor_kind
= (enum gnu_v3_dtor_kinds
) 0;
6503 cplus_demangle_init_info (mangled
, DMGL_GNU_V3
, strlen (mangled
), &di
);
6506 #ifdef CP_DYNAMIC_ARRAYS
6507 __extension__
struct demangle_component comps
[di
.num_comps
];
6508 __extension__
struct demangle_component
*subs
[di
.num_subs
];
6513 di
.comps
= alloca (di
.num_comps
* sizeof (*di
.comps
));
6514 di
.subs
= alloca (di
.num_subs
* sizeof (*di
.subs
));
6517 dc
= cplus_demangle_mangled_name (&di
, 1);
6519 /* Note that because we did not pass DMGL_PARAMS, we don't expect
6520 to demangle the entire string. */
6527 /* These cannot appear on a constructor or destructor. */
6528 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
6529 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
6530 case DEMANGLE_COMPONENT_CONST_THIS
:
6531 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
6532 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
6536 case DEMANGLE_COMPONENT_TYPED_NAME
:
6537 case DEMANGLE_COMPONENT_TEMPLATE
:
6540 case DEMANGLE_COMPONENT_QUAL_NAME
:
6541 case DEMANGLE_COMPONENT_LOCAL_NAME
:
6544 case DEMANGLE_COMPONENT_CTOR
:
6545 *ctor_kind
= dc
->u
.s_ctor
.kind
;
6549 case DEMANGLE_COMPONENT_DTOR
:
6550 *dtor_kind
= dc
->u
.s_dtor
.kind
;
6561 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
6562 name. A non-zero return indicates the type of constructor. */
6564 enum gnu_v3_ctor_kinds
6565 is_gnu_v3_mangled_ctor (const char *name
)
6567 enum gnu_v3_ctor_kinds ctor_kind
;
6568 enum gnu_v3_dtor_kinds dtor_kind
;
6570 if (! is_ctor_or_dtor (name
, &ctor_kind
, &dtor_kind
))
6571 return (enum gnu_v3_ctor_kinds
) 0;
6576 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
6577 name. A non-zero return indicates the type of destructor. */
6579 enum gnu_v3_dtor_kinds
6580 is_gnu_v3_mangled_dtor (const char *name
)
6582 enum gnu_v3_ctor_kinds ctor_kind
;
6583 enum gnu_v3_dtor_kinds dtor_kind
;
6585 if (! is_ctor_or_dtor (name
, &ctor_kind
, &dtor_kind
))
6586 return (enum gnu_v3_dtor_kinds
) 0;
6590 #endif /* IN_GLIBCPP_V3 */
6592 #ifdef STANDALONE_DEMANGLER
6595 #include "dyn-string.h"
6597 static void print_usage (FILE* fp
, int exit_value
);
6599 #define IS_ALPHA(CHAR) \
6600 (((CHAR) >= 'a' && (CHAR) <= 'z') \
6601 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
6603 /* Non-zero if CHAR is a character than can occur in a mangled name. */
6604 #define is_mangled_char(CHAR) \
6605 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
6606 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
6608 /* The name of this program, as invoked. */
6609 const char* program_name
;
6611 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
6614 print_usage (FILE* fp
, int exit_value
)
6616 fprintf (fp
, "Usage: %s [options] [names ...]\n", program_name
);
6617 fprintf (fp
, "Options:\n");
6618 fprintf (fp
, " -h,--help Display this message.\n");
6619 fprintf (fp
, " -p,--no-params Don't display function parameters\n");
6620 fprintf (fp
, " -v,--verbose Produce verbose demanglings.\n");
6621 fprintf (fp
, "If names are provided, they are demangled. Otherwise filters standard input.\n");
6626 /* Option specification for getopt_long. */
6627 static const struct option long_options
[] =
6629 { "help", no_argument
, NULL
, 'h' },
6630 { "no-params", no_argument
, NULL
, 'p' },
6631 { "verbose", no_argument
, NULL
, 'v' },
6632 { NULL
, no_argument
, NULL
, 0 },
6635 /* Main entry for a demangling filter executable. It will demangle
6636 its command line arguments, if any. If none are provided, it will
6637 filter stdin to stdout, replacing any recognized mangled C++ names
6638 with their demangled equivalents. */
6641 main (int argc
, char *argv
[])
6645 int options
= DMGL_PARAMS
| DMGL_ANSI
| DMGL_TYPES
;
6647 /* Use the program name of this program, as invoked. */
6648 program_name
= argv
[0];
6650 /* Parse options. */
6653 opt_char
= getopt_long (argc
, argv
, "hpv", long_options
, NULL
);
6656 case '?': /* Unrecognized option. */
6657 print_usage (stderr
, 1);
6661 print_usage (stdout
, 0);
6665 options
&= ~ DMGL_PARAMS
;
6669 options
|= DMGL_VERBOSE
;
6673 while (opt_char
!= -1);
6676 /* No command line arguments were provided. Filter stdin. */
6678 dyn_string_t mangled
= dyn_string_new (3);
6681 /* Read all of input. */
6682 while (!feof (stdin
))
6686 /* Pile characters into mangled until we hit one that can't
6687 occur in a mangled name. */
6689 while (!feof (stdin
) && is_mangled_char (c
))
6691 dyn_string_append_char (mangled
, c
);
6697 if (dyn_string_length (mangled
) > 0)
6699 #ifdef IN_GLIBCPP_V3
6700 s
= __cxa_demangle (dyn_string_buf (mangled
), NULL
, NULL
, NULL
);
6702 s
= cplus_demangle_v3 (dyn_string_buf (mangled
), options
);
6712 /* It might not have been a mangled name. Print the
6714 fputs (dyn_string_buf (mangled
), stdout
);
6717 dyn_string_clear (mangled
);
6720 /* If we haven't hit EOF yet, we've read one character that
6721 can't occur in a mangled name, so print it out. */
6726 dyn_string_delete (mangled
);
6729 /* Demangle command line arguments. */
6731 /* Loop over command line arguments. */
6732 for (i
= optind
; i
< argc
; ++i
)
6735 #ifdef IN_GLIBCPP_V3
6739 /* Attempt to demangle. */
6740 #ifdef IN_GLIBCPP_V3
6741 s
= __cxa_demangle (argv
[i
], NULL
, NULL
, &status
);
6743 s
= cplus_demangle_v3 (argv
[i
], options
);
6746 /* If it worked, print the demangled name. */
6754 #ifdef IN_GLIBCPP_V3
6755 fprintf (stderr
, "Failed: %s (status %d)\n", argv
[i
], status
);
6757 fprintf (stderr
, "Failed: %s\n", argv
[i
]);
6766 #endif /* STANDALONE_DEMANGLER */