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
*);
430 static struct demangle_component
*d_nested_name (struct d_info
*);
432 static struct demangle_component
*d_prefix (struct d_info
*);
434 static struct demangle_component
*d_unqualified_name (struct d_info
*);
436 static struct demangle_component
*d_source_name (struct d_info
*);
438 static int d_number (struct d_info
*);
440 static struct demangle_component
*d_identifier (struct d_info
*, int);
442 static struct demangle_component
*d_operator_name (struct d_info
*);
444 static struct demangle_component
*d_special_name (struct d_info
*);
446 static struct demangle_component
*d_parmlist (struct d_info
*);
448 static int d_call_offset (struct d_info
*, int);
450 static struct demangle_component
*d_ctor_dtor_name (struct d_info
*);
452 static struct demangle_component
**
453 d_cv_qualifiers (struct d_info
*, struct demangle_component
**, int);
455 static struct demangle_component
*
456 d_ref_qualifier (struct d_info
*, struct demangle_component
*);
458 static struct demangle_component
*
459 d_function_type (struct d_info
*);
461 static struct demangle_component
*
462 d_bare_function_type (struct d_info
*, int);
464 static struct demangle_component
*
465 d_class_enum_type (struct d_info
*);
467 static struct demangle_component
*d_array_type (struct d_info
*);
469 static struct demangle_component
*d_vector_type (struct d_info
*);
471 static struct demangle_component
*
472 d_pointer_to_member_type (struct d_info
*);
474 static struct demangle_component
*
475 d_template_param (struct d_info
*);
477 static struct demangle_component
*d_template_args (struct d_info
*);
478 static struct demangle_component
*d_template_args_1 (struct d_info
*);
480 static struct demangle_component
*
481 d_template_arg (struct d_info
*);
483 static struct demangle_component
*d_expression (struct d_info
*);
485 static struct demangle_component
*d_expr_primary (struct d_info
*);
487 static struct demangle_component
*d_local_name (struct d_info
*);
489 static int d_discriminator (struct d_info
*);
491 static struct demangle_component
*d_lambda (struct d_info
*);
493 static struct demangle_component
*d_unnamed_type (struct d_info
*);
495 static struct demangle_component
*
496 d_clone_suffix (struct d_info
*, struct demangle_component
*);
499 d_add_substitution (struct d_info
*, struct demangle_component
*);
501 static struct demangle_component
*d_substitution (struct d_info
*, int);
503 static void d_checkpoint (struct d_info
*, struct d_info_checkpoint
*);
505 static void d_backtrack (struct d_info
*, struct d_info_checkpoint
*);
507 static void d_growable_string_init (struct d_growable_string
*, size_t);
510 d_growable_string_resize (struct d_growable_string
*, size_t);
513 d_growable_string_append_buffer (struct d_growable_string
*,
514 const char *, size_t);
516 d_growable_string_callback_adapter (const char *, size_t, void *);
519 d_print_init (struct d_print_info
*, demangle_callbackref
, void *,
520 const struct demangle_component
*);
522 static inline void d_print_error (struct d_print_info
*);
524 static inline int d_print_saw_error (struct d_print_info
*);
526 static inline void d_print_flush (struct d_print_info
*);
528 static inline void d_append_char (struct d_print_info
*, char);
530 static inline void d_append_buffer (struct d_print_info
*,
531 const char *, size_t);
533 static inline void d_append_string (struct d_print_info
*, const char *);
535 static inline char d_last_char (struct d_print_info
*);
538 d_print_comp (struct d_print_info
*, int, struct demangle_component
*);
541 d_print_java_identifier (struct d_print_info
*, const char *, int);
544 d_print_mod_list (struct d_print_info
*, int, struct d_print_mod
*, int);
547 d_print_mod (struct d_print_info
*, int, struct demangle_component
*);
550 d_print_function_type (struct d_print_info
*, int,
551 struct demangle_component
*,
552 struct d_print_mod
*);
555 d_print_array_type (struct d_print_info
*, int,
556 struct demangle_component
*,
557 struct d_print_mod
*);
560 d_print_expr_op (struct d_print_info
*, int, struct demangle_component
*);
562 static void d_print_cast (struct d_print_info
*, int,
563 struct demangle_component
*);
564 static void d_print_conversion (struct d_print_info
*, int,
565 struct demangle_component
*);
567 static int d_demangle_callback (const char *, int,
568 demangle_callbackref
, void *);
569 static char *d_demangle (const char *, int, size_t *);
571 /* True iff TYPE is a demangling component representing a
572 function-type-qualifier. */
575 is_fnqual_component_type (enum demangle_component_type type
)
577 return (type
== DEMANGLE_COMPONENT_RESTRICT_THIS
578 || type
== DEMANGLE_COMPONENT_VOLATILE_THIS
579 || type
== DEMANGLE_COMPONENT_CONST_THIS
580 || type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
581 || type
== DEMANGLE_COMPONENT_TRANSACTION_SAFE
582 || type
== DEMANGLE_COMPONENT_NOEXCEPT
583 || type
== DEMANGLE_COMPONENT_THROW_SPEC
584 || type
== DEMANGLE_COMPONENT_REFERENCE_THIS
);
587 #define FNQUAL_COMPONENT_CASE \
588 case DEMANGLE_COMPONENT_RESTRICT_THIS: \
589 case DEMANGLE_COMPONENT_VOLATILE_THIS: \
590 case DEMANGLE_COMPONENT_CONST_THIS: \
591 case DEMANGLE_COMPONENT_REFERENCE_THIS: \
592 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS: \
593 case DEMANGLE_COMPONENT_TRANSACTION_SAFE: \
594 case DEMANGLE_COMPONENT_NOEXCEPT: \
595 case DEMANGLE_COMPONENT_THROW_SPEC
597 #ifdef CP_DEMANGLE_DEBUG
600 d_dump (struct demangle_component
*dc
, int indent
)
607 printf ("failed demangling\n");
611 for (i
= 0; i
< indent
; ++i
)
616 case DEMANGLE_COMPONENT_NAME
:
617 printf ("name '%.*s'\n", dc
->u
.s_name
.len
, dc
->u
.s_name
.s
);
619 case DEMANGLE_COMPONENT_TAGGED_NAME
:
620 printf ("tagged name\n");
621 d_dump (dc
->u
.s_binary
.left
, indent
+ 2);
622 d_dump (dc
->u
.s_binary
.right
, indent
+ 2);
624 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
625 printf ("template parameter %ld\n", dc
->u
.s_number
.number
);
627 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
628 printf ("function parameter %ld\n", dc
->u
.s_number
.number
);
630 case DEMANGLE_COMPONENT_CTOR
:
631 printf ("constructor %d\n", (int) dc
->u
.s_ctor
.kind
);
632 d_dump (dc
->u
.s_ctor
.name
, indent
+ 2);
634 case DEMANGLE_COMPONENT_DTOR
:
635 printf ("destructor %d\n", (int) dc
->u
.s_dtor
.kind
);
636 d_dump (dc
->u
.s_dtor
.name
, indent
+ 2);
638 case DEMANGLE_COMPONENT_SUB_STD
:
639 printf ("standard substitution %s\n", dc
->u
.s_string
.string
);
641 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
642 printf ("builtin type %s\n", dc
->u
.s_builtin
.type
->name
);
644 case DEMANGLE_COMPONENT_OPERATOR
:
645 printf ("operator %s\n", dc
->u
.s_operator
.op
->name
);
647 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
648 printf ("extended operator with %d args\n",
649 dc
->u
.s_extended_operator
.args
);
650 d_dump (dc
->u
.s_extended_operator
.name
, indent
+ 2);
653 case DEMANGLE_COMPONENT_QUAL_NAME
:
654 printf ("qualified name\n");
656 case DEMANGLE_COMPONENT_LOCAL_NAME
:
657 printf ("local name\n");
659 case DEMANGLE_COMPONENT_TYPED_NAME
:
660 printf ("typed name\n");
662 case DEMANGLE_COMPONENT_TEMPLATE
:
663 printf ("template\n");
665 case DEMANGLE_COMPONENT_VTABLE
:
668 case DEMANGLE_COMPONENT_VTT
:
671 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
672 printf ("construction vtable\n");
674 case DEMANGLE_COMPONENT_TYPEINFO
:
675 printf ("typeinfo\n");
677 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
678 printf ("typeinfo name\n");
680 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
681 printf ("typeinfo function\n");
683 case DEMANGLE_COMPONENT_THUNK
:
686 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
687 printf ("virtual thunk\n");
689 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
690 printf ("covariant thunk\n");
692 case DEMANGLE_COMPONENT_JAVA_CLASS
:
693 printf ("java class\n");
695 case DEMANGLE_COMPONENT_GUARD
:
698 case DEMANGLE_COMPONENT_REFTEMP
:
699 printf ("reference temporary\n");
701 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
702 printf ("hidden alias\n");
704 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
705 printf ("transaction clone\n");
707 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
708 printf ("non-transaction clone\n");
710 case DEMANGLE_COMPONENT_RESTRICT
:
711 printf ("restrict\n");
713 case DEMANGLE_COMPONENT_VOLATILE
:
714 printf ("volatile\n");
716 case DEMANGLE_COMPONENT_CONST
:
719 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
720 printf ("restrict this\n");
722 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
723 printf ("volatile this\n");
725 case DEMANGLE_COMPONENT_CONST_THIS
:
726 printf ("const this\n");
728 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
729 printf ("reference this\n");
731 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
732 printf ("rvalue reference this\n");
734 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
735 printf ("transaction_safe this\n");
737 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
738 printf ("vendor type qualifier\n");
740 case DEMANGLE_COMPONENT_POINTER
:
741 printf ("pointer\n");
743 case DEMANGLE_COMPONENT_REFERENCE
:
744 printf ("reference\n");
746 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
747 printf ("rvalue reference\n");
749 case DEMANGLE_COMPONENT_COMPLEX
:
750 printf ("complex\n");
752 case DEMANGLE_COMPONENT_IMAGINARY
:
753 printf ("imaginary\n");
755 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
756 printf ("vendor type\n");
758 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
759 printf ("function type\n");
761 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
762 printf ("array type\n");
764 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
765 printf ("pointer to member type\n");
767 case DEMANGLE_COMPONENT_FIXED_TYPE
:
768 printf ("fixed-point type, accum? %d, sat? %d\n",
769 dc
->u
.s_fixed
.accum
, dc
->u
.s_fixed
.sat
);
770 d_dump (dc
->u
.s_fixed
.length
, indent
+ 2);
772 case DEMANGLE_COMPONENT_ARGLIST
:
773 printf ("argument list\n");
775 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
776 printf ("template argument list\n");
778 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
779 printf ("initializer list\n");
781 case DEMANGLE_COMPONENT_CAST
:
784 case DEMANGLE_COMPONENT_CONVERSION
:
785 printf ("conversion operator\n");
787 case DEMANGLE_COMPONENT_NULLARY
:
788 printf ("nullary operator\n");
790 case DEMANGLE_COMPONENT_UNARY
:
791 printf ("unary operator\n");
793 case DEMANGLE_COMPONENT_BINARY
:
794 printf ("binary operator\n");
796 case DEMANGLE_COMPONENT_BINARY_ARGS
:
797 printf ("binary operator arguments\n");
799 case DEMANGLE_COMPONENT_TRINARY
:
800 printf ("trinary operator\n");
802 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
803 printf ("trinary operator arguments 1\n");
805 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
806 printf ("trinary operator arguments 1\n");
808 case DEMANGLE_COMPONENT_LITERAL
:
809 printf ("literal\n");
811 case DEMANGLE_COMPONENT_LITERAL_NEG
:
812 printf ("negative literal\n");
814 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
815 printf ("java resource\n");
817 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
818 printf ("compound name\n");
820 case DEMANGLE_COMPONENT_CHARACTER
:
821 printf ("character '%c'\n", dc
->u
.s_character
.character
);
823 case DEMANGLE_COMPONENT_NUMBER
:
824 printf ("number %ld\n", dc
->u
.s_number
.number
);
826 case DEMANGLE_COMPONENT_DECLTYPE
:
827 printf ("decltype\n");
829 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
830 printf ("pack expansion\n");
832 case DEMANGLE_COMPONENT_TLS_INIT
:
833 printf ("tls init function\n");
835 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
836 printf ("tls wrapper function\n");
838 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
839 printf ("default argument %d\n", dc
->u
.s_unary_num
.num
);
840 d_dump (dc
->u
.s_unary_num
.sub
, indent
+2);
842 case DEMANGLE_COMPONENT_LAMBDA
:
843 printf ("lambda %d\n", dc
->u
.s_unary_num
.num
);
844 d_dump (dc
->u
.s_unary_num
.sub
, indent
+2);
848 d_dump (d_left (dc
), indent
+ 2);
849 d_dump (d_right (dc
), indent
+ 2);
852 #endif /* CP_DEMANGLE_DEBUG */
854 /* Fill in a DEMANGLE_COMPONENT_NAME. */
856 CP_STATIC_IF_GLIBCPP_V3
858 cplus_demangle_fill_name (struct demangle_component
*p
, const char *s
, int len
)
860 if (p
== NULL
|| s
== NULL
|| len
== 0)
863 p
->type
= DEMANGLE_COMPONENT_NAME
;
865 p
->u
.s_name
.len
= len
;
869 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
871 CP_STATIC_IF_GLIBCPP_V3
873 cplus_demangle_fill_extended_operator (struct demangle_component
*p
, int args
,
874 struct demangle_component
*name
)
876 if (p
== NULL
|| args
< 0 || name
== NULL
)
879 p
->type
= DEMANGLE_COMPONENT_EXTENDED_OPERATOR
;
880 p
->u
.s_extended_operator
.args
= args
;
881 p
->u
.s_extended_operator
.name
= name
;
885 /* Fill in a DEMANGLE_COMPONENT_CTOR. */
887 CP_STATIC_IF_GLIBCPP_V3
889 cplus_demangle_fill_ctor (struct demangle_component
*p
,
890 enum gnu_v3_ctor_kinds kind
,
891 struct demangle_component
*name
)
895 || (int) kind
< gnu_v3_complete_object_ctor
896 || (int) kind
> gnu_v3_object_ctor_group
)
899 p
->type
= DEMANGLE_COMPONENT_CTOR
;
900 p
->u
.s_ctor
.kind
= kind
;
901 p
->u
.s_ctor
.name
= name
;
905 /* Fill in a DEMANGLE_COMPONENT_DTOR. */
907 CP_STATIC_IF_GLIBCPP_V3
909 cplus_demangle_fill_dtor (struct demangle_component
*p
,
910 enum gnu_v3_dtor_kinds kind
,
911 struct demangle_component
*name
)
915 || (int) kind
< gnu_v3_deleting_dtor
916 || (int) kind
> gnu_v3_object_dtor_group
)
919 p
->type
= DEMANGLE_COMPONENT_DTOR
;
920 p
->u
.s_dtor
.kind
= kind
;
921 p
->u
.s_dtor
.name
= name
;
925 /* Add a new component. */
927 static struct demangle_component
*
928 d_make_empty (struct d_info
*di
)
930 struct demangle_component
*p
;
932 if (di
->next_comp
>= di
->num_comps
)
934 p
= &di
->comps
[di
->next_comp
];
940 /* Add a new generic component. */
942 static struct demangle_component
*
943 d_make_comp (struct d_info
*di
, enum demangle_component_type type
,
944 struct demangle_component
*left
,
945 struct demangle_component
*right
)
947 struct demangle_component
*p
;
949 /* We check for errors here. A typical error would be a NULL return
950 from a subroutine. We catch those here, and return NULL
954 /* These types require two parameters. */
955 case DEMANGLE_COMPONENT_QUAL_NAME
:
956 case DEMANGLE_COMPONENT_LOCAL_NAME
:
957 case DEMANGLE_COMPONENT_TYPED_NAME
:
958 case DEMANGLE_COMPONENT_TAGGED_NAME
:
959 case DEMANGLE_COMPONENT_TEMPLATE
:
960 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
961 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
962 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
963 case DEMANGLE_COMPONENT_UNARY
:
964 case DEMANGLE_COMPONENT_BINARY
:
965 case DEMANGLE_COMPONENT_BINARY_ARGS
:
966 case DEMANGLE_COMPONENT_TRINARY
:
967 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
968 case DEMANGLE_COMPONENT_LITERAL
:
969 case DEMANGLE_COMPONENT_LITERAL_NEG
:
970 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
971 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
972 case DEMANGLE_COMPONENT_CLONE
:
973 if (left
== NULL
|| right
== NULL
)
977 /* These types only require one parameter. */
978 case DEMANGLE_COMPONENT_VTABLE
:
979 case DEMANGLE_COMPONENT_VTT
:
980 case DEMANGLE_COMPONENT_TYPEINFO
:
981 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
982 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
983 case DEMANGLE_COMPONENT_THUNK
:
984 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
985 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
986 case DEMANGLE_COMPONENT_JAVA_CLASS
:
987 case DEMANGLE_COMPONENT_GUARD
:
988 case DEMANGLE_COMPONENT_TLS_INIT
:
989 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
990 case DEMANGLE_COMPONENT_REFTEMP
:
991 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
992 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
993 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
994 case DEMANGLE_COMPONENT_POINTER
:
995 case DEMANGLE_COMPONENT_REFERENCE
:
996 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
997 case DEMANGLE_COMPONENT_COMPLEX
:
998 case DEMANGLE_COMPONENT_IMAGINARY
:
999 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
1000 case DEMANGLE_COMPONENT_CAST
:
1001 case DEMANGLE_COMPONENT_CONVERSION
:
1002 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
1003 case DEMANGLE_COMPONENT_DECLTYPE
:
1004 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
1005 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
1006 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
1007 case DEMANGLE_COMPONENT_NULLARY
:
1008 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
1013 /* This needs a right parameter, but the left parameter can be
1015 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
1016 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
1021 /* These are allowed to have no parameters--in some cases they
1022 will be filled in later. */
1023 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
1024 case DEMANGLE_COMPONENT_RESTRICT
:
1025 case DEMANGLE_COMPONENT_VOLATILE
:
1026 case DEMANGLE_COMPONENT_CONST
:
1027 case DEMANGLE_COMPONENT_ARGLIST
:
1028 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
1029 FNQUAL_COMPONENT_CASE
:
1032 /* Other types should not be seen here. */
1037 p
= d_make_empty (di
);
1041 p
->u
.s_binary
.left
= left
;
1042 p
->u
.s_binary
.right
= right
;
1047 /* Add a new demangle mangled name component. */
1049 static struct demangle_component
*
1050 d_make_demangle_mangled_name (struct d_info
*di
, const char *s
)
1052 if (d_peek_char (di
) != '_' || d_peek_next_char (di
) != 'Z')
1053 return d_make_name (di
, s
, strlen (s
));
1055 return d_encoding (di
, 0);
1058 /* Add a new name component. */
1060 static struct demangle_component
*
1061 d_make_name (struct d_info
*di
, const char *s
, int len
)
1063 struct demangle_component
*p
;
1065 p
= d_make_empty (di
);
1066 if (! cplus_demangle_fill_name (p
, s
, len
))
1071 /* Add a new builtin type component. */
1073 static struct demangle_component
*
1074 d_make_builtin_type (struct d_info
*di
,
1075 const struct demangle_builtin_type_info
*type
)
1077 struct demangle_component
*p
;
1081 p
= d_make_empty (di
);
1084 p
->type
= DEMANGLE_COMPONENT_BUILTIN_TYPE
;
1085 p
->u
.s_builtin
.type
= type
;
1090 /* Add a new operator component. */
1092 static struct demangle_component
*
1093 d_make_operator (struct d_info
*di
, const struct demangle_operator_info
*op
)
1095 struct demangle_component
*p
;
1097 p
= d_make_empty (di
);
1100 p
->type
= DEMANGLE_COMPONENT_OPERATOR
;
1101 p
->u
.s_operator
.op
= op
;
1106 /* Add a new extended operator component. */
1108 static struct demangle_component
*
1109 d_make_extended_operator (struct d_info
*di
, int args
,
1110 struct demangle_component
*name
)
1112 struct demangle_component
*p
;
1114 p
= d_make_empty (di
);
1115 if (! cplus_demangle_fill_extended_operator (p
, args
, name
))
1120 static struct demangle_component
*
1121 d_make_default_arg (struct d_info
*di
, int num
,
1122 struct demangle_component
*sub
)
1124 struct demangle_component
*p
= d_make_empty (di
);
1127 p
->type
= DEMANGLE_COMPONENT_DEFAULT_ARG
;
1128 p
->u
.s_unary_num
.num
= num
;
1129 p
->u
.s_unary_num
.sub
= sub
;
1134 /* Add a new constructor component. */
1136 static struct demangle_component
*
1137 d_make_ctor (struct d_info
*di
, enum gnu_v3_ctor_kinds kind
,
1138 struct demangle_component
*name
)
1140 struct demangle_component
*p
;
1142 p
= d_make_empty (di
);
1143 if (! cplus_demangle_fill_ctor (p
, kind
, name
))
1148 /* Add a new destructor component. */
1150 static struct demangle_component
*
1151 d_make_dtor (struct d_info
*di
, enum gnu_v3_dtor_kinds kind
,
1152 struct demangle_component
*name
)
1154 struct demangle_component
*p
;
1156 p
= d_make_empty (di
);
1157 if (! cplus_demangle_fill_dtor (p
, kind
, name
))
1162 /* Add a new template parameter. */
1164 static struct demangle_component
*
1165 d_make_template_param (struct d_info
*di
, int i
)
1167 struct demangle_component
*p
;
1169 p
= d_make_empty (di
);
1172 p
->type
= DEMANGLE_COMPONENT_TEMPLATE_PARAM
;
1173 p
->u
.s_number
.number
= i
;
1178 /* Add a new function parameter. */
1180 static struct demangle_component
*
1181 d_make_function_param (struct d_info
*di
, int i
)
1183 struct demangle_component
*p
;
1185 p
= d_make_empty (di
);
1188 p
->type
= DEMANGLE_COMPONENT_FUNCTION_PARAM
;
1189 p
->u
.s_number
.number
= i
;
1194 /* Add a new standard substitution component. */
1196 static struct demangle_component
*
1197 d_make_sub (struct d_info
*di
, const char *name
, int len
)
1199 struct demangle_component
*p
;
1201 p
= d_make_empty (di
);
1204 p
->type
= DEMANGLE_COMPONENT_SUB_STD
;
1205 p
->u
.s_string
.string
= name
;
1206 p
->u
.s_string
.len
= len
;
1211 /* <mangled-name> ::= _Z <encoding> [<clone-suffix>]*
1213 TOP_LEVEL is non-zero when called at the top level. */
1215 CP_STATIC_IF_GLIBCPP_V3
1216 struct demangle_component
*
1217 cplus_demangle_mangled_name (struct d_info
*di
, int top_level
)
1219 struct demangle_component
*p
;
1221 if (! d_check_char (di
, '_')
1222 /* Allow missing _ if not at toplevel to work around a
1223 bug in G++ abi-version=2 mangling; see the comment in
1224 write_template_arg. */
1227 if (! d_check_char (di
, 'Z'))
1229 p
= d_encoding (di
, top_level
);
1231 /* If at top level and parsing parameters, check for a clone
1233 if (top_level
&& (di
->options
& DMGL_PARAMS
) != 0)
1234 while (d_peek_char (di
) == '.'
1235 && (IS_LOWER (d_peek_next_char (di
))
1236 || d_peek_next_char (di
) == '_'
1237 || IS_DIGIT (d_peek_next_char (di
))))
1238 p
= d_clone_suffix (di
, p
);
1243 /* Return whether a function should have a return type. The argument
1244 is the function name, which may be qualified in various ways. The
1245 rules are that template functions have return types with some
1246 exceptions, function types which are not part of a function name
1247 mangling have return types with some exceptions, and non-template
1248 function names do not have return types. The exceptions are that
1249 constructors, destructors, and conversion operators do not have
1253 has_return_type (struct demangle_component
*dc
)
1261 case DEMANGLE_COMPONENT_TEMPLATE
:
1262 return ! is_ctor_dtor_or_conversion (d_left (dc
));
1263 FNQUAL_COMPONENT_CASE
:
1264 return has_return_type (d_left (dc
));
1268 /* Return whether a name is a constructor, a destructor, or a
1269 conversion operator. */
1272 is_ctor_dtor_or_conversion (struct demangle_component
*dc
)
1280 case DEMANGLE_COMPONENT_QUAL_NAME
:
1281 case DEMANGLE_COMPONENT_LOCAL_NAME
:
1282 return is_ctor_dtor_or_conversion (d_right (dc
));
1283 case DEMANGLE_COMPONENT_CTOR
:
1284 case DEMANGLE_COMPONENT_DTOR
:
1285 case DEMANGLE_COMPONENT_CONVERSION
:
1290 /* <encoding> ::= <(function) name> <bare-function-type>
1294 TOP_LEVEL is non-zero when called at the top level, in which case
1295 if DMGL_PARAMS is not set we do not demangle the function
1296 parameters. We only set this at the top level, because otherwise
1297 we would not correctly demangle names in local scopes. */
1299 static struct demangle_component
*
1300 d_encoding (struct d_info
*di
, int top_level
)
1302 char peek
= d_peek_char (di
);
1304 if (peek
== 'G' || peek
== 'T')
1305 return d_special_name (di
);
1308 struct demangle_component
*dc
;
1312 if (dc
!= NULL
&& top_level
&& (di
->options
& DMGL_PARAMS
) == 0)
1314 /* Strip off any initial CV-qualifiers, as they really apply
1315 to the `this' parameter, and they were not output by the
1316 v2 demangler without DMGL_PARAMS. */
1317 while (dc
->type
== DEMANGLE_COMPONENT_RESTRICT_THIS
1318 || dc
->type
== DEMANGLE_COMPONENT_VOLATILE_THIS
1319 || dc
->type
== DEMANGLE_COMPONENT_CONST_THIS
1320 || dc
->type
== DEMANGLE_COMPONENT_REFERENCE_THIS
1321 || dc
->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
)
1324 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1325 there may be function-qualifiers on its right argument which
1326 really apply here; this happens when parsing a class
1327 which is local to a function. */
1328 if (dc
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
1330 struct demangle_component
*dcr
;
1333 while (is_fnqual_component_type (dcr
->type
))
1335 dc
->u
.s_binary
.right
= dcr
;
1341 peek
= d_peek_char (di
);
1342 if (dc
== NULL
|| peek
== '\0' || peek
== 'E')
1344 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPED_NAME
, dc
,
1345 d_bare_function_type (di
, has_return_type (dc
)));
1349 /* <tagged-name> ::= <name> B <source-name> */
1351 static struct demangle_component
*
1352 d_abi_tags (struct d_info
*di
, struct demangle_component
*dc
)
1354 struct demangle_component
*hold_last_name
;
1357 /* Preserve the last name, so the ABI tag doesn't clobber it. */
1358 hold_last_name
= di
->last_name
;
1360 while (peek
= d_peek_char (di
),
1363 struct demangle_component
*tag
;
1365 tag
= d_source_name (di
);
1366 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TAGGED_NAME
, dc
, tag
);
1369 di
->last_name
= hold_last_name
;
1374 /* <name> ::= <nested-name>
1376 ::= <unscoped-template-name> <template-args>
1379 <unscoped-name> ::= <unqualified-name>
1380 ::= St <unqualified-name>
1382 <unscoped-template-name> ::= <unscoped-name>
1386 static struct demangle_component
*
1387 d_name (struct d_info
*di
)
1389 char peek
= d_peek_char (di
);
1390 struct demangle_component
*dc
;
1395 return d_nested_name (di
);
1398 return d_local_name (di
);
1401 return d_unqualified_name (di
);
1407 if (d_peek_next_char (di
) != 't')
1409 dc
= d_substitution (di
, 0);
1415 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_QUAL_NAME
,
1416 d_make_name (di
, "std", 3),
1417 d_unqualified_name (di
));
1422 if (d_peek_char (di
) != 'I')
1424 /* The grammar does not permit this case to occur if we
1425 called d_substitution() above (i.e., subst == 1). We
1426 don't bother to check. */
1430 /* This is <template-args>, which means that we just saw
1431 <unscoped-template-name>, which is a substitution
1432 candidate if we didn't just get it from a
1436 if (! d_add_substitution (di
, dc
))
1439 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, dc
,
1440 d_template_args (di
));
1448 dc
= d_unqualified_name (di
);
1449 if (d_peek_char (di
) == 'I')
1451 /* This is <template-args>, which means that we just saw
1452 <unscoped-template-name>, which is a substitution
1454 if (! d_add_substitution (di
, dc
))
1456 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, dc
,
1457 d_template_args (di
));
1463 /* <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
1464 ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
1467 static struct demangle_component
*
1468 d_nested_name (struct d_info
*di
)
1470 struct demangle_component
*ret
;
1471 struct demangle_component
**pret
;
1472 struct demangle_component
*rqual
;
1474 if (! d_check_char (di
, 'N'))
1477 pret
= d_cv_qualifiers (di
, &ret
, 1);
1481 /* Parse the ref-qualifier now and then attach it
1482 once we have something to attach it to. */
1483 rqual
= d_ref_qualifier (di
, NULL
);
1485 *pret
= d_prefix (di
);
1491 d_left (rqual
) = ret
;
1495 if (! d_check_char (di
, 'E'))
1501 /* <prefix> ::= <prefix> <unqualified-name>
1502 ::= <template-prefix> <template-args>
1503 ::= <template-param>
1508 <template-prefix> ::= <prefix> <(template) unqualified-name>
1509 ::= <template-param>
1513 static struct demangle_component
*
1514 d_prefix (struct d_info
*di
)
1516 struct demangle_component
*ret
= NULL
;
1521 enum demangle_component_type comb_type
;
1522 struct demangle_component
*dc
;
1524 peek
= d_peek_char (di
);
1528 /* The older code accepts a <local-name> here, but I don't see
1529 that in the grammar. The older code does not accept a
1530 <template-param> here. */
1532 comb_type
= DEMANGLE_COMPONENT_QUAL_NAME
;
1535 char peek2
= d_peek_next_char (di
);
1536 if (peek2
== 'T' || peek2
== 't')
1538 dc
= cplus_demangle_type (di
);
1540 /* Destructor name. */
1541 dc
= d_unqualified_name (di
);
1543 else if (IS_DIGIT (peek
)
1548 dc
= d_unqualified_name (di
);
1549 else if (peek
== 'S')
1550 dc
= d_substitution (di
, 1);
1551 else if (peek
== 'I')
1555 comb_type
= DEMANGLE_COMPONENT_TEMPLATE
;
1556 dc
= d_template_args (di
);
1558 else if (peek
== 'T')
1559 dc
= d_template_param (di
);
1560 else if (peek
== 'E')
1562 else if (peek
== 'M')
1564 /* Initializer scope for a lambda. We don't need to represent
1565 this; the normal code will just treat the variable as a type
1566 scope, which gives appropriate output. */
1578 ret
= d_make_comp (di
, comb_type
, ret
, dc
);
1580 if (peek
!= 'S' && d_peek_char (di
) != 'E')
1582 if (! d_add_substitution (di
, ret
))
1588 /* <unqualified-name> ::= <operator-name>
1589 ::= <ctor-dtor-name>
1591 ::= <local-source-name>
1593 <local-source-name> ::= L <source-name> <discriminator>
1596 static struct demangle_component
*
1597 d_unqualified_name (struct d_info
*di
)
1599 struct demangle_component
*ret
;
1602 peek
= d_peek_char (di
);
1603 if (IS_DIGIT (peek
))
1604 ret
= d_source_name (di
);
1605 else if (IS_LOWER (peek
))
1607 if (peek
== 'o' && d_peek_next_char (di
) == 'n')
1609 ret
= d_operator_name (di
);
1610 if (ret
!= NULL
&& ret
->type
== DEMANGLE_COMPONENT_OPERATOR
)
1612 di
->expansion
+= sizeof "operator" + ret
->u
.s_operator
.op
->len
- 2;
1613 if (!strcmp (ret
->u
.s_operator
.op
->code
, "li"))
1614 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, ret
,
1615 d_source_name (di
));
1618 else if (peek
== 'C' || peek
== 'D')
1619 ret
= d_ctor_dtor_name (di
);
1620 else if (peek
== 'L')
1624 ret
= d_source_name (di
);
1627 if (! d_discriminator (di
))
1630 else if (peek
== 'U')
1632 switch (d_peek_next_char (di
))
1635 ret
= d_lambda (di
);
1638 ret
= d_unnamed_type (di
);
1647 if (d_peek_char (di
) == 'B')
1648 ret
= d_abi_tags (di
, ret
);
1652 /* <source-name> ::= <(positive length) number> <identifier> */
1654 static struct demangle_component
*
1655 d_source_name (struct d_info
*di
)
1658 struct demangle_component
*ret
;
1660 len
= d_number (di
);
1663 ret
= d_identifier (di
, len
);
1664 di
->last_name
= ret
;
1668 /* number ::= [n] <(non-negative decimal integer)> */
1671 d_number (struct d_info
*di
)
1678 peek
= d_peek_char (di
);
1683 peek
= d_peek_char (di
);
1689 if (! IS_DIGIT (peek
))
1695 if (ret
> ((INT_MAX
- (peek
- '0')) / 10))
1697 ret
= ret
* 10 + peek
- '0';
1699 peek
= d_peek_char (di
);
1703 /* Like d_number, but returns a demangle_component. */
1705 static struct demangle_component
*
1706 d_number_component (struct d_info
*di
)
1708 struct demangle_component
*ret
= d_make_empty (di
);
1711 ret
->type
= DEMANGLE_COMPONENT_NUMBER
;
1712 ret
->u
.s_number
.number
= d_number (di
);
1717 /* identifier ::= <(unqualified source code identifier)> */
1719 static struct demangle_component
*
1720 d_identifier (struct d_info
*di
, int len
)
1726 if (di
->send
- name
< len
)
1729 d_advance (di
, len
);
1731 /* A Java mangled name may have a trailing '$' if it is a C++
1732 keyword. This '$' is not included in the length count. We just
1734 if ((di
->options
& DMGL_JAVA
) != 0
1735 && d_peek_char (di
) == '$')
1738 /* Look for something which looks like a gcc encoding of an
1739 anonymous namespace, and replace it with a more user friendly
1741 if (len
>= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN
+ 2
1742 && memcmp (name
, ANONYMOUS_NAMESPACE_PREFIX
,
1743 ANONYMOUS_NAMESPACE_PREFIX_LEN
) == 0)
1747 s
= name
+ ANONYMOUS_NAMESPACE_PREFIX_LEN
;
1748 if ((*s
== '.' || *s
== '_' || *s
== '$')
1751 di
->expansion
-= len
- sizeof "(anonymous namespace)";
1752 return d_make_name (di
, "(anonymous namespace)",
1753 sizeof "(anonymous namespace)" - 1);
1757 return d_make_name (di
, name
, len
);
1760 /* operator_name ::= many different two character encodings.
1762 ::= v <digit> <source-name>
1764 This list is sorted for binary search. */
1766 #define NL(s) s, (sizeof s) - 1
1768 CP_STATIC_IF_GLIBCPP_V3
1769 const struct demangle_operator_info cplus_demangle_operators
[] =
1771 { "aN", NL ("&="), 2 },
1772 { "aS", NL ("="), 2 },
1773 { "aa", NL ("&&"), 2 },
1774 { "ad", NL ("&"), 1 },
1775 { "an", NL ("&"), 2 },
1776 { "at", NL ("alignof "), 1 },
1777 { "az", NL ("alignof "), 1 },
1778 { "cc", NL ("const_cast"), 2 },
1779 { "cl", NL ("()"), 2 },
1780 { "cm", NL (","), 2 },
1781 { "co", NL ("~"), 1 },
1782 { "dV", NL ("/="), 2 },
1783 { "da", NL ("delete[] "), 1 },
1784 { "dc", NL ("dynamic_cast"), 2 },
1785 { "de", NL ("*"), 1 },
1786 { "dl", NL ("delete "), 1 },
1787 { "ds", NL (".*"), 2 },
1788 { "dt", NL ("."), 2 },
1789 { "dv", NL ("/"), 2 },
1790 { "eO", NL ("^="), 2 },
1791 { "eo", NL ("^"), 2 },
1792 { "eq", NL ("=="), 2 },
1793 { "fL", NL ("..."), 3 },
1794 { "fR", NL ("..."), 3 },
1795 { "fl", NL ("..."), 2 },
1796 { "fr", NL ("..."), 2 },
1797 { "ge", NL (">="), 2 },
1798 { "gs", NL ("::"), 1 },
1799 { "gt", NL (">"), 2 },
1800 { "ix", NL ("[]"), 2 },
1801 { "lS", NL ("<<="), 2 },
1802 { "le", NL ("<="), 2 },
1803 { "li", NL ("operator\"\" "), 1 },
1804 { "ls", NL ("<<"), 2 },
1805 { "lt", NL ("<"), 2 },
1806 { "mI", NL ("-="), 2 },
1807 { "mL", NL ("*="), 2 },
1808 { "mi", NL ("-"), 2 },
1809 { "ml", NL ("*"), 2 },
1810 { "mm", NL ("--"), 1 },
1811 { "na", NL ("new[]"), 3 },
1812 { "ne", NL ("!="), 2 },
1813 { "ng", NL ("-"), 1 },
1814 { "nt", NL ("!"), 1 },
1815 { "nw", NL ("new"), 3 },
1816 { "oR", NL ("|="), 2 },
1817 { "oo", NL ("||"), 2 },
1818 { "or", NL ("|"), 2 },
1819 { "pL", NL ("+="), 2 },
1820 { "pl", NL ("+"), 2 },
1821 { "pm", NL ("->*"), 2 },
1822 { "pp", NL ("++"), 1 },
1823 { "ps", NL ("+"), 1 },
1824 { "pt", NL ("->"), 2 },
1825 { "qu", NL ("?"), 3 },
1826 { "rM", NL ("%="), 2 },
1827 { "rS", NL (">>="), 2 },
1828 { "rc", NL ("reinterpret_cast"), 2 },
1829 { "rm", NL ("%"), 2 },
1830 { "rs", NL (">>"), 2 },
1831 { "sP", NL ("sizeof..."), 1 },
1832 { "sZ", NL ("sizeof..."), 1 },
1833 { "sc", NL ("static_cast"), 2 },
1834 { "st", NL ("sizeof "), 1 },
1835 { "sz", NL ("sizeof "), 1 },
1836 { "tr", NL ("throw"), 0 },
1837 { "tw", NL ("throw "), 1 },
1838 { NULL
, NULL
, 0, 0 }
1841 static struct demangle_component
*
1842 d_operator_name (struct d_info
*di
)
1847 c1
= d_next_char (di
);
1848 c2
= d_next_char (di
);
1849 if (c1
== 'v' && IS_DIGIT (c2
))
1850 return d_make_extended_operator (di
, c2
- '0', d_source_name (di
));
1851 else if (c1
== 'c' && c2
== 'v')
1853 struct demangle_component
*type
;
1854 int was_conversion
= di
->is_conversion
;
1855 struct demangle_component
*res
;
1857 di
->is_conversion
= ! di
->is_expression
;
1858 type
= cplus_demangle_type (di
);
1859 if (di
->is_conversion
)
1860 res
= d_make_comp (di
, DEMANGLE_COMPONENT_CONVERSION
, type
, NULL
);
1862 res
= d_make_comp (di
, DEMANGLE_COMPONENT_CAST
, type
, NULL
);
1863 di
->is_conversion
= was_conversion
;
1868 /* LOW is the inclusive lower bound. */
1870 /* HIGH is the exclusive upper bound. We subtract one to ignore
1871 the sentinel at the end of the array. */
1872 int high
= ((sizeof (cplus_demangle_operators
)
1873 / sizeof (cplus_demangle_operators
[0]))
1879 const struct demangle_operator_info
*p
;
1881 i
= low
+ (high
- low
) / 2;
1882 p
= cplus_demangle_operators
+ i
;
1884 if (c1
== p
->code
[0] && c2
== p
->code
[1])
1885 return d_make_operator (di
, p
);
1887 if (c1
< p
->code
[0] || (c1
== p
->code
[0] && c2
< p
->code
[1]))
1897 static struct demangle_component
*
1898 d_make_character (struct d_info
*di
, int c
)
1900 struct demangle_component
*p
;
1901 p
= d_make_empty (di
);
1904 p
->type
= DEMANGLE_COMPONENT_CHARACTER
;
1905 p
->u
.s_character
.character
= c
;
1910 static struct demangle_component
*
1911 d_java_resource (struct d_info
*di
)
1913 struct demangle_component
*p
= NULL
;
1914 struct demangle_component
*next
= NULL
;
1919 len
= d_number (di
);
1923 /* Eat the leading '_'. */
1924 if (d_next_char (di
) != '_')
1937 /* Each chunk is either a '$' escape... */
1955 next
= d_make_character (di
, c
);
1963 /* ... or a sequence of characters. */
1966 while (i
< len
&& str
[i
] && str
[i
] != '$')
1969 next
= d_make_name (di
, str
, i
);
1982 p
= d_make_comp (di
, DEMANGLE_COMPONENT_COMPOUND_NAME
, p
, next
);
1988 p
= d_make_comp (di
, DEMANGLE_COMPONENT_JAVA_RESOURCE
, p
, NULL
);
1993 /* <special-name> ::= TV <type>
1997 ::= GV <(object) name>
1998 ::= T <call-offset> <(base) encoding>
1999 ::= Tc <call-offset> <call-offset> <(base) encoding>
2000 Also g++ extensions:
2001 ::= TC <type> <(offset) number> _ <(base) type>
2006 ::= Gr <resource name>
2011 static struct demangle_component
*
2012 d_special_name (struct d_info
*di
)
2014 di
->expansion
+= 20;
2015 if (d_check_char (di
, 'T'))
2017 switch (d_next_char (di
))
2021 return d_make_comp (di
, DEMANGLE_COMPONENT_VTABLE
,
2022 cplus_demangle_type (di
), NULL
);
2024 di
->expansion
-= 10;
2025 return d_make_comp (di
, DEMANGLE_COMPONENT_VTT
,
2026 cplus_demangle_type (di
), NULL
);
2028 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO
,
2029 cplus_demangle_type (di
), NULL
);
2031 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO_NAME
,
2032 cplus_demangle_type (di
), NULL
);
2035 if (! d_call_offset (di
, 'h'))
2037 return d_make_comp (di
, DEMANGLE_COMPONENT_THUNK
,
2038 d_encoding (di
, 0), NULL
);
2041 if (! d_call_offset (di
, 'v'))
2043 return d_make_comp (di
, DEMANGLE_COMPONENT_VIRTUAL_THUNK
,
2044 d_encoding (di
, 0), NULL
);
2047 if (! d_call_offset (di
, '\0'))
2049 if (! d_call_offset (di
, '\0'))
2051 return d_make_comp (di
, DEMANGLE_COMPONENT_COVARIANT_THUNK
,
2052 d_encoding (di
, 0), NULL
);
2056 struct demangle_component
*derived_type
;
2058 struct demangle_component
*base_type
;
2060 derived_type
= cplus_demangle_type (di
);
2061 offset
= d_number (di
);
2064 if (! d_check_char (di
, '_'))
2066 base_type
= cplus_demangle_type (di
);
2067 /* We don't display the offset. FIXME: We should display
2068 it in verbose mode. */
2070 return d_make_comp (di
, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
,
2071 base_type
, derived_type
);
2075 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO_FN
,
2076 cplus_demangle_type (di
), NULL
);
2078 return d_make_comp (di
, DEMANGLE_COMPONENT_JAVA_CLASS
,
2079 cplus_demangle_type (di
), NULL
);
2082 return d_make_comp (di
, DEMANGLE_COMPONENT_TLS_INIT
,
2086 return d_make_comp (di
, DEMANGLE_COMPONENT_TLS_WRAPPER
,
2093 else if (d_check_char (di
, 'G'))
2095 switch (d_next_char (di
))
2098 return d_make_comp (di
, DEMANGLE_COMPONENT_GUARD
, d_name (di
), NULL
);
2102 struct demangle_component
*name
= d_name (di
);
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
)
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
)
3573 struct demangle_component
*function
;
3575 if (! d_check_char (di
, 'Z'))
3578 function
= d_encoding (di
, 0);
3580 if (! d_check_char (di
, 'E'))
3583 if (d_peek_char (di
) == 's')
3586 if (! d_discriminator (di
))
3588 return d_make_comp (di
, DEMANGLE_COMPONENT_LOCAL_NAME
, function
,
3589 d_make_name (di
, "string literal",
3590 sizeof "string literal" - 1));
3594 struct demangle_component
*name
;
3597 if (d_peek_char (di
) == 'd')
3599 /* Default argument scope: d <number> _. */
3601 num
= d_compact_number (di
);
3610 /* Lambdas and unnamed types have internal discriminators. */
3611 case DEMANGLE_COMPONENT_LAMBDA
:
3612 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
3615 if (! d_discriminator (di
))
3619 name
= d_make_default_arg (di
, num
, name
);
3620 return d_make_comp (di
, DEMANGLE_COMPONENT_LOCAL_NAME
, function
, name
);
3624 /* <discriminator> ::= _ <number> # when number < 10
3625 ::= __ <number> _ # when number >= 10
3627 <discriminator> ::= _ <number> # when number >=10
3628 is also accepted to support gcc versions that wrongly mangled that way.
3630 We demangle the discriminator, but we don't print it out. FIXME:
3631 We should print it out in verbose mode. */
3634 d_discriminator (struct d_info
*di
)
3636 int discrim
, num_underscores
= 1;
3638 if (d_peek_char (di
) != '_')
3641 if (d_peek_char (di
) == '_')
3647 discrim
= d_number (di
);
3650 if (num_underscores
> 1 && discrim
>= 10)
3652 if (d_peek_char (di
) == '_')
3661 /* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */
3663 static struct demangle_component
*
3664 d_lambda (struct d_info
*di
)
3666 struct demangle_component
*tl
;
3667 struct demangle_component
*ret
;
3670 if (! d_check_char (di
, 'U'))
3672 if (! d_check_char (di
, 'l'))
3675 tl
= d_parmlist (di
);
3679 if (! d_check_char (di
, 'E'))
3682 num
= d_compact_number (di
);
3686 ret
= d_make_empty (di
);
3689 ret
->type
= DEMANGLE_COMPONENT_LAMBDA
;
3690 ret
->u
.s_unary_num
.sub
= tl
;
3691 ret
->u
.s_unary_num
.num
= num
;
3694 if (! d_add_substitution (di
, ret
))
3700 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
3702 static struct demangle_component
*
3703 d_unnamed_type (struct d_info
*di
)
3705 struct demangle_component
*ret
;
3708 if (! d_check_char (di
, 'U'))
3710 if (! d_check_char (di
, 't'))
3713 num
= d_compact_number (di
);
3717 ret
= d_make_empty (di
);
3720 ret
->type
= DEMANGLE_COMPONENT_UNNAMED_TYPE
;
3721 ret
->u
.s_number
.number
= num
;
3724 if (! d_add_substitution (di
, ret
))
3730 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
3733 static struct demangle_component
*
3734 d_clone_suffix (struct d_info
*di
, struct demangle_component
*encoding
)
3736 const char *suffix
= d_str (di
);
3737 const char *pend
= suffix
;
3738 struct demangle_component
*n
;
3740 if (*pend
== '.' && (IS_LOWER (pend
[1]) || pend
[1] == '_'))
3743 while (IS_LOWER (*pend
) || *pend
== '_')
3746 while (*pend
== '.' && IS_DIGIT (pend
[1]))
3749 while (IS_DIGIT (*pend
))
3752 d_advance (di
, pend
- suffix
);
3753 n
= d_make_name (di
, suffix
, pend
- suffix
);
3754 return d_make_comp (di
, DEMANGLE_COMPONENT_CLONE
, encoding
, n
);
3757 /* Add a new substitution. */
3760 d_add_substitution (struct d_info
*di
, struct demangle_component
*dc
)
3764 if (di
->next_sub
>= di
->num_subs
)
3766 di
->subs
[di
->next_sub
] = dc
;
3771 /* <substitution> ::= S <seq-id> _
3781 If PREFIX is non-zero, then this type is being used as a prefix in
3782 a qualified name. In this case, for the standard substitutions, we
3783 need to check whether we are being used as a prefix for a
3784 constructor or destructor, and return a full template name.
3785 Otherwise we will get something like std::iostream::~iostream()
3786 which does not correspond particularly well to any function which
3787 actually appears in the source.
3790 static const struct d_standard_sub_info standard_subs
[] =
3795 { 'a', NL ("std::allocator"),
3796 NL ("std::allocator"),
3798 { 'b', NL ("std::basic_string"),
3799 NL ("std::basic_string"),
3800 NL ("basic_string") },
3801 { 's', NL ("std::string"),
3802 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
3803 NL ("basic_string") },
3804 { 'i', NL ("std::istream"),
3805 NL ("std::basic_istream<char, std::char_traits<char> >"),
3806 NL ("basic_istream") },
3807 { 'o', NL ("std::ostream"),
3808 NL ("std::basic_ostream<char, std::char_traits<char> >"),
3809 NL ("basic_ostream") },
3810 { 'd', NL ("std::iostream"),
3811 NL ("std::basic_iostream<char, std::char_traits<char> >"),
3812 NL ("basic_iostream") }
3815 static struct demangle_component
*
3816 d_substitution (struct d_info
*di
, int prefix
)
3820 if (! d_check_char (di
, 'S'))
3823 c
= d_next_char (di
);
3824 if (c
== '_' || IS_DIGIT (c
) || IS_UPPER (c
))
3833 unsigned int new_id
;
3836 new_id
= id
* 36 + c
- '0';
3837 else if (IS_UPPER (c
))
3838 new_id
= id
* 36 + c
- 'A' + 10;
3844 c
= d_next_char (di
);
3851 if (id
>= (unsigned int) di
->next_sub
)
3854 return di
->subs
[id
];
3859 const struct d_standard_sub_info
*p
;
3860 const struct d_standard_sub_info
*pend
;
3862 verbose
= (di
->options
& DMGL_VERBOSE
) != 0;
3863 if (! verbose
&& prefix
)
3867 peek
= d_peek_char (di
);
3868 if (peek
== 'C' || peek
== 'D')
3872 pend
= (&standard_subs
[0]
3873 + sizeof standard_subs
/ sizeof standard_subs
[0]);
3874 for (p
= &standard_subs
[0]; p
< pend
; ++p
)
3880 struct demangle_component
*dc
;
3882 if (p
->set_last_name
!= NULL
)
3883 di
->last_name
= d_make_sub (di
, p
->set_last_name
,
3884 p
->set_last_name_len
);
3887 s
= p
->full_expansion
;
3892 s
= p
->simple_expansion
;
3893 len
= p
->simple_len
;
3895 di
->expansion
+= len
;
3896 dc
= d_make_sub (di
, s
, len
);
3897 if (d_peek_char (di
) == 'B')
3899 /* If there are ABI tags on the abbreviation, it becomes
3900 a substitution candidate. */
3901 dc
= d_abi_tags (di
, dc
);
3902 if (! d_add_substitution (di
, dc
))
3914 d_checkpoint (struct d_info
*di
, struct d_info_checkpoint
*checkpoint
)
3916 checkpoint
->n
= di
->n
;
3917 checkpoint
->next_comp
= di
->next_comp
;
3918 checkpoint
->next_sub
= di
->next_sub
;
3919 checkpoint
->expansion
= di
->expansion
;
3923 d_backtrack (struct d_info
*di
, struct d_info_checkpoint
*checkpoint
)
3925 di
->n
= checkpoint
->n
;
3926 di
->next_comp
= checkpoint
->next_comp
;
3927 di
->next_sub
= checkpoint
->next_sub
;
3928 di
->expansion
= checkpoint
->expansion
;
3931 /* Initialize a growable string. */
3934 d_growable_string_init (struct d_growable_string
*dgs
, size_t estimate
)
3939 dgs
->allocation_failure
= 0;
3942 d_growable_string_resize (dgs
, estimate
);
3945 /* Grow a growable string to a given size. */
3948 d_growable_string_resize (struct d_growable_string
*dgs
, size_t need
)
3953 if (dgs
->allocation_failure
)
3956 /* Start allocation at two bytes to avoid any possibility of confusion
3957 with the special value of 1 used as a return in *palc to indicate
3958 allocation failures. */
3959 newalc
= dgs
->alc
> 0 ? dgs
->alc
: 2;
3960 while (newalc
< need
)
3963 newbuf
= (char *) realloc (dgs
->buf
, newalc
);
3970 dgs
->allocation_failure
= 1;
3977 /* Append a buffer to a growable string. */
3980 d_growable_string_append_buffer (struct d_growable_string
*dgs
,
3981 const char *s
, size_t l
)
3985 need
= dgs
->len
+ l
+ 1;
3986 if (need
> dgs
->alc
)
3987 d_growable_string_resize (dgs
, need
);
3989 if (dgs
->allocation_failure
)
3992 memcpy (dgs
->buf
+ dgs
->len
, s
, l
);
3993 dgs
->buf
[dgs
->len
+ l
] = '\0';
3997 /* Bridge growable strings to the callback mechanism. */
4000 d_growable_string_callback_adapter (const char *s
, size_t l
, void *opaque
)
4002 struct d_growable_string
*dgs
= (struct d_growable_string
*) opaque
;
4004 d_growable_string_append_buffer (dgs
, s
, l
);
4007 /* Walk the tree, counting the number of templates encountered, and
4008 the number of times a scope might be saved. These counts will be
4009 used to allocate data structures for d_print_comp, so the logic
4010 here must mirror the logic d_print_comp will use. It is not
4011 important that the resulting numbers are exact, so long as they
4012 are larger than the actual numbers encountered. */
4015 d_count_templates_scopes (int *num_templates
, int *num_scopes
,
4016 const struct demangle_component
*dc
)
4023 case DEMANGLE_COMPONENT_NAME
:
4024 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
4025 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
4026 case DEMANGLE_COMPONENT_SUB_STD
:
4027 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
4028 case DEMANGLE_COMPONENT_OPERATOR
:
4029 case DEMANGLE_COMPONENT_CHARACTER
:
4030 case DEMANGLE_COMPONENT_NUMBER
:
4031 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
4034 case DEMANGLE_COMPONENT_TEMPLATE
:
4036 goto recurse_left_right
;
4038 case DEMANGLE_COMPONENT_REFERENCE
:
4039 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
4040 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_TEMPLATE_PARAM
)
4042 goto recurse_left_right
;
4044 case DEMANGLE_COMPONENT_QUAL_NAME
:
4045 case DEMANGLE_COMPONENT_LOCAL_NAME
:
4046 case DEMANGLE_COMPONENT_TYPED_NAME
:
4047 case DEMANGLE_COMPONENT_VTABLE
:
4048 case DEMANGLE_COMPONENT_VTT
:
4049 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
4050 case DEMANGLE_COMPONENT_TYPEINFO
:
4051 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
4052 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
4053 case DEMANGLE_COMPONENT_THUNK
:
4054 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
4055 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
4056 case DEMANGLE_COMPONENT_JAVA_CLASS
:
4057 case DEMANGLE_COMPONENT_GUARD
:
4058 case DEMANGLE_COMPONENT_TLS_INIT
:
4059 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
4060 case DEMANGLE_COMPONENT_REFTEMP
:
4061 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
4062 case DEMANGLE_COMPONENT_RESTRICT
:
4063 case DEMANGLE_COMPONENT_VOLATILE
:
4064 case DEMANGLE_COMPONENT_CONST
:
4065 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
4066 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
4067 case DEMANGLE_COMPONENT_CONST_THIS
:
4068 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
4069 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
4070 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
4071 case DEMANGLE_COMPONENT_NOEXCEPT
:
4072 case DEMANGLE_COMPONENT_THROW_SPEC
:
4073 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
4074 case DEMANGLE_COMPONENT_POINTER
:
4075 case DEMANGLE_COMPONENT_COMPLEX
:
4076 case DEMANGLE_COMPONENT_IMAGINARY
:
4077 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
4078 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
4079 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
4080 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
4081 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
4082 case DEMANGLE_COMPONENT_ARGLIST
:
4083 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
4084 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
4085 case DEMANGLE_COMPONENT_CAST
:
4086 case DEMANGLE_COMPONENT_CONVERSION
:
4087 case DEMANGLE_COMPONENT_NULLARY
:
4088 case DEMANGLE_COMPONENT_UNARY
:
4089 case DEMANGLE_COMPONENT_BINARY
:
4090 case DEMANGLE_COMPONENT_BINARY_ARGS
:
4091 case DEMANGLE_COMPONENT_TRINARY
:
4092 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
4093 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
4094 case DEMANGLE_COMPONENT_LITERAL
:
4095 case DEMANGLE_COMPONENT_LITERAL_NEG
:
4096 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
4097 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
4098 case DEMANGLE_COMPONENT_DECLTYPE
:
4099 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
4100 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
4101 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
4102 case DEMANGLE_COMPONENT_TAGGED_NAME
:
4103 case DEMANGLE_COMPONENT_CLONE
:
4105 d_count_templates_scopes (num_templates
, num_scopes
,
4107 d_count_templates_scopes (num_templates
, num_scopes
,
4111 case DEMANGLE_COMPONENT_CTOR
:
4112 d_count_templates_scopes (num_templates
, num_scopes
,
4116 case DEMANGLE_COMPONENT_DTOR
:
4117 d_count_templates_scopes (num_templates
, num_scopes
,
4121 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
4122 d_count_templates_scopes (num_templates
, num_scopes
,
4123 dc
->u
.s_extended_operator
.name
);
4126 case DEMANGLE_COMPONENT_FIXED_TYPE
:
4127 d_count_templates_scopes (num_templates
, num_scopes
,
4128 dc
->u
.s_fixed
.length
);
4131 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
4132 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
4133 d_count_templates_scopes (num_templates
, num_scopes
,
4137 case DEMANGLE_COMPONENT_LAMBDA
:
4138 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
4139 d_count_templates_scopes (num_templates
, num_scopes
,
4140 dc
->u
.s_unary_num
.sub
);
4145 /* Initialize a print information structure. */
4148 d_print_init (struct d_print_info
*dpi
, demangle_callbackref callback
,
4149 void *opaque
, const struct demangle_component
*dc
)
4152 dpi
->last_char
= '\0';
4153 dpi
->templates
= NULL
;
4154 dpi
->modifiers
= NULL
;
4155 dpi
->pack_index
= 0;
4156 dpi
->flush_count
= 0;
4158 dpi
->callback
= callback
;
4159 dpi
->opaque
= opaque
;
4161 dpi
->demangle_failure
= 0;
4163 dpi
->is_lambda_arg
= 0;
4165 dpi
->component_stack
= NULL
;
4167 dpi
->saved_scopes
= NULL
;
4168 dpi
->next_saved_scope
= 0;
4169 dpi
->num_saved_scopes
= 0;
4171 dpi
->copy_templates
= NULL
;
4172 dpi
->next_copy_template
= 0;
4173 dpi
->num_copy_templates
= 0;
4175 d_count_templates_scopes (&dpi
->num_copy_templates
,
4176 &dpi
->num_saved_scopes
, dc
);
4177 dpi
->num_copy_templates
*= dpi
->num_saved_scopes
;
4179 dpi
->current_template
= NULL
;
4182 /* Indicate that an error occurred during printing, and test for error. */
4185 d_print_error (struct d_print_info
*dpi
)
4187 dpi
->demangle_failure
= 1;
4191 d_print_saw_error (struct d_print_info
*dpi
)
4193 return dpi
->demangle_failure
!= 0;
4196 /* Flush buffered characters to the callback. */
4199 d_print_flush (struct d_print_info
*dpi
)
4201 dpi
->buf
[dpi
->len
] = '\0';
4202 dpi
->callback (dpi
->buf
, dpi
->len
, dpi
->opaque
);
4207 /* Append characters and buffers for printing. */
4210 d_append_char (struct d_print_info
*dpi
, char c
)
4212 if (dpi
->len
== sizeof (dpi
->buf
) - 1)
4213 d_print_flush (dpi
);
4215 dpi
->buf
[dpi
->len
++] = c
;
4220 d_append_buffer (struct d_print_info
*dpi
, const char *s
, size_t l
)
4224 for (i
= 0; i
< l
; i
++)
4225 d_append_char (dpi
, s
[i
]);
4229 d_append_string (struct d_print_info
*dpi
, const char *s
)
4231 d_append_buffer (dpi
, s
, strlen (s
));
4235 d_append_num (struct d_print_info
*dpi
, int l
)
4238 sprintf (buf
,"%d", l
);
4239 d_append_string (dpi
, buf
);
4243 d_last_char (struct d_print_info
*dpi
)
4245 return dpi
->last_char
;
4248 /* Turn components into a human readable string. OPTIONS is the
4249 options bits passed to the demangler. DC is the tree to print.
4250 CALLBACK is a function to call to flush demangled string segments
4251 as they fill the intermediate buffer, and OPAQUE is a generalized
4252 callback argument. On success, this returns 1. On failure,
4253 it returns 0, indicating a bad parse. It does not use heap
4254 memory to build an output string, so cannot encounter memory
4255 allocation failure. */
4257 CP_STATIC_IF_GLIBCPP_V3
4259 cplus_demangle_print_callback (int options
,
4260 struct demangle_component
*dc
,
4261 demangle_callbackref callback
, void *opaque
)
4263 struct d_print_info dpi
;
4265 d_print_init (&dpi
, callback
, opaque
, dc
);
4268 #ifdef CP_DYNAMIC_ARRAYS
4269 /* Avoid zero-length VLAs, which are prohibited by the C99 standard
4270 and flagged as errors by Address Sanitizer. */
4271 __extension__
struct d_saved_scope scopes
[(dpi
.num_saved_scopes
> 0)
4272 ? dpi
.num_saved_scopes
: 1];
4273 __extension__
struct d_print_template temps
[(dpi
.num_copy_templates
> 0)
4274 ? dpi
.num_copy_templates
: 1];
4276 dpi
.saved_scopes
= scopes
;
4277 dpi
.copy_templates
= temps
;
4279 dpi
.saved_scopes
= alloca (dpi
.num_saved_scopes
4280 * sizeof (*dpi
.saved_scopes
));
4281 dpi
.copy_templates
= alloca (dpi
.num_copy_templates
4282 * sizeof (*dpi
.copy_templates
));
4285 d_print_comp (&dpi
, options
, dc
);
4288 d_print_flush (&dpi
);
4290 return ! d_print_saw_error (&dpi
);
4293 /* Turn components into a human readable string. OPTIONS is the
4294 options bits passed to the demangler. DC is the tree to print.
4295 ESTIMATE is a guess at the length of the result. This returns a
4296 string allocated by malloc, or NULL on error. On success, this
4297 sets *PALC to the size of the allocated buffer. On failure, this
4298 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
4301 CP_STATIC_IF_GLIBCPP_V3
4303 cplus_demangle_print (int options
, struct demangle_component
*dc
,
4304 int estimate
, size_t *palc
)
4306 struct d_growable_string dgs
;
4308 d_growable_string_init (&dgs
, estimate
);
4310 if (! cplus_demangle_print_callback (options
, dc
,
4311 d_growable_string_callback_adapter
,
4319 *palc
= dgs
.allocation_failure
? 1 : dgs
.alc
;
4323 /* Returns the I'th element of the template arglist ARGS, or NULL on
4324 failure. If I is negative, return the entire arglist. */
4326 static struct demangle_component
*
4327 d_index_template_argument (struct demangle_component
*args
, int i
)
4329 struct demangle_component
*a
;
4332 /* Print the whole argument pack. */
4339 if (a
->type
!= DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4345 if (i
!= 0 || a
== NULL
)
4351 /* Returns the template argument from the current context indicated by DC,
4352 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
4354 static struct demangle_component
*
4355 d_lookup_template_argument (struct d_print_info
*dpi
,
4356 const struct demangle_component
*dc
)
4358 if (dpi
->templates
== NULL
)
4360 d_print_error (dpi
);
4364 return d_index_template_argument
4365 (d_right (dpi
->templates
->template_decl
),
4366 dc
->u
.s_number
.number
);
4369 /* Returns a template argument pack used in DC (any will do), or NULL. */
4371 static struct demangle_component
*
4372 d_find_pack (struct d_print_info
*dpi
,
4373 const struct demangle_component
*dc
)
4375 struct demangle_component
*a
;
4381 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
4382 a
= d_lookup_template_argument (dpi
, dc
);
4383 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4387 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
4390 case DEMANGLE_COMPONENT_LAMBDA
:
4391 case DEMANGLE_COMPONENT_NAME
:
4392 case DEMANGLE_COMPONENT_TAGGED_NAME
:
4393 case DEMANGLE_COMPONENT_OPERATOR
:
4394 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
4395 case DEMANGLE_COMPONENT_SUB_STD
:
4396 case DEMANGLE_COMPONENT_CHARACTER
:
4397 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
4398 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
4399 case DEMANGLE_COMPONENT_FIXED_TYPE
:
4400 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
4401 case DEMANGLE_COMPONENT_NUMBER
:
4404 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
4405 return d_find_pack (dpi
, dc
->u
.s_extended_operator
.name
);
4406 case DEMANGLE_COMPONENT_CTOR
:
4407 return d_find_pack (dpi
, dc
->u
.s_ctor
.name
);
4408 case DEMANGLE_COMPONENT_DTOR
:
4409 return d_find_pack (dpi
, dc
->u
.s_dtor
.name
);
4412 a
= d_find_pack (dpi
, d_left (dc
));
4415 return d_find_pack (dpi
, d_right (dc
));
4419 /* Returns the length of the template argument pack DC. */
4422 d_pack_length (const struct demangle_component
*dc
)
4425 while (dc
&& dc
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
4426 && d_left (dc
) != NULL
)
4434 /* Returns the number of template args in DC, expanding any pack expansions
4438 d_args_length (struct d_print_info
*dpi
, const struct demangle_component
*dc
)
4441 for (; dc
&& dc
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
;
4444 struct demangle_component
*elt
= d_left (dc
);
4447 if (elt
->type
== DEMANGLE_COMPONENT_PACK_EXPANSION
)
4449 struct demangle_component
*a
= d_find_pack (dpi
, d_left (elt
));
4450 count
+= d_pack_length (a
);
4458 /* DC is a component of a mangled expression. Print it, wrapped in parens
4462 d_print_subexpr (struct d_print_info
*dpi
, int options
,
4463 struct demangle_component
*dc
)
4466 if (dc
->type
== DEMANGLE_COMPONENT_NAME
4467 || dc
->type
== DEMANGLE_COMPONENT_QUAL_NAME
4468 || dc
->type
== DEMANGLE_COMPONENT_INITIALIZER_LIST
4469 || dc
->type
== DEMANGLE_COMPONENT_FUNCTION_PARAM
)
4472 d_append_char (dpi
, '(');
4473 d_print_comp (dpi
, options
, dc
);
4475 d_append_char (dpi
, ')');
4478 /* Save the current scope. */
4481 d_save_scope (struct d_print_info
*dpi
,
4482 const struct demangle_component
*container
)
4484 struct d_saved_scope
*scope
;
4485 struct d_print_template
*src
, **link
;
4487 if (dpi
->next_saved_scope
>= dpi
->num_saved_scopes
)
4489 d_print_error (dpi
);
4492 scope
= &dpi
->saved_scopes
[dpi
->next_saved_scope
];
4493 dpi
->next_saved_scope
++;
4495 scope
->container
= container
;
4496 link
= &scope
->templates
;
4498 for (src
= dpi
->templates
; src
!= NULL
; src
= src
->next
)
4500 struct d_print_template
*dst
;
4502 if (dpi
->next_copy_template
>= dpi
->num_copy_templates
)
4504 d_print_error (dpi
);
4507 dst
= &dpi
->copy_templates
[dpi
->next_copy_template
];
4508 dpi
->next_copy_template
++;
4510 dst
->template_decl
= src
->template_decl
;
4518 /* Attempt to locate a previously saved scope. Returns NULL if no
4519 corresponding saved scope was found. */
4521 static struct d_saved_scope
*
4522 d_get_saved_scope (struct d_print_info
*dpi
,
4523 const struct demangle_component
*container
)
4527 for (i
= 0; i
< dpi
->next_saved_scope
; i
++)
4528 if (dpi
->saved_scopes
[i
].container
== container
)
4529 return &dpi
->saved_scopes
[i
];
4534 /* If DC is a C++17 fold-expression, print it and return true; otherwise
4538 d_maybe_print_fold_expression (struct d_print_info
*dpi
, int options
,
4539 struct demangle_component
*dc
)
4541 struct demangle_component
*ops
, *operator_
, *op1
, *op2
;
4544 const char *fold_code
= d_left (dc
)->u
.s_operator
.op
->code
;
4545 if (fold_code
[0] != 'f')
4549 operator_
= d_left (ops
);
4550 op1
= d_right (ops
);
4552 if (op1
->type
== DEMANGLE_COMPONENT_TRINARY_ARG2
)
4554 op2
= d_right (op1
);
4558 /* Print the whole pack. */
4559 save_idx
= dpi
->pack_index
;
4560 dpi
->pack_index
= -1;
4562 switch (fold_code
[1])
4564 /* Unary left fold, (... + X). */
4566 d_append_string (dpi
, "(...");
4567 d_print_expr_op (dpi
, options
, operator_
);
4568 d_print_subexpr (dpi
, options
, op1
);
4569 d_append_char (dpi
, ')');
4572 /* Unary right fold, (X + ...). */
4574 d_append_char (dpi
, '(');
4575 d_print_subexpr (dpi
, options
, op1
);
4576 d_print_expr_op (dpi
, options
, operator_
);
4577 d_append_string (dpi
, "...)");
4580 /* Binary left fold, (42 + ... + X). */
4582 /* Binary right fold, (X + ... + 42). */
4584 d_append_char (dpi
, '(');
4585 d_print_subexpr (dpi
, options
, op1
);
4586 d_print_expr_op (dpi
, options
, operator_
);
4587 d_append_string (dpi
, "...");
4588 d_print_expr_op (dpi
, options
, operator_
);
4589 d_print_subexpr (dpi
, options
, op2
);
4590 d_append_char (dpi
, ')');
4594 dpi
->pack_index
= save_idx
;
4598 /* Subroutine to handle components. */
4601 d_print_comp_inner (struct d_print_info
*dpi
, int options
,
4602 struct demangle_component
*dc
)
4604 /* Magic variable to let reference smashing skip over the next modifier
4605 without needing to modify *dc. */
4606 struct demangle_component
*mod_inner
= NULL
;
4608 /* Variable used to store the current templates while a previously
4609 captured scope is used. */
4610 struct d_print_template
*saved_templates
;
4612 /* Nonzero if templates have been stored in the above variable. */
4613 int need_template_restore
= 0;
4617 d_print_error (dpi
);
4620 if (d_print_saw_error (dpi
))
4625 case DEMANGLE_COMPONENT_NAME
:
4626 if ((options
& DMGL_JAVA
) == 0)
4627 d_append_buffer (dpi
, dc
->u
.s_name
.s
, dc
->u
.s_name
.len
);
4629 d_print_java_identifier (dpi
, dc
->u
.s_name
.s
, dc
->u
.s_name
.len
);
4632 case DEMANGLE_COMPONENT_TAGGED_NAME
:
4633 d_print_comp (dpi
, options
, d_left (dc
));
4634 d_append_string (dpi
, "[abi:");
4635 d_print_comp (dpi
, options
, d_right (dc
));
4636 d_append_char (dpi
, ']');
4639 case DEMANGLE_COMPONENT_QUAL_NAME
:
4640 case DEMANGLE_COMPONENT_LOCAL_NAME
:
4641 d_print_comp (dpi
, options
, d_left (dc
));
4642 if ((options
& DMGL_JAVA
) == 0)
4643 d_append_string (dpi
, "::");
4645 d_append_char (dpi
, '.');
4647 struct demangle_component
*local_name
= d_right (dc
);
4648 if (local_name
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
4650 d_append_string (dpi
, "{default arg#");
4651 d_append_num (dpi
, local_name
->u
.s_unary_num
.num
+ 1);
4652 d_append_string (dpi
, "}::");
4653 local_name
= local_name
->u
.s_unary_num
.sub
;
4655 d_print_comp (dpi
, options
, local_name
);
4659 case DEMANGLE_COMPONENT_TYPED_NAME
:
4661 struct d_print_mod
*hold_modifiers
;
4662 struct demangle_component
*typed_name
;
4663 struct d_print_mod adpm
[4];
4665 struct d_print_template dpt
;
4667 /* Pass the name down to the type so that it can be printed in
4668 the right place for the type. We also have to pass down
4669 any CV-qualifiers, which apply to the this parameter. */
4670 hold_modifiers
= dpi
->modifiers
;
4673 typed_name
= d_left (dc
);
4674 while (typed_name
!= NULL
)
4676 if (i
>= sizeof adpm
/ sizeof adpm
[0])
4678 d_print_error (dpi
);
4682 adpm
[i
].next
= dpi
->modifiers
;
4683 dpi
->modifiers
= &adpm
[i
];
4684 adpm
[i
].mod
= typed_name
;
4685 adpm
[i
].printed
= 0;
4686 adpm
[i
].templates
= dpi
->templates
;
4689 if (!is_fnqual_component_type (typed_name
->type
))
4692 typed_name
= d_left (typed_name
);
4695 if (typed_name
== NULL
)
4697 d_print_error (dpi
);
4701 /* If typed_name is a template, then it applies to the
4702 function type as well. */
4703 if (typed_name
->type
== DEMANGLE_COMPONENT_TEMPLATE
)
4705 dpt
.next
= dpi
->templates
;
4706 dpi
->templates
= &dpt
;
4707 dpt
.template_decl
= typed_name
;
4710 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
4711 there may be CV-qualifiers on its right argument which
4712 really apply here; this happens when parsing a class which
4713 is local to a function. */
4714 if (typed_name
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
4716 struct demangle_component
*local_name
;
4718 local_name
= d_right (typed_name
);
4719 if (local_name
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
4720 local_name
= local_name
->u
.s_unary_num
.sub
;
4721 if (local_name
== NULL
)
4723 d_print_error (dpi
);
4726 while (is_fnqual_component_type (local_name
->type
))
4728 if (i
>= sizeof adpm
/ sizeof adpm
[0])
4730 d_print_error (dpi
);
4734 adpm
[i
] = adpm
[i
- 1];
4735 adpm
[i
].next
= &adpm
[i
- 1];
4736 dpi
->modifiers
= &adpm
[i
];
4738 adpm
[i
- 1].mod
= local_name
;
4739 adpm
[i
- 1].printed
= 0;
4740 adpm
[i
- 1].templates
= dpi
->templates
;
4743 local_name
= d_left (local_name
);
4747 d_print_comp (dpi
, options
, d_right (dc
));
4749 if (typed_name
->type
== DEMANGLE_COMPONENT_TEMPLATE
)
4750 dpi
->templates
= dpt
.next
;
4752 /* If the modifiers didn't get printed by the type, print them
4757 if (! adpm
[i
].printed
)
4759 d_append_char (dpi
, ' ');
4760 d_print_mod (dpi
, options
, adpm
[i
].mod
);
4764 dpi
->modifiers
= hold_modifiers
;
4769 case DEMANGLE_COMPONENT_TEMPLATE
:
4771 struct d_print_mod
*hold_dpm
;
4772 struct demangle_component
*dcl
;
4773 const struct demangle_component
*hold_current
;
4775 /* This template may need to be referenced by a cast operator
4776 contained in its subtree. */
4777 hold_current
= dpi
->current_template
;
4778 dpi
->current_template
= dc
;
4780 /* Don't push modifiers into a template definition. Doing so
4781 could give the wrong definition for a template argument.
4782 Instead, treat the template essentially as a name. */
4784 hold_dpm
= dpi
->modifiers
;
4785 dpi
->modifiers
= NULL
;
4789 if ((options
& DMGL_JAVA
) != 0
4790 && dcl
->type
== DEMANGLE_COMPONENT_NAME
4791 && dcl
->u
.s_name
.len
== 6
4792 && strncmp (dcl
->u
.s_name
.s
, "JArray", 6) == 0)
4794 /* Special-case Java arrays, so that JArray<TYPE> appears
4795 instead as TYPE[]. */
4797 d_print_comp (dpi
, options
, d_right (dc
));
4798 d_append_string (dpi
, "[]");
4802 d_print_comp (dpi
, options
, dcl
);
4803 if (d_last_char (dpi
) == '<')
4804 d_append_char (dpi
, ' ');
4805 d_append_char (dpi
, '<');
4806 d_print_comp (dpi
, options
, d_right (dc
));
4807 /* Avoid generating two consecutive '>' characters, to avoid
4808 the C++ syntactic ambiguity. */
4809 if (d_last_char (dpi
) == '>')
4810 d_append_char (dpi
, ' ');
4811 d_append_char (dpi
, '>');
4814 dpi
->modifiers
= hold_dpm
;
4815 dpi
->current_template
= hold_current
;
4820 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
4821 if (dpi
->is_lambda_arg
)
4823 /* Show the template parm index, as that's how g++ displays
4824 these, and future proofs us against potential
4825 '[]<typename T> (T *a, T *b) {...}'. */
4826 d_append_buffer (dpi
, "auto:", 5);
4827 d_append_num (dpi
, dc
->u
.s_number
.number
+ 1);
4831 struct d_print_template
*hold_dpt
;
4832 struct demangle_component
*a
= d_lookup_template_argument (dpi
, dc
);
4834 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4835 a
= d_index_template_argument (a
, dpi
->pack_index
);
4839 d_print_error (dpi
);
4843 /* While processing this parameter, we need to pop the list
4844 of templates. This is because the template parameter may
4845 itself be a reference to a parameter of an outer
4848 hold_dpt
= dpi
->templates
;
4849 dpi
->templates
= hold_dpt
->next
;
4851 d_print_comp (dpi
, options
, a
);
4853 dpi
->templates
= hold_dpt
;
4857 case DEMANGLE_COMPONENT_CTOR
:
4858 d_print_comp (dpi
, options
, dc
->u
.s_ctor
.name
);
4861 case DEMANGLE_COMPONENT_DTOR
:
4862 d_append_char (dpi
, '~');
4863 d_print_comp (dpi
, options
, dc
->u
.s_dtor
.name
);
4866 case DEMANGLE_COMPONENT_VTABLE
:
4867 d_append_string (dpi
, "vtable for ");
4868 d_print_comp (dpi
, options
, d_left (dc
));
4871 case DEMANGLE_COMPONENT_VTT
:
4872 d_append_string (dpi
, "VTT for ");
4873 d_print_comp (dpi
, options
, d_left (dc
));
4876 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
4877 d_append_string (dpi
, "construction vtable for ");
4878 d_print_comp (dpi
, options
, d_left (dc
));
4879 d_append_string (dpi
, "-in-");
4880 d_print_comp (dpi
, options
, d_right (dc
));
4883 case DEMANGLE_COMPONENT_TYPEINFO
:
4884 d_append_string (dpi
, "typeinfo for ");
4885 d_print_comp (dpi
, options
, d_left (dc
));
4888 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
4889 d_append_string (dpi
, "typeinfo name for ");
4890 d_print_comp (dpi
, options
, d_left (dc
));
4893 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
4894 d_append_string (dpi
, "typeinfo fn for ");
4895 d_print_comp (dpi
, options
, d_left (dc
));
4898 case DEMANGLE_COMPONENT_THUNK
:
4899 d_append_string (dpi
, "non-virtual thunk to ");
4900 d_print_comp (dpi
, options
, d_left (dc
));
4903 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
4904 d_append_string (dpi
, "virtual thunk to ");
4905 d_print_comp (dpi
, options
, d_left (dc
));
4908 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
4909 d_append_string (dpi
, "covariant return thunk to ");
4910 d_print_comp (dpi
, options
, d_left (dc
));
4913 case DEMANGLE_COMPONENT_JAVA_CLASS
:
4914 d_append_string (dpi
, "java Class for ");
4915 d_print_comp (dpi
, options
, d_left (dc
));
4918 case DEMANGLE_COMPONENT_GUARD
:
4919 d_append_string (dpi
, "guard variable for ");
4920 d_print_comp (dpi
, options
, d_left (dc
));
4923 case DEMANGLE_COMPONENT_TLS_INIT
:
4924 d_append_string (dpi
, "TLS init function for ");
4925 d_print_comp (dpi
, options
, d_left (dc
));
4928 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
4929 d_append_string (dpi
, "TLS wrapper function for ");
4930 d_print_comp (dpi
, options
, d_left (dc
));
4933 case DEMANGLE_COMPONENT_REFTEMP
:
4934 d_append_string (dpi
, "reference temporary #");
4935 d_print_comp (dpi
, options
, d_right (dc
));
4936 d_append_string (dpi
, " for ");
4937 d_print_comp (dpi
, options
, d_left (dc
));
4940 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
4941 d_append_string (dpi
, "hidden alias for ");
4942 d_print_comp (dpi
, options
, d_left (dc
));
4945 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
4946 d_append_string (dpi
, "transaction clone for ");
4947 d_print_comp (dpi
, options
, d_left (dc
));
4950 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
4951 d_append_string (dpi
, "non-transaction clone for ");
4952 d_print_comp (dpi
, options
, d_left (dc
));
4955 case DEMANGLE_COMPONENT_SUB_STD
:
4956 d_append_buffer (dpi
, dc
->u
.s_string
.string
, dc
->u
.s_string
.len
);
4959 case DEMANGLE_COMPONENT_RESTRICT
:
4960 case DEMANGLE_COMPONENT_VOLATILE
:
4961 case DEMANGLE_COMPONENT_CONST
:
4963 struct d_print_mod
*pdpm
;
4965 /* When printing arrays, it's possible to have cases where the
4966 same CV-qualifier gets pushed on the stack multiple times.
4967 We only need to print it once. */
4969 for (pdpm
= dpi
->modifiers
; pdpm
!= NULL
; pdpm
= pdpm
->next
)
4971 if (! pdpm
->printed
)
4973 if (pdpm
->mod
->type
!= DEMANGLE_COMPONENT_RESTRICT
4974 && pdpm
->mod
->type
!= DEMANGLE_COMPONENT_VOLATILE
4975 && pdpm
->mod
->type
!= DEMANGLE_COMPONENT_CONST
)
4977 if (pdpm
->mod
->type
== dc
->type
)
4979 d_print_comp (dpi
, options
, d_left (dc
));
4987 case DEMANGLE_COMPONENT_REFERENCE
:
4988 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
4990 /* Handle reference smashing: & + && = &. */
4991 struct demangle_component
*sub
= d_left (dc
);
4992 if (!dpi
->is_lambda_arg
4993 && sub
->type
== DEMANGLE_COMPONENT_TEMPLATE_PARAM
)
4995 struct d_saved_scope
*scope
= d_get_saved_scope (dpi
, sub
);
4996 struct demangle_component
*a
;
5000 /* This is the first time SUB has been traversed.
5001 We need to capture the current templates so
5002 they can be restored if SUB is reentered as a
5004 d_save_scope (dpi
, sub
);
5005 if (d_print_saw_error (dpi
))
5010 const struct d_component_stack
*dcse
;
5011 int found_self_or_parent
= 0;
5013 /* This traversal is reentering SUB as a substition.
5014 If we are not beneath SUB or DC in the tree then we
5015 need to restore SUB's template stack temporarily. */
5016 for (dcse
= dpi
->component_stack
; dcse
!= NULL
;
5017 dcse
= dcse
->parent
)
5021 && dcse
!= dpi
->component_stack
))
5023 found_self_or_parent
= 1;
5028 if (!found_self_or_parent
)
5030 saved_templates
= dpi
->templates
;
5031 dpi
->templates
= scope
->templates
;
5032 need_template_restore
= 1;
5036 a
= d_lookup_template_argument (dpi
, sub
);
5037 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
5038 a
= d_index_template_argument (a
, dpi
->pack_index
);
5042 if (need_template_restore
)
5043 dpi
->templates
= saved_templates
;
5045 d_print_error (dpi
);
5052 if (sub
->type
== DEMANGLE_COMPONENT_REFERENCE
5053 || sub
->type
== dc
->type
)
5055 else if (sub
->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE
)
5056 mod_inner
= d_left (sub
);
5060 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
5061 case DEMANGLE_COMPONENT_POINTER
:
5062 case DEMANGLE_COMPONENT_COMPLEX
:
5063 case DEMANGLE_COMPONENT_IMAGINARY
:
5064 FNQUAL_COMPONENT_CASE
:
5067 /* We keep a list of modifiers on the stack. */
5068 struct d_print_mod dpm
;
5070 dpm
.next
= dpi
->modifiers
;
5071 dpi
->modifiers
= &dpm
;
5074 dpm
.templates
= dpi
->templates
;
5077 mod_inner
= d_left (dc
);
5079 d_print_comp (dpi
, options
, mod_inner
);
5081 /* If the modifier didn't get printed by the type, print it
5084 d_print_mod (dpi
, options
, dc
);
5086 dpi
->modifiers
= dpm
.next
;
5088 if (need_template_restore
)
5089 dpi
->templates
= saved_templates
;
5094 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
5095 if ((options
& DMGL_JAVA
) == 0)
5096 d_append_buffer (dpi
, dc
->u
.s_builtin
.type
->name
,
5097 dc
->u
.s_builtin
.type
->len
);
5099 d_append_buffer (dpi
, dc
->u
.s_builtin
.type
->java_name
,
5100 dc
->u
.s_builtin
.type
->java_len
);
5103 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
5104 d_print_comp (dpi
, options
, d_left (dc
));
5107 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
5109 if ((options
& DMGL_RET_POSTFIX
) != 0)
5110 d_print_function_type (dpi
,
5111 options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5112 dc
, dpi
->modifiers
);
5114 /* Print return type if present */
5115 if (d_left (dc
) != NULL
&& (options
& DMGL_RET_POSTFIX
) != 0)
5116 d_print_comp (dpi
, options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5118 else if (d_left (dc
) != NULL
&& (options
& DMGL_RET_DROP
) == 0)
5120 struct d_print_mod dpm
;
5122 /* We must pass this type down as a modifier in order to
5123 print it in the right location. */
5124 dpm
.next
= dpi
->modifiers
;
5125 dpi
->modifiers
= &dpm
;
5128 dpm
.templates
= dpi
->templates
;
5130 d_print_comp (dpi
, options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5133 dpi
->modifiers
= dpm
.next
;
5138 /* In standard prefix notation, there is a space between the
5139 return type and the function signature. */
5140 if ((options
& DMGL_RET_POSTFIX
) == 0)
5141 d_append_char (dpi
, ' ');
5144 if ((options
& DMGL_RET_POSTFIX
) == 0)
5145 d_print_function_type (dpi
,
5146 options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5147 dc
, dpi
->modifiers
);
5152 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
5154 struct d_print_mod
*hold_modifiers
;
5155 struct d_print_mod adpm
[4];
5157 struct d_print_mod
*pdpm
;
5159 /* We must pass this type down as a modifier in order to print
5160 multi-dimensional arrays correctly. If the array itself is
5161 CV-qualified, we act as though the element type were
5162 CV-qualified. We do this by copying the modifiers down
5163 rather than fiddling pointers, so that we don't wind up
5164 with a d_print_mod higher on the stack pointing into our
5165 stack frame after we return. */
5167 hold_modifiers
= dpi
->modifiers
;
5169 adpm
[0].next
= hold_modifiers
;
5170 dpi
->modifiers
= &adpm
[0];
5172 adpm
[0].printed
= 0;
5173 adpm
[0].templates
= dpi
->templates
;
5176 pdpm
= hold_modifiers
;
5178 && (pdpm
->mod
->type
== DEMANGLE_COMPONENT_RESTRICT
5179 || pdpm
->mod
->type
== DEMANGLE_COMPONENT_VOLATILE
5180 || pdpm
->mod
->type
== DEMANGLE_COMPONENT_CONST
))
5182 if (! pdpm
->printed
)
5184 if (i
>= sizeof adpm
/ sizeof adpm
[0])
5186 d_print_error (dpi
);
5191 adpm
[i
].next
= dpi
->modifiers
;
5192 dpi
->modifiers
= &adpm
[i
];
5200 d_print_comp (dpi
, options
, d_right (dc
));
5202 dpi
->modifiers
= hold_modifiers
;
5204 if (adpm
[0].printed
)
5210 d_print_mod (dpi
, options
, adpm
[i
].mod
);
5213 d_print_array_type (dpi
, options
, dc
, dpi
->modifiers
);
5218 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
5219 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
5221 struct d_print_mod dpm
;
5223 dpm
.next
= dpi
->modifiers
;
5224 dpi
->modifiers
= &dpm
;
5227 dpm
.templates
= dpi
->templates
;
5229 d_print_comp (dpi
, options
, d_right (dc
));
5231 /* If the modifier didn't get printed by the type, print it
5234 d_print_mod (dpi
, options
, dc
);
5236 dpi
->modifiers
= dpm
.next
;
5241 case DEMANGLE_COMPONENT_FIXED_TYPE
:
5242 if (dc
->u
.s_fixed
.sat
)
5243 d_append_string (dpi
, "_Sat ");
5244 /* Don't print "int _Accum". */
5245 if (dc
->u
.s_fixed
.length
->u
.s_builtin
.type
5246 != &cplus_demangle_builtin_types
['i'-'a'])
5248 d_print_comp (dpi
, options
, dc
->u
.s_fixed
.length
);
5249 d_append_char (dpi
, ' ');
5251 if (dc
->u
.s_fixed
.accum
)
5252 d_append_string (dpi
, "_Accum");
5254 d_append_string (dpi
, "_Fract");
5257 case DEMANGLE_COMPONENT_ARGLIST
:
5258 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
5259 if (d_left (dc
) != NULL
)
5260 d_print_comp (dpi
, options
, d_left (dc
));
5261 if (d_right (dc
) != NULL
)
5264 unsigned long int flush_count
;
5265 /* Make sure ", " isn't flushed by d_append_string, otherwise
5266 dpi->len -= 2 wouldn't work. */
5267 if (dpi
->len
>= sizeof (dpi
->buf
) - 2)
5268 d_print_flush (dpi
);
5269 d_append_string (dpi
, ", ");
5271 flush_count
= dpi
->flush_count
;
5272 d_print_comp (dpi
, options
, d_right (dc
));
5273 /* If that didn't print anything (which can happen with empty
5274 template argument packs), remove the comma and space. */
5275 if (dpi
->flush_count
== flush_count
&& dpi
->len
== len
)
5280 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
5282 struct demangle_component
*type
= d_left (dc
);
5283 struct demangle_component
*list
= d_right (dc
);
5286 d_print_comp (dpi
, options
, type
);
5287 d_append_char (dpi
, '{');
5288 d_print_comp (dpi
, options
, list
);
5289 d_append_char (dpi
, '}');
5293 case DEMANGLE_COMPONENT_OPERATOR
:
5295 const struct demangle_operator_info
*op
= dc
->u
.s_operator
.op
;
5298 d_append_string (dpi
, "operator");
5299 /* Add a space before new/delete. */
5300 if (IS_LOWER (op
->name
[0]))
5301 d_append_char (dpi
, ' ');
5302 /* Omit a trailing space. */
5303 if (op
->name
[len
-1] == ' ')
5305 d_append_buffer (dpi
, op
->name
, len
);
5309 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
5310 d_append_string (dpi
, "operator ");
5311 d_print_comp (dpi
, options
, dc
->u
.s_extended_operator
.name
);
5314 case DEMANGLE_COMPONENT_CONVERSION
:
5315 d_append_string (dpi
, "operator ");
5316 d_print_conversion (dpi
, options
, dc
);
5319 case DEMANGLE_COMPONENT_NULLARY
:
5320 d_print_expr_op (dpi
, options
, d_left (dc
));
5323 case DEMANGLE_COMPONENT_UNARY
:
5325 struct demangle_component
*op
= d_left (dc
);
5326 struct demangle_component
*operand
= d_right (dc
);
5327 const char *code
= NULL
;
5329 if (op
->type
== DEMANGLE_COMPONENT_OPERATOR
)
5331 code
= op
->u
.s_operator
.op
->code
;
5332 if (!strcmp (code
, "ad"))
5334 /* Don't print the argument list for the address of a
5336 if (operand
->type
== DEMANGLE_COMPONENT_TYPED_NAME
5337 && d_left (operand
)->type
== DEMANGLE_COMPONENT_QUAL_NAME
5338 && d_right (operand
)->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5339 operand
= d_left (operand
);
5341 if (operand
->type
== DEMANGLE_COMPONENT_BINARY_ARGS
)
5343 /* This indicates a suffix operator. */
5344 operand
= d_left (operand
);
5345 d_print_subexpr (dpi
, options
, operand
);
5346 d_print_expr_op (dpi
, options
, op
);
5351 /* For sizeof..., just print the pack length. */
5352 if (code
&& !strcmp (code
, "sZ"))
5354 struct demangle_component
*a
= d_find_pack (dpi
, operand
);
5355 int len
= d_pack_length (a
);
5356 d_append_num (dpi
, len
);
5359 else if (code
&& !strcmp (code
, "sP"))
5361 int len
= d_args_length (dpi
, operand
);
5362 d_append_num (dpi
, len
);
5366 if (op
->type
!= DEMANGLE_COMPONENT_CAST
)
5367 d_print_expr_op (dpi
, options
, op
);
5370 d_append_char (dpi
, '(');
5371 d_print_cast (dpi
, options
, op
);
5372 d_append_char (dpi
, ')');
5374 if (code
&& !strcmp (code
, "gs"))
5375 /* Avoid parens after '::'. */
5376 d_print_comp (dpi
, options
, operand
);
5377 else if (code
&& !strcmp (code
, "st"))
5378 /* Always print parens for sizeof (type). */
5380 d_append_char (dpi
, '(');
5381 d_print_comp (dpi
, options
, operand
);
5382 d_append_char (dpi
, ')');
5385 d_print_subexpr (dpi
, options
, operand
);
5389 case DEMANGLE_COMPONENT_BINARY
:
5390 if (d_right (dc
)->type
!= DEMANGLE_COMPONENT_BINARY_ARGS
)
5392 d_print_error (dpi
);
5396 if (op_is_new_cast (d_left (dc
)))
5398 d_print_expr_op (dpi
, options
, d_left (dc
));
5399 d_append_char (dpi
, '<');
5400 d_print_comp (dpi
, options
, d_left (d_right (dc
)));
5401 d_append_string (dpi
, ">(");
5402 d_print_comp (dpi
, options
, d_right (d_right (dc
)));
5403 d_append_char (dpi
, ')');
5407 if (d_maybe_print_fold_expression (dpi
, options
, dc
))
5410 /* We wrap an expression which uses the greater-than operator in
5411 an extra layer of parens so that it does not get confused
5412 with the '>' which ends the template parameters. */
5413 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_OPERATOR
5414 && d_left (dc
)->u
.s_operator
.op
->len
== 1
5415 && d_left (dc
)->u
.s_operator
.op
->name
[0] == '>')
5416 d_append_char (dpi
, '(');
5418 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "cl") == 0
5419 && d_left (d_right (dc
))->type
== DEMANGLE_COMPONENT_TYPED_NAME
)
5421 /* Function call used in an expression should not have printed types
5422 of the function arguments. Values of the function arguments still
5423 get printed below. */
5425 const struct demangle_component
*func
= d_left (d_right (dc
));
5427 if (d_right (func
)->type
!= DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5428 d_print_error (dpi
);
5429 d_print_subexpr (dpi
, options
, d_left (func
));
5432 d_print_subexpr (dpi
, options
, d_left (d_right (dc
)));
5433 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "ix") == 0)
5435 d_append_char (dpi
, '[');
5436 d_print_comp (dpi
, options
, d_right (d_right (dc
)));
5437 d_append_char (dpi
, ']');
5441 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "cl") != 0)
5442 d_print_expr_op (dpi
, options
, d_left (dc
));
5443 d_print_subexpr (dpi
, options
, d_right (d_right (dc
)));
5446 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_OPERATOR
5447 && d_left (dc
)->u
.s_operator
.op
->len
== 1
5448 && d_left (dc
)->u
.s_operator
.op
->name
[0] == '>')
5449 d_append_char (dpi
, ')');
5453 case DEMANGLE_COMPONENT_BINARY_ARGS
:
5454 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
5455 d_print_error (dpi
);
5458 case DEMANGLE_COMPONENT_TRINARY
:
5459 if (d_right (dc
)->type
!= DEMANGLE_COMPONENT_TRINARY_ARG1
5460 || d_right (d_right (dc
))->type
!= DEMANGLE_COMPONENT_TRINARY_ARG2
)
5462 d_print_error (dpi
);
5465 if (d_maybe_print_fold_expression (dpi
, options
, dc
))
5468 struct demangle_component
*op
= d_left (dc
);
5469 struct demangle_component
*first
= d_left (d_right (dc
));
5470 struct demangle_component
*second
= d_left (d_right (d_right (dc
)));
5471 struct demangle_component
*third
= d_right (d_right (d_right (dc
)));
5473 if (!strcmp (op
->u
.s_operator
.op
->code
, "qu"))
5475 d_print_subexpr (dpi
, options
, first
);
5476 d_print_expr_op (dpi
, options
, op
);
5477 d_print_subexpr (dpi
, options
, second
);
5478 d_append_string (dpi
, " : ");
5479 d_print_subexpr (dpi
, options
, third
);
5483 d_append_string (dpi
, "new ");
5484 if (d_left (first
) != NULL
)
5486 d_print_subexpr (dpi
, options
, first
);
5487 d_append_char (dpi
, ' ');
5489 d_print_comp (dpi
, options
, second
);
5491 d_print_subexpr (dpi
, options
, third
);
5496 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
5497 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
5498 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
5499 d_print_error (dpi
);
5502 case DEMANGLE_COMPONENT_LITERAL
:
5503 case DEMANGLE_COMPONENT_LITERAL_NEG
:
5505 enum d_builtin_type_print tp
;
5507 /* For some builtin types, produce simpler output. */
5508 tp
= D_PRINT_DEFAULT
;
5509 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
)
5511 tp
= d_left (dc
)->u
.s_builtin
.type
->print
;
5515 case D_PRINT_UNSIGNED
:
5517 case D_PRINT_UNSIGNED_LONG
:
5518 case D_PRINT_LONG_LONG
:
5519 case D_PRINT_UNSIGNED_LONG_LONG
:
5520 if (d_right (dc
)->type
== DEMANGLE_COMPONENT_NAME
)
5522 if (dc
->type
== DEMANGLE_COMPONENT_LITERAL_NEG
)
5523 d_append_char (dpi
, '-');
5524 d_print_comp (dpi
, options
, d_right (dc
));
5529 case D_PRINT_UNSIGNED
:
5530 d_append_char (dpi
, 'u');
5533 d_append_char (dpi
, 'l');
5535 case D_PRINT_UNSIGNED_LONG
:
5536 d_append_string (dpi
, "ul");
5538 case D_PRINT_LONG_LONG
:
5539 d_append_string (dpi
, "ll");
5541 case D_PRINT_UNSIGNED_LONG_LONG
:
5542 d_append_string (dpi
, "ull");
5550 if (d_right (dc
)->type
== DEMANGLE_COMPONENT_NAME
5551 && d_right (dc
)->u
.s_name
.len
== 1
5552 && dc
->type
== DEMANGLE_COMPONENT_LITERAL
)
5554 switch (d_right (dc
)->u
.s_name
.s
[0])
5557 d_append_string (dpi
, "false");
5560 d_append_string (dpi
, "true");
5573 d_append_char (dpi
, '(');
5574 d_print_comp (dpi
, options
, d_left (dc
));
5575 d_append_char (dpi
, ')');
5576 if (dc
->type
== DEMANGLE_COMPONENT_LITERAL_NEG
)
5577 d_append_char (dpi
, '-');
5578 if (tp
== D_PRINT_FLOAT
)
5579 d_append_char (dpi
, '[');
5580 d_print_comp (dpi
, options
, d_right (dc
));
5581 if (tp
== D_PRINT_FLOAT
)
5582 d_append_char (dpi
, ']');
5586 case DEMANGLE_COMPONENT_NUMBER
:
5587 d_append_num (dpi
, dc
->u
.s_number
.number
);
5590 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
5591 d_append_string (dpi
, "java resource ");
5592 d_print_comp (dpi
, options
, d_left (dc
));
5595 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
5596 d_print_comp (dpi
, options
, d_left (dc
));
5597 d_print_comp (dpi
, options
, d_right (dc
));
5600 case DEMANGLE_COMPONENT_CHARACTER
:
5601 d_append_char (dpi
, dc
->u
.s_character
.character
);
5604 case DEMANGLE_COMPONENT_DECLTYPE
:
5605 d_append_string (dpi
, "decltype (");
5606 d_print_comp (dpi
, options
, d_left (dc
));
5607 d_append_char (dpi
, ')');
5610 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
5614 struct demangle_component
*a
= d_find_pack (dpi
, d_left (dc
));
5617 /* d_find_pack won't find anything if the only packs involved
5618 in this expansion are function parameter packs; in that
5619 case, just print the pattern and "...". */
5620 d_print_subexpr (dpi
, options
, d_left (dc
));
5621 d_append_string (dpi
, "...");
5625 len
= d_pack_length (a
);
5627 for (i
= 0; i
< len
; ++i
)
5629 dpi
->pack_index
= i
;
5630 d_print_comp (dpi
, options
, dc
);
5632 d_append_string (dpi
, ", ");
5637 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
5639 long num
= dc
->u
.s_number
.number
;
5641 d_append_string (dpi
, "this");
5644 d_append_string (dpi
, "{parm#");
5645 d_append_num (dpi
, num
);
5646 d_append_char (dpi
, '}');
5651 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
5652 d_append_string (dpi
, "global constructors keyed to ");
5653 d_print_comp (dpi
, options
, dc
->u
.s_binary
.left
);
5656 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
5657 d_append_string (dpi
, "global destructors keyed to ");
5658 d_print_comp (dpi
, options
, dc
->u
.s_binary
.left
);
5661 case DEMANGLE_COMPONENT_LAMBDA
:
5662 d_append_string (dpi
, "{lambda(");
5663 /* Generic lambda auto parms are mangled as the template type
5665 dpi
->is_lambda_arg
++;
5666 d_print_comp (dpi
, options
, dc
->u
.s_unary_num
.sub
);
5667 dpi
->is_lambda_arg
--;
5668 d_append_string (dpi
, ")#");
5669 d_append_num (dpi
, dc
->u
.s_unary_num
.num
+ 1);
5670 d_append_char (dpi
, '}');
5673 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
5674 d_append_string (dpi
, "{unnamed type#");
5675 d_append_num (dpi
, dc
->u
.s_number
.number
+ 1);
5676 d_append_char (dpi
, '}');
5679 case DEMANGLE_COMPONENT_CLONE
:
5680 d_print_comp (dpi
, options
, d_left (dc
));
5681 d_append_string (dpi
, " [clone ");
5682 d_print_comp (dpi
, options
, d_right (dc
));
5683 d_append_char (dpi
, ']');
5687 d_print_error (dpi
);
5693 d_print_comp (struct d_print_info
*dpi
, int options
,
5694 struct demangle_component
*dc
)
5696 struct d_component_stack self
;
5697 if (dc
== NULL
|| dc
->d_printing
> 1 || dpi
->recursion
> MAX_RECURSION_COUNT
)
5699 d_print_error (dpi
);
5707 self
.parent
= dpi
->component_stack
;
5708 dpi
->component_stack
= &self
;
5710 d_print_comp_inner (dpi
, options
, dc
);
5712 dpi
->component_stack
= self
.parent
;
5717 /* Print a Java dentifier. For Java we try to handle encoded extended
5718 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
5719 so we don't it for C++. Characters are encoded as
5723 d_print_java_identifier (struct d_print_info
*dpi
, const char *name
, int len
)
5729 for (p
= name
; p
< end
; ++p
)
5740 for (q
= p
+ 3; q
< end
; ++q
)
5746 else if (*q
>= 'A' && *q
<= 'F')
5747 dig
= *q
- 'A' + 10;
5748 else if (*q
>= 'a' && *q
<= 'f')
5749 dig
= *q
- 'a' + 10;
5755 /* If the Unicode character is larger than 256, we don't try
5756 to deal with it here. FIXME. */
5757 if (q
< end
&& *q
== '_' && c
< 256)
5759 d_append_char (dpi
, c
);
5765 d_append_char (dpi
, *p
);
5769 /* Print a list of modifiers. SUFFIX is 1 if we are printing
5770 qualifiers on this after printing a function. */
5773 d_print_mod_list (struct d_print_info
*dpi
, int options
,
5774 struct d_print_mod
*mods
, int suffix
)
5776 struct d_print_template
*hold_dpt
;
5778 if (mods
== NULL
|| d_print_saw_error (dpi
))
5783 && (is_fnqual_component_type (mods
->mod
->type
))))
5785 d_print_mod_list (dpi
, options
, mods
->next
, suffix
);
5791 hold_dpt
= dpi
->templates
;
5792 dpi
->templates
= mods
->templates
;
5794 if (mods
->mod
->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5796 d_print_function_type (dpi
, options
, mods
->mod
, mods
->next
);
5797 dpi
->templates
= hold_dpt
;
5800 else if (mods
->mod
->type
== DEMANGLE_COMPONENT_ARRAY_TYPE
)
5802 d_print_array_type (dpi
, options
, mods
->mod
, mods
->next
);
5803 dpi
->templates
= hold_dpt
;
5806 else if (mods
->mod
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
5808 struct d_print_mod
*hold_modifiers
;
5809 struct demangle_component
*dc
;
5811 /* When this is on the modifier stack, we have pulled any
5812 qualifiers off the right argument already. Otherwise, we
5813 print it as usual, but don't let the left argument see any
5816 hold_modifiers
= dpi
->modifiers
;
5817 dpi
->modifiers
= NULL
;
5818 d_print_comp (dpi
, options
, d_left (mods
->mod
));
5819 dpi
->modifiers
= hold_modifiers
;
5821 if ((options
& DMGL_JAVA
) == 0)
5822 d_append_string (dpi
, "::");
5824 d_append_char (dpi
, '.');
5826 dc
= d_right (mods
->mod
);
5828 if (dc
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
5830 d_append_string (dpi
, "{default arg#");
5831 d_append_num (dpi
, dc
->u
.s_unary_num
.num
+ 1);
5832 d_append_string (dpi
, "}::");
5833 dc
= dc
->u
.s_unary_num
.sub
;
5836 while (is_fnqual_component_type (dc
->type
))
5839 d_print_comp (dpi
, options
, dc
);
5841 dpi
->templates
= hold_dpt
;
5845 d_print_mod (dpi
, options
, mods
->mod
);
5847 dpi
->templates
= hold_dpt
;
5849 d_print_mod_list (dpi
, options
, mods
->next
, suffix
);
5852 /* Print a modifier. */
5855 d_print_mod (struct d_print_info
*dpi
, int options
,
5856 struct demangle_component
*mod
)
5860 case DEMANGLE_COMPONENT_RESTRICT
:
5861 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
5862 d_append_string (dpi
, " restrict");
5864 case DEMANGLE_COMPONENT_VOLATILE
:
5865 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
5866 d_append_string (dpi
, " volatile");
5868 case DEMANGLE_COMPONENT_CONST
:
5869 case DEMANGLE_COMPONENT_CONST_THIS
:
5870 d_append_string (dpi
, " const");
5872 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
5873 d_append_string (dpi
, " transaction_safe");
5875 case DEMANGLE_COMPONENT_NOEXCEPT
:
5876 d_append_string (dpi
, " noexcept");
5879 d_append_char (dpi
, '(');
5880 d_print_comp (dpi
, options
, d_right (mod
));
5881 d_append_char (dpi
, ')');
5884 case DEMANGLE_COMPONENT_THROW_SPEC
:
5885 d_append_string (dpi
, " throw");
5888 d_append_char (dpi
, '(');
5889 d_print_comp (dpi
, options
, d_right (mod
));
5890 d_append_char (dpi
, ')');
5893 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
5894 d_append_char (dpi
, ' ');
5895 d_print_comp (dpi
, options
, d_right (mod
));
5897 case DEMANGLE_COMPONENT_POINTER
:
5898 /* There is no pointer symbol in Java. */
5899 if ((options
& DMGL_JAVA
) == 0)
5900 d_append_char (dpi
, '*');
5902 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
5903 /* For the ref-qualifier, put a space before the &. */
5904 d_append_char (dpi
, ' ');
5906 case DEMANGLE_COMPONENT_REFERENCE
:
5907 d_append_char (dpi
, '&');
5909 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
5910 d_append_char (dpi
, ' ');
5912 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
5913 d_append_string (dpi
, "&&");
5915 case DEMANGLE_COMPONENT_COMPLEX
:
5916 d_append_string (dpi
, "complex ");
5918 case DEMANGLE_COMPONENT_IMAGINARY
:
5919 d_append_string (dpi
, "imaginary ");
5921 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
5922 if (d_last_char (dpi
) != '(')
5923 d_append_char (dpi
, ' ');
5924 d_print_comp (dpi
, options
, d_left (mod
));
5925 d_append_string (dpi
, "::*");
5927 case DEMANGLE_COMPONENT_TYPED_NAME
:
5928 d_print_comp (dpi
, options
, d_left (mod
));
5930 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
5931 d_append_string (dpi
, " __vector(");
5932 d_print_comp (dpi
, options
, d_left (mod
));
5933 d_append_char (dpi
, ')');
5937 /* Otherwise, we have something that won't go back on the
5938 modifier stack, so we can just print it. */
5939 d_print_comp (dpi
, options
, mod
);
5944 /* Print a function type, except for the return type. */
5947 d_print_function_type (struct d_print_info
*dpi
, int options
,
5948 struct demangle_component
*dc
,
5949 struct d_print_mod
*mods
)
5953 struct d_print_mod
*p
;
5954 struct d_print_mod
*hold_modifiers
;
5958 for (p
= mods
; p
!= NULL
; p
= p
->next
)
5963 switch (p
->mod
->type
)
5965 case DEMANGLE_COMPONENT_POINTER
:
5966 case DEMANGLE_COMPONENT_REFERENCE
:
5967 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
5970 case DEMANGLE_COMPONENT_RESTRICT
:
5971 case DEMANGLE_COMPONENT_VOLATILE
:
5972 case DEMANGLE_COMPONENT_CONST
:
5973 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
5974 case DEMANGLE_COMPONENT_COMPLEX
:
5975 case DEMANGLE_COMPONENT_IMAGINARY
:
5976 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
5980 FNQUAL_COMPONENT_CASE
:
5993 if (d_last_char (dpi
) != '('
5994 && d_last_char (dpi
) != '*')
5997 if (need_space
&& d_last_char (dpi
) != ' ')
5998 d_append_char (dpi
, ' ');
5999 d_append_char (dpi
, '(');
6002 hold_modifiers
= dpi
->modifiers
;
6003 dpi
->modifiers
= NULL
;
6005 d_print_mod_list (dpi
, options
, mods
, 0);
6008 d_append_char (dpi
, ')');
6010 d_append_char (dpi
, '(');
6012 if (d_right (dc
) != NULL
)
6013 d_print_comp (dpi
, options
, d_right (dc
));
6015 d_append_char (dpi
, ')');
6017 d_print_mod_list (dpi
, options
, mods
, 1);
6019 dpi
->modifiers
= hold_modifiers
;
6022 /* Print an array type, except for the element type. */
6025 d_print_array_type (struct d_print_info
*dpi
, int options
,
6026 struct demangle_component
*dc
,
6027 struct d_print_mod
*mods
)
6035 struct d_print_mod
*p
;
6038 for (p
= mods
; p
!= NULL
; p
= p
->next
)
6042 if (p
->mod
->type
== DEMANGLE_COMPONENT_ARRAY_TYPE
)
6057 d_append_string (dpi
, " (");
6059 d_print_mod_list (dpi
, options
, mods
, 0);
6062 d_append_char (dpi
, ')');
6066 d_append_char (dpi
, ' ');
6068 d_append_char (dpi
, '[');
6070 if (d_left (dc
) != NULL
)
6071 d_print_comp (dpi
, options
, d_left (dc
));
6073 d_append_char (dpi
, ']');
6076 /* Print an operator in an expression. */
6079 d_print_expr_op (struct d_print_info
*dpi
, int options
,
6080 struct demangle_component
*dc
)
6082 if (dc
->type
== DEMANGLE_COMPONENT_OPERATOR
)
6083 d_append_buffer (dpi
, dc
->u
.s_operator
.op
->name
,
6084 dc
->u
.s_operator
.op
->len
);
6086 d_print_comp (dpi
, options
, dc
);
6092 d_print_cast (struct d_print_info
*dpi
, int options
,
6093 struct demangle_component
*dc
)
6095 d_print_comp (dpi
, options
, d_left (dc
));
6098 /* Print a conversion operator. */
6101 d_print_conversion (struct d_print_info
*dpi
, int options
,
6102 struct demangle_component
*dc
)
6104 struct d_print_template dpt
;
6106 /* For a conversion operator, we need the template parameters from
6107 the enclosing template in scope for processing the type. */
6108 if (dpi
->current_template
!= NULL
)
6110 dpt
.next
= dpi
->templates
;
6111 dpi
->templates
= &dpt
;
6112 dpt
.template_decl
= dpi
->current_template
;
6115 if (d_left (dc
)->type
!= DEMANGLE_COMPONENT_TEMPLATE
)
6117 d_print_comp (dpi
, options
, d_left (dc
));
6118 if (dpi
->current_template
!= NULL
)
6119 dpi
->templates
= dpt
.next
;
6123 d_print_comp (dpi
, options
, d_left (d_left (dc
)));
6125 /* For a templated cast operator, we need to remove the template
6126 parameters from scope after printing the operator name,
6127 so we need to handle the template printing here. */
6128 if (dpi
->current_template
!= NULL
)
6129 dpi
->templates
= dpt
.next
;
6131 if (d_last_char (dpi
) == '<')
6132 d_append_char (dpi
, ' ');
6133 d_append_char (dpi
, '<');
6134 d_print_comp (dpi
, options
, d_right (d_left (dc
)));
6135 /* Avoid generating two consecutive '>' characters, to avoid
6136 the C++ syntactic ambiguity. */
6137 if (d_last_char (dpi
) == '>')
6138 d_append_char (dpi
, ' ');
6139 d_append_char (dpi
, '>');
6143 /* Initialize the information structure we use to pass around
6146 CP_STATIC_IF_GLIBCPP_V3
6148 cplus_demangle_init_info (const char *mangled
, int options
, size_t len
,
6152 di
->send
= mangled
+ len
;
6153 di
->options
= options
;
6157 /* We can not need more components than twice the number of chars in
6158 the mangled string. Most components correspond directly to
6159 chars, but the ARGLIST types are exceptions. */
6160 di
->num_comps
= 2 * len
;
6163 /* Similarly, we can not need more substitutions than there are
6164 chars in the mangled string. */
6168 di
->last_name
= NULL
;
6171 di
->is_expression
= 0;
6172 di
->is_conversion
= 0;
6175 /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
6176 mangled name, return strings in repeated callback giving the demangled
6177 name. OPTIONS is the usual libiberty demangler options. On success,
6178 this returns 1. On failure, returns 0. */
6181 d_demangle_callback (const char *mangled
, int options
,
6182 demangle_callbackref callback
, void *opaque
)
6193 struct demangle_component
*dc
;
6196 if (mangled
[0] == '_' && mangled
[1] == 'Z')
6198 else if (strncmp (mangled
, "_GLOBAL_", 8) == 0
6199 && (mangled
[8] == '.' || mangled
[8] == '_' || mangled
[8] == '$')
6200 && (mangled
[9] == 'D' || mangled
[9] == 'I')
6201 && mangled
[10] == '_')
6202 type
= mangled
[9] == 'I' ? DCT_GLOBAL_CTORS
: DCT_GLOBAL_DTORS
;
6205 if ((options
& DMGL_TYPES
) == 0)
6210 cplus_demangle_init_info (mangled
, options
, strlen (mangled
), &di
);
6213 #ifdef CP_DYNAMIC_ARRAYS
6214 __extension__
struct demangle_component comps
[di
.num_comps
];
6215 __extension__
struct demangle_component
*subs
[di
.num_subs
];
6220 di
.comps
= alloca (di
.num_comps
* sizeof (*di
.comps
));
6221 di
.subs
= alloca (di
.num_subs
* sizeof (*di
.subs
));
6227 dc
= cplus_demangle_type (&di
);
6230 dc
= cplus_demangle_mangled_name (&di
, 1);
6232 case DCT_GLOBAL_CTORS
:
6233 case DCT_GLOBAL_DTORS
:
6234 d_advance (&di
, 11);
6235 dc
= d_make_comp (&di
,
6236 (type
== DCT_GLOBAL_CTORS
6237 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
6238 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
),
6239 d_make_demangle_mangled_name (&di
, d_str (&di
)),
6241 d_advance (&di
, strlen (d_str (&di
)));
6244 abort (); /* We have listed all the cases. */
6247 /* If DMGL_PARAMS is set, then if we didn't consume the entire
6248 mangled string, then we didn't successfully demangle it. If
6249 DMGL_PARAMS is not set, we didn't look at the trailing
6251 if (((options
& DMGL_PARAMS
) != 0) && d_peek_char (&di
) != '\0')
6254 #ifdef CP_DEMANGLE_DEBUG
6258 status
= (dc
!= NULL
)
6259 ? cplus_demangle_print_callback (options
, dc
, callback
, opaque
)
6266 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
6267 name, return a buffer allocated with malloc holding the demangled
6268 name. OPTIONS is the usual libiberty demangler options. On
6269 success, this sets *PALC to the allocated size of the returned
6270 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
6271 a memory allocation failure, and returns NULL. */
6274 d_demangle (const char *mangled
, int options
, size_t *palc
)
6276 struct d_growable_string dgs
;
6279 d_growable_string_init (&dgs
, 0);
6281 status
= d_demangle_callback (mangled
, options
,
6282 d_growable_string_callback_adapter
, &dgs
);
6290 *palc
= dgs
.allocation_failure
? 1 : dgs
.alc
;
6294 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
6296 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
6298 /* ia64 ABI-mandated entry point in the C++ runtime library for
6299 performing demangling. MANGLED_NAME is a NUL-terminated character
6300 string containing the name to be demangled.
6302 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
6303 *LENGTH bytes, into which the demangled name is stored. If
6304 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
6305 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
6306 is placed in a region of memory allocated with malloc.
6308 If LENGTH is non-NULL, the length of the buffer containing the
6309 demangled name, is placed in *LENGTH.
6311 The return value is a pointer to the start of the NUL-terminated
6312 demangled name, or NULL if the demangling fails. The caller is
6313 responsible for deallocating this memory using free.
6315 *STATUS is set to one of the following values:
6316 0: The demangling operation succeeded.
6317 -1: A memory allocation failure occurred.
6318 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6319 -3: One of the arguments is invalid.
6321 The demangling is performed using the C++ ABI mangling rules, with
6325 __cxa_demangle (const char *mangled_name
, char *output_buffer
,
6326 size_t *length
, int *status
)
6331 if (mangled_name
== NULL
)
6338 if (output_buffer
!= NULL
&& length
== NULL
)
6345 demangled
= d_demangle (mangled_name
, DMGL_PARAMS
| DMGL_TYPES
, &alc
);
6347 if (demangled
== NULL
)
6359 if (output_buffer
== NULL
)
6366 if (strlen (demangled
) < *length
)
6368 strcpy (output_buffer
, demangled
);
6370 demangled
= output_buffer
;
6374 free (output_buffer
);
6385 extern int __gcclibcxx_demangle_callback (const char *,
6387 (const char *, size_t, void *),
6390 /* Alternative, allocationless entry point in the C++ runtime library
6391 for performing demangling. MANGLED_NAME is a NUL-terminated character
6392 string containing the name to be demangled.
6394 CALLBACK is a callback function, called with demangled string
6395 segments as demangling progresses; it is called at least once,
6396 but may be called more than once. OPAQUE is a generalized pointer
6397 used as a callback argument.
6399 The return code is one of the following values, equivalent to
6400 the STATUS values of __cxa_demangle() (excluding -1, since this
6401 function performs no memory allocations):
6402 0: The demangling operation succeeded.
6403 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6404 -3: One of the arguments is invalid.
6406 The demangling is performed using the C++ ABI mangling rules, with
6410 __gcclibcxx_demangle_callback (const char *mangled_name
,
6411 void (*callback
) (const char *, size_t, void *),
6416 if (mangled_name
== NULL
|| callback
== NULL
)
6419 status
= d_demangle_callback (mangled_name
, DMGL_PARAMS
| DMGL_TYPES
,
6427 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
6429 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
6430 mangled name, return a buffer allocated with malloc holding the
6431 demangled name. Otherwise, return NULL. */
6434 cplus_demangle_v3 (const char *mangled
, int options
)
6438 return d_demangle (mangled
, options
, &alc
);
6442 cplus_demangle_v3_callback (const char *mangled
, int options
,
6443 demangle_callbackref callback
, void *opaque
)
6445 return d_demangle_callback (mangled
, options
, callback
, opaque
);
6448 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
6449 conventions, but the output formatting is a little different.
6450 This instructs the C++ demangler not to emit pointer characters ("*"), to
6451 use Java's namespace separator symbol ("." instead of "::"), and to output
6452 JArray<TYPE> as TYPE[]. */
6455 java_demangle_v3 (const char *mangled
)
6459 return d_demangle (mangled
, DMGL_JAVA
| DMGL_PARAMS
| DMGL_RET_POSTFIX
, &alc
);
6463 java_demangle_v3_callback (const char *mangled
,
6464 demangle_callbackref callback
, void *opaque
)
6466 return d_demangle_callback (mangled
,
6467 DMGL_JAVA
| DMGL_PARAMS
| DMGL_RET_POSTFIX
,
6471 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
6473 #ifndef IN_GLIBCPP_V3
6475 /* Demangle a string in order to find out whether it is a constructor
6476 or destructor. Return non-zero on success. Set *CTOR_KIND and
6477 *DTOR_KIND appropriately. */
6480 is_ctor_or_dtor (const char *mangled
,
6481 enum gnu_v3_ctor_kinds
*ctor_kind
,
6482 enum gnu_v3_dtor_kinds
*dtor_kind
)
6485 struct demangle_component
*dc
;
6488 *ctor_kind
= (enum gnu_v3_ctor_kinds
) 0;
6489 *dtor_kind
= (enum gnu_v3_dtor_kinds
) 0;
6491 cplus_demangle_init_info (mangled
, DMGL_GNU_V3
, strlen (mangled
), &di
);
6494 #ifdef CP_DYNAMIC_ARRAYS
6495 __extension__
struct demangle_component comps
[di
.num_comps
];
6496 __extension__
struct demangle_component
*subs
[di
.num_subs
];
6501 di
.comps
= alloca (di
.num_comps
* sizeof (*di
.comps
));
6502 di
.subs
= alloca (di
.num_subs
* sizeof (*di
.subs
));
6505 dc
= cplus_demangle_mangled_name (&di
, 1);
6507 /* Note that because we did not pass DMGL_PARAMS, we don't expect
6508 to demangle the entire string. */
6515 /* These cannot appear on a constructor or destructor. */
6516 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
6517 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
6518 case DEMANGLE_COMPONENT_CONST_THIS
:
6519 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
6520 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
6524 case DEMANGLE_COMPONENT_TYPED_NAME
:
6525 case DEMANGLE_COMPONENT_TEMPLATE
:
6528 case DEMANGLE_COMPONENT_QUAL_NAME
:
6529 case DEMANGLE_COMPONENT_LOCAL_NAME
:
6532 case DEMANGLE_COMPONENT_CTOR
:
6533 *ctor_kind
= dc
->u
.s_ctor
.kind
;
6537 case DEMANGLE_COMPONENT_DTOR
:
6538 *dtor_kind
= dc
->u
.s_dtor
.kind
;
6549 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
6550 name. A non-zero return indicates the type of constructor. */
6552 enum gnu_v3_ctor_kinds
6553 is_gnu_v3_mangled_ctor (const char *name
)
6555 enum gnu_v3_ctor_kinds ctor_kind
;
6556 enum gnu_v3_dtor_kinds dtor_kind
;
6558 if (! is_ctor_or_dtor (name
, &ctor_kind
, &dtor_kind
))
6559 return (enum gnu_v3_ctor_kinds
) 0;
6564 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
6565 name. A non-zero return indicates the type of destructor. */
6567 enum gnu_v3_dtor_kinds
6568 is_gnu_v3_mangled_dtor (const char *name
)
6570 enum gnu_v3_ctor_kinds ctor_kind
;
6571 enum gnu_v3_dtor_kinds dtor_kind
;
6573 if (! is_ctor_or_dtor (name
, &ctor_kind
, &dtor_kind
))
6574 return (enum gnu_v3_dtor_kinds
) 0;
6578 #endif /* IN_GLIBCPP_V3 */
6580 #ifdef STANDALONE_DEMANGLER
6583 #include "dyn-string.h"
6585 static void print_usage (FILE* fp
, int exit_value
);
6587 #define IS_ALPHA(CHAR) \
6588 (((CHAR) >= 'a' && (CHAR) <= 'z') \
6589 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
6591 /* Non-zero if CHAR is a character than can occur in a mangled name. */
6592 #define is_mangled_char(CHAR) \
6593 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
6594 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
6596 /* The name of this program, as invoked. */
6597 const char* program_name
;
6599 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
6602 print_usage (FILE* fp
, int exit_value
)
6604 fprintf (fp
, "Usage: %s [options] [names ...]\n", program_name
);
6605 fprintf (fp
, "Options:\n");
6606 fprintf (fp
, " -h,--help Display this message.\n");
6607 fprintf (fp
, " -p,--no-params Don't display function parameters\n");
6608 fprintf (fp
, " -v,--verbose Produce verbose demanglings.\n");
6609 fprintf (fp
, "If names are provided, they are demangled. Otherwise filters standard input.\n");
6614 /* Option specification for getopt_long. */
6615 static const struct option long_options
[] =
6617 { "help", no_argument
, NULL
, 'h' },
6618 { "no-params", no_argument
, NULL
, 'p' },
6619 { "verbose", no_argument
, NULL
, 'v' },
6620 { NULL
, no_argument
, NULL
, 0 },
6623 /* Main entry for a demangling filter executable. It will demangle
6624 its command line arguments, if any. If none are provided, it will
6625 filter stdin to stdout, replacing any recognized mangled C++ names
6626 with their demangled equivalents. */
6629 main (int argc
, char *argv
[])
6633 int options
= DMGL_PARAMS
| DMGL_ANSI
| DMGL_TYPES
;
6635 /* Use the program name of this program, as invoked. */
6636 program_name
= argv
[0];
6638 /* Parse options. */
6641 opt_char
= getopt_long (argc
, argv
, "hpv", long_options
, NULL
);
6644 case '?': /* Unrecognized option. */
6645 print_usage (stderr
, 1);
6649 print_usage (stdout
, 0);
6653 options
&= ~ DMGL_PARAMS
;
6657 options
|= DMGL_VERBOSE
;
6661 while (opt_char
!= -1);
6664 /* No command line arguments were provided. Filter stdin. */
6666 dyn_string_t mangled
= dyn_string_new (3);
6669 /* Read all of input. */
6670 while (!feof (stdin
))
6674 /* Pile characters into mangled until we hit one that can't
6675 occur in a mangled name. */
6677 while (!feof (stdin
) && is_mangled_char (c
))
6679 dyn_string_append_char (mangled
, c
);
6685 if (dyn_string_length (mangled
) > 0)
6687 #ifdef IN_GLIBCPP_V3
6688 s
= __cxa_demangle (dyn_string_buf (mangled
), NULL
, NULL
, NULL
);
6690 s
= cplus_demangle_v3 (dyn_string_buf (mangled
), options
);
6700 /* It might not have been a mangled name. Print the
6702 fputs (dyn_string_buf (mangled
), stdout
);
6705 dyn_string_clear (mangled
);
6708 /* If we haven't hit EOF yet, we've read one character that
6709 can't occur in a mangled name, so print it out. */
6714 dyn_string_delete (mangled
);
6717 /* Demangle command line arguments. */
6719 /* Loop over command line arguments. */
6720 for (i
= optind
; i
< argc
; ++i
)
6723 #ifdef IN_GLIBCPP_V3
6727 /* Attempt to demangle. */
6728 #ifdef IN_GLIBCPP_V3
6729 s
= __cxa_demangle (argv
[i
], NULL
, NULL
, &status
);
6731 s
= cplus_demangle_v3 (argv
[i
], options
);
6734 /* If it worked, print the demangled name. */
6742 #ifdef IN_GLIBCPP_V3
6743 fprintf (stderr
, "Failed: %s (status %d)\n", argv
[i
], status
);
6745 fprintf (stderr
, "Failed: %s\n", argv
[i
]);
6754 #endif /* STANDALONE_DEMANGLER */