1 /* Demangler for g++ V3 ABI.
2 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2014
3 Free Software Foundation, Inc.
4 Written by Ian Lance Taylor <ian@wasabisystems.com>.
6 This file is part of the libiberty library, which is part of GCC.
8 This file is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 In addition to the permissions in the GNU General Public License, the
14 Free Software Foundation gives you unlimited permission to link the
15 compiled version of this file into combinations with other programs,
16 and to distribute those combinations without any restriction coming
17 from the use of this file. (The General Public License restrictions
18 do apply in other respects; for example, they cover modification of
19 the file, and distribution when not linked into a combined
22 This program is distributed in the hope that it will be useful,
23 but WITHOUT ANY WARRANTY; without even the implied warranty of
24 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 GNU General Public License for more details.
27 You should have received a copy of the GNU General Public License
28 along with this program; if not, write to the Free Software
29 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
32 /* This code implements a demangler for the g++ V3 ABI. The ABI is
33 described on this web page:
34 http://www.codesourcery.com/cxx-abi/abi.html#mangling
36 This code was written while looking at the demangler written by
37 Alex Samuel <samuel@codesourcery.com>.
39 This code first pulls the mangled name apart into a list of
40 components, and then walks the list generating the demangled
43 This file will normally define the following functions, q.v.:
44 char *cplus_demangle_v3(const char *mangled, int options)
45 char *java_demangle_v3(const char *mangled)
46 int cplus_demangle_v3_callback(const char *mangled, int options,
47 demangle_callbackref callback)
48 int java_demangle_v3_callback(const char *mangled,
49 demangle_callbackref callback)
50 enum gnu_v3_ctor_kinds is_gnu_v3_mangled_ctor (const char *name)
51 enum gnu_v3_dtor_kinds is_gnu_v3_mangled_dtor (const char *name)
53 Also, the interface to the component list is public, and defined in
54 demangle.h. The interface consists of these types, which are
55 defined in demangle.h:
56 enum demangle_component_type
57 struct demangle_component
59 and these functions defined in this file:
60 cplus_demangle_fill_name
61 cplus_demangle_fill_extended_operator
62 cplus_demangle_fill_ctor
63 cplus_demangle_fill_dtor
65 cplus_demangle_print_callback
66 and other functions defined in the file cp-demint.c.
68 This file also defines some other functions and variables which are
69 only to be used by the file cp-demint.c.
71 Preprocessor macros you can define while compiling this file:
74 If defined, this file defines the following functions, q.v.:
75 char *__cxa_demangle (const char *mangled, char *buf, size_t *len,
77 int __gcclibcxx_demangle_callback (const char *,
79 (const char *, size_t, void *),
81 instead of cplus_demangle_v3[_callback]() and
82 java_demangle_v3[_callback]().
85 If defined, this file defines only __cxa_demangle() and
86 __gcclibcxx_demangle_callback(), and no other publically visible
87 functions or variables.
90 If defined, this file defines a main() function which demangles
91 any arguments, or, if none, demangles stdin.
94 If defined, turns on debugging mode, which prints information on
95 stdout about the mangled string. This is not generally useful.
98 If defined, additional sanity checks will be performed. It will
99 cause some slowdown, but will allow to catch out-of-bound access
100 errors earlier. This macro is intended for testing and debugging. */
102 #if defined (_AIX) && !defined (__GNUC__)
124 # define alloca __builtin_alloca
126 extern char *alloca ();
127 # endif /* __GNUC__ */
129 #endif /* HAVE_ALLOCA_H */
135 # define INT_MAX (int)(((unsigned int) ~0) >> 1) /* 0x7FFFFFFF */
138 #include "ansidecl.h"
139 #include "libiberty.h"
140 #include "demangle.h"
141 #include "cp-demangle.h"
143 /* If IN_GLIBCPP_V3 is defined, some functions are made static. We
144 also rename them via #define to avoid compiler errors when the
145 static definition conflicts with the extern declaration in a header
149 #define CP_STATIC_IF_GLIBCPP_V3 static
151 #define cplus_demangle_fill_name d_fill_name
152 static int d_fill_name (struct demangle_component
*, const char *, int);
154 #define cplus_demangle_fill_extended_operator d_fill_extended_operator
156 d_fill_extended_operator (struct demangle_component
*, int,
157 struct demangle_component
*);
159 #define cplus_demangle_fill_ctor d_fill_ctor
161 d_fill_ctor (struct demangle_component
*, enum gnu_v3_ctor_kinds
,
162 struct demangle_component
*);
164 #define cplus_demangle_fill_dtor d_fill_dtor
166 d_fill_dtor (struct demangle_component
*, enum gnu_v3_dtor_kinds
,
167 struct demangle_component
*);
169 #define cplus_demangle_mangled_name d_mangled_name
170 static struct demangle_component
*d_mangled_name (struct d_info
*, int);
172 #define cplus_demangle_type d_type
173 static struct demangle_component
*d_type (struct d_info
*);
175 #define cplus_demangle_print d_print
176 static char *d_print (int, const struct demangle_component
*, int, size_t *);
178 #define cplus_demangle_print_callback d_print_callback
179 static int d_print_callback (int, const struct demangle_component
*,
180 demangle_callbackref
, void *);
182 #define cplus_demangle_init_info d_init_info
183 static void d_init_info (const char *, int, size_t, struct d_info
*);
185 #else /* ! defined(IN_GLIBCPP_V3) */
186 #define CP_STATIC_IF_GLIBCPP_V3
187 #endif /* ! defined(IN_GLIBCPP_V3) */
189 /* See if the compiler supports dynamic arrays. */
192 #define CP_DYNAMIC_ARRAYS
195 #ifdef __STDC_VERSION__
196 #if __STDC_VERSION__ >= 199901L
197 #define CP_DYNAMIC_ARRAYS
198 #endif /* __STDC__VERSION >= 199901L */
199 #endif /* defined (__STDC_VERSION__) */
200 #endif /* defined (__STDC__) */
201 #endif /* ! defined (__GNUC__) */
203 /* We avoid pulling in the ctype tables, to prevent pulling in
204 additional unresolved symbols when this code is used in a library.
205 FIXME: Is this really a valid reason? This comes from the original
208 As of this writing this file has the following undefined references
209 when compiled with -DIN_GLIBCPP_V3: realloc, free, memcpy, strcpy,
212 #define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
213 #define IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z')
214 #define IS_LOWER(c) ((c) >= 'a' && (c) <= 'z')
216 /* The prefix prepended by GCC to an identifier represnting the
217 anonymous namespace. */
218 #define ANONYMOUS_NAMESPACE_PREFIX "_GLOBAL_"
219 #define ANONYMOUS_NAMESPACE_PREFIX_LEN \
220 (sizeof (ANONYMOUS_NAMESPACE_PREFIX) - 1)
222 /* Information we keep for the standard substitutions. */
224 struct d_standard_sub_info
226 /* The code for this substitution. */
228 /* The simple string it expands to. */
229 const char *simple_expansion
;
230 /* The length of the simple expansion. */
232 /* The results of a full, verbose, expansion. This is used when
233 qualifying a constructor/destructor, or when in verbose mode. */
234 const char *full_expansion
;
235 /* The length of the full expansion. */
237 /* What to set the last_name field of d_info to; NULL if we should
238 not set it. This is only relevant when qualifying a
239 constructor/destructor. */
240 const char *set_last_name
;
241 /* The length of set_last_name. */
242 int set_last_name_len
;
245 /* Accessors for subtrees of struct demangle_component. */
247 #define d_left(dc) ((dc)->u.s_binary.left)
248 #define d_right(dc) ((dc)->u.s_binary.right)
250 /* A list of templates. This is used while printing. */
252 struct d_print_template
254 /* Next template on the list. */
255 struct d_print_template
*next
;
257 const struct demangle_component
*template_decl
;
260 /* A list of type modifiers. This is used while printing. */
264 /* Next modifier on the list. These are in the reverse of the order
265 in which they appeared in the mangled string. */
266 struct d_print_mod
*next
;
268 const struct demangle_component
*mod
;
269 /* Whether this modifier was printed. */
271 /* The list of templates which applies to this modifier. */
272 struct d_print_template
*templates
;
275 /* We use these structures to hold information during printing. */
277 struct d_growable_string
279 /* Buffer holding the result. */
281 /* Current length of data in buffer. */
283 /* Allocated size of buffer. */
285 /* Set to 1 if we had a memory allocation failure. */
286 int allocation_failure
;
289 /* Stack of components, innermost first, used to avoid loops. */
291 struct d_component_stack
293 /* This component. */
294 const struct demangle_component
*dc
;
295 /* This component's parent. */
296 const struct d_component_stack
*parent
;
299 /* A demangle component and some scope captured when it was first
304 /* The component whose scope this is. */
305 const struct demangle_component
*container
;
306 /* The list of templates, if any, that was current when this
307 scope was captured. */
308 struct d_print_template
*templates
;
311 /* Checkpoint structure to allow backtracking. This holds copies
312 of the fields of struct d_info that need to be restored
313 if a trial parse needs to be backtracked over. */
315 struct d_info_checkpoint
324 enum { D_PRINT_BUFFER_LENGTH
= 256 };
327 /* Fixed-length allocated buffer for demangled data, flushed to the
328 callback with a NUL termination once full. */
329 char buf
[D_PRINT_BUFFER_LENGTH
];
330 /* Current length of data in buffer. */
332 /* The last character printed, saved individually so that it survives
335 /* Callback function to handle demangled buffer flush. */
336 demangle_callbackref callback
;
337 /* Opaque callback argument. */
339 /* The current list of templates, if any. */
340 struct d_print_template
*templates
;
341 /* The current list of modifiers (e.g., pointer, reference, etc.),
343 struct d_print_mod
*modifiers
;
344 /* Set to 1 if we saw a demangling error. */
345 int demangle_failure
;
346 /* The current index into any template argument packs we are using
347 for printing, or -1 to print the whole pack. */
349 /* Number of d_print_flush calls so far. */
350 unsigned long int flush_count
;
351 /* Stack of components, innermost first, used to avoid loops. */
352 const struct d_component_stack
*component_stack
;
353 /* Array of saved scopes for evaluating substitutions. */
354 struct d_saved_scope
*saved_scopes
;
355 /* Index of the next unused saved scope in the above array. */
356 int next_saved_scope
;
357 /* Number of saved scopes in the above array. */
358 int num_saved_scopes
;
359 /* Array of templates for saving into scopes. */
360 struct d_print_template
*copy_templates
;
361 /* Index of the next unused copy template in the above array. */
362 int next_copy_template
;
363 /* Number of copy templates in the above array. */
364 int num_copy_templates
;
365 /* The nearest enclosing template, if any. */
366 const struct demangle_component
*current_template
;
369 #ifdef CP_DEMANGLE_DEBUG
370 static void d_dump (struct demangle_component
*, int);
373 static struct demangle_component
*
374 d_make_empty (struct d_info
*);
376 static struct demangle_component
*
377 d_make_comp (struct d_info
*, enum demangle_component_type
,
378 struct demangle_component
*,
379 struct demangle_component
*);
381 static struct demangle_component
*
382 d_make_name (struct d_info
*, const char *, int);
384 static struct demangle_component
*
385 d_make_demangle_mangled_name (struct d_info
*, const char *);
387 static struct demangle_component
*
388 d_make_builtin_type (struct d_info
*,
389 const struct demangle_builtin_type_info
*);
391 static struct demangle_component
*
392 d_make_operator (struct d_info
*,
393 const struct demangle_operator_info
*);
395 static struct demangle_component
*
396 d_make_extended_operator (struct d_info
*, int,
397 struct demangle_component
*);
399 static struct demangle_component
*
400 d_make_ctor (struct d_info
*, enum gnu_v3_ctor_kinds
,
401 struct demangle_component
*);
403 static struct demangle_component
*
404 d_make_dtor (struct d_info
*, enum gnu_v3_dtor_kinds
,
405 struct demangle_component
*);
407 static struct demangle_component
*
408 d_make_template_param (struct d_info
*, int);
410 static struct demangle_component
*
411 d_make_sub (struct d_info
*, const char *, int);
414 has_return_type (struct demangle_component
*);
417 is_ctor_dtor_or_conversion (struct demangle_component
*);
419 static struct demangle_component
*d_encoding (struct d_info
*, int);
421 static struct demangle_component
*d_name (struct d_info
*);
423 static struct demangle_component
*d_nested_name (struct d_info
*);
425 static struct demangle_component
*d_prefix (struct d_info
*);
427 static struct demangle_component
*d_unqualified_name (struct d_info
*);
429 static struct demangle_component
*d_source_name (struct d_info
*);
431 static int d_number (struct d_info
*);
433 static struct demangle_component
*d_identifier (struct d_info
*, int);
435 static struct demangle_component
*d_operator_name (struct d_info
*);
437 static struct demangle_component
*d_special_name (struct d_info
*);
439 static int d_call_offset (struct d_info
*, int);
441 static struct demangle_component
*d_ctor_dtor_name (struct d_info
*);
443 static struct demangle_component
**
444 d_cv_qualifiers (struct d_info
*, struct demangle_component
**, int);
446 static struct demangle_component
*
447 d_ref_qualifier (struct d_info
*, struct demangle_component
*);
449 static struct demangle_component
*
450 d_function_type (struct d_info
*);
452 static struct demangle_component
*
453 d_bare_function_type (struct d_info
*, int);
455 static struct demangle_component
*
456 d_class_enum_type (struct d_info
*);
458 static struct demangle_component
*d_array_type (struct d_info
*);
460 static struct demangle_component
*d_vector_type (struct d_info
*);
462 static struct demangle_component
*
463 d_pointer_to_member_type (struct d_info
*);
465 static struct demangle_component
*
466 d_template_param (struct d_info
*);
468 static struct demangle_component
*d_template_args (struct d_info
*);
469 static struct demangle_component
*d_template_args_1 (struct d_info
*);
471 static struct demangle_component
*
472 d_template_arg (struct d_info
*);
474 static struct demangle_component
*d_expression (struct d_info
*);
476 static struct demangle_component
*d_expr_primary (struct d_info
*);
478 static struct demangle_component
*d_local_name (struct d_info
*);
480 static int d_discriminator (struct d_info
*);
482 static struct demangle_component
*d_lambda (struct d_info
*);
484 static struct demangle_component
*d_unnamed_type (struct d_info
*);
486 static struct demangle_component
*
487 d_clone_suffix (struct d_info
*, struct demangle_component
*);
490 d_add_substitution (struct d_info
*, struct demangle_component
*);
492 static struct demangle_component
*d_substitution (struct d_info
*, int);
494 static void d_checkpoint (struct d_info
*, struct d_info_checkpoint
*);
496 static void d_backtrack (struct d_info
*, struct d_info_checkpoint
*);
498 static void d_growable_string_init (struct d_growable_string
*, size_t);
501 d_growable_string_resize (struct d_growable_string
*, size_t);
504 d_growable_string_append_buffer (struct d_growable_string
*,
505 const char *, size_t);
507 d_growable_string_callback_adapter (const char *, size_t, void *);
510 d_print_init (struct d_print_info
*, demangle_callbackref
, void *,
511 const struct demangle_component
*);
513 static inline void d_print_error (struct d_print_info
*);
515 static inline int d_print_saw_error (struct d_print_info
*);
517 static inline void d_print_flush (struct d_print_info
*);
519 static inline void d_append_char (struct d_print_info
*, char);
521 static inline void d_append_buffer (struct d_print_info
*,
522 const char *, size_t);
524 static inline void d_append_string (struct d_print_info
*, const char *);
526 static inline char d_last_char (struct d_print_info
*);
529 d_print_comp (struct d_print_info
*, int, const struct demangle_component
*);
532 d_print_java_identifier (struct d_print_info
*, const char *, int);
535 d_print_mod_list (struct d_print_info
*, int, struct d_print_mod
*, int);
538 d_print_mod (struct d_print_info
*, int, const struct demangle_component
*);
541 d_print_function_type (struct d_print_info
*, int,
542 const struct demangle_component
*,
543 struct d_print_mod
*);
546 d_print_array_type (struct d_print_info
*, int,
547 const struct demangle_component
*,
548 struct d_print_mod
*);
551 d_print_expr_op (struct d_print_info
*, int, const struct demangle_component
*);
553 static void d_print_cast (struct d_print_info
*, int,
554 const struct demangle_component
*);
555 static void d_print_conversion (struct d_print_info
*, int,
556 const struct demangle_component
*);
558 static int d_demangle_callback (const char *, int,
559 demangle_callbackref
, void *);
560 static char *d_demangle (const char *, int, size_t *);
562 #ifdef CP_DEMANGLE_DEBUG
565 d_dump (struct demangle_component
*dc
, int indent
)
572 printf ("failed demangling\n");
576 for (i
= 0; i
< indent
; ++i
)
581 case DEMANGLE_COMPONENT_NAME
:
582 printf ("name '%.*s'\n", dc
->u
.s_name
.len
, dc
->u
.s_name
.s
);
584 case DEMANGLE_COMPONENT_TAGGED_NAME
:
585 printf ("tagged name\n");
586 d_dump (dc
->u
.s_binary
.left
, indent
+ 2);
587 d_dump (dc
->u
.s_binary
.right
, indent
+ 2);
589 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
590 printf ("template parameter %ld\n", dc
->u
.s_number
.number
);
592 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
593 printf ("function parameter %ld\n", dc
->u
.s_number
.number
);
595 case DEMANGLE_COMPONENT_CTOR
:
596 printf ("constructor %d\n", (int) dc
->u
.s_ctor
.kind
);
597 d_dump (dc
->u
.s_ctor
.name
, indent
+ 2);
599 case DEMANGLE_COMPONENT_DTOR
:
600 printf ("destructor %d\n", (int) dc
->u
.s_dtor
.kind
);
601 d_dump (dc
->u
.s_dtor
.name
, indent
+ 2);
603 case DEMANGLE_COMPONENT_SUB_STD
:
604 printf ("standard substitution %s\n", dc
->u
.s_string
.string
);
606 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
607 printf ("builtin type %s\n", dc
->u
.s_builtin
.type
->name
);
609 case DEMANGLE_COMPONENT_OPERATOR
:
610 printf ("operator %s\n", dc
->u
.s_operator
.op
->name
);
612 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
613 printf ("extended operator with %d args\n",
614 dc
->u
.s_extended_operator
.args
);
615 d_dump (dc
->u
.s_extended_operator
.name
, indent
+ 2);
618 case DEMANGLE_COMPONENT_QUAL_NAME
:
619 printf ("qualified name\n");
621 case DEMANGLE_COMPONENT_LOCAL_NAME
:
622 printf ("local name\n");
624 case DEMANGLE_COMPONENT_TYPED_NAME
:
625 printf ("typed name\n");
627 case DEMANGLE_COMPONENT_TEMPLATE
:
628 printf ("template\n");
630 case DEMANGLE_COMPONENT_VTABLE
:
633 case DEMANGLE_COMPONENT_VTT
:
636 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
637 printf ("construction vtable\n");
639 case DEMANGLE_COMPONENT_TYPEINFO
:
640 printf ("typeinfo\n");
642 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
643 printf ("typeinfo name\n");
645 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
646 printf ("typeinfo function\n");
648 case DEMANGLE_COMPONENT_THUNK
:
651 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
652 printf ("virtual thunk\n");
654 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
655 printf ("covariant thunk\n");
657 case DEMANGLE_COMPONENT_JAVA_CLASS
:
658 printf ("java class\n");
660 case DEMANGLE_COMPONENT_GUARD
:
663 case DEMANGLE_COMPONENT_REFTEMP
:
664 printf ("reference temporary\n");
666 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
667 printf ("hidden alias\n");
669 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
670 printf ("transaction clone\n");
672 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
673 printf ("non-transaction clone\n");
675 case DEMANGLE_COMPONENT_RESTRICT
:
676 printf ("restrict\n");
678 case DEMANGLE_COMPONENT_VOLATILE
:
679 printf ("volatile\n");
681 case DEMANGLE_COMPONENT_CONST
:
684 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
685 printf ("restrict this\n");
687 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
688 printf ("volatile this\n");
690 case DEMANGLE_COMPONENT_CONST_THIS
:
691 printf ("const this\n");
693 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
694 printf ("reference this\n");
696 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
697 printf ("rvalue reference this\n");
699 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
700 printf ("transaction_safe this\n");
702 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
703 printf ("vendor type qualifier\n");
705 case DEMANGLE_COMPONENT_POINTER
:
706 printf ("pointer\n");
708 case DEMANGLE_COMPONENT_REFERENCE
:
709 printf ("reference\n");
711 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
712 printf ("rvalue reference\n");
714 case DEMANGLE_COMPONENT_COMPLEX
:
715 printf ("complex\n");
717 case DEMANGLE_COMPONENT_IMAGINARY
:
718 printf ("imaginary\n");
720 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
721 printf ("vendor type\n");
723 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
724 printf ("function type\n");
726 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
727 printf ("array type\n");
729 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
730 printf ("pointer to member type\n");
732 case DEMANGLE_COMPONENT_FIXED_TYPE
:
733 printf ("fixed-point type, accum? %d, sat? %d\n",
734 dc
->u
.s_fixed
.accum
, dc
->u
.s_fixed
.sat
);
735 d_dump (dc
->u
.s_fixed
.length
, indent
+ 2);
737 case DEMANGLE_COMPONENT_ARGLIST
:
738 printf ("argument list\n");
740 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
741 printf ("template argument list\n");
743 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
744 printf ("initializer list\n");
746 case DEMANGLE_COMPONENT_CAST
:
749 case DEMANGLE_COMPONENT_CONVERSION
:
750 printf ("conversion operator\n");
752 case DEMANGLE_COMPONENT_NULLARY
:
753 printf ("nullary operator\n");
755 case DEMANGLE_COMPONENT_UNARY
:
756 printf ("unary operator\n");
758 case DEMANGLE_COMPONENT_BINARY
:
759 printf ("binary operator\n");
761 case DEMANGLE_COMPONENT_BINARY_ARGS
:
762 printf ("binary operator arguments\n");
764 case DEMANGLE_COMPONENT_TRINARY
:
765 printf ("trinary operator\n");
767 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
768 printf ("trinary operator arguments 1\n");
770 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
771 printf ("trinary operator arguments 1\n");
773 case DEMANGLE_COMPONENT_LITERAL
:
774 printf ("literal\n");
776 case DEMANGLE_COMPONENT_LITERAL_NEG
:
777 printf ("negative literal\n");
779 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
780 printf ("java resource\n");
782 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
783 printf ("compound name\n");
785 case DEMANGLE_COMPONENT_CHARACTER
:
786 printf ("character '%c'\n", dc
->u
.s_character
.character
);
788 case DEMANGLE_COMPONENT_NUMBER
:
789 printf ("number %ld\n", dc
->u
.s_number
.number
);
791 case DEMANGLE_COMPONENT_DECLTYPE
:
792 printf ("decltype\n");
794 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
795 printf ("pack expansion\n");
797 case DEMANGLE_COMPONENT_TLS_INIT
:
798 printf ("tls init function\n");
800 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
801 printf ("tls wrapper function\n");
803 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
804 printf ("default argument %d\n", dc
->u
.s_unary_num
.num
);
805 d_dump (dc
->u
.s_unary_num
.sub
, indent
+2);
807 case DEMANGLE_COMPONENT_LAMBDA
:
808 printf ("lambda %d\n", dc
->u
.s_unary_num
.num
);
809 d_dump (dc
->u
.s_unary_num
.sub
, indent
+2);
813 d_dump (d_left (dc
), indent
+ 2);
814 d_dump (d_right (dc
), indent
+ 2);
817 #endif /* CP_DEMANGLE_DEBUG */
819 /* Fill in a DEMANGLE_COMPONENT_NAME. */
821 CP_STATIC_IF_GLIBCPP_V3
823 cplus_demangle_fill_name (struct demangle_component
*p
, const char *s
, int len
)
825 if (p
== NULL
|| s
== NULL
|| len
== 0)
827 p
->type
= DEMANGLE_COMPONENT_NAME
;
829 p
->u
.s_name
.len
= len
;
833 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
835 CP_STATIC_IF_GLIBCPP_V3
837 cplus_demangle_fill_extended_operator (struct demangle_component
*p
, int args
,
838 struct demangle_component
*name
)
840 if (p
== NULL
|| args
< 0 || name
== NULL
)
842 p
->type
= DEMANGLE_COMPONENT_EXTENDED_OPERATOR
;
843 p
->u
.s_extended_operator
.args
= args
;
844 p
->u
.s_extended_operator
.name
= name
;
848 /* Fill in a DEMANGLE_COMPONENT_CTOR. */
850 CP_STATIC_IF_GLIBCPP_V3
852 cplus_demangle_fill_ctor (struct demangle_component
*p
,
853 enum gnu_v3_ctor_kinds kind
,
854 struct demangle_component
*name
)
858 || (int) kind
< gnu_v3_complete_object_ctor
859 || (int) kind
> gnu_v3_object_ctor_group
)
861 p
->type
= DEMANGLE_COMPONENT_CTOR
;
862 p
->u
.s_ctor
.kind
= kind
;
863 p
->u
.s_ctor
.name
= name
;
867 /* Fill in a DEMANGLE_COMPONENT_DTOR. */
869 CP_STATIC_IF_GLIBCPP_V3
871 cplus_demangle_fill_dtor (struct demangle_component
*p
,
872 enum gnu_v3_dtor_kinds kind
,
873 struct demangle_component
*name
)
877 || (int) kind
< gnu_v3_deleting_dtor
878 || (int) kind
> gnu_v3_object_dtor_group
)
880 p
->type
= DEMANGLE_COMPONENT_DTOR
;
881 p
->u
.s_dtor
.kind
= kind
;
882 p
->u
.s_dtor
.name
= name
;
886 /* Add a new component. */
888 static struct demangle_component
*
889 d_make_empty (struct d_info
*di
)
891 struct demangle_component
*p
;
893 if (di
->next_comp
>= di
->num_comps
)
895 p
= &di
->comps
[di
->next_comp
];
900 /* Add a new generic component. */
902 static struct demangle_component
*
903 d_make_comp (struct d_info
*di
, enum demangle_component_type type
,
904 struct demangle_component
*left
,
905 struct demangle_component
*right
)
907 struct demangle_component
*p
;
909 /* We check for errors here. A typical error would be a NULL return
910 from a subroutine. We catch those here, and return NULL
914 /* These types require two parameters. */
915 case DEMANGLE_COMPONENT_QUAL_NAME
:
916 case DEMANGLE_COMPONENT_LOCAL_NAME
:
917 case DEMANGLE_COMPONENT_TYPED_NAME
:
918 case DEMANGLE_COMPONENT_TAGGED_NAME
:
919 case DEMANGLE_COMPONENT_TEMPLATE
:
920 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
921 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
922 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
923 case DEMANGLE_COMPONENT_UNARY
:
924 case DEMANGLE_COMPONENT_BINARY
:
925 case DEMANGLE_COMPONENT_BINARY_ARGS
:
926 case DEMANGLE_COMPONENT_TRINARY
:
927 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
928 case DEMANGLE_COMPONENT_LITERAL
:
929 case DEMANGLE_COMPONENT_LITERAL_NEG
:
930 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
931 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
932 case DEMANGLE_COMPONENT_CLONE
:
933 if (left
== NULL
|| right
== NULL
)
937 /* These types only require one parameter. */
938 case DEMANGLE_COMPONENT_VTABLE
:
939 case DEMANGLE_COMPONENT_VTT
:
940 case DEMANGLE_COMPONENT_TYPEINFO
:
941 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
942 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
943 case DEMANGLE_COMPONENT_THUNK
:
944 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
945 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
946 case DEMANGLE_COMPONENT_JAVA_CLASS
:
947 case DEMANGLE_COMPONENT_GUARD
:
948 case DEMANGLE_COMPONENT_TLS_INIT
:
949 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
950 case DEMANGLE_COMPONENT_REFTEMP
:
951 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
952 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
953 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
954 case DEMANGLE_COMPONENT_POINTER
:
955 case DEMANGLE_COMPONENT_REFERENCE
:
956 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
957 case DEMANGLE_COMPONENT_COMPLEX
:
958 case DEMANGLE_COMPONENT_IMAGINARY
:
959 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
960 case DEMANGLE_COMPONENT_CAST
:
961 case DEMANGLE_COMPONENT_CONVERSION
:
962 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
963 case DEMANGLE_COMPONENT_DECLTYPE
:
964 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
965 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
966 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
967 case DEMANGLE_COMPONENT_NULLARY
:
968 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
973 /* This needs a right parameter, but the left parameter can be
975 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
976 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
981 /* These are allowed to have no parameters--in some cases they
982 will be filled in later. */
983 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
984 case DEMANGLE_COMPONENT_RESTRICT
:
985 case DEMANGLE_COMPONENT_VOLATILE
:
986 case DEMANGLE_COMPONENT_CONST
:
987 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
988 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
989 case DEMANGLE_COMPONENT_CONST_THIS
:
990 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
991 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
992 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
993 case DEMANGLE_COMPONENT_ARGLIST
:
994 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
997 /* Other types should not be seen here. */
1002 p
= d_make_empty (di
);
1006 p
->u
.s_binary
.left
= left
;
1007 p
->u
.s_binary
.right
= right
;
1012 /* Add a new demangle mangled name component. */
1014 static struct demangle_component
*
1015 d_make_demangle_mangled_name (struct d_info
*di
, const char *s
)
1017 if (d_peek_char (di
) != '_' || d_peek_next_char (di
) != 'Z')
1018 return d_make_name (di
, s
, strlen (s
));
1020 return d_encoding (di
, 0);
1023 /* Add a new name component. */
1025 static struct demangle_component
*
1026 d_make_name (struct d_info
*di
, const char *s
, int len
)
1028 struct demangle_component
*p
;
1030 p
= d_make_empty (di
);
1031 if (! cplus_demangle_fill_name (p
, s
, len
))
1036 /* Add a new builtin type component. */
1038 static struct demangle_component
*
1039 d_make_builtin_type (struct d_info
*di
,
1040 const struct demangle_builtin_type_info
*type
)
1042 struct demangle_component
*p
;
1046 p
= d_make_empty (di
);
1049 p
->type
= DEMANGLE_COMPONENT_BUILTIN_TYPE
;
1050 p
->u
.s_builtin
.type
= type
;
1055 /* Add a new operator component. */
1057 static struct demangle_component
*
1058 d_make_operator (struct d_info
*di
, const struct demangle_operator_info
*op
)
1060 struct demangle_component
*p
;
1062 p
= d_make_empty (di
);
1065 p
->type
= DEMANGLE_COMPONENT_OPERATOR
;
1066 p
->u
.s_operator
.op
= op
;
1071 /* Add a new extended operator component. */
1073 static struct demangle_component
*
1074 d_make_extended_operator (struct d_info
*di
, int args
,
1075 struct demangle_component
*name
)
1077 struct demangle_component
*p
;
1079 p
= d_make_empty (di
);
1080 if (! cplus_demangle_fill_extended_operator (p
, args
, name
))
1085 static struct demangle_component
*
1086 d_make_default_arg (struct d_info
*di
, int num
,
1087 struct demangle_component
*sub
)
1089 struct demangle_component
*p
= d_make_empty (di
);
1092 p
->type
= DEMANGLE_COMPONENT_DEFAULT_ARG
;
1093 p
->u
.s_unary_num
.num
= num
;
1094 p
->u
.s_unary_num
.sub
= sub
;
1099 /* Add a new constructor component. */
1101 static struct demangle_component
*
1102 d_make_ctor (struct d_info
*di
, enum gnu_v3_ctor_kinds kind
,
1103 struct demangle_component
*name
)
1105 struct demangle_component
*p
;
1107 p
= d_make_empty (di
);
1108 if (! cplus_demangle_fill_ctor (p
, kind
, name
))
1113 /* Add a new destructor component. */
1115 static struct demangle_component
*
1116 d_make_dtor (struct d_info
*di
, enum gnu_v3_dtor_kinds kind
,
1117 struct demangle_component
*name
)
1119 struct demangle_component
*p
;
1121 p
= d_make_empty (di
);
1122 if (! cplus_demangle_fill_dtor (p
, kind
, name
))
1127 /* Add a new template parameter. */
1129 static struct demangle_component
*
1130 d_make_template_param (struct d_info
*di
, int i
)
1132 struct demangle_component
*p
;
1134 p
= d_make_empty (di
);
1137 p
->type
= DEMANGLE_COMPONENT_TEMPLATE_PARAM
;
1138 p
->u
.s_number
.number
= i
;
1143 /* Add a new function parameter. */
1145 static struct demangle_component
*
1146 d_make_function_param (struct d_info
*di
, int i
)
1148 struct demangle_component
*p
;
1150 p
= d_make_empty (di
);
1153 p
->type
= DEMANGLE_COMPONENT_FUNCTION_PARAM
;
1154 p
->u
.s_number
.number
= i
;
1159 /* Add a new standard substitution component. */
1161 static struct demangle_component
*
1162 d_make_sub (struct d_info
*di
, const char *name
, int len
)
1164 struct demangle_component
*p
;
1166 p
= d_make_empty (di
);
1169 p
->type
= DEMANGLE_COMPONENT_SUB_STD
;
1170 p
->u
.s_string
.string
= name
;
1171 p
->u
.s_string
.len
= len
;
1176 /* <mangled-name> ::= _Z <encoding> [<clone-suffix>]*
1178 TOP_LEVEL is non-zero when called at the top level. */
1180 CP_STATIC_IF_GLIBCPP_V3
1181 struct demangle_component
*
1182 cplus_demangle_mangled_name (struct d_info
*di
, int top_level
)
1184 struct demangle_component
*p
;
1186 if (! d_check_char (di
, '_')
1187 /* Allow missing _ if not at toplevel to work around a
1188 bug in G++ abi-version=2 mangling; see the comment in
1189 write_template_arg. */
1192 if (! d_check_char (di
, 'Z'))
1194 p
= d_encoding (di
, top_level
);
1196 /* If at top level and parsing parameters, check for a clone
1198 if (top_level
&& (di
->options
& DMGL_PARAMS
) != 0)
1199 while (d_peek_char (di
) == '.'
1200 && (IS_LOWER (d_peek_next_char (di
))
1201 || d_peek_next_char (di
) == '_'
1202 || IS_DIGIT (d_peek_next_char (di
))))
1203 p
= d_clone_suffix (di
, p
);
1208 /* Return whether a function should have a return type. The argument
1209 is the function name, which may be qualified in various ways. The
1210 rules are that template functions have return types with some
1211 exceptions, function types which are not part of a function name
1212 mangling have return types with some exceptions, and non-template
1213 function names do not have return types. The exceptions are that
1214 constructors, destructors, and conversion operators do not have
1218 has_return_type (struct demangle_component
*dc
)
1226 case DEMANGLE_COMPONENT_TEMPLATE
:
1227 return ! is_ctor_dtor_or_conversion (d_left (dc
));
1228 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
1229 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
1230 case DEMANGLE_COMPONENT_CONST_THIS
:
1231 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
1232 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
1233 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
1234 return has_return_type (d_left (dc
));
1238 /* Return whether a name is a constructor, a destructor, or a
1239 conversion operator. */
1242 is_ctor_dtor_or_conversion (struct demangle_component
*dc
)
1250 case DEMANGLE_COMPONENT_QUAL_NAME
:
1251 case DEMANGLE_COMPONENT_LOCAL_NAME
:
1252 return is_ctor_dtor_or_conversion (d_right (dc
));
1253 case DEMANGLE_COMPONENT_CTOR
:
1254 case DEMANGLE_COMPONENT_DTOR
:
1255 case DEMANGLE_COMPONENT_CONVERSION
:
1260 /* <encoding> ::= <(function) name> <bare-function-type>
1264 TOP_LEVEL is non-zero when called at the top level, in which case
1265 if DMGL_PARAMS is not set we do not demangle the function
1266 parameters. We only set this at the top level, because otherwise
1267 we would not correctly demangle names in local scopes. */
1269 static struct demangle_component
*
1270 d_encoding (struct d_info
*di
, int top_level
)
1272 char peek
= d_peek_char (di
);
1274 if (peek
== 'G' || peek
== 'T')
1275 return d_special_name (di
);
1278 struct demangle_component
*dc
;
1282 if (dc
!= NULL
&& top_level
&& (di
->options
& DMGL_PARAMS
) == 0)
1284 /* Strip off any initial CV-qualifiers, as they really apply
1285 to the `this' parameter, and they were not output by the
1286 v2 demangler without DMGL_PARAMS. */
1287 while (dc
->type
== DEMANGLE_COMPONENT_RESTRICT_THIS
1288 || dc
->type
== DEMANGLE_COMPONENT_VOLATILE_THIS
1289 || dc
->type
== DEMANGLE_COMPONENT_CONST_THIS
1290 || dc
->type
== DEMANGLE_COMPONENT_TRANSACTION_SAFE
1291 || dc
->type
== DEMANGLE_COMPONENT_REFERENCE_THIS
1292 || dc
->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
)
1295 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1296 there may be CV-qualifiers on its right argument which
1297 really apply here; this happens when parsing a class
1298 which is local to a function. */
1299 if (dc
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
1301 struct demangle_component
*dcr
;
1304 while (dcr
->type
== DEMANGLE_COMPONENT_RESTRICT_THIS
1305 || dcr
->type
== DEMANGLE_COMPONENT_VOLATILE_THIS
1306 || dcr
->type
== DEMANGLE_COMPONENT_CONST_THIS
1307 || dcr
->type
== DEMANGLE_COMPONENT_TRANSACTION_SAFE
1308 || dcr
->type
== DEMANGLE_COMPONENT_REFERENCE_THIS
1309 || dcr
->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
)
1311 dc
->u
.s_binary
.right
= dcr
;
1317 peek
= d_peek_char (di
);
1318 if (dc
== NULL
|| peek
== '\0' || peek
== 'E')
1320 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPED_NAME
, dc
,
1321 d_bare_function_type (di
, has_return_type (dc
)));
1325 /* <tagged-name> ::= <name> B <source-name> */
1327 static struct demangle_component
*
1328 d_abi_tags (struct d_info
*di
, struct demangle_component
*dc
)
1330 struct demangle_component
*hold_last_name
;
1333 /* Preserve the last name, so the ABI tag doesn't clobber it. */
1334 hold_last_name
= di
->last_name
;
1336 while (peek
= d_peek_char (di
),
1339 struct demangle_component
*tag
;
1341 tag
= d_source_name (di
);
1342 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TAGGED_NAME
, dc
, tag
);
1345 di
->last_name
= hold_last_name
;
1350 /* <name> ::= <nested-name>
1352 ::= <unscoped-template-name> <template-args>
1355 <unscoped-name> ::= <unqualified-name>
1356 ::= St <unqualified-name>
1358 <unscoped-template-name> ::= <unscoped-name>
1362 static struct demangle_component
*
1363 d_name (struct d_info
*di
)
1365 char peek
= d_peek_char (di
);
1366 struct demangle_component
*dc
;
1371 return d_nested_name (di
);
1374 return d_local_name (di
);
1377 return d_unqualified_name (di
);
1383 if (d_peek_next_char (di
) != 't')
1385 dc
= d_substitution (di
, 0);
1391 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_QUAL_NAME
,
1392 d_make_name (di
, "std", 3),
1393 d_unqualified_name (di
));
1398 if (d_peek_char (di
) != 'I')
1400 /* The grammar does not permit this case to occur if we
1401 called d_substitution() above (i.e., subst == 1). We
1402 don't bother to check. */
1406 /* This is <template-args>, which means that we just saw
1407 <unscoped-template-name>, which is a substitution
1408 candidate if we didn't just get it from a
1412 if (! d_add_substitution (di
, dc
))
1415 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, dc
,
1416 d_template_args (di
));
1424 dc
= d_unqualified_name (di
);
1425 if (d_peek_char (di
) == 'I')
1427 /* This is <template-args>, which means that we just saw
1428 <unscoped-template-name>, which is a substitution
1430 if (! d_add_substitution (di
, dc
))
1432 dc
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, dc
,
1433 d_template_args (di
));
1439 /* <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
1440 ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
1443 static struct demangle_component
*
1444 d_nested_name (struct d_info
*di
)
1446 struct demangle_component
*ret
;
1447 struct demangle_component
**pret
;
1448 struct demangle_component
*rqual
;
1450 if (! d_check_char (di
, 'N'))
1453 pret
= d_cv_qualifiers (di
, &ret
, 1);
1457 /* Parse the ref-qualifier now and then attach it
1458 once we have something to attach it to. */
1459 rqual
= d_ref_qualifier (di
, NULL
);
1461 *pret
= d_prefix (di
);
1467 d_left (rqual
) = ret
;
1471 if (! d_check_char (di
, 'E'))
1477 /* <prefix> ::= <prefix> <unqualified-name>
1478 ::= <template-prefix> <template-args>
1479 ::= <template-param>
1484 <template-prefix> ::= <prefix> <(template) unqualified-name>
1485 ::= <template-param>
1489 static struct demangle_component
*
1490 d_prefix (struct d_info
*di
)
1492 struct demangle_component
*ret
= NULL
;
1497 enum demangle_component_type comb_type
;
1498 struct demangle_component
*dc
;
1500 peek
= d_peek_char (di
);
1504 /* The older code accepts a <local-name> here, but I don't see
1505 that in the grammar. The older code does not accept a
1506 <template-param> here. */
1508 comb_type
= DEMANGLE_COMPONENT_QUAL_NAME
;
1511 char peek2
= d_peek_next_char (di
);
1512 if (peek2
== 'T' || peek2
== 't')
1514 dc
= cplus_demangle_type (di
);
1516 /* Destructor name. */
1517 dc
= d_unqualified_name (di
);
1519 else if (IS_DIGIT (peek
)
1524 dc
= d_unqualified_name (di
);
1525 else if (peek
== 'S')
1526 dc
= d_substitution (di
, 1);
1527 else if (peek
== 'I')
1531 comb_type
= DEMANGLE_COMPONENT_TEMPLATE
;
1532 dc
= d_template_args (di
);
1534 else if (peek
== 'T')
1535 dc
= d_template_param (di
);
1536 else if (peek
== 'E')
1538 else if (peek
== 'M')
1540 /* Initializer scope for a lambda. We don't need to represent
1541 this; the normal code will just treat the variable as a type
1542 scope, which gives appropriate output. */
1554 ret
= d_make_comp (di
, comb_type
, ret
, dc
);
1556 if (peek
!= 'S' && d_peek_char (di
) != 'E')
1558 if (! d_add_substitution (di
, ret
))
1564 /* <unqualified-name> ::= <operator-name>
1565 ::= <ctor-dtor-name>
1567 ::= <local-source-name>
1569 <local-source-name> ::= L <source-name> <discriminator>
1572 static struct demangle_component
*
1573 d_unqualified_name (struct d_info
*di
)
1575 struct demangle_component
*ret
;
1578 peek
= d_peek_char (di
);
1579 if (IS_DIGIT (peek
))
1580 ret
= d_source_name (di
);
1581 else if (IS_LOWER (peek
))
1583 ret
= d_operator_name (di
);
1584 if (ret
!= NULL
&& ret
->type
== DEMANGLE_COMPONENT_OPERATOR
)
1586 di
->expansion
+= sizeof "operator" + ret
->u
.s_operator
.op
->len
- 2;
1587 if (!strcmp (ret
->u
.s_operator
.op
->code
, "li"))
1588 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, ret
,
1589 d_source_name (di
));
1592 else if (peek
== 'C' || peek
== 'D')
1593 ret
= d_ctor_dtor_name (di
);
1594 else if (peek
== 'L')
1598 ret
= d_source_name (di
);
1601 if (! d_discriminator (di
))
1604 else if (peek
== 'U')
1606 switch (d_peek_next_char (di
))
1609 ret
= d_lambda (di
);
1612 ret
= d_unnamed_type (di
);
1621 if (d_peek_char (di
) == 'B')
1622 ret
= d_abi_tags (di
, ret
);
1626 /* <source-name> ::= <(positive length) number> <identifier> */
1628 static struct demangle_component
*
1629 d_source_name (struct d_info
*di
)
1632 struct demangle_component
*ret
;
1634 len
= d_number (di
);
1637 ret
= d_identifier (di
, len
);
1638 di
->last_name
= ret
;
1642 /* number ::= [n] <(non-negative decimal integer)> */
1645 d_number (struct d_info
*di
)
1652 peek
= d_peek_char (di
);
1657 peek
= d_peek_char (di
);
1663 if (! IS_DIGIT (peek
))
1669 ret
= ret
* 10 + peek
- '0';
1671 peek
= d_peek_char (di
);
1675 /* Like d_number, but returns a demangle_component. */
1677 static struct demangle_component
*
1678 d_number_component (struct d_info
*di
)
1680 struct demangle_component
*ret
= d_make_empty (di
);
1683 ret
->type
= DEMANGLE_COMPONENT_NUMBER
;
1684 ret
->u
.s_number
.number
= d_number (di
);
1689 /* identifier ::= <(unqualified source code identifier)> */
1691 static struct demangle_component
*
1692 d_identifier (struct d_info
*di
, int len
)
1698 if (di
->send
- name
< len
)
1701 d_advance (di
, len
);
1703 /* A Java mangled name may have a trailing '$' if it is a C++
1704 keyword. This '$' is not included in the length count. We just
1706 if ((di
->options
& DMGL_JAVA
) != 0
1707 && d_peek_char (di
) == '$')
1710 /* Look for something which looks like a gcc encoding of an
1711 anonymous namespace, and replace it with a more user friendly
1713 if (len
>= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN
+ 2
1714 && memcmp (name
, ANONYMOUS_NAMESPACE_PREFIX
,
1715 ANONYMOUS_NAMESPACE_PREFIX_LEN
) == 0)
1719 s
= name
+ ANONYMOUS_NAMESPACE_PREFIX_LEN
;
1720 if ((*s
== '.' || *s
== '_' || *s
== '$')
1723 di
->expansion
-= len
- sizeof "(anonymous namespace)";
1724 return d_make_name (di
, "(anonymous namespace)",
1725 sizeof "(anonymous namespace)" - 1);
1729 return d_make_name (di
, name
, len
);
1732 /* operator_name ::= many different two character encodings.
1734 ::= v <digit> <source-name>
1736 This list is sorted for binary search. */
1738 #define NL(s) s, (sizeof s) - 1
1740 CP_STATIC_IF_GLIBCPP_V3
1741 const struct demangle_operator_info cplus_demangle_operators
[] =
1743 { "aN", NL ("&="), 2 },
1744 { "aS", NL ("="), 2 },
1745 { "aa", NL ("&&"), 2 },
1746 { "ad", NL ("&"), 1 },
1747 { "an", NL ("&"), 2 },
1748 { "at", NL ("alignof "), 1 },
1749 { "az", NL ("alignof "), 1 },
1750 { "cc", NL ("const_cast"), 2 },
1751 { "cl", NL ("()"), 2 },
1752 { "cm", NL (","), 2 },
1753 { "co", NL ("~"), 1 },
1754 { "dV", NL ("/="), 2 },
1755 { "da", NL ("delete[] "), 1 },
1756 { "dc", NL ("dynamic_cast"), 2 },
1757 { "de", NL ("*"), 1 },
1758 { "dl", NL ("delete "), 1 },
1759 { "ds", NL (".*"), 2 },
1760 { "dt", NL ("."), 2 },
1761 { "dv", NL ("/"), 2 },
1762 { "eO", NL ("^="), 2 },
1763 { "eo", NL ("^"), 2 },
1764 { "eq", NL ("=="), 2 },
1765 { "fL", NL ("..."), 3 },
1766 { "fR", NL ("..."), 3 },
1767 { "fl", NL ("..."), 2 },
1768 { "fr", NL ("..."), 2 },
1769 { "ge", NL (">="), 2 },
1770 { "gs", NL ("::"), 1 },
1771 { "gt", NL (">"), 2 },
1772 { "ix", NL ("[]"), 2 },
1773 { "lS", NL ("<<="), 2 },
1774 { "le", NL ("<="), 2 },
1775 { "li", NL ("operator\"\" "), 1 },
1776 { "ls", NL ("<<"), 2 },
1777 { "lt", NL ("<"), 2 },
1778 { "mI", NL ("-="), 2 },
1779 { "mL", NL ("*="), 2 },
1780 { "mi", NL ("-"), 2 },
1781 { "ml", NL ("*"), 2 },
1782 { "mm", NL ("--"), 1 },
1783 { "na", NL ("new[]"), 3 },
1784 { "ne", NL ("!="), 2 },
1785 { "ng", NL ("-"), 1 },
1786 { "nt", NL ("!"), 1 },
1787 { "nw", NL ("new"), 3 },
1788 { "oR", NL ("|="), 2 },
1789 { "oo", NL ("||"), 2 },
1790 { "or", NL ("|"), 2 },
1791 { "pL", NL ("+="), 2 },
1792 { "pl", NL ("+"), 2 },
1793 { "pm", NL ("->*"), 2 },
1794 { "pp", NL ("++"), 1 },
1795 { "ps", NL ("+"), 1 },
1796 { "pt", NL ("->"), 2 },
1797 { "qu", NL ("?"), 3 },
1798 { "rM", NL ("%="), 2 },
1799 { "rS", NL (">>="), 2 },
1800 { "rc", NL ("reinterpret_cast"), 2 },
1801 { "rm", NL ("%"), 2 },
1802 { "rs", NL (">>"), 2 },
1803 { "sP", NL ("sizeof..."), 1 },
1804 { "sZ", NL ("sizeof..."), 1 },
1805 { "sc", NL ("static_cast"), 2 },
1806 { "st", NL ("sizeof "), 1 },
1807 { "sz", NL ("sizeof "), 1 },
1808 { "tr", NL ("throw"), 0 },
1809 { "tw", NL ("throw "), 1 },
1810 { NULL
, NULL
, 0, 0 }
1813 static struct demangle_component
*
1814 d_operator_name (struct d_info
*di
)
1819 c1
= d_next_char (di
);
1820 c2
= d_next_char (di
);
1821 if (c1
== 'v' && IS_DIGIT (c2
))
1822 return d_make_extended_operator (di
, c2
- '0', d_source_name (di
));
1823 else if (c1
== 'c' && c2
== 'v')
1825 struct demangle_component
*type
;
1826 int was_conversion
= di
->is_conversion
;
1827 struct demangle_component
*res
;
1829 di
->is_conversion
= ! di
->is_expression
;
1830 type
= cplus_demangle_type (di
);
1831 if (di
->is_conversion
)
1832 res
= d_make_comp (di
, DEMANGLE_COMPONENT_CONVERSION
, type
, NULL
);
1834 res
= d_make_comp (di
, DEMANGLE_COMPONENT_CAST
, type
, NULL
);
1835 di
->is_conversion
= was_conversion
;
1840 /* LOW is the inclusive lower bound. */
1842 /* HIGH is the exclusive upper bound. We subtract one to ignore
1843 the sentinel at the end of the array. */
1844 int high
= ((sizeof (cplus_demangle_operators
)
1845 / sizeof (cplus_demangle_operators
[0]))
1851 const struct demangle_operator_info
*p
;
1853 i
= low
+ (high
- low
) / 2;
1854 p
= cplus_demangle_operators
+ i
;
1856 if (c1
== p
->code
[0] && c2
== p
->code
[1])
1857 return d_make_operator (di
, p
);
1859 if (c1
< p
->code
[0] || (c1
== p
->code
[0] && c2
< p
->code
[1]))
1869 static struct demangle_component
*
1870 d_make_character (struct d_info
*di
, int c
)
1872 struct demangle_component
*p
;
1873 p
= d_make_empty (di
);
1876 p
->type
= DEMANGLE_COMPONENT_CHARACTER
;
1877 p
->u
.s_character
.character
= c
;
1882 static struct demangle_component
*
1883 d_java_resource (struct d_info
*di
)
1885 struct demangle_component
*p
= NULL
;
1886 struct demangle_component
*next
= NULL
;
1891 len
= d_number (di
);
1895 /* Eat the leading '_'. */
1896 if (d_next_char (di
) != '_')
1909 /* Each chunk is either a '$' escape... */
1927 next
= d_make_character (di
, c
);
1935 /* ... or a sequence of characters. */
1938 while (i
< len
&& str
[i
] && str
[i
] != '$')
1941 next
= d_make_name (di
, str
, i
);
1954 p
= d_make_comp (di
, DEMANGLE_COMPONENT_COMPOUND_NAME
, p
, next
);
1960 p
= d_make_comp (di
, DEMANGLE_COMPONENT_JAVA_RESOURCE
, p
, NULL
);
1965 /* <special-name> ::= TV <type>
1969 ::= GV <(object) name>
1970 ::= T <call-offset> <(base) encoding>
1971 ::= Tc <call-offset> <call-offset> <(base) encoding>
1972 Also g++ extensions:
1973 ::= TC <type> <(offset) number> _ <(base) type>
1978 ::= Gr <resource name>
1983 static struct demangle_component
*
1984 d_special_name (struct d_info
*di
)
1986 di
->expansion
+= 20;
1987 if (d_check_char (di
, 'T'))
1989 switch (d_next_char (di
))
1993 return d_make_comp (di
, DEMANGLE_COMPONENT_VTABLE
,
1994 cplus_demangle_type (di
), NULL
);
1996 di
->expansion
-= 10;
1997 return d_make_comp (di
, DEMANGLE_COMPONENT_VTT
,
1998 cplus_demangle_type (di
), NULL
);
2000 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO
,
2001 cplus_demangle_type (di
), NULL
);
2003 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO_NAME
,
2004 cplus_demangle_type (di
), NULL
);
2007 if (! d_call_offset (di
, 'h'))
2009 return d_make_comp (di
, DEMANGLE_COMPONENT_THUNK
,
2010 d_encoding (di
, 0), NULL
);
2013 if (! d_call_offset (di
, 'v'))
2015 return d_make_comp (di
, DEMANGLE_COMPONENT_VIRTUAL_THUNK
,
2016 d_encoding (di
, 0), NULL
);
2019 if (! d_call_offset (di
, '\0'))
2021 if (! d_call_offset (di
, '\0'))
2023 return d_make_comp (di
, DEMANGLE_COMPONENT_COVARIANT_THUNK
,
2024 d_encoding (di
, 0), NULL
);
2028 struct demangle_component
*derived_type
;
2030 struct demangle_component
*base_type
;
2032 derived_type
= cplus_demangle_type (di
);
2033 offset
= d_number (di
);
2036 if (! d_check_char (di
, '_'))
2038 base_type
= cplus_demangle_type (di
);
2039 /* We don't display the offset. FIXME: We should display
2040 it in verbose mode. */
2042 return d_make_comp (di
, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
,
2043 base_type
, derived_type
);
2047 return d_make_comp (di
, DEMANGLE_COMPONENT_TYPEINFO_FN
,
2048 cplus_demangle_type (di
), NULL
);
2050 return d_make_comp (di
, DEMANGLE_COMPONENT_JAVA_CLASS
,
2051 cplus_demangle_type (di
), NULL
);
2054 return d_make_comp (di
, DEMANGLE_COMPONENT_TLS_INIT
,
2058 return d_make_comp (di
, DEMANGLE_COMPONENT_TLS_WRAPPER
,
2065 else if (d_check_char (di
, 'G'))
2067 switch (d_next_char (di
))
2070 return d_make_comp (di
, DEMANGLE_COMPONENT_GUARD
, d_name (di
), NULL
);
2074 struct demangle_component
*name
= d_name (di
);
2075 return d_make_comp (di
, DEMANGLE_COMPONENT_REFTEMP
, name
,
2076 d_number_component (di
));
2080 return d_make_comp (di
, DEMANGLE_COMPONENT_HIDDEN_ALIAS
,
2081 d_encoding (di
, 0), NULL
);
2084 switch (d_next_char (di
))
2087 return d_make_comp (di
, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
,
2088 d_encoding (di
, 0), NULL
);
2090 /* ??? The proposal is that other letters (such as 'h') stand
2091 for different variants of transaction cloning, such as
2092 compiling directly for hardware transaction support. But
2093 they still should all be transactional clones of some sort
2094 so go ahead and call them that. */
2096 return d_make_comp (di
, DEMANGLE_COMPONENT_TRANSACTION_CLONE
,
2097 d_encoding (di
, 0), NULL
);
2101 return d_java_resource (di
);
2111 /* <call-offset> ::= h <nv-offset> _
2114 <nv-offset> ::= <(offset) number>
2116 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
2118 The C parameter, if not '\0', is a character we just read which is
2119 the start of the <call-offset>.
2121 We don't display the offset information anywhere. FIXME: We should
2122 display it in verbose mode. */
2125 d_call_offset (struct d_info
*di
, int c
)
2128 c
= d_next_char (di
);
2135 if (! d_check_char (di
, '_'))
2142 if (! d_check_char (di
, '_'))
2148 /* <ctor-dtor-name> ::= C1
2156 static struct demangle_component
*
2157 d_ctor_dtor_name (struct d_info
*di
)
2159 if (di
->last_name
!= NULL
)
2161 if (di
->last_name
->type
== DEMANGLE_COMPONENT_NAME
)
2162 di
->expansion
+= di
->last_name
->u
.s_name
.len
;
2163 else if (di
->last_name
->type
== DEMANGLE_COMPONENT_SUB_STD
)
2164 di
->expansion
+= di
->last_name
->u
.s_string
.len
;
2166 switch (d_peek_char (di
))
2170 enum gnu_v3_ctor_kinds kind
;
2172 switch (d_peek_next_char (di
))
2175 kind
= gnu_v3_complete_object_ctor
;
2178 kind
= gnu_v3_base_object_ctor
;
2181 kind
= gnu_v3_complete_object_allocating_ctor
;
2184 kind
= gnu_v3_unified_ctor
;
2187 kind
= gnu_v3_object_ctor_group
;
2193 return d_make_ctor (di
, kind
, di
->last_name
);
2198 enum gnu_v3_dtor_kinds kind
;
2200 switch (d_peek_next_char (di
))
2203 kind
= gnu_v3_deleting_dtor
;
2206 kind
= gnu_v3_complete_object_dtor
;
2209 kind
= gnu_v3_base_object_dtor
;
2211 /* digit '3' is not used */
2213 kind
= gnu_v3_unified_dtor
;
2216 kind
= gnu_v3_object_dtor_group
;
2222 return d_make_dtor (di
, kind
, di
->last_name
);
2230 /* <type> ::= <builtin-type>
2232 ::= <class-enum-type>
2234 ::= <pointer-to-member-type>
2235 ::= <template-param>
2236 ::= <template-template-param> <template-args>
2238 ::= <CV-qualifiers> <type>
2241 ::= O <type> (C++0x)
2244 ::= U <source-name> <type>
2246 <builtin-type> ::= various one letter codes
2250 CP_STATIC_IF_GLIBCPP_V3
2251 const struct demangle_builtin_type_info
2252 cplus_demangle_builtin_types
[D_BUILTIN_TYPE_COUNT
] =
2254 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT
},
2255 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL
},
2256 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT
},
2257 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT
},
2258 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT
},
2259 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT
},
2260 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT
},
2261 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT
},
2262 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT
},
2263 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED
},
2264 /* k */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2265 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG
},
2266 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG
},
2267 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT
},
2268 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2270 /* p */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2271 /* q */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2272 /* r */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2273 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT
},
2274 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT
},
2275 /* u */ { NULL
, 0, NULL
, 0, D_PRINT_DEFAULT
},
2276 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID
},
2277 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT
},
2278 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG
},
2279 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2280 D_PRINT_UNSIGNED_LONG_LONG
},
2281 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT
},
2282 /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT
},
2283 /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT
},
2284 /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT
},
2285 /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT
},
2286 /* 30 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT
},
2287 /* 31 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT
},
2288 /* 32 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"),
2292 CP_STATIC_IF_GLIBCPP_V3
2293 struct demangle_component
*
2294 cplus_demangle_type (struct d_info
*di
)
2297 struct demangle_component
*ret
;
2300 /* The ABI specifies that when CV-qualifiers are used, the base type
2301 is substitutable, and the fully qualified type is substitutable,
2302 but the base type with a strict subset of the CV-qualifiers is
2303 not substitutable. The natural recursive implementation of the
2304 CV-qualifiers would cause subsets to be substitutable, so instead
2305 we pull them all off now.
2307 FIXME: The ABI says that order-insensitive vendor qualifiers
2308 should be handled in the same way, but we have no way to tell
2309 which vendor qualifiers are order-insensitive and which are
2310 order-sensitive. So we just assume that they are all
2311 order-sensitive. g++ 3.4 supports only one vendor qualifier,
2312 __vector, and it treats it as order-sensitive when mangling
2315 peek
= d_peek_char (di
);
2316 if (peek
== 'r' || peek
== 'V' || peek
== 'K'
2317 || (peek
== 'D' && d_peek_next_char (di
) == 'x'))
2319 struct demangle_component
**pret
;
2321 pret
= d_cv_qualifiers (di
, &ret
, 0);
2324 if (d_peek_char (di
) == 'F')
2326 /* cv-qualifiers before a function type apply to 'this',
2327 so avoid adding the unqualified function type to
2328 the substitution list. */
2329 *pret
= d_function_type (di
);
2332 *pret
= cplus_demangle_type (di
);
2335 if ((*pret
)->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
2336 || (*pret
)->type
== DEMANGLE_COMPONENT_REFERENCE_THIS
)
2338 /* Move the ref-qualifier outside the cv-qualifiers so that
2339 they are printed in the right order. */
2340 struct demangle_component
*fn
= d_left (*pret
);
2341 d_left (*pret
) = ret
;
2345 if (! d_add_substitution (di
, ret
))
2354 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2355 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
2356 case 'o': case 's': case 't':
2357 case 'v': case 'w': case 'x': case 'y': case 'z':
2358 ret
= d_make_builtin_type (di
,
2359 &cplus_demangle_builtin_types
[peek
- 'a']);
2360 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2367 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_VENDOR_TYPE
,
2368 d_source_name (di
), NULL
);
2372 ret
= d_function_type (di
);
2375 case '0': case '1': case '2': case '3': case '4':
2376 case '5': case '6': case '7': case '8': case '9':
2379 ret
= d_class_enum_type (di
);
2383 ret
= d_array_type (di
);
2387 ret
= d_pointer_to_member_type (di
);
2391 ret
= d_template_param (di
);
2392 if (d_peek_char (di
) == 'I')
2394 /* This may be <template-template-param> <template-args>.
2395 If this is the type for a conversion operator, we can
2396 have a <template-template-param> here only by following
2397 a derivation like this:
2400 -> <template-prefix> <template-args>
2401 -> <prefix> <template-unqualified-name> <template-args>
2402 -> <unqualified-name> <template-unqualified-name> <template-args>
2403 -> <source-name> <template-unqualified-name> <template-args>
2404 -> <source-name> <operator-name> <template-args>
2405 -> <source-name> cv <type> <template-args>
2406 -> <source-name> cv <template-template-param> <template-args> <template-args>
2408 where the <template-args> is followed by another.
2409 Otherwise, we must have a derivation like this:
2412 -> <template-prefix> <template-args>
2413 -> <prefix> <template-unqualified-name> <template-args>
2414 -> <unqualified-name> <template-unqualified-name> <template-args>
2415 -> <source-name> <template-unqualified-name> <template-args>
2416 -> <source-name> <operator-name> <template-args>
2417 -> <source-name> cv <type> <template-args>
2418 -> <source-name> cv <template-param> <template-args>
2420 where we need to leave the <template-args> to be processed
2421 by d_prefix (following the <template-prefix>).
2423 The <template-template-param> part is a substitution
2425 if (! di
->is_conversion
)
2427 if (! d_add_substitution (di
, ret
))
2429 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2430 d_template_args (di
));
2434 struct demangle_component
*args
;
2435 struct d_info_checkpoint checkpoint
;
2437 d_checkpoint (di
, &checkpoint
);
2438 args
= d_template_args (di
);
2439 if (d_peek_char (di
) == 'I')
2441 if (! d_add_substitution (di
, ret
))
2443 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2447 d_backtrack (di
, &checkpoint
);
2453 /* If this is a special substitution, then it is the start of
2454 <class-enum-type>. */
2458 peek_next
= d_peek_next_char (di
);
2459 if (IS_DIGIT (peek_next
)
2461 || IS_UPPER (peek_next
))
2463 ret
= d_substitution (di
, 0);
2464 /* The substituted name may have been a template name and
2465 may be followed by tepmlate args. */
2466 if (d_peek_char (di
) == 'I')
2467 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2468 d_template_args (di
));
2474 ret
= d_class_enum_type (di
);
2475 /* If the substitution was a complete type, then it is not
2476 a new substitution candidate. However, if the
2477 substitution was followed by template arguments, then
2478 the whole thing is a substitution candidate. */
2479 if (ret
!= NULL
&& ret
->type
== DEMANGLE_COMPONENT_SUB_STD
)
2487 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_RVALUE_REFERENCE
,
2488 cplus_demangle_type (di
), NULL
);
2493 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_POINTER
,
2494 cplus_demangle_type (di
), NULL
);
2499 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_REFERENCE
,
2500 cplus_demangle_type (di
), NULL
);
2505 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_COMPLEX
,
2506 cplus_demangle_type (di
), NULL
);
2511 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_IMAGINARY
,
2512 cplus_demangle_type (di
), NULL
);
2517 ret
= d_source_name (di
);
2518 if (d_peek_char (di
) == 'I')
2519 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, ret
,
2520 d_template_args (di
));
2521 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
,
2522 cplus_demangle_type (di
), ret
);
2528 peek
= d_next_char (di
);
2533 /* decltype (expression) */
2534 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_DECLTYPE
,
2535 d_expression (di
), NULL
);
2536 if (ret
&& d_next_char (di
) != 'E')
2542 /* Pack expansion. */
2543 ret
= d_make_comp (di
, DEMANGLE_COMPONENT_PACK_EXPANSION
,
2544 cplus_demangle_type (di
), NULL
);
2550 ret
= d_make_name (di
, "auto", 4);
2554 /* 32-bit decimal floating point */
2555 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[26]);
2556 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2560 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[27]);
2561 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2565 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[28]);
2566 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2569 /* 16-bit half-precision FP */
2570 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[29]);
2571 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2575 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[30]);
2576 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2580 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[31]);
2581 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2585 /* Fixed point types. DF<int bits><length><fract bits><sat> */
2586 ret
= d_make_empty (di
);
2587 ret
->type
= DEMANGLE_COMPONENT_FIXED_TYPE
;
2588 if ((ret
->u
.s_fixed
.accum
= IS_DIGIT (d_peek_char (di
))))
2589 /* For demangling we don't care about the bits. */
2591 ret
->u
.s_fixed
.length
= cplus_demangle_type (di
);
2592 if (ret
->u
.s_fixed
.length
== NULL
)
2595 peek
= d_next_char (di
);
2596 ret
->u
.s_fixed
.sat
= (peek
== 's');
2600 ret
= d_vector_type (di
);
2605 /* decltype(nullptr) */
2606 ret
= d_make_builtin_type (di
, &cplus_demangle_builtin_types
[32]);
2607 di
->expansion
+= ret
->u
.s_builtin
.type
->len
;
2621 if (! d_add_substitution (di
, ret
))
2628 /* <CV-qualifiers> ::= [r] [V] [K] [Dx] */
2630 static struct demangle_component
**
2631 d_cv_qualifiers (struct d_info
*di
,
2632 struct demangle_component
**pret
, int member_fn
)
2634 struct demangle_component
**pstart
;
2638 peek
= d_peek_char (di
);
2639 while (peek
== 'r' || peek
== 'V' || peek
== 'K'
2640 || (peek
== 'D' && d_peek_next_char (di
) == 'x'))
2642 enum demangle_component_type t
;
2648 ? DEMANGLE_COMPONENT_RESTRICT_THIS
2649 : DEMANGLE_COMPONENT_RESTRICT
);
2650 di
->expansion
+= sizeof "restrict";
2652 else if (peek
== 'V')
2655 ? DEMANGLE_COMPONENT_VOLATILE_THIS
2656 : DEMANGLE_COMPONENT_VOLATILE
);
2657 di
->expansion
+= sizeof "volatile";
2659 else if (peek
== 'K')
2662 ? DEMANGLE_COMPONENT_CONST_THIS
2663 : DEMANGLE_COMPONENT_CONST
);
2664 di
->expansion
+= sizeof "const";
2668 t
= DEMANGLE_COMPONENT_TRANSACTION_SAFE
;
2669 di
->expansion
+= sizeof "transaction_safe";
2673 *pret
= d_make_comp (di
, t
, NULL
, NULL
);
2676 pret
= &d_left (*pret
);
2678 peek
= d_peek_char (di
);
2681 if (!member_fn
&& peek
== 'F')
2683 while (pstart
!= pret
)
2685 switch ((*pstart
)->type
)
2687 case DEMANGLE_COMPONENT_RESTRICT
:
2688 (*pstart
)->type
= DEMANGLE_COMPONENT_RESTRICT_THIS
;
2690 case DEMANGLE_COMPONENT_VOLATILE
:
2691 (*pstart
)->type
= DEMANGLE_COMPONENT_VOLATILE_THIS
;
2693 case DEMANGLE_COMPONENT_CONST
:
2694 (*pstart
)->type
= DEMANGLE_COMPONENT_CONST_THIS
;
2699 pstart
= &d_left (*pstart
);
2706 /* <ref-qualifier> ::= R
2709 static struct demangle_component
*
2710 d_ref_qualifier (struct d_info
*di
, struct demangle_component
*sub
)
2712 struct demangle_component
*ret
= sub
;
2715 peek
= d_peek_char (di
);
2716 if (peek
== 'R' || peek
== 'O')
2718 enum demangle_component_type t
;
2721 t
= DEMANGLE_COMPONENT_REFERENCE_THIS
;
2722 di
->expansion
+= sizeof "&";
2726 t
= DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
;
2727 di
->expansion
+= sizeof "&&";
2731 ret
= d_make_comp (di
, t
, ret
, NULL
);
2737 /* <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] [T] E */
2739 static struct demangle_component
*
2740 d_function_type (struct d_info
*di
)
2742 struct demangle_component
*ret
;
2744 if (! d_check_char (di
, 'F'))
2746 if (d_peek_char (di
) == 'Y')
2748 /* Function has C linkage. We don't print this information.
2749 FIXME: We should print it in verbose mode. */
2752 ret
= d_bare_function_type (di
, 1);
2753 ret
= d_ref_qualifier (di
, ret
);
2755 if (! d_check_char (di
, 'E'))
2762 static struct demangle_component
*
2763 d_parmlist (struct d_info
*di
)
2765 struct demangle_component
*tl
;
2766 struct demangle_component
**ptl
;
2772 struct demangle_component
*type
;
2774 char peek
= d_peek_char (di
);
2775 if (peek
== '\0' || peek
== 'E' || peek
== '.')
2777 if ((peek
== 'R' || peek
== 'O')
2778 && d_peek_next_char (di
) == 'E')
2779 /* Function ref-qualifier, not a ref prefix for a parameter type. */
2781 type
= cplus_demangle_type (di
);
2784 *ptl
= d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, type
, NULL
);
2787 ptl
= &d_right (*ptl
);
2790 /* There should be at least one parameter type besides the optional
2791 return type. A function which takes no arguments will have a
2792 single parameter type void. */
2796 /* If we have a single parameter type void, omit it. */
2797 if (d_right (tl
) == NULL
2798 && d_left (tl
)->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
2799 && d_left (tl
)->u
.s_builtin
.type
->print
== D_PRINT_VOID
)
2801 di
->expansion
-= d_left (tl
)->u
.s_builtin
.type
->len
;
2808 /* <bare-function-type> ::= [J]<type>+ */
2810 static struct demangle_component
*
2811 d_bare_function_type (struct d_info
*di
, int has_return_type
)
2813 struct demangle_component
*return_type
;
2814 struct demangle_component
*tl
;
2817 /* Detect special qualifier indicating that the first argument
2818 is the return type. */
2819 peek
= d_peek_char (di
);
2823 has_return_type
= 1;
2826 if (has_return_type
)
2828 return_type
= cplus_demangle_type (di
);
2829 if (return_type
== NULL
)
2835 tl
= d_parmlist (di
);
2839 return d_make_comp (di
, DEMANGLE_COMPONENT_FUNCTION_TYPE
,
2843 /* <class-enum-type> ::= <name> */
2845 static struct demangle_component
*
2846 d_class_enum_type (struct d_info
*di
)
2851 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2852 ::= A [<(dimension) expression>] _ <(element) type>
2855 static struct demangle_component
*
2856 d_array_type (struct d_info
*di
)
2859 struct demangle_component
*dim
;
2861 if (! d_check_char (di
, 'A'))
2864 peek
= d_peek_char (di
);
2867 else if (IS_DIGIT (peek
))
2875 peek
= d_peek_char (di
);
2877 while (IS_DIGIT (peek
));
2878 dim
= d_make_name (di
, s
, d_str (di
) - s
);
2884 dim
= d_expression (di
);
2889 if (! d_check_char (di
, '_'))
2892 return d_make_comp (di
, DEMANGLE_COMPONENT_ARRAY_TYPE
, dim
,
2893 cplus_demangle_type (di
));
2896 /* <vector-type> ::= Dv <number> _ <type>
2897 ::= Dv _ <expression> _ <type> */
2899 static struct demangle_component
*
2900 d_vector_type (struct d_info
*di
)
2903 struct demangle_component
*dim
;
2905 peek
= d_peek_char (di
);
2909 dim
= d_expression (di
);
2912 dim
= d_number_component (di
);
2917 if (! d_check_char (di
, '_'))
2920 return d_make_comp (di
, DEMANGLE_COMPONENT_VECTOR_TYPE
, dim
,
2921 cplus_demangle_type (di
));
2924 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
2926 static struct demangle_component
*
2927 d_pointer_to_member_type (struct d_info
*di
)
2929 struct demangle_component
*cl
;
2930 struct demangle_component
*mem
;
2932 if (! d_check_char (di
, 'M'))
2935 cl
= cplus_demangle_type (di
);
2939 /* The ABI says, "The type of a non-static member function is considered
2940 to be different, for the purposes of substitution, from the type of a
2941 namespace-scope or static member function whose type appears
2942 similar. The types of two non-static member functions are considered
2943 to be different, for the purposes of substitution, if the functions
2944 are members of different classes. In other words, for the purposes of
2945 substitution, the class of which the function is a member is
2946 considered part of the type of function."
2948 For a pointer to member function, this call to cplus_demangle_type
2949 will end up adding a (possibly qualified) non-member function type to
2950 the substitution table, which is not correct; however, the member
2951 function type will never be used in a substitution, so putting the
2952 wrong type in the substitution table is harmless. */
2954 mem
= cplus_demangle_type (di
);
2958 return d_make_comp (di
, DEMANGLE_COMPONENT_PTRMEM_TYPE
, cl
, mem
);
2961 /* <non-negative number> _ */
2964 d_compact_number (struct d_info
*di
)
2967 if (d_peek_char (di
) == '_')
2969 else if (d_peek_char (di
) == 'n')
2972 num
= d_number (di
) + 1;
2974 if (num
< 0 || ! d_check_char (di
, '_'))
2979 /* <template-param> ::= T_
2980 ::= T <(parameter-2 non-negative) number> _
2983 static struct demangle_component
*
2984 d_template_param (struct d_info
*di
)
2988 if (! d_check_char (di
, 'T'))
2991 param
= d_compact_number (di
);
2997 return d_make_template_param (di
, param
);
3000 /* <template-args> ::= I <template-arg>+ E */
3002 static struct demangle_component
*
3003 d_template_args (struct d_info
*di
)
3005 if (d_peek_char (di
) != 'I'
3006 && d_peek_char (di
) != 'J')
3010 return d_template_args_1 (di
);
3013 /* <template-arg>* E */
3015 static struct demangle_component
*
3016 d_template_args_1 (struct d_info
*di
)
3018 struct demangle_component
*hold_last_name
;
3019 struct demangle_component
*al
;
3020 struct demangle_component
**pal
;
3022 /* Preserve the last name we saw--don't let the template arguments
3023 clobber it, as that would give us the wrong name for a subsequent
3024 constructor or destructor. */
3025 hold_last_name
= di
->last_name
;
3027 if (d_peek_char (di
) == 'E')
3029 /* An argument pack can be empty. */
3031 return d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
, NULL
, NULL
);
3038 struct demangle_component
*a
;
3040 a
= d_template_arg (di
);
3044 *pal
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
, a
, NULL
);
3047 pal
= &d_right (*pal
);
3049 if (d_peek_char (di
) == 'E')
3056 di
->last_name
= hold_last_name
;
3061 /* <template-arg> ::= <type>
3062 ::= X <expression> E
3066 static struct demangle_component
*
3067 d_template_arg (struct d_info
*di
)
3069 struct demangle_component
*ret
;
3071 switch (d_peek_char (di
))
3075 ret
= d_expression (di
);
3076 if (! d_check_char (di
, 'E'))
3081 return d_expr_primary (di
);
3085 /* An argument pack. */
3086 return d_template_args (di
);
3089 return cplus_demangle_type (di
);
3093 /* Parse a sequence of expressions until we hit the terminator
3096 static struct demangle_component
*
3097 d_exprlist (struct d_info
*di
, char terminator
)
3099 struct demangle_component
*list
= NULL
;
3100 struct demangle_component
**p
= &list
;
3102 if (d_peek_char (di
) == terminator
)
3105 return d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, NULL
, NULL
);
3110 struct demangle_component
*arg
= d_expression (di
);
3114 *p
= d_make_comp (di
, DEMANGLE_COMPONENT_ARGLIST
, arg
, NULL
);
3119 if (d_peek_char (di
) == terminator
)
3129 /* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
3130 dynamic_cast, static_cast or reinterpret_cast. */
3133 op_is_new_cast (struct demangle_component
*op
)
3135 const char *code
= op
->u
.s_operator
.op
->code
;
3136 return (code
[1] == 'c'
3137 && (code
[0] == 's' || code
[0] == 'd'
3138 || code
[0] == 'c' || code
[0] == 'r'));
3141 /* <expression> ::= <(unary) operator-name> <expression>
3142 ::= <(binary) operator-name> <expression> <expression>
3143 ::= <(trinary) operator-name> <expression> <expression> <expression>
3144 ::= cl <expression>+ E
3146 ::= <template-param>
3147 ::= sr <type> <unqualified-name>
3148 ::= sr <type> <unqualified-name> <template-args>
3152 static inline struct demangle_component
*
3153 d_expression_1 (struct d_info
*di
)
3157 peek
= d_peek_char (di
);
3159 return d_expr_primary (di
);
3160 else if (peek
== 'T')
3161 return d_template_param (di
);
3162 else if (peek
== 's' && d_peek_next_char (di
) == 'r')
3164 struct demangle_component
*type
;
3165 struct demangle_component
*name
;
3168 type
= cplus_demangle_type (di
);
3169 name
= d_unqualified_name (di
);
3170 if (d_peek_char (di
) != 'I')
3171 return d_make_comp (di
, DEMANGLE_COMPONENT_QUAL_NAME
, type
, name
);
3173 return d_make_comp (di
, DEMANGLE_COMPONENT_QUAL_NAME
, type
,
3174 d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, name
,
3175 d_template_args (di
)));
3177 else if (peek
== 's' && d_peek_next_char (di
) == 'p')
3180 return d_make_comp (di
, DEMANGLE_COMPONENT_PACK_EXPANSION
,
3181 d_expression_1 (di
), NULL
);
3183 else if (peek
== 'f' && d_peek_next_char (di
) == 'p')
3185 /* Function parameter used in a late-specified return type. */
3188 if (d_peek_char (di
) == 'T')
3190 /* 'this' parameter. */
3196 index
= d_compact_number (di
);
3197 if (index
== INT_MAX
|| index
== -1)
3201 return d_make_function_param (di
, index
);
3203 else if (IS_DIGIT (peek
)
3204 || (peek
== 'o' && d_peek_next_char (di
) == 'n'))
3206 /* We can get an unqualified name as an expression in the case of
3207 a dependent function call, i.e. decltype(f(t)). */
3208 struct demangle_component
*name
;
3211 /* operator-function-id, i.e. operator+(t). */
3214 name
= d_unqualified_name (di
);
3217 if (d_peek_char (di
) == 'I')
3218 return d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
, name
,
3219 d_template_args (di
));
3223 else if ((peek
== 'i' || peek
== 't')
3224 && d_peek_next_char (di
) == 'l')
3226 /* Brace-enclosed initializer list, untyped or typed. */
3227 struct demangle_component
*type
= NULL
;
3229 type
= cplus_demangle_type (di
);
3230 if (!d_peek_next_char (di
))
3233 return d_make_comp (di
, DEMANGLE_COMPONENT_INITIALIZER_LIST
,
3234 type
, d_exprlist (di
, 'E'));
3238 struct demangle_component
*op
;
3239 const char *code
= NULL
;
3242 op
= d_operator_name (di
);
3246 if (op
->type
== DEMANGLE_COMPONENT_OPERATOR
)
3248 code
= op
->u
.s_operator
.op
->code
;
3249 di
->expansion
+= op
->u
.s_operator
.op
->len
- 2;
3250 if (strcmp (code
, "st") == 0)
3251 return d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, op
,
3252 cplus_demangle_type (di
));
3259 case DEMANGLE_COMPONENT_OPERATOR
:
3260 args
= op
->u
.s_operator
.op
->args
;
3262 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
3263 args
= op
->u
.s_extended_operator
.args
;
3265 case DEMANGLE_COMPONENT_CAST
:
3273 return d_make_comp (di
, DEMANGLE_COMPONENT_NULLARY
, op
, NULL
);
3277 struct demangle_component
*operand
;
3280 if (code
&& (code
[0] == 'p' || code
[0] == 'm')
3281 && code
[1] == code
[0])
3282 /* pp_ and mm_ are the prefix variants. */
3283 suffix
= !d_check_char (di
, '_');
3285 if (op
->type
== DEMANGLE_COMPONENT_CAST
3286 && d_check_char (di
, '_'))
3287 operand
= d_exprlist (di
, 'E');
3288 else if (code
&& !strcmp (code
, "sP"))
3289 operand
= d_template_args_1 (di
);
3291 operand
= d_expression_1 (di
);
3294 /* Indicate the suffix variant for d_print_comp. */
3295 return d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, op
,
3297 DEMANGLE_COMPONENT_BINARY_ARGS
,
3300 return d_make_comp (di
, DEMANGLE_COMPONENT_UNARY
, op
,
3305 struct demangle_component
*left
;
3306 struct demangle_component
*right
;
3310 if (op_is_new_cast (op
))
3311 left
= cplus_demangle_type (di
);
3312 else if (code
[0] == 'f')
3313 /* fold-expression. */
3314 left
= d_operator_name (di
);
3316 left
= d_expression_1 (di
);
3317 if (!strcmp (code
, "cl"))
3318 right
= d_exprlist (di
, 'E');
3319 else if (!strcmp (code
, "dt") || !strcmp (code
, "pt"))
3321 right
= d_unqualified_name (di
);
3322 if (d_peek_char (di
) == 'I')
3323 right
= d_make_comp (di
, DEMANGLE_COMPONENT_TEMPLATE
,
3324 right
, d_template_args (di
));
3327 right
= d_expression_1 (di
);
3329 return d_make_comp (di
, DEMANGLE_COMPONENT_BINARY
, op
,
3331 DEMANGLE_COMPONENT_BINARY_ARGS
,
3336 struct demangle_component
*first
;
3337 struct demangle_component
*second
;
3338 struct demangle_component
*third
;
3342 else if (!strcmp (code
, "qu"))
3344 /* ?: expression. */
3345 first
= d_expression_1 (di
);
3346 second
= d_expression_1 (di
);
3347 third
= d_expression_1 (di
);
3349 else if (code
[0] == 'f')
3351 /* fold-expression. */
3352 first
= d_operator_name (di
);
3353 second
= d_expression_1 (di
);
3354 third
= d_expression_1 (di
);
3356 else if (code
[0] == 'n')
3358 /* new-expression. */
3359 if (code
[1] != 'w' && code
[1] != 'a')
3361 first
= d_exprlist (di
, '_');
3362 second
= cplus_demangle_type (di
);
3363 if (d_peek_char (di
) == 'E')
3368 else if (d_peek_char (di
) == 'p'
3369 && d_peek_next_char (di
) == 'i')
3371 /* Parenthesized initializer. */
3373 third
= d_exprlist (di
, 'E');
3375 else if (d_peek_char (di
) == 'i'
3376 && d_peek_next_char (di
) == 'l')
3377 /* initializer-list. */
3378 third
= d_expression_1 (di
);
3384 return d_make_comp (di
, DEMANGLE_COMPONENT_TRINARY
, op
,
3386 DEMANGLE_COMPONENT_TRINARY_ARG1
,
3389 DEMANGLE_COMPONENT_TRINARY_ARG2
,
3398 static struct demangle_component
*
3399 d_expression (struct d_info
*di
)
3401 struct demangle_component
*ret
;
3402 int was_expression
= di
->is_expression
;
3404 di
->is_expression
= 1;
3405 ret
= d_expression_1 (di
);
3406 di
->is_expression
= was_expression
;
3410 /* <expr-primary> ::= L <type> <(value) number> E
3411 ::= L <type> <(value) float> E
3412 ::= L <mangled-name> E
3415 static struct demangle_component
*
3416 d_expr_primary (struct d_info
*di
)
3418 struct demangle_component
*ret
;
3420 if (! d_check_char (di
, 'L'))
3422 if (d_peek_char (di
) == '_'
3423 /* Workaround for G++ bug; see comment in write_template_arg. */
3424 || d_peek_char (di
) == 'Z')
3425 ret
= cplus_demangle_mangled_name (di
, 0);
3428 struct demangle_component
*type
;
3429 enum demangle_component_type t
;
3432 type
= cplus_demangle_type (di
);
3436 /* If we have a type we know how to print, we aren't going to
3437 print the type name itself. */
3438 if (type
->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
3439 && type
->u
.s_builtin
.type
->print
!= D_PRINT_DEFAULT
)
3440 di
->expansion
-= type
->u
.s_builtin
.type
->len
;
3442 /* Rather than try to interpret the literal value, we just
3443 collect it as a string. Note that it's possible to have a
3444 floating point literal here. The ABI specifies that the
3445 format of such literals is machine independent. That's fine,
3446 but what's not fine is that versions of g++ up to 3.2 with
3447 -fabi-version=1 used upper case letters in the hex constant,
3448 and dumped out gcc's internal representation. That makes it
3449 hard to tell where the constant ends, and hard to dump the
3450 constant in any readable form anyhow. We don't attempt to
3451 handle these cases. */
3453 t
= DEMANGLE_COMPONENT_LITERAL
;
3454 if (d_peek_char (di
) == 'n')
3456 t
= DEMANGLE_COMPONENT_LITERAL_NEG
;
3460 while (d_peek_char (di
) != 'E')
3462 if (d_peek_char (di
) == '\0')
3466 ret
= d_make_comp (di
, t
, type
, d_make_name (di
, s
, d_str (di
) - s
));
3468 if (! d_check_char (di
, 'E'))
3473 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3474 ::= Z <(function) encoding> E s [<discriminator>]
3475 ::= Z <(function) encoding> E d [<parameter> number>] _ <entity name>
3478 static struct demangle_component
*
3479 d_local_name (struct d_info
*di
)
3481 struct demangle_component
*function
;
3483 if (! d_check_char (di
, 'Z'))
3486 function
= d_encoding (di
, 0);
3488 if (! d_check_char (di
, 'E'))
3491 if (d_peek_char (di
) == 's')
3494 if (! d_discriminator (di
))
3496 return d_make_comp (di
, DEMANGLE_COMPONENT_LOCAL_NAME
, function
,
3497 d_make_name (di
, "string literal",
3498 sizeof "string literal" - 1));
3502 struct demangle_component
*name
;
3505 if (d_peek_char (di
) == 'd')
3507 /* Default argument scope: d <number> _. */
3509 num
= d_compact_number (di
);
3518 /* Lambdas and unnamed types have internal discriminators. */
3519 case DEMANGLE_COMPONENT_LAMBDA
:
3520 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
3523 if (! d_discriminator (di
))
3527 name
= d_make_default_arg (di
, num
, name
);
3528 return d_make_comp (di
, DEMANGLE_COMPONENT_LOCAL_NAME
, function
, name
);
3532 /* <discriminator> ::= _ <(non-negative) number>
3534 We demangle the discriminator, but we don't print it out. FIXME:
3535 We should print it out in verbose mode. */
3538 d_discriminator (struct d_info
*di
)
3542 if (d_peek_char (di
) != '_')
3545 discrim
= d_number (di
);
3551 /* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */
3553 static struct demangle_component
*
3554 d_lambda (struct d_info
*di
)
3556 struct demangle_component
*tl
;
3557 struct demangle_component
*ret
;
3560 if (! d_check_char (di
, 'U'))
3562 if (! d_check_char (di
, 'l'))
3565 tl
= d_parmlist (di
);
3569 if (! d_check_char (di
, 'E'))
3572 num
= d_compact_number (di
);
3576 ret
= d_make_empty (di
);
3579 ret
->type
= DEMANGLE_COMPONENT_LAMBDA
;
3580 ret
->u
.s_unary_num
.sub
= tl
;
3581 ret
->u
.s_unary_num
.num
= num
;
3584 if (! d_add_substitution (di
, ret
))
3590 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
3592 static struct demangle_component
*
3593 d_unnamed_type (struct d_info
*di
)
3595 struct demangle_component
*ret
;
3598 if (! d_check_char (di
, 'U'))
3600 if (! d_check_char (di
, 't'))
3603 num
= d_compact_number (di
);
3607 ret
= d_make_empty (di
);
3610 ret
->type
= DEMANGLE_COMPONENT_UNNAMED_TYPE
;
3611 ret
->u
.s_number
.number
= num
;
3614 if (! d_add_substitution (di
, ret
))
3620 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
3623 static struct demangle_component
*
3624 d_clone_suffix (struct d_info
*di
, struct demangle_component
*encoding
)
3626 const char *suffix
= d_str (di
);
3627 const char *pend
= suffix
;
3628 struct demangle_component
*n
;
3630 if (*pend
== '.' && (IS_LOWER (pend
[1]) || pend
[1] == '_'))
3633 while (IS_LOWER (*pend
) || *pend
== '_')
3636 while (*pend
== '.' && IS_DIGIT (pend
[1]))
3639 while (IS_DIGIT (*pend
))
3642 d_advance (di
, pend
- suffix
);
3643 n
= d_make_name (di
, suffix
, pend
- suffix
);
3644 return d_make_comp (di
, DEMANGLE_COMPONENT_CLONE
, encoding
, n
);
3647 /* Add a new substitution. */
3650 d_add_substitution (struct d_info
*di
, struct demangle_component
*dc
)
3654 if (di
->next_sub
>= di
->num_subs
)
3656 di
->subs
[di
->next_sub
] = dc
;
3661 /* <substitution> ::= S <seq-id> _
3671 If PREFIX is non-zero, then this type is being used as a prefix in
3672 a qualified name. In this case, for the standard substitutions, we
3673 need to check whether we are being used as a prefix for a
3674 constructor or destructor, and return a full template name.
3675 Otherwise we will get something like std::iostream::~iostream()
3676 which does not correspond particularly well to any function which
3677 actually appears in the source.
3680 static const struct d_standard_sub_info standard_subs
[] =
3685 { 'a', NL ("std::allocator"),
3686 NL ("std::allocator"),
3688 { 'b', NL ("std::basic_string"),
3689 NL ("std::basic_string"),
3690 NL ("basic_string") },
3691 { 's', NL ("std::string"),
3692 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
3693 NL ("basic_string") },
3694 { 'i', NL ("std::istream"),
3695 NL ("std::basic_istream<char, std::char_traits<char> >"),
3696 NL ("basic_istream") },
3697 { 'o', NL ("std::ostream"),
3698 NL ("std::basic_ostream<char, std::char_traits<char> >"),
3699 NL ("basic_ostream") },
3700 { 'd', NL ("std::iostream"),
3701 NL ("std::basic_iostream<char, std::char_traits<char> >"),
3702 NL ("basic_iostream") }
3705 static struct demangle_component
*
3706 d_substitution (struct d_info
*di
, int prefix
)
3710 if (! d_check_char (di
, 'S'))
3713 c
= d_next_char (di
);
3714 if (c
== '_' || IS_DIGIT (c
) || IS_UPPER (c
))
3723 unsigned int new_id
;
3726 new_id
= id
* 36 + c
- '0';
3727 else if (IS_UPPER (c
))
3728 new_id
= id
* 36 + c
- 'A' + 10;
3734 c
= d_next_char (di
);
3741 if (id
>= (unsigned int) di
->next_sub
)
3746 return di
->subs
[id
];
3751 const struct d_standard_sub_info
*p
;
3752 const struct d_standard_sub_info
*pend
;
3754 verbose
= (di
->options
& DMGL_VERBOSE
) != 0;
3755 if (! verbose
&& prefix
)
3759 peek
= d_peek_char (di
);
3760 if (peek
== 'C' || peek
== 'D')
3764 pend
= (&standard_subs
[0]
3765 + sizeof standard_subs
/ sizeof standard_subs
[0]);
3766 for (p
= &standard_subs
[0]; p
< pend
; ++p
)
3772 struct demangle_component
*c
;
3774 if (p
->set_last_name
!= NULL
)
3775 di
->last_name
= d_make_sub (di
, p
->set_last_name
,
3776 p
->set_last_name_len
);
3779 s
= p
->full_expansion
;
3784 s
= p
->simple_expansion
;
3785 len
= p
->simple_len
;
3787 di
->expansion
+= len
;
3788 c
= d_make_sub (di
, s
, len
);
3789 if (d_peek_char (di
) == 'B')
3791 /* If there are ABI tags on the abbreviation, it becomes
3792 a substitution candidate. */
3793 c
= d_abi_tags (di
, c
);
3794 d_add_substitution (di
, c
);
3805 d_checkpoint (struct d_info
*di
, struct d_info_checkpoint
*checkpoint
)
3807 checkpoint
->n
= di
->n
;
3808 checkpoint
->next_comp
= di
->next_comp
;
3809 checkpoint
->next_sub
= di
->next_sub
;
3810 checkpoint
->did_subs
= di
->did_subs
;
3811 checkpoint
->expansion
= di
->expansion
;
3815 d_backtrack (struct d_info
*di
, struct d_info_checkpoint
*checkpoint
)
3817 di
->n
= checkpoint
->n
;
3818 di
->next_comp
= checkpoint
->next_comp
;
3819 di
->next_sub
= checkpoint
->next_sub
;
3820 di
->did_subs
= checkpoint
->did_subs
;
3821 di
->expansion
= checkpoint
->expansion
;
3824 /* Initialize a growable string. */
3827 d_growable_string_init (struct d_growable_string
*dgs
, size_t estimate
)
3832 dgs
->allocation_failure
= 0;
3835 d_growable_string_resize (dgs
, estimate
);
3838 /* Grow a growable string to a given size. */
3841 d_growable_string_resize (struct d_growable_string
*dgs
, size_t need
)
3846 if (dgs
->allocation_failure
)
3849 /* Start allocation at two bytes to avoid any possibility of confusion
3850 with the special value of 1 used as a return in *palc to indicate
3851 allocation failures. */
3852 newalc
= dgs
->alc
> 0 ? dgs
->alc
: 2;
3853 while (newalc
< need
)
3856 newbuf
= (char *) realloc (dgs
->buf
, newalc
);
3863 dgs
->allocation_failure
= 1;
3870 /* Append a buffer to a growable string. */
3873 d_growable_string_append_buffer (struct d_growable_string
*dgs
,
3874 const char *s
, size_t l
)
3878 need
= dgs
->len
+ l
+ 1;
3879 if (need
> dgs
->alc
)
3880 d_growable_string_resize (dgs
, need
);
3882 if (dgs
->allocation_failure
)
3885 memcpy (dgs
->buf
+ dgs
->len
, s
, l
);
3886 dgs
->buf
[dgs
->len
+ l
] = '\0';
3890 /* Bridge growable strings to the callback mechanism. */
3893 d_growable_string_callback_adapter (const char *s
, size_t l
, void *opaque
)
3895 struct d_growable_string
*dgs
= (struct d_growable_string
*) opaque
;
3897 d_growable_string_append_buffer (dgs
, s
, l
);
3900 /* Walk the tree, counting the number of templates encountered, and
3901 the number of times a scope might be saved. These counts will be
3902 used to allocate data structures for d_print_comp, so the logic
3903 here must mirror the logic d_print_comp will use. It is not
3904 important that the resulting numbers are exact, so long as they
3905 are larger than the actual numbers encountered. */
3908 d_count_templates_scopes (int *num_templates
, int *num_scopes
,
3909 const struct demangle_component
*dc
)
3916 case DEMANGLE_COMPONENT_NAME
:
3917 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
3918 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
3919 case DEMANGLE_COMPONENT_SUB_STD
:
3920 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
3921 case DEMANGLE_COMPONENT_OPERATOR
:
3922 case DEMANGLE_COMPONENT_CHARACTER
:
3923 case DEMANGLE_COMPONENT_NUMBER
:
3924 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
3927 case DEMANGLE_COMPONENT_TEMPLATE
:
3929 goto recurse_left_right
;
3931 case DEMANGLE_COMPONENT_REFERENCE
:
3932 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
3933 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_TEMPLATE_PARAM
)
3935 goto recurse_left_right
;
3937 case DEMANGLE_COMPONENT_QUAL_NAME
:
3938 case DEMANGLE_COMPONENT_LOCAL_NAME
:
3939 case DEMANGLE_COMPONENT_TYPED_NAME
:
3940 case DEMANGLE_COMPONENT_VTABLE
:
3941 case DEMANGLE_COMPONENT_VTT
:
3942 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
3943 case DEMANGLE_COMPONENT_TYPEINFO
:
3944 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
3945 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
3946 case DEMANGLE_COMPONENT_THUNK
:
3947 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
3948 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
3949 case DEMANGLE_COMPONENT_JAVA_CLASS
:
3950 case DEMANGLE_COMPONENT_GUARD
:
3951 case DEMANGLE_COMPONENT_TLS_INIT
:
3952 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
3953 case DEMANGLE_COMPONENT_REFTEMP
:
3954 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
3955 case DEMANGLE_COMPONENT_RESTRICT
:
3956 case DEMANGLE_COMPONENT_VOLATILE
:
3957 case DEMANGLE_COMPONENT_CONST
:
3958 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
3959 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
3960 case DEMANGLE_COMPONENT_CONST_THIS
:
3961 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
3962 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
3963 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
3964 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
3965 case DEMANGLE_COMPONENT_POINTER
:
3966 case DEMANGLE_COMPONENT_COMPLEX
:
3967 case DEMANGLE_COMPONENT_IMAGINARY
:
3968 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
3969 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
3970 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
3971 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
3972 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
3973 case DEMANGLE_COMPONENT_ARGLIST
:
3974 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
3975 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
3976 case DEMANGLE_COMPONENT_CAST
:
3977 case DEMANGLE_COMPONENT_CONVERSION
:
3978 case DEMANGLE_COMPONENT_NULLARY
:
3979 case DEMANGLE_COMPONENT_UNARY
:
3980 case DEMANGLE_COMPONENT_BINARY
:
3981 case DEMANGLE_COMPONENT_BINARY_ARGS
:
3982 case DEMANGLE_COMPONENT_TRINARY
:
3983 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
3984 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
3985 case DEMANGLE_COMPONENT_LITERAL
:
3986 case DEMANGLE_COMPONENT_LITERAL_NEG
:
3987 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
3988 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
3989 case DEMANGLE_COMPONENT_DECLTYPE
:
3990 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
3991 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
3992 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
3993 case DEMANGLE_COMPONENT_TAGGED_NAME
:
3994 case DEMANGLE_COMPONENT_CLONE
:
3996 d_count_templates_scopes (num_templates
, num_scopes
,
3998 d_count_templates_scopes (num_templates
, num_scopes
,
4002 case DEMANGLE_COMPONENT_CTOR
:
4003 d_count_templates_scopes (num_templates
, num_scopes
,
4007 case DEMANGLE_COMPONENT_DTOR
:
4008 d_count_templates_scopes (num_templates
, num_scopes
,
4012 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
4013 d_count_templates_scopes (num_templates
, num_scopes
,
4014 dc
->u
.s_extended_operator
.name
);
4017 case DEMANGLE_COMPONENT_FIXED_TYPE
:
4018 d_count_templates_scopes (num_templates
, num_scopes
,
4019 dc
->u
.s_fixed
.length
);
4022 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
4023 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
4024 d_count_templates_scopes (num_templates
, num_scopes
,
4028 case DEMANGLE_COMPONENT_LAMBDA
:
4029 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
4030 d_count_templates_scopes (num_templates
, num_scopes
,
4031 dc
->u
.s_unary_num
.sub
);
4036 /* Initialize a print information structure. */
4039 d_print_init (struct d_print_info
*dpi
, demangle_callbackref callback
,
4040 void *opaque
, const struct demangle_component
*dc
)
4043 dpi
->last_char
= '\0';
4044 dpi
->templates
= NULL
;
4045 dpi
->modifiers
= NULL
;
4046 dpi
->pack_index
= 0;
4047 dpi
->flush_count
= 0;
4049 dpi
->callback
= callback
;
4050 dpi
->opaque
= opaque
;
4052 dpi
->demangle_failure
= 0;
4054 dpi
->component_stack
= NULL
;
4056 dpi
->saved_scopes
= NULL
;
4057 dpi
->next_saved_scope
= 0;
4058 dpi
->num_saved_scopes
= 0;
4060 dpi
->copy_templates
= NULL
;
4061 dpi
->next_copy_template
= 0;
4062 dpi
->num_copy_templates
= 0;
4064 d_count_templates_scopes (&dpi
->num_copy_templates
,
4065 &dpi
->num_saved_scopes
, dc
);
4066 dpi
->num_copy_templates
*= dpi
->num_saved_scopes
;
4068 dpi
->current_template
= NULL
;
4071 /* Indicate that an error occurred during printing, and test for error. */
4074 d_print_error (struct d_print_info
*dpi
)
4076 dpi
->demangle_failure
= 1;
4080 d_print_saw_error (struct d_print_info
*dpi
)
4082 return dpi
->demangle_failure
!= 0;
4085 /* Flush buffered characters to the callback. */
4088 d_print_flush (struct d_print_info
*dpi
)
4090 dpi
->buf
[dpi
->len
] = '\0';
4091 dpi
->callback (dpi
->buf
, dpi
->len
, dpi
->opaque
);
4096 /* Append characters and buffers for printing. */
4099 d_append_char (struct d_print_info
*dpi
, char c
)
4101 if (dpi
->len
== sizeof (dpi
->buf
) - 1)
4102 d_print_flush (dpi
);
4104 dpi
->buf
[dpi
->len
++] = c
;
4109 d_append_buffer (struct d_print_info
*dpi
, const char *s
, size_t l
)
4113 for (i
= 0; i
< l
; i
++)
4114 d_append_char (dpi
, s
[i
]);
4118 d_append_string (struct d_print_info
*dpi
, const char *s
)
4120 d_append_buffer (dpi
, s
, strlen (s
));
4124 d_append_num (struct d_print_info
*dpi
, int l
)
4127 sprintf (buf
,"%d", l
);
4128 d_append_string (dpi
, buf
);
4132 d_last_char (struct d_print_info
*dpi
)
4134 return dpi
->last_char
;
4137 /* Turn components into a human readable string. OPTIONS is the
4138 options bits passed to the demangler. DC is the tree to print.
4139 CALLBACK is a function to call to flush demangled string segments
4140 as they fill the intermediate buffer, and OPAQUE is a generalized
4141 callback argument. On success, this returns 1. On failure,
4142 it returns 0, indicating a bad parse. It does not use heap
4143 memory to build an output string, so cannot encounter memory
4144 allocation failure. */
4146 CP_STATIC_IF_GLIBCPP_V3
4148 cplus_demangle_print_callback (int options
,
4149 const struct demangle_component
*dc
,
4150 demangle_callbackref callback
, void *opaque
)
4152 struct d_print_info dpi
;
4154 d_print_init (&dpi
, callback
, opaque
, dc
);
4157 #ifdef CP_DYNAMIC_ARRAYS
4158 /* Avoid zero-length VLAs, which are prohibited by the C99 standard
4159 and flagged as errors by Address Sanitizer. */
4160 __extension__
struct d_saved_scope scopes
[(dpi
.num_saved_scopes
> 0)
4161 ? dpi
.num_saved_scopes
: 1];
4162 __extension__
struct d_print_template temps
[(dpi
.num_copy_templates
> 0)
4163 ? dpi
.num_copy_templates
: 1];
4165 dpi
.saved_scopes
= scopes
;
4166 dpi
.copy_templates
= temps
;
4168 dpi
.saved_scopes
= alloca (dpi
.num_saved_scopes
4169 * sizeof (*dpi
.saved_scopes
));
4170 dpi
.copy_templates
= alloca (dpi
.num_copy_templates
4171 * sizeof (*dpi
.copy_templates
));
4174 d_print_comp (&dpi
, options
, dc
);
4177 d_print_flush (&dpi
);
4179 return ! d_print_saw_error (&dpi
);
4182 /* Turn components into a human readable string. OPTIONS is the
4183 options bits passed to the demangler. DC is the tree to print.
4184 ESTIMATE is a guess at the length of the result. This returns a
4185 string allocated by malloc, or NULL on error. On success, this
4186 sets *PALC to the size of the allocated buffer. On failure, this
4187 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
4190 CP_STATIC_IF_GLIBCPP_V3
4192 cplus_demangle_print (int options
, const struct demangle_component
*dc
,
4193 int estimate
, size_t *palc
)
4195 struct d_growable_string dgs
;
4197 d_growable_string_init (&dgs
, estimate
);
4199 if (! cplus_demangle_print_callback (options
, dc
,
4200 d_growable_string_callback_adapter
,
4208 *palc
= dgs
.allocation_failure
? 1 : dgs
.alc
;
4212 /* Returns the I'th element of the template arglist ARGS, or NULL on
4213 failure. If I is negative, return the entire arglist. */
4215 static struct demangle_component
*
4216 d_index_template_argument (struct demangle_component
*args
, int i
)
4218 struct demangle_component
*a
;
4221 /* Print the whole argument pack. */
4228 if (a
->type
!= DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4234 if (i
!= 0 || a
== NULL
)
4240 /* Returns the template argument from the current context indicated by DC,
4241 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
4243 static struct demangle_component
*
4244 d_lookup_template_argument (struct d_print_info
*dpi
,
4245 const struct demangle_component
*dc
)
4247 if (dpi
->templates
== NULL
)
4249 d_print_error (dpi
);
4253 return d_index_template_argument
4254 (d_right (dpi
->templates
->template_decl
),
4255 dc
->u
.s_number
.number
);
4258 /* Returns a template argument pack used in DC (any will do), or NULL. */
4260 static struct demangle_component
*
4261 d_find_pack (struct d_print_info
*dpi
,
4262 const struct demangle_component
*dc
)
4264 struct demangle_component
*a
;
4270 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
4271 a
= d_lookup_template_argument (dpi
, dc
);
4272 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4276 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
4279 case DEMANGLE_COMPONENT_LAMBDA
:
4280 case DEMANGLE_COMPONENT_NAME
:
4281 case DEMANGLE_COMPONENT_TAGGED_NAME
:
4282 case DEMANGLE_COMPONENT_OPERATOR
:
4283 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
4284 case DEMANGLE_COMPONENT_SUB_STD
:
4285 case DEMANGLE_COMPONENT_CHARACTER
:
4286 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
4287 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
4288 case DEMANGLE_COMPONENT_FIXED_TYPE
:
4289 case DEMANGLE_COMPONENT_DEFAULT_ARG
:
4290 case DEMANGLE_COMPONENT_NUMBER
:
4293 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
4294 return d_find_pack (dpi
, dc
->u
.s_extended_operator
.name
);
4295 case DEMANGLE_COMPONENT_CTOR
:
4296 return d_find_pack (dpi
, dc
->u
.s_ctor
.name
);
4297 case DEMANGLE_COMPONENT_DTOR
:
4298 return d_find_pack (dpi
, dc
->u
.s_dtor
.name
);
4301 a
= d_find_pack (dpi
, d_left (dc
));
4304 return d_find_pack (dpi
, d_right (dc
));
4308 /* Returns the length of the template argument pack DC. */
4311 d_pack_length (const struct demangle_component
*dc
)
4314 while (dc
&& dc
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
4315 && d_left (dc
) != NULL
)
4323 /* Returns the number of template args in DC, expanding any pack expansions
4327 d_args_length (struct d_print_info
*dpi
, const struct demangle_component
*dc
)
4330 for (; dc
&& dc
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
;
4333 struct demangle_component
*elt
= d_left (dc
);
4336 if (elt
->type
== DEMANGLE_COMPONENT_PACK_EXPANSION
)
4338 struct demangle_component
*a
= d_find_pack (dpi
, d_left (elt
));
4339 count
+= d_pack_length (a
);
4347 /* DC is a component of a mangled expression. Print it, wrapped in parens
4351 d_print_subexpr (struct d_print_info
*dpi
, int options
,
4352 const struct demangle_component
*dc
)
4355 if (dc
->type
== DEMANGLE_COMPONENT_NAME
4356 || dc
->type
== DEMANGLE_COMPONENT_QUAL_NAME
4357 || dc
->type
== DEMANGLE_COMPONENT_INITIALIZER_LIST
4358 || dc
->type
== DEMANGLE_COMPONENT_FUNCTION_PARAM
)
4361 d_append_char (dpi
, '(');
4362 d_print_comp (dpi
, options
, dc
);
4364 d_append_char (dpi
, ')');
4367 /* Save the current scope. */
4370 d_save_scope (struct d_print_info
*dpi
,
4371 const struct demangle_component
*container
)
4373 struct d_saved_scope
*scope
;
4374 struct d_print_template
*src
, **link
;
4376 if (dpi
->next_saved_scope
>= dpi
->num_saved_scopes
)
4378 d_print_error (dpi
);
4381 scope
= &dpi
->saved_scopes
[dpi
->next_saved_scope
];
4382 dpi
->next_saved_scope
++;
4384 scope
->container
= container
;
4385 link
= &scope
->templates
;
4387 for (src
= dpi
->templates
; src
!= NULL
; src
= src
->next
)
4389 struct d_print_template
*dst
;
4391 if (dpi
->next_copy_template
>= dpi
->num_copy_templates
)
4393 d_print_error (dpi
);
4396 dst
= &dpi
->copy_templates
[dpi
->next_copy_template
];
4397 dpi
->next_copy_template
++;
4399 dst
->template_decl
= src
->template_decl
;
4407 /* Attempt to locate a previously saved scope. Returns NULL if no
4408 corresponding saved scope was found. */
4410 static struct d_saved_scope
*
4411 d_get_saved_scope (struct d_print_info
*dpi
,
4412 const struct demangle_component
*container
)
4416 for (i
= 0; i
< dpi
->next_saved_scope
; i
++)
4417 if (dpi
->saved_scopes
[i
].container
== container
)
4418 return &dpi
->saved_scopes
[i
];
4423 /* If DC is a C++17 fold-expression, print it and return true; otherwise
4427 d_maybe_print_fold_expression (struct d_print_info
*dpi
, int options
,
4428 const struct demangle_component
*dc
)
4430 const struct demangle_component
*ops
, *operator_
, *op1
, *op2
;
4433 const char *fold_code
= d_left (dc
)->u
.s_operator
.op
->code
;
4434 if (fold_code
[0] != 'f')
4438 operator_
= d_left (ops
);
4439 op1
= d_right (ops
);
4441 if (op1
->type
== DEMANGLE_COMPONENT_TRINARY_ARG2
)
4443 op2
= d_right (op1
);
4447 /* Print the whole pack. */
4448 save_idx
= dpi
->pack_index
;
4449 dpi
->pack_index
= -1;
4451 switch (fold_code
[1])
4453 /* Unary left fold, (... + X). */
4455 d_append_string (dpi
, "(...");
4456 d_print_expr_op (dpi
, options
, operator_
);
4457 d_print_subexpr (dpi
, options
, op1
);
4458 d_append_char (dpi
, ')');
4461 /* Unary right fold, (X + ...). */
4463 d_append_char (dpi
, '(');
4464 d_print_subexpr (dpi
, options
, op1
);
4465 d_print_expr_op (dpi
, options
, operator_
);
4466 d_append_string (dpi
, "...)");
4469 /* Binary left fold, (42 + ... + X). */
4471 /* Binary right fold, (X + ... + 42). */
4473 d_append_char (dpi
, '(');
4474 d_print_subexpr (dpi
, options
, op1
);
4475 d_print_expr_op (dpi
, options
, operator_
);
4476 d_append_string (dpi
, "...");
4477 d_print_expr_op (dpi
, options
, operator_
);
4478 d_print_subexpr (dpi
, options
, op2
);
4479 d_append_char (dpi
, ')');
4483 dpi
->pack_index
= save_idx
;
4487 /* Subroutine to handle components. */
4490 d_print_comp_inner (struct d_print_info
*dpi
, int options
,
4491 const struct demangle_component
*dc
)
4493 /* Magic variable to let reference smashing skip over the next modifier
4494 without needing to modify *dc. */
4495 const struct demangle_component
*mod_inner
= NULL
;
4497 /* Variable used to store the current templates while a previously
4498 captured scope is used. */
4499 struct d_print_template
*saved_templates
;
4501 /* Nonzero if templates have been stored in the above variable. */
4502 int need_template_restore
= 0;
4506 d_print_error (dpi
);
4509 if (d_print_saw_error (dpi
))
4514 case DEMANGLE_COMPONENT_NAME
:
4515 if ((options
& DMGL_JAVA
) == 0)
4516 d_append_buffer (dpi
, dc
->u
.s_name
.s
, dc
->u
.s_name
.len
);
4518 d_print_java_identifier (dpi
, dc
->u
.s_name
.s
, dc
->u
.s_name
.len
);
4521 case DEMANGLE_COMPONENT_TAGGED_NAME
:
4522 d_print_comp (dpi
, options
, d_left (dc
));
4523 d_append_string (dpi
, "[abi:");
4524 d_print_comp (dpi
, options
, d_right (dc
));
4525 d_append_char (dpi
, ']');
4528 case DEMANGLE_COMPONENT_QUAL_NAME
:
4529 case DEMANGLE_COMPONENT_LOCAL_NAME
:
4530 d_print_comp (dpi
, options
, d_left (dc
));
4531 if ((options
& DMGL_JAVA
) == 0)
4532 d_append_string (dpi
, "::");
4534 d_append_char (dpi
, '.');
4536 struct demangle_component
*local_name
= d_right (dc
);
4537 if (local_name
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
4539 d_append_string (dpi
, "{default arg#");
4540 d_append_num (dpi
, local_name
->u
.s_unary_num
.num
+ 1);
4541 d_append_string (dpi
, "}::");
4542 local_name
= local_name
->u
.s_unary_num
.sub
;
4544 d_print_comp (dpi
, options
, local_name
);
4548 case DEMANGLE_COMPONENT_TYPED_NAME
:
4550 struct d_print_mod
*hold_modifiers
;
4551 struct demangle_component
*typed_name
;
4552 struct d_print_mod adpm
[4];
4554 struct d_print_template dpt
;
4556 /* Pass the name down to the type so that it can be printed in
4557 the right place for the type. We also have to pass down
4558 any CV-qualifiers, which apply to the this parameter. */
4559 hold_modifiers
= dpi
->modifiers
;
4562 typed_name
= d_left (dc
);
4563 while (typed_name
!= NULL
)
4565 if (i
>= sizeof adpm
/ sizeof adpm
[0])
4567 d_print_error (dpi
);
4571 adpm
[i
].next
= dpi
->modifiers
;
4572 dpi
->modifiers
= &adpm
[i
];
4573 adpm
[i
].mod
= typed_name
;
4574 adpm
[i
].printed
= 0;
4575 adpm
[i
].templates
= dpi
->templates
;
4578 if (typed_name
->type
!= DEMANGLE_COMPONENT_RESTRICT_THIS
4579 && typed_name
->type
!= DEMANGLE_COMPONENT_VOLATILE_THIS
4580 && typed_name
->type
!= DEMANGLE_COMPONENT_CONST_THIS
4581 && typed_name
->type
!= DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
4582 && typed_name
->type
!= DEMANGLE_COMPONENT_TRANSACTION_SAFE
4583 && typed_name
->type
!= DEMANGLE_COMPONENT_REFERENCE_THIS
)
4586 typed_name
= d_left (typed_name
);
4589 if (typed_name
== NULL
)
4591 d_print_error (dpi
);
4595 /* If typed_name is a template, then it applies to the
4596 function type as well. */
4597 if (typed_name
->type
== DEMANGLE_COMPONENT_TEMPLATE
)
4599 dpt
.next
= dpi
->templates
;
4600 dpi
->templates
= &dpt
;
4601 dpt
.template_decl
= typed_name
;
4604 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
4605 there may be CV-qualifiers on its right argument which
4606 really apply here; this happens when parsing a class which
4607 is local to a function. */
4608 if (typed_name
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
4610 struct demangle_component
*local_name
;
4612 local_name
= d_right (typed_name
);
4613 if (local_name
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
4614 local_name
= local_name
->u
.s_unary_num
.sub
;
4615 if (local_name
== NULL
)
4617 d_print_error (dpi
);
4620 while (local_name
->type
== DEMANGLE_COMPONENT_RESTRICT_THIS
4621 || local_name
->type
== DEMANGLE_COMPONENT_VOLATILE_THIS
4622 || local_name
->type
== DEMANGLE_COMPONENT_CONST_THIS
4623 || local_name
->type
== DEMANGLE_COMPONENT_REFERENCE_THIS
4624 || local_name
->type
== DEMANGLE_COMPONENT_TRANSACTION_SAFE
4625 || (local_name
->type
4626 == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
))
4628 if (i
>= sizeof adpm
/ sizeof adpm
[0])
4630 d_print_error (dpi
);
4634 adpm
[i
] = adpm
[i
- 1];
4635 adpm
[i
].next
= &adpm
[i
- 1];
4636 dpi
->modifiers
= &adpm
[i
];
4638 adpm
[i
- 1].mod
= local_name
;
4639 adpm
[i
- 1].printed
= 0;
4640 adpm
[i
- 1].templates
= dpi
->templates
;
4643 local_name
= d_left (local_name
);
4647 d_print_comp (dpi
, options
, d_right (dc
));
4649 if (typed_name
->type
== DEMANGLE_COMPONENT_TEMPLATE
)
4650 dpi
->templates
= dpt
.next
;
4652 /* If the modifiers didn't get printed by the type, print them
4657 if (! adpm
[i
].printed
)
4659 d_append_char (dpi
, ' ');
4660 d_print_mod (dpi
, options
, adpm
[i
].mod
);
4664 dpi
->modifiers
= hold_modifiers
;
4669 case DEMANGLE_COMPONENT_TEMPLATE
:
4671 struct d_print_mod
*hold_dpm
;
4672 struct demangle_component
*dcl
;
4673 const struct demangle_component
*hold_current
;
4675 /* This template may need to be referenced by a cast operator
4676 contained in its subtree. */
4677 hold_current
= dpi
->current_template
;
4678 dpi
->current_template
= dc
;
4680 /* Don't push modifiers into a template definition. Doing so
4681 could give the wrong definition for a template argument.
4682 Instead, treat the template essentially as a name. */
4684 hold_dpm
= dpi
->modifiers
;
4685 dpi
->modifiers
= NULL
;
4689 if ((options
& DMGL_JAVA
) != 0
4690 && dcl
->type
== DEMANGLE_COMPONENT_NAME
4691 && dcl
->u
.s_name
.len
== 6
4692 && strncmp (dcl
->u
.s_name
.s
, "JArray", 6) == 0)
4694 /* Special-case Java arrays, so that JArray<TYPE> appears
4695 instead as TYPE[]. */
4697 d_print_comp (dpi
, options
, d_right (dc
));
4698 d_append_string (dpi
, "[]");
4702 d_print_comp (dpi
, options
, dcl
);
4703 if (d_last_char (dpi
) == '<')
4704 d_append_char (dpi
, ' ');
4705 d_append_char (dpi
, '<');
4706 d_print_comp (dpi
, options
, d_right (dc
));
4707 /* Avoid generating two consecutive '>' characters, to avoid
4708 the C++ syntactic ambiguity. */
4709 if (d_last_char (dpi
) == '>')
4710 d_append_char (dpi
, ' ');
4711 d_append_char (dpi
, '>');
4714 dpi
->modifiers
= hold_dpm
;
4715 dpi
->current_template
= hold_current
;
4720 case DEMANGLE_COMPONENT_TEMPLATE_PARAM
:
4722 struct d_print_template
*hold_dpt
;
4723 struct demangle_component
*a
= d_lookup_template_argument (dpi
, dc
);
4725 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4726 a
= d_index_template_argument (a
, dpi
->pack_index
);
4730 d_print_error (dpi
);
4734 /* While processing this parameter, we need to pop the list of
4735 templates. This is because the template parameter may
4736 itself be a reference to a parameter of an outer
4739 hold_dpt
= dpi
->templates
;
4740 dpi
->templates
= hold_dpt
->next
;
4742 d_print_comp (dpi
, options
, a
);
4744 dpi
->templates
= hold_dpt
;
4749 case DEMANGLE_COMPONENT_CTOR
:
4750 d_print_comp (dpi
, options
, dc
->u
.s_ctor
.name
);
4753 case DEMANGLE_COMPONENT_DTOR
:
4754 d_append_char (dpi
, '~');
4755 d_print_comp (dpi
, options
, dc
->u
.s_dtor
.name
);
4758 case DEMANGLE_COMPONENT_VTABLE
:
4759 d_append_string (dpi
, "vtable for ");
4760 d_print_comp (dpi
, options
, d_left (dc
));
4763 case DEMANGLE_COMPONENT_VTT
:
4764 d_append_string (dpi
, "VTT for ");
4765 d_print_comp (dpi
, options
, d_left (dc
));
4768 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE
:
4769 d_append_string (dpi
, "construction vtable for ");
4770 d_print_comp (dpi
, options
, d_left (dc
));
4771 d_append_string (dpi
, "-in-");
4772 d_print_comp (dpi
, options
, d_right (dc
));
4775 case DEMANGLE_COMPONENT_TYPEINFO
:
4776 d_append_string (dpi
, "typeinfo for ");
4777 d_print_comp (dpi
, options
, d_left (dc
));
4780 case DEMANGLE_COMPONENT_TYPEINFO_NAME
:
4781 d_append_string (dpi
, "typeinfo name for ");
4782 d_print_comp (dpi
, options
, d_left (dc
));
4785 case DEMANGLE_COMPONENT_TYPEINFO_FN
:
4786 d_append_string (dpi
, "typeinfo fn for ");
4787 d_print_comp (dpi
, options
, d_left (dc
));
4790 case DEMANGLE_COMPONENT_THUNK
:
4791 d_append_string (dpi
, "non-virtual thunk to ");
4792 d_print_comp (dpi
, options
, d_left (dc
));
4795 case DEMANGLE_COMPONENT_VIRTUAL_THUNK
:
4796 d_append_string (dpi
, "virtual thunk to ");
4797 d_print_comp (dpi
, options
, d_left (dc
));
4800 case DEMANGLE_COMPONENT_COVARIANT_THUNK
:
4801 d_append_string (dpi
, "covariant return thunk to ");
4802 d_print_comp (dpi
, options
, d_left (dc
));
4805 case DEMANGLE_COMPONENT_JAVA_CLASS
:
4806 d_append_string (dpi
, "java Class for ");
4807 d_print_comp (dpi
, options
, d_left (dc
));
4810 case DEMANGLE_COMPONENT_GUARD
:
4811 d_append_string (dpi
, "guard variable for ");
4812 d_print_comp (dpi
, options
, d_left (dc
));
4815 case DEMANGLE_COMPONENT_TLS_INIT
:
4816 d_append_string (dpi
, "TLS init function for ");
4817 d_print_comp (dpi
, options
, d_left (dc
));
4820 case DEMANGLE_COMPONENT_TLS_WRAPPER
:
4821 d_append_string (dpi
, "TLS wrapper function for ");
4822 d_print_comp (dpi
, options
, d_left (dc
));
4825 case DEMANGLE_COMPONENT_REFTEMP
:
4826 d_append_string (dpi
, "reference temporary #");
4827 d_print_comp (dpi
, options
, d_right (dc
));
4828 d_append_string (dpi
, " for ");
4829 d_print_comp (dpi
, options
, d_left (dc
));
4832 case DEMANGLE_COMPONENT_HIDDEN_ALIAS
:
4833 d_append_string (dpi
, "hidden alias for ");
4834 d_print_comp (dpi
, options
, d_left (dc
));
4837 case DEMANGLE_COMPONENT_TRANSACTION_CLONE
:
4838 d_append_string (dpi
, "transaction clone for ");
4839 d_print_comp (dpi
, options
, d_left (dc
));
4842 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE
:
4843 d_append_string (dpi
, "non-transaction clone for ");
4844 d_print_comp (dpi
, options
, d_left (dc
));
4847 case DEMANGLE_COMPONENT_SUB_STD
:
4848 d_append_buffer (dpi
, dc
->u
.s_string
.string
, dc
->u
.s_string
.len
);
4851 case DEMANGLE_COMPONENT_RESTRICT
:
4852 case DEMANGLE_COMPONENT_VOLATILE
:
4853 case DEMANGLE_COMPONENT_CONST
:
4855 struct d_print_mod
*pdpm
;
4857 /* When printing arrays, it's possible to have cases where the
4858 same CV-qualifier gets pushed on the stack multiple times.
4859 We only need to print it once. */
4861 for (pdpm
= dpi
->modifiers
; pdpm
!= NULL
; pdpm
= pdpm
->next
)
4863 if (! pdpm
->printed
)
4865 if (pdpm
->mod
->type
!= DEMANGLE_COMPONENT_RESTRICT
4866 && pdpm
->mod
->type
!= DEMANGLE_COMPONENT_VOLATILE
4867 && pdpm
->mod
->type
!= DEMANGLE_COMPONENT_CONST
)
4869 if (pdpm
->mod
->type
== dc
->type
)
4871 d_print_comp (dpi
, options
, d_left (dc
));
4879 case DEMANGLE_COMPONENT_REFERENCE
:
4880 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
4882 /* Handle reference smashing: & + && = &. */
4883 const struct demangle_component
*sub
= d_left (dc
);
4884 if (sub
->type
== DEMANGLE_COMPONENT_TEMPLATE_PARAM
)
4886 struct d_saved_scope
*scope
= d_get_saved_scope (dpi
, sub
);
4887 struct demangle_component
*a
;
4891 /* This is the first time SUB has been traversed.
4892 We need to capture the current templates so
4893 they can be restored if SUB is reentered as a
4895 d_save_scope (dpi
, sub
);
4896 if (d_print_saw_error (dpi
))
4901 const struct d_component_stack
*dcse
;
4902 int found_self_or_parent
= 0;
4904 /* This traversal is reentering SUB as a substition.
4905 If we are not beneath SUB or DC in the tree then we
4906 need to restore SUB's template stack temporarily. */
4907 for (dcse
= dpi
->component_stack
; dcse
!= NULL
;
4908 dcse
= dcse
->parent
)
4912 && dcse
!= dpi
->component_stack
))
4914 found_self_or_parent
= 1;
4919 if (!found_self_or_parent
)
4921 saved_templates
= dpi
->templates
;
4922 dpi
->templates
= scope
->templates
;
4923 need_template_restore
= 1;
4927 a
= d_lookup_template_argument (dpi
, sub
);
4928 if (a
&& a
->type
== DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
)
4929 a
= d_index_template_argument (a
, dpi
->pack_index
);
4933 if (need_template_restore
)
4934 dpi
->templates
= saved_templates
;
4936 d_print_error (dpi
);
4943 if (sub
->type
== DEMANGLE_COMPONENT_REFERENCE
4944 || sub
->type
== dc
->type
)
4946 else if (sub
->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE
)
4947 mod_inner
= d_left (sub
);
4951 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
4952 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
4953 case DEMANGLE_COMPONENT_CONST_THIS
:
4954 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
4955 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
4956 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
4957 case DEMANGLE_COMPONENT_POINTER
:
4958 case DEMANGLE_COMPONENT_COMPLEX
:
4959 case DEMANGLE_COMPONENT_IMAGINARY
:
4960 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
4963 /* We keep a list of modifiers on the stack. */
4964 struct d_print_mod dpm
;
4966 dpm
.next
= dpi
->modifiers
;
4967 dpi
->modifiers
= &dpm
;
4970 dpm
.templates
= dpi
->templates
;
4973 mod_inner
= d_left (dc
);
4975 d_print_comp (dpi
, options
, mod_inner
);
4977 /* If the modifier didn't get printed by the type, print it
4980 d_print_mod (dpi
, options
, dc
);
4982 dpi
->modifiers
= dpm
.next
;
4984 if (need_template_restore
)
4985 dpi
->templates
= saved_templates
;
4990 case DEMANGLE_COMPONENT_BUILTIN_TYPE
:
4991 if ((options
& DMGL_JAVA
) == 0)
4992 d_append_buffer (dpi
, dc
->u
.s_builtin
.type
->name
,
4993 dc
->u
.s_builtin
.type
->len
);
4995 d_append_buffer (dpi
, dc
->u
.s_builtin
.type
->java_name
,
4996 dc
->u
.s_builtin
.type
->java_len
);
4999 case DEMANGLE_COMPONENT_VENDOR_TYPE
:
5000 d_print_comp (dpi
, options
, d_left (dc
));
5003 case DEMANGLE_COMPONENT_FUNCTION_TYPE
:
5005 if ((options
& DMGL_RET_POSTFIX
) != 0)
5006 d_print_function_type (dpi
,
5007 options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5008 dc
, dpi
->modifiers
);
5010 /* Print return type if present */
5011 if (d_left (dc
) != NULL
&& (options
& DMGL_RET_POSTFIX
) != 0)
5012 d_print_comp (dpi
, options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5014 else if (d_left (dc
) != NULL
&& (options
& DMGL_RET_DROP
) == 0)
5016 struct d_print_mod dpm
;
5018 /* We must pass this type down as a modifier in order to
5019 print it in the right location. */
5020 dpm
.next
= dpi
->modifiers
;
5021 dpi
->modifiers
= &dpm
;
5024 dpm
.templates
= dpi
->templates
;
5026 d_print_comp (dpi
, options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5029 dpi
->modifiers
= dpm
.next
;
5034 /* In standard prefix notation, there is a space between the
5035 return type and the function signature. */
5036 if ((options
& DMGL_RET_POSTFIX
) == 0)
5037 d_append_char (dpi
, ' ');
5040 if ((options
& DMGL_RET_POSTFIX
) == 0)
5041 d_print_function_type (dpi
,
5042 options
& ~(DMGL_RET_POSTFIX
| DMGL_RET_DROP
),
5043 dc
, dpi
->modifiers
);
5048 case DEMANGLE_COMPONENT_ARRAY_TYPE
:
5050 struct d_print_mod
*hold_modifiers
;
5051 struct d_print_mod adpm
[4];
5053 struct d_print_mod
*pdpm
;
5055 /* We must pass this type down as a modifier in order to print
5056 multi-dimensional arrays correctly. If the array itself is
5057 CV-qualified, we act as though the element type were
5058 CV-qualified. We do this by copying the modifiers down
5059 rather than fiddling pointers, so that we don't wind up
5060 with a d_print_mod higher on the stack pointing into our
5061 stack frame after we return. */
5063 hold_modifiers
= dpi
->modifiers
;
5065 adpm
[0].next
= hold_modifiers
;
5066 dpi
->modifiers
= &adpm
[0];
5068 adpm
[0].printed
= 0;
5069 adpm
[0].templates
= dpi
->templates
;
5072 pdpm
= hold_modifiers
;
5074 && (pdpm
->mod
->type
== DEMANGLE_COMPONENT_RESTRICT
5075 || pdpm
->mod
->type
== DEMANGLE_COMPONENT_VOLATILE
5076 || pdpm
->mod
->type
== DEMANGLE_COMPONENT_CONST
))
5078 if (! pdpm
->printed
)
5080 if (i
>= sizeof adpm
/ sizeof adpm
[0])
5082 d_print_error (dpi
);
5087 adpm
[i
].next
= dpi
->modifiers
;
5088 dpi
->modifiers
= &adpm
[i
];
5096 d_print_comp (dpi
, options
, d_right (dc
));
5098 dpi
->modifiers
= hold_modifiers
;
5100 if (adpm
[0].printed
)
5106 d_print_mod (dpi
, options
, adpm
[i
].mod
);
5109 d_print_array_type (dpi
, options
, dc
, dpi
->modifiers
);
5114 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
5115 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
5117 struct d_print_mod dpm
;
5119 dpm
.next
= dpi
->modifiers
;
5120 dpi
->modifiers
= &dpm
;
5123 dpm
.templates
= dpi
->templates
;
5125 d_print_comp (dpi
, options
, d_right (dc
));
5127 /* If the modifier didn't get printed by the type, print it
5130 d_print_mod (dpi
, options
, dc
);
5132 dpi
->modifiers
= dpm
.next
;
5137 case DEMANGLE_COMPONENT_FIXED_TYPE
:
5138 if (dc
->u
.s_fixed
.sat
)
5139 d_append_string (dpi
, "_Sat ");
5140 /* Don't print "int _Accum". */
5141 if (dc
->u
.s_fixed
.length
->u
.s_builtin
.type
5142 != &cplus_demangle_builtin_types
['i'-'a'])
5144 d_print_comp (dpi
, options
, dc
->u
.s_fixed
.length
);
5145 d_append_char (dpi
, ' ');
5147 if (dc
->u
.s_fixed
.accum
)
5148 d_append_string (dpi
, "_Accum");
5150 d_append_string (dpi
, "_Fract");
5153 case DEMANGLE_COMPONENT_ARGLIST
:
5154 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
:
5155 if (d_left (dc
) != NULL
)
5156 d_print_comp (dpi
, options
, d_left (dc
));
5157 if (d_right (dc
) != NULL
)
5160 unsigned long int flush_count
;
5161 /* Make sure ", " isn't flushed by d_append_string, otherwise
5162 dpi->len -= 2 wouldn't work. */
5163 if (dpi
->len
>= sizeof (dpi
->buf
) - 2)
5164 d_print_flush (dpi
);
5165 d_append_string (dpi
, ", ");
5167 flush_count
= dpi
->flush_count
;
5168 d_print_comp (dpi
, options
, d_right (dc
));
5169 /* If that didn't print anything (which can happen with empty
5170 template argument packs), remove the comma and space. */
5171 if (dpi
->flush_count
== flush_count
&& dpi
->len
== len
)
5176 case DEMANGLE_COMPONENT_INITIALIZER_LIST
:
5178 struct demangle_component
*type
= d_left (dc
);
5179 struct demangle_component
*list
= d_right (dc
);
5182 d_print_comp (dpi
, options
, type
);
5183 d_append_char (dpi
, '{');
5184 d_print_comp (dpi
, options
, list
);
5185 d_append_char (dpi
, '}');
5189 case DEMANGLE_COMPONENT_OPERATOR
:
5191 const struct demangle_operator_info
*op
= dc
->u
.s_operator
.op
;
5194 d_append_string (dpi
, "operator");
5195 /* Add a space before new/delete. */
5196 if (IS_LOWER (op
->name
[0]))
5197 d_append_char (dpi
, ' ');
5198 /* Omit a trailing space. */
5199 if (op
->name
[len
-1] == ' ')
5201 d_append_buffer (dpi
, op
->name
, len
);
5205 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR
:
5206 d_append_string (dpi
, "operator ");
5207 d_print_comp (dpi
, options
, dc
->u
.s_extended_operator
.name
);
5210 case DEMANGLE_COMPONENT_CONVERSION
:
5211 d_append_string (dpi
, "operator ");
5212 d_print_conversion (dpi
, options
, dc
);
5215 case DEMANGLE_COMPONENT_NULLARY
:
5216 d_print_expr_op (dpi
, options
, d_left (dc
));
5219 case DEMANGLE_COMPONENT_UNARY
:
5221 struct demangle_component
*op
= d_left (dc
);
5222 struct demangle_component
*operand
= d_right (dc
);
5223 const char *code
= NULL
;
5225 if (op
->type
== DEMANGLE_COMPONENT_OPERATOR
)
5227 code
= op
->u
.s_operator
.op
->code
;
5228 if (!strcmp (code
, "ad"))
5230 /* Don't print the argument list for the address of a
5232 if (operand
->type
== DEMANGLE_COMPONENT_TYPED_NAME
5233 && d_left (operand
)->type
== DEMANGLE_COMPONENT_QUAL_NAME
5234 && d_right (operand
)->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5235 operand
= d_left (operand
);
5237 if (operand
->type
== DEMANGLE_COMPONENT_BINARY_ARGS
)
5239 /* This indicates a suffix operator. */
5240 operand
= d_left (operand
);
5241 d_print_subexpr (dpi
, options
, operand
);
5242 d_print_expr_op (dpi
, options
, op
);
5247 /* For sizeof..., just print the pack length. */
5248 if (code
&& !strcmp (code
, "sZ"))
5250 struct demangle_component
*a
= d_find_pack (dpi
, operand
);
5251 int len
= d_pack_length (a
);
5252 d_append_num (dpi
, len
);
5255 else if (code
&& !strcmp (code
, "sP"))
5257 int len
= d_args_length (dpi
, operand
);
5258 d_append_num (dpi
, len
);
5262 if (op
->type
!= DEMANGLE_COMPONENT_CAST
)
5263 d_print_expr_op (dpi
, options
, op
);
5266 d_append_char (dpi
, '(');
5267 d_print_cast (dpi
, options
, op
);
5268 d_append_char (dpi
, ')');
5270 if (code
&& !strcmp (code
, "gs"))
5271 /* Avoid parens after '::'. */
5272 d_print_comp (dpi
, options
, operand
);
5273 else if (code
&& !strcmp (code
, "st"))
5274 /* Always print parens for sizeof (type). */
5276 d_append_char (dpi
, '(');
5277 d_print_comp (dpi
, options
, operand
);
5278 d_append_char (dpi
, ')');
5281 d_print_subexpr (dpi
, options
, operand
);
5285 case DEMANGLE_COMPONENT_BINARY
:
5286 if (d_right (dc
)->type
!= DEMANGLE_COMPONENT_BINARY_ARGS
)
5288 d_print_error (dpi
);
5292 if (op_is_new_cast (d_left (dc
)))
5294 d_print_expr_op (dpi
, options
, d_left (dc
));
5295 d_append_char (dpi
, '<');
5296 d_print_comp (dpi
, options
, d_left (d_right (dc
)));
5297 d_append_string (dpi
, ">(");
5298 d_print_comp (dpi
, options
, d_right (d_right (dc
)));
5299 d_append_char (dpi
, ')');
5303 if (d_maybe_print_fold_expression (dpi
, options
, dc
))
5306 /* We wrap an expression which uses the greater-than operator in
5307 an extra layer of parens so that it does not get confused
5308 with the '>' which ends the template parameters. */
5309 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_OPERATOR
5310 && d_left (dc
)->u
.s_operator
.op
->len
== 1
5311 && d_left (dc
)->u
.s_operator
.op
->name
[0] == '>')
5312 d_append_char (dpi
, '(');
5314 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "cl") == 0
5315 && d_left (d_right (dc
))->type
== DEMANGLE_COMPONENT_TYPED_NAME
)
5317 /* Function call used in an expression should not have printed types
5318 of the function arguments. Values of the function arguments still
5319 get printed below. */
5321 const struct demangle_component
*func
= d_left (d_right (dc
));
5323 if (d_right (func
)->type
!= DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5324 d_print_error (dpi
);
5325 d_print_subexpr (dpi
, options
, d_left (func
));
5328 d_print_subexpr (dpi
, options
, d_left (d_right (dc
)));
5329 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "ix") == 0)
5331 d_append_char (dpi
, '[');
5332 d_print_comp (dpi
, options
, d_right (d_right (dc
)));
5333 d_append_char (dpi
, ']');
5337 if (strcmp (d_left (dc
)->u
.s_operator
.op
->code
, "cl") != 0)
5338 d_print_expr_op (dpi
, options
, d_left (dc
));
5339 d_print_subexpr (dpi
, options
, d_right (d_right (dc
)));
5342 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_OPERATOR
5343 && d_left (dc
)->u
.s_operator
.op
->len
== 1
5344 && d_left (dc
)->u
.s_operator
.op
->name
[0] == '>')
5345 d_append_char (dpi
, ')');
5349 case DEMANGLE_COMPONENT_BINARY_ARGS
:
5350 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
5351 d_print_error (dpi
);
5354 case DEMANGLE_COMPONENT_TRINARY
:
5355 if (d_right (dc
)->type
!= DEMANGLE_COMPONENT_TRINARY_ARG1
5356 || d_right (d_right (dc
))->type
!= DEMANGLE_COMPONENT_TRINARY_ARG2
)
5358 d_print_error (dpi
);
5361 if (d_maybe_print_fold_expression (dpi
, options
, dc
))
5364 struct demangle_component
*op
= d_left (dc
);
5365 struct demangle_component
*first
= d_left (d_right (dc
));
5366 struct demangle_component
*second
= d_left (d_right (d_right (dc
)));
5367 struct demangle_component
*third
= d_right (d_right (d_right (dc
)));
5369 if (!strcmp (op
->u
.s_operator
.op
->code
, "qu"))
5371 d_print_subexpr (dpi
, options
, first
);
5372 d_print_expr_op (dpi
, options
, op
);
5373 d_print_subexpr (dpi
, options
, second
);
5374 d_append_string (dpi
, " : ");
5375 d_print_subexpr (dpi
, options
, third
);
5379 d_append_string (dpi
, "new ");
5380 if (d_left (first
) != NULL
)
5382 d_print_subexpr (dpi
, options
, first
);
5383 d_append_char (dpi
, ' ');
5385 d_print_comp (dpi
, options
, second
);
5387 d_print_subexpr (dpi
, options
, third
);
5392 case DEMANGLE_COMPONENT_TRINARY_ARG1
:
5393 case DEMANGLE_COMPONENT_TRINARY_ARG2
:
5394 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
5395 d_print_error (dpi
);
5398 case DEMANGLE_COMPONENT_LITERAL
:
5399 case DEMANGLE_COMPONENT_LITERAL_NEG
:
5401 enum d_builtin_type_print tp
;
5403 /* For some builtin types, produce simpler output. */
5404 tp
= D_PRINT_DEFAULT
;
5405 if (d_left (dc
)->type
== DEMANGLE_COMPONENT_BUILTIN_TYPE
)
5407 tp
= d_left (dc
)->u
.s_builtin
.type
->print
;
5411 case D_PRINT_UNSIGNED
:
5413 case D_PRINT_UNSIGNED_LONG
:
5414 case D_PRINT_LONG_LONG
:
5415 case D_PRINT_UNSIGNED_LONG_LONG
:
5416 if (d_right (dc
)->type
== DEMANGLE_COMPONENT_NAME
)
5418 if (dc
->type
== DEMANGLE_COMPONENT_LITERAL_NEG
)
5419 d_append_char (dpi
, '-');
5420 d_print_comp (dpi
, options
, d_right (dc
));
5425 case D_PRINT_UNSIGNED
:
5426 d_append_char (dpi
, 'u');
5429 d_append_char (dpi
, 'l');
5431 case D_PRINT_UNSIGNED_LONG
:
5432 d_append_string (dpi
, "ul");
5434 case D_PRINT_LONG_LONG
:
5435 d_append_string (dpi
, "ll");
5437 case D_PRINT_UNSIGNED_LONG_LONG
:
5438 d_append_string (dpi
, "ull");
5446 if (d_right (dc
)->type
== DEMANGLE_COMPONENT_NAME
5447 && d_right (dc
)->u
.s_name
.len
== 1
5448 && dc
->type
== DEMANGLE_COMPONENT_LITERAL
)
5450 switch (d_right (dc
)->u
.s_name
.s
[0])
5453 d_append_string (dpi
, "false");
5456 d_append_string (dpi
, "true");
5469 d_append_char (dpi
, '(');
5470 d_print_comp (dpi
, options
, d_left (dc
));
5471 d_append_char (dpi
, ')');
5472 if (dc
->type
== DEMANGLE_COMPONENT_LITERAL_NEG
)
5473 d_append_char (dpi
, '-');
5474 if (tp
== D_PRINT_FLOAT
)
5475 d_append_char (dpi
, '[');
5476 d_print_comp (dpi
, options
, d_right (dc
));
5477 if (tp
== D_PRINT_FLOAT
)
5478 d_append_char (dpi
, ']');
5482 case DEMANGLE_COMPONENT_NUMBER
:
5483 d_append_num (dpi
, dc
->u
.s_number
.number
);
5486 case DEMANGLE_COMPONENT_JAVA_RESOURCE
:
5487 d_append_string (dpi
, "java resource ");
5488 d_print_comp (dpi
, options
, d_left (dc
));
5491 case DEMANGLE_COMPONENT_COMPOUND_NAME
:
5492 d_print_comp (dpi
, options
, d_left (dc
));
5493 d_print_comp (dpi
, options
, d_right (dc
));
5496 case DEMANGLE_COMPONENT_CHARACTER
:
5497 d_append_char (dpi
, dc
->u
.s_character
.character
);
5500 case DEMANGLE_COMPONENT_DECLTYPE
:
5501 d_append_string (dpi
, "decltype (");
5502 d_print_comp (dpi
, options
, d_left (dc
));
5503 d_append_char (dpi
, ')');
5506 case DEMANGLE_COMPONENT_PACK_EXPANSION
:
5510 struct demangle_component
*a
= d_find_pack (dpi
, d_left (dc
));
5513 /* d_find_pack won't find anything if the only packs involved
5514 in this expansion are function parameter packs; in that
5515 case, just print the pattern and "...". */
5516 d_print_subexpr (dpi
, options
, d_left (dc
));
5517 d_append_string (dpi
, "...");
5521 len
= d_pack_length (a
);
5523 for (i
= 0; i
< len
; ++i
)
5525 dpi
->pack_index
= i
;
5526 d_print_comp (dpi
, options
, dc
);
5528 d_append_string (dpi
, ", ");
5533 case DEMANGLE_COMPONENT_FUNCTION_PARAM
:
5535 long num
= dc
->u
.s_number
.number
;
5537 d_append_string (dpi
, "this");
5540 d_append_string (dpi
, "{parm#");
5541 d_append_num (dpi
, num
);
5542 d_append_char (dpi
, '}');
5547 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
:
5548 d_append_string (dpi
, "global constructors keyed to ");
5549 d_print_comp (dpi
, options
, dc
->u
.s_binary
.left
);
5552 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
:
5553 d_append_string (dpi
, "global destructors keyed to ");
5554 d_print_comp (dpi
, options
, dc
->u
.s_binary
.left
);
5557 case DEMANGLE_COMPONENT_LAMBDA
:
5558 d_append_string (dpi
, "{lambda(");
5559 d_print_comp (dpi
, options
, dc
->u
.s_unary_num
.sub
);
5560 d_append_string (dpi
, ")#");
5561 d_append_num (dpi
, dc
->u
.s_unary_num
.num
+ 1);
5562 d_append_char (dpi
, '}');
5565 case DEMANGLE_COMPONENT_UNNAMED_TYPE
:
5566 d_append_string (dpi
, "{unnamed type#");
5567 d_append_num (dpi
, dc
->u
.s_number
.number
+ 1);
5568 d_append_char (dpi
, '}');
5571 case DEMANGLE_COMPONENT_CLONE
:
5572 d_print_comp (dpi
, options
, d_left (dc
));
5573 d_append_string (dpi
, " [clone ");
5574 d_print_comp (dpi
, options
, d_right (dc
));
5575 d_append_char (dpi
, ']');
5579 d_print_error (dpi
);
5585 d_print_comp (struct d_print_info
*dpi
, int options
,
5586 const struct demangle_component
*dc
)
5588 struct d_component_stack self
;
5591 self
.parent
= dpi
->component_stack
;
5592 dpi
->component_stack
= &self
;
5594 d_print_comp_inner (dpi
, options
, dc
);
5596 dpi
->component_stack
= self
.parent
;
5599 /* Print a Java dentifier. For Java we try to handle encoded extended
5600 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
5601 so we don't it for C++. Characters are encoded as
5605 d_print_java_identifier (struct d_print_info
*dpi
, const char *name
, int len
)
5611 for (p
= name
; p
< end
; ++p
)
5622 for (q
= p
+ 3; q
< end
; ++q
)
5628 else if (*q
>= 'A' && *q
<= 'F')
5629 dig
= *q
- 'A' + 10;
5630 else if (*q
>= 'a' && *q
<= 'f')
5631 dig
= *q
- 'a' + 10;
5637 /* If the Unicode character is larger than 256, we don't try
5638 to deal with it here. FIXME. */
5639 if (q
< end
&& *q
== '_' && c
< 256)
5641 d_append_char (dpi
, c
);
5647 d_append_char (dpi
, *p
);
5651 /* Print a list of modifiers. SUFFIX is 1 if we are printing
5652 qualifiers on this after printing a function. */
5655 d_print_mod_list (struct d_print_info
*dpi
, int options
,
5656 struct d_print_mod
*mods
, int suffix
)
5658 struct d_print_template
*hold_dpt
;
5660 if (mods
== NULL
|| d_print_saw_error (dpi
))
5665 && (mods
->mod
->type
== DEMANGLE_COMPONENT_RESTRICT_THIS
5666 || mods
->mod
->type
== DEMANGLE_COMPONENT_VOLATILE_THIS
5667 || mods
->mod
->type
== DEMANGLE_COMPONENT_CONST_THIS
5668 || mods
->mod
->type
== DEMANGLE_COMPONENT_REFERENCE_THIS
5669 || mods
->mod
->type
== DEMANGLE_COMPONENT_TRANSACTION_SAFE
5671 == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
))))
5673 d_print_mod_list (dpi
, options
, mods
->next
, suffix
);
5679 hold_dpt
= dpi
->templates
;
5680 dpi
->templates
= mods
->templates
;
5682 if (mods
->mod
->type
== DEMANGLE_COMPONENT_FUNCTION_TYPE
)
5684 d_print_function_type (dpi
, options
, mods
->mod
, mods
->next
);
5685 dpi
->templates
= hold_dpt
;
5688 else if (mods
->mod
->type
== DEMANGLE_COMPONENT_ARRAY_TYPE
)
5690 d_print_array_type (dpi
, options
, mods
->mod
, mods
->next
);
5691 dpi
->templates
= hold_dpt
;
5694 else if (mods
->mod
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
5696 struct d_print_mod
*hold_modifiers
;
5697 struct demangle_component
*dc
;
5699 /* When this is on the modifier stack, we have pulled any
5700 qualifiers off the right argument already. Otherwise, we
5701 print it as usual, but don't let the left argument see any
5704 hold_modifiers
= dpi
->modifiers
;
5705 dpi
->modifiers
= NULL
;
5706 d_print_comp (dpi
, options
, d_left (mods
->mod
));
5707 dpi
->modifiers
= hold_modifiers
;
5709 if ((options
& DMGL_JAVA
) == 0)
5710 d_append_string (dpi
, "::");
5712 d_append_char (dpi
, '.');
5714 dc
= d_right (mods
->mod
);
5716 if (dc
->type
== DEMANGLE_COMPONENT_DEFAULT_ARG
)
5718 d_append_string (dpi
, "{default arg#");
5719 d_append_num (dpi
, dc
->u
.s_unary_num
.num
+ 1);
5720 d_append_string (dpi
, "}::");
5721 dc
= dc
->u
.s_unary_num
.sub
;
5724 while (dc
->type
== DEMANGLE_COMPONENT_RESTRICT_THIS
5725 || dc
->type
== DEMANGLE_COMPONENT_VOLATILE_THIS
5726 || dc
->type
== DEMANGLE_COMPONENT_CONST_THIS
5727 || dc
->type
== DEMANGLE_COMPONENT_REFERENCE_THIS
5728 || dc
->type
== DEMANGLE_COMPONENT_TRANSACTION_SAFE
5729 || dc
->type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
)
5732 d_print_comp (dpi
, options
, dc
);
5734 dpi
->templates
= hold_dpt
;
5738 d_print_mod (dpi
, options
, mods
->mod
);
5740 dpi
->templates
= hold_dpt
;
5742 d_print_mod_list (dpi
, options
, mods
->next
, suffix
);
5745 /* Print a modifier. */
5748 d_print_mod (struct d_print_info
*dpi
, int options
,
5749 const struct demangle_component
*mod
)
5753 case DEMANGLE_COMPONENT_RESTRICT
:
5754 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
5755 d_append_string (dpi
, " restrict");
5757 case DEMANGLE_COMPONENT_VOLATILE
:
5758 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
5759 d_append_string (dpi
, " volatile");
5761 case DEMANGLE_COMPONENT_CONST
:
5762 case DEMANGLE_COMPONENT_CONST_THIS
:
5763 d_append_string (dpi
, " const");
5765 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
5766 d_append_string (dpi
, " transaction_safe");
5768 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
5769 d_append_char (dpi
, ' ');
5770 d_print_comp (dpi
, options
, d_right (mod
));
5772 case DEMANGLE_COMPONENT_POINTER
:
5773 /* There is no pointer symbol in Java. */
5774 if ((options
& DMGL_JAVA
) == 0)
5775 d_append_char (dpi
, '*');
5777 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
5778 /* For the ref-qualifier, put a space before the &. */
5779 d_append_char (dpi
, ' ');
5780 case DEMANGLE_COMPONENT_REFERENCE
:
5781 d_append_char (dpi
, '&');
5783 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
5784 d_append_char (dpi
, ' ');
5785 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
5786 d_append_string (dpi
, "&&");
5788 case DEMANGLE_COMPONENT_COMPLEX
:
5789 d_append_string (dpi
, "complex ");
5791 case DEMANGLE_COMPONENT_IMAGINARY
:
5792 d_append_string (dpi
, "imaginary ");
5794 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
5795 if (d_last_char (dpi
) != '(')
5796 d_append_char (dpi
, ' ');
5797 d_print_comp (dpi
, options
, d_left (mod
));
5798 d_append_string (dpi
, "::*");
5800 case DEMANGLE_COMPONENT_TYPED_NAME
:
5801 d_print_comp (dpi
, options
, d_left (mod
));
5803 case DEMANGLE_COMPONENT_VECTOR_TYPE
:
5804 d_append_string (dpi
, " __vector(");
5805 d_print_comp (dpi
, options
, d_left (mod
));
5806 d_append_char (dpi
, ')');
5810 /* Otherwise, we have something that won't go back on the
5811 modifier stack, so we can just print it. */
5812 d_print_comp (dpi
, options
, mod
);
5817 /* Print a function type, except for the return type. */
5820 d_print_function_type (struct d_print_info
*dpi
, int options
,
5821 const struct demangle_component
*dc
,
5822 struct d_print_mod
*mods
)
5826 struct d_print_mod
*p
;
5827 struct d_print_mod
*hold_modifiers
;
5831 for (p
= mods
; p
!= NULL
; p
= p
->next
)
5836 switch (p
->mod
->type
)
5838 case DEMANGLE_COMPONENT_POINTER
:
5839 case DEMANGLE_COMPONENT_REFERENCE
:
5840 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
5843 case DEMANGLE_COMPONENT_RESTRICT
:
5844 case DEMANGLE_COMPONENT_VOLATILE
:
5845 case DEMANGLE_COMPONENT_CONST
:
5846 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL
:
5847 case DEMANGLE_COMPONENT_COMPLEX
:
5848 case DEMANGLE_COMPONENT_IMAGINARY
:
5849 case DEMANGLE_COMPONENT_PTRMEM_TYPE
:
5853 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
5854 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
5855 case DEMANGLE_COMPONENT_CONST_THIS
:
5856 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
5857 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
5858 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
5871 if (d_last_char (dpi
) != '('
5872 && d_last_char (dpi
) != '*')
5875 if (need_space
&& d_last_char (dpi
) != ' ')
5876 d_append_char (dpi
, ' ');
5877 d_append_char (dpi
, '(');
5880 hold_modifiers
= dpi
->modifiers
;
5881 dpi
->modifiers
= NULL
;
5883 d_print_mod_list (dpi
, options
, mods
, 0);
5886 d_append_char (dpi
, ')');
5888 d_append_char (dpi
, '(');
5890 if (d_right (dc
) != NULL
)
5891 d_print_comp (dpi
, options
, d_right (dc
));
5893 d_append_char (dpi
, ')');
5895 d_print_mod_list (dpi
, options
, mods
, 1);
5897 dpi
->modifiers
= hold_modifiers
;
5900 /* Print an array type, except for the element type. */
5903 d_print_array_type (struct d_print_info
*dpi
, int options
,
5904 const struct demangle_component
*dc
,
5905 struct d_print_mod
*mods
)
5913 struct d_print_mod
*p
;
5916 for (p
= mods
; p
!= NULL
; p
= p
->next
)
5920 if (p
->mod
->type
== DEMANGLE_COMPONENT_ARRAY_TYPE
)
5935 d_append_string (dpi
, " (");
5937 d_print_mod_list (dpi
, options
, mods
, 0);
5940 d_append_char (dpi
, ')');
5944 d_append_char (dpi
, ' ');
5946 d_append_char (dpi
, '[');
5948 if (d_left (dc
) != NULL
)
5949 d_print_comp (dpi
, options
, d_left (dc
));
5951 d_append_char (dpi
, ']');
5954 /* Print an operator in an expression. */
5957 d_print_expr_op (struct d_print_info
*dpi
, int options
,
5958 const struct demangle_component
*dc
)
5960 if (dc
->type
== DEMANGLE_COMPONENT_OPERATOR
)
5961 d_append_buffer (dpi
, dc
->u
.s_operator
.op
->name
,
5962 dc
->u
.s_operator
.op
->len
);
5964 d_print_comp (dpi
, options
, dc
);
5970 d_print_cast (struct d_print_info
*dpi
, int options
,
5971 const struct demangle_component
*dc
)
5973 d_print_comp (dpi
, options
, d_left (dc
));
5976 /* Print a conversion operator. */
5979 d_print_conversion (struct d_print_info
*dpi
, int options
,
5980 const struct demangle_component
*dc
)
5982 struct d_print_template dpt
;
5984 /* For a conversion operator, we need the template parameters from
5985 the enclosing template in scope for processing the type. */
5986 if (dpi
->current_template
!= NULL
)
5988 dpt
.next
= dpi
->templates
;
5989 dpi
->templates
= &dpt
;
5990 dpt
.template_decl
= dpi
->current_template
;
5993 if (d_left (dc
)->type
!= DEMANGLE_COMPONENT_TEMPLATE
)
5995 d_print_comp (dpi
, options
, d_left (dc
));
5996 if (dpi
->current_template
!= NULL
)
5997 dpi
->templates
= dpt
.next
;
6001 d_print_comp (dpi
, options
, d_left (d_left (dc
)));
6003 /* For a templated cast operator, we need to remove the template
6004 parameters from scope after printing the operator name,
6005 so we need to handle the template printing here. */
6006 if (dpi
->current_template
!= NULL
)
6007 dpi
->templates
= dpt
.next
;
6009 if (d_last_char (dpi
) == '<')
6010 d_append_char (dpi
, ' ');
6011 d_append_char (dpi
, '<');
6012 d_print_comp (dpi
, options
, d_right (d_left (dc
)));
6013 /* Avoid generating two consecutive '>' characters, to avoid
6014 the C++ syntactic ambiguity. */
6015 if (d_last_char (dpi
) == '>')
6016 d_append_char (dpi
, ' ');
6017 d_append_char (dpi
, '>');
6021 /* Initialize the information structure we use to pass around
6024 CP_STATIC_IF_GLIBCPP_V3
6026 cplus_demangle_init_info (const char *mangled
, int options
, size_t len
,
6030 di
->send
= mangled
+ len
;
6031 di
->options
= options
;
6035 /* We can not need more components than twice the number of chars in
6036 the mangled string. Most components correspond directly to
6037 chars, but the ARGLIST types are exceptions. */
6038 di
->num_comps
= 2 * len
;
6041 /* Similarly, we can not need more substitutions than there are
6042 chars in the mangled string. */
6047 di
->last_name
= NULL
;
6050 di
->is_expression
= 0;
6051 di
->is_conversion
= 0;
6054 /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
6055 mangled name, return strings in repeated callback giving the demangled
6056 name. OPTIONS is the usual libiberty demangler options. On success,
6057 this returns 1. On failure, returns 0. */
6060 d_demangle_callback (const char *mangled
, int options
,
6061 demangle_callbackref callback
, void *opaque
)
6072 struct demangle_component
*dc
;
6075 if (mangled
[0] == '_' && mangled
[1] == 'Z')
6077 else if (strncmp (mangled
, "_GLOBAL_", 8) == 0
6078 && (mangled
[8] == '.' || mangled
[8] == '_' || mangled
[8] == '$')
6079 && (mangled
[9] == 'D' || mangled
[9] == 'I')
6080 && mangled
[10] == '_')
6081 type
= mangled
[9] == 'I' ? DCT_GLOBAL_CTORS
: DCT_GLOBAL_DTORS
;
6084 if ((options
& DMGL_TYPES
) == 0)
6089 cplus_demangle_init_info (mangled
, options
, strlen (mangled
), &di
);
6092 #ifdef CP_DYNAMIC_ARRAYS
6093 __extension__
struct demangle_component comps
[di
.num_comps
];
6094 __extension__
struct demangle_component
*subs
[di
.num_subs
];
6099 di
.comps
= alloca (di
.num_comps
* sizeof (*di
.comps
));
6100 di
.subs
= alloca (di
.num_subs
* sizeof (*di
.subs
));
6106 dc
= cplus_demangle_type (&di
);
6109 dc
= cplus_demangle_mangled_name (&di
, 1);
6111 case DCT_GLOBAL_CTORS
:
6112 case DCT_GLOBAL_DTORS
:
6113 d_advance (&di
, 11);
6114 dc
= d_make_comp (&di
,
6115 (type
== DCT_GLOBAL_CTORS
6116 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
6117 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS
),
6118 d_make_demangle_mangled_name (&di
, d_str (&di
)),
6120 d_advance (&di
, strlen (d_str (&di
)));
6123 abort (); /* We have listed all the cases. */
6126 /* If DMGL_PARAMS is set, then if we didn't consume the entire
6127 mangled string, then we didn't successfully demangle it. If
6128 DMGL_PARAMS is not set, we didn't look at the trailing
6130 if (((options
& DMGL_PARAMS
) != 0) && d_peek_char (&di
) != '\0')
6133 #ifdef CP_DEMANGLE_DEBUG
6137 status
= (dc
!= NULL
)
6138 ? cplus_demangle_print_callback (options
, dc
, callback
, opaque
)
6145 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
6146 name, return a buffer allocated with malloc holding the demangled
6147 name. OPTIONS is the usual libiberty demangler options. On
6148 success, this sets *PALC to the allocated size of the returned
6149 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
6150 a memory allocation failure, and returns NULL. */
6153 d_demangle (const char *mangled
, int options
, size_t *palc
)
6155 struct d_growable_string dgs
;
6158 d_growable_string_init (&dgs
, 0);
6160 status
= d_demangle_callback (mangled
, options
,
6161 d_growable_string_callback_adapter
, &dgs
);
6169 *palc
= dgs
.allocation_failure
? 1 : dgs
.alc
;
6173 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
6175 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
6177 /* ia64 ABI-mandated entry point in the C++ runtime library for
6178 performing demangling. MANGLED_NAME is a NUL-terminated character
6179 string containing the name to be demangled.
6181 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
6182 *LENGTH bytes, into which the demangled name is stored. If
6183 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
6184 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
6185 is placed in a region of memory allocated with malloc.
6187 If LENGTH is non-NULL, the length of the buffer containing the
6188 demangled name, is placed in *LENGTH.
6190 The return value is a pointer to the start of the NUL-terminated
6191 demangled name, or NULL if the demangling fails. The caller is
6192 responsible for deallocating this memory using free.
6194 *STATUS is set to one of the following values:
6195 0: The demangling operation succeeded.
6196 -1: A memory allocation failure occurred.
6197 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6198 -3: One of the arguments is invalid.
6200 The demangling is performed using the C++ ABI mangling rules, with
6204 __cxa_demangle (const char *mangled_name
, char *output_buffer
,
6205 size_t *length
, int *status
)
6210 if (mangled_name
== NULL
)
6217 if (output_buffer
!= NULL
&& length
== NULL
)
6224 demangled
= d_demangle (mangled_name
, DMGL_PARAMS
| DMGL_TYPES
, &alc
);
6226 if (demangled
== NULL
)
6238 if (output_buffer
== NULL
)
6245 if (strlen (demangled
) < *length
)
6247 strcpy (output_buffer
, demangled
);
6249 demangled
= output_buffer
;
6253 free (output_buffer
);
6264 extern int __gcclibcxx_demangle_callback (const char *,
6266 (const char *, size_t, void *),
6269 /* Alternative, allocationless entry point in the C++ runtime library
6270 for performing demangling. MANGLED_NAME is a NUL-terminated character
6271 string containing the name to be demangled.
6273 CALLBACK is a callback function, called with demangled string
6274 segments as demangling progresses; it is called at least once,
6275 but may be called more than once. OPAQUE is a generalized pointer
6276 used as a callback argument.
6278 The return code is one of the following values, equivalent to
6279 the STATUS values of __cxa_demangle() (excluding -1, since this
6280 function performs no memory allocations):
6281 0: The demangling operation succeeded.
6282 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6283 -3: One of the arguments is invalid.
6285 The demangling is performed using the C++ ABI mangling rules, with
6289 __gcclibcxx_demangle_callback (const char *mangled_name
,
6290 void (*callback
) (const char *, size_t, void *),
6295 if (mangled_name
== NULL
|| callback
== NULL
)
6298 status
= d_demangle_callback (mangled_name
, DMGL_PARAMS
| DMGL_TYPES
,
6306 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
6308 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
6309 mangled name, return a buffer allocated with malloc holding the
6310 demangled name. Otherwise, return NULL. */
6313 cplus_demangle_v3 (const char *mangled
, int options
)
6317 return d_demangle (mangled
, options
, &alc
);
6321 cplus_demangle_v3_callback (const char *mangled
, int options
,
6322 demangle_callbackref callback
, void *opaque
)
6324 return d_demangle_callback (mangled
, options
, callback
, opaque
);
6327 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
6328 conventions, but the output formatting is a little different.
6329 This instructs the C++ demangler not to emit pointer characters ("*"), to
6330 use Java's namespace separator symbol ("." instead of "::"), and to output
6331 JArray<TYPE> as TYPE[]. */
6334 java_demangle_v3 (const char *mangled
)
6338 return d_demangle (mangled
, DMGL_JAVA
| DMGL_PARAMS
| DMGL_RET_POSTFIX
, &alc
);
6342 java_demangle_v3_callback (const char *mangled
,
6343 demangle_callbackref callback
, void *opaque
)
6345 return d_demangle_callback (mangled
,
6346 DMGL_JAVA
| DMGL_PARAMS
| DMGL_RET_POSTFIX
,
6350 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
6352 #ifndef IN_GLIBCPP_V3
6354 /* Demangle a string in order to find out whether it is a constructor
6355 or destructor. Return non-zero on success. Set *CTOR_KIND and
6356 *DTOR_KIND appropriately. */
6359 is_ctor_or_dtor (const char *mangled
,
6360 enum gnu_v3_ctor_kinds
*ctor_kind
,
6361 enum gnu_v3_dtor_kinds
*dtor_kind
)
6364 struct demangle_component
*dc
;
6367 *ctor_kind
= (enum gnu_v3_ctor_kinds
) 0;
6368 *dtor_kind
= (enum gnu_v3_dtor_kinds
) 0;
6370 cplus_demangle_init_info (mangled
, DMGL_GNU_V3
, strlen (mangled
), &di
);
6373 #ifdef CP_DYNAMIC_ARRAYS
6374 __extension__
struct demangle_component comps
[di
.num_comps
];
6375 __extension__
struct demangle_component
*subs
[di
.num_subs
];
6380 di
.comps
= alloca (di
.num_comps
* sizeof (*di
.comps
));
6381 di
.subs
= alloca (di
.num_subs
* sizeof (*di
.subs
));
6384 dc
= cplus_demangle_mangled_name (&di
, 1);
6386 /* Note that because we did not pass DMGL_PARAMS, we don't expect
6387 to demangle the entire string. */
6394 /* These cannot appear on a constructor or destructor. */
6395 case DEMANGLE_COMPONENT_RESTRICT_THIS
:
6396 case DEMANGLE_COMPONENT_VOLATILE_THIS
:
6397 case DEMANGLE_COMPONENT_CONST_THIS
:
6398 case DEMANGLE_COMPONENT_REFERENCE_THIS
:
6399 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
:
6400 case DEMANGLE_COMPONENT_TRANSACTION_SAFE
:
6404 case DEMANGLE_COMPONENT_TYPED_NAME
:
6405 case DEMANGLE_COMPONENT_TEMPLATE
:
6408 case DEMANGLE_COMPONENT_QUAL_NAME
:
6409 case DEMANGLE_COMPONENT_LOCAL_NAME
:
6412 case DEMANGLE_COMPONENT_CTOR
:
6413 *ctor_kind
= dc
->u
.s_ctor
.kind
;
6417 case DEMANGLE_COMPONENT_DTOR
:
6418 *dtor_kind
= dc
->u
.s_dtor
.kind
;
6429 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
6430 name. A non-zero return indicates the type of constructor. */
6432 enum gnu_v3_ctor_kinds
6433 is_gnu_v3_mangled_ctor (const char *name
)
6435 enum gnu_v3_ctor_kinds ctor_kind
;
6436 enum gnu_v3_dtor_kinds dtor_kind
;
6438 if (! is_ctor_or_dtor (name
, &ctor_kind
, &dtor_kind
))
6439 return (enum gnu_v3_ctor_kinds
) 0;
6444 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
6445 name. A non-zero return indicates the type of destructor. */
6447 enum gnu_v3_dtor_kinds
6448 is_gnu_v3_mangled_dtor (const char *name
)
6450 enum gnu_v3_ctor_kinds ctor_kind
;
6451 enum gnu_v3_dtor_kinds dtor_kind
;
6453 if (! is_ctor_or_dtor (name
, &ctor_kind
, &dtor_kind
))
6454 return (enum gnu_v3_dtor_kinds
) 0;
6458 #endif /* IN_GLIBCPP_V3 */
6460 #ifdef STANDALONE_DEMANGLER
6463 #include "dyn-string.h"
6465 static void print_usage (FILE* fp
, int exit_value
);
6467 #define IS_ALPHA(CHAR) \
6468 (((CHAR) >= 'a' && (CHAR) <= 'z') \
6469 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
6471 /* Non-zero if CHAR is a character than can occur in a mangled name. */
6472 #define is_mangled_char(CHAR) \
6473 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
6474 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
6476 /* The name of this program, as invoked. */
6477 const char* program_name
;
6479 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
6482 print_usage (FILE* fp
, int exit_value
)
6484 fprintf (fp
, "Usage: %s [options] [names ...]\n", program_name
);
6485 fprintf (fp
, "Options:\n");
6486 fprintf (fp
, " -h,--help Display this message.\n");
6487 fprintf (fp
, " -p,--no-params Don't display function parameters\n");
6488 fprintf (fp
, " -v,--verbose Produce verbose demanglings.\n");
6489 fprintf (fp
, "If names are provided, they are demangled. Otherwise filters standard input.\n");
6494 /* Option specification for getopt_long. */
6495 static const struct option long_options
[] =
6497 { "help", no_argument
, NULL
, 'h' },
6498 { "no-params", no_argument
, NULL
, 'p' },
6499 { "verbose", no_argument
, NULL
, 'v' },
6500 { NULL
, no_argument
, NULL
, 0 },
6503 /* Main entry for a demangling filter executable. It will demangle
6504 its command line arguments, if any. If none are provided, it will
6505 filter stdin to stdout, replacing any recognized mangled C++ names
6506 with their demangled equivalents. */
6509 main (int argc
, char *argv
[])
6513 int options
= DMGL_PARAMS
| DMGL_ANSI
| DMGL_TYPES
;
6515 /* Use the program name of this program, as invoked. */
6516 program_name
= argv
[0];
6518 /* Parse options. */
6521 opt_char
= getopt_long (argc
, argv
, "hpv", long_options
, NULL
);
6524 case '?': /* Unrecognized option. */
6525 print_usage (stderr
, 1);
6529 print_usage (stdout
, 0);
6533 options
&= ~ DMGL_PARAMS
;
6537 options
|= DMGL_VERBOSE
;
6541 while (opt_char
!= -1);
6544 /* No command line arguments were provided. Filter stdin. */
6546 dyn_string_t mangled
= dyn_string_new (3);
6549 /* Read all of input. */
6550 while (!feof (stdin
))
6554 /* Pile characters into mangled until we hit one that can't
6555 occur in a mangled name. */
6557 while (!feof (stdin
) && is_mangled_char (c
))
6559 dyn_string_append_char (mangled
, c
);
6565 if (dyn_string_length (mangled
) > 0)
6567 #ifdef IN_GLIBCPP_V3
6568 s
= __cxa_demangle (dyn_string_buf (mangled
), NULL
, NULL
, NULL
);
6570 s
= cplus_demangle_v3 (dyn_string_buf (mangled
), options
);
6580 /* It might not have been a mangled name. Print the
6582 fputs (dyn_string_buf (mangled
), stdout
);
6585 dyn_string_clear (mangled
);
6588 /* If we haven't hit EOF yet, we've read one character that
6589 can't occur in a mangled name, so print it out. */
6594 dyn_string_delete (mangled
);
6597 /* Demangle command line arguments. */
6599 /* Loop over command line arguments. */
6600 for (i
= optind
; i
< argc
; ++i
)
6603 #ifdef IN_GLIBCPP_V3
6607 /* Attempt to demangle. */
6608 #ifdef IN_GLIBCPP_V3
6609 s
= __cxa_demangle (argv
[i
], NULL
, NULL
, &status
);
6611 s
= cplus_demangle_v3 (argv
[i
], options
);
6614 /* If it worked, print the demangled name. */
6622 #ifdef IN_GLIBCPP_V3
6623 fprintf (stderr
, "Failed: %s (status %d)\n", argv
[i
], status
);
6625 fprintf (stderr
, "Failed: %s\n", argv
[i
]);
6634 #endif /* STANDALONE_DEMANGLER */