1 /* Demangler for g++ V3 ABI.
2 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
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 (_AIX) && !defined (__GNUC__)
120 # define alloca __builtin_alloca
122 extern char *alloca ();
123 # endif /* __GNUC__ */
125 #endif /* HAVE_ALLOCA_H */
127 #include "ansidecl.h"
128 #include "libiberty.h"
129 #include "demangle.h"
130 #include "cp-demangle.h"
132 /* If IN_GLIBCPP_V3 is defined, some functions are made static. We
133 also rename them via #define to avoid compiler errors when the
134 static definition conflicts with the extern declaration in a header
138 #define CP_STATIC_IF_GLIBCPP_V3 static
140 #define cplus_demangle_fill_name d_fill_name
141 static int d_fill_name (struct demangle_component *, const char *, int);
143 #define cplus_demangle_fill_extended_operator d_fill_extended_operator
145 d_fill_extended_operator (struct demangle_component *, int,
146 struct demangle_component *);
148 #define cplus_demangle_fill_ctor d_fill_ctor
150 d_fill_ctor (struct demangle_component *, enum gnu_v3_ctor_kinds,
151 struct demangle_component *);
153 #define cplus_demangle_fill_dtor d_fill_dtor
155 d_fill_dtor (struct demangle_component *, enum gnu_v3_dtor_kinds,
156 struct demangle_component *);
158 #define cplus_demangle_mangled_name d_mangled_name
159 static struct demangle_component *d_mangled_name (struct d_info *, int);
161 #define cplus_demangle_type d_type
162 static struct demangle_component *d_type (struct d_info *);
164 #define cplus_demangle_print d_print
165 static char *d_print (int, const struct demangle_component *, int, size_t *);
167 #define cplus_demangle_print_callback d_print_callback
168 static int d_print_callback (int, const struct demangle_component *,
169 demangle_callbackref, void *);
171 #define cplus_demangle_init_info d_init_info
172 static void d_init_info (const char *, int, size_t, struct d_info *);
174 #else /* ! defined(IN_GLIBCPP_V3) */
175 #define CP_STATIC_IF_GLIBCPP_V3
176 #endif /* ! defined(IN_GLIBCPP_V3) */
178 /* See if the compiler supports dynamic arrays. */
181 #define CP_DYNAMIC_ARRAYS
184 #ifdef __STDC_VERSION__
185 #if __STDC_VERSION__ >= 199901L
186 #define CP_DYNAMIC_ARRAYS
187 #endif /* __STDC__VERSION >= 199901L */
188 #endif /* defined (__STDC_VERSION__) */
189 #endif /* defined (__STDC__) */
190 #endif /* ! defined (__GNUC__) */
192 /* We avoid pulling in the ctype tables, to prevent pulling in
193 additional unresolved symbols when this code is used in a library.
194 FIXME: Is this really a valid reason? This comes from the original
197 As of this writing this file has the following undefined references
198 when compiled with -DIN_GLIBCPP_V3: realloc, free, memcpy, strcpy,
201 #define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
202 #define IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z')
203 #define IS_LOWER(c) ((c) >= 'a' && (c) <= 'z')
205 /* The prefix prepended by GCC to an identifier represnting the
206 anonymous namespace. */
207 #define ANONYMOUS_NAMESPACE_PREFIX "_GLOBAL_"
208 #define ANONYMOUS_NAMESPACE_PREFIX_LEN \
209 (sizeof (ANONYMOUS_NAMESPACE_PREFIX) - 1)
211 /* Information we keep for the standard substitutions. */
213 struct d_standard_sub_info
215 /* The code for this substitution. */
217 /* The simple string it expands to. */
218 const char *simple_expansion;
219 /* The length of the simple expansion. */
221 /* The results of a full, verbose, expansion. This is used when
222 qualifying a constructor/destructor, or when in verbose mode. */
223 const char *full_expansion;
224 /* The length of the full expansion. */
226 /* What to set the last_name field of d_info to; NULL if we should
227 not set it. This is only relevant when qualifying a
228 constructor/destructor. */
229 const char *set_last_name;
230 /* The length of set_last_name. */
231 int set_last_name_len;
234 /* Accessors for subtrees of struct demangle_component. */
236 #define d_left(dc) ((dc)->u.s_binary.left)
237 #define d_right(dc) ((dc)->u.s_binary.right)
239 /* A list of templates. This is used while printing. */
241 struct d_print_template
243 /* Next template on the list. */
244 struct d_print_template *next;
246 const struct demangle_component *template_decl;
249 /* A list of type modifiers. This is used while printing. */
253 /* Next modifier on the list. These are in the reverse of the order
254 in which they appeared in the mangled string. */
255 struct d_print_mod *next;
257 const struct demangle_component *mod;
258 /* Whether this modifier was printed. */
260 /* The list of templates which applies to this modifier. */
261 struct d_print_template *templates;
264 /* We use these structures to hold information during printing. */
266 struct d_growable_string
268 /* Buffer holding the result. */
270 /* Current length of data in buffer. */
272 /* Allocated size of buffer. */
274 /* Set to 1 if we had a memory allocation failure. */
275 int allocation_failure;
278 /* A demangle component and some scope captured when it was first
283 /* The component whose scope this is. */
284 const struct demangle_component *container;
285 /* The list of templates, if any, that was current when this
286 scope was captured. */
287 struct d_print_template *templates;
290 /* Checkpoint structure to allow backtracking. This holds copies
291 of the fields of struct d_info that need to be restored
292 if a trial parse needs to be backtracked over. */
294 struct d_info_checkpoint
303 enum { D_PRINT_BUFFER_LENGTH = 256 };
306 /* Fixed-length allocated buffer for demangled data, flushed to the
307 callback with a NUL termination once full. */
308 char buf[D_PRINT_BUFFER_LENGTH];
309 /* Current length of data in buffer. */
311 /* The last character printed, saved individually so that it survives
314 /* Callback function to handle demangled buffer flush. */
315 demangle_callbackref callback;
316 /* Opaque callback argument. */
318 /* The current list of templates, if any. */
319 struct d_print_template *templates;
320 /* The current list of modifiers (e.g., pointer, reference, etc.),
322 struct d_print_mod *modifiers;
323 /* Set to 1 if we saw a demangling error. */
324 int demangle_failure;
325 /* The current index into any template argument packs we are using
328 /* Number of d_print_flush calls so far. */
329 unsigned long int flush_count;
330 /* Array of saved scopes for evaluating substitutions. */
331 struct d_saved_scope *saved_scopes;
332 /* Number of saved scopes in the above array. */
333 int num_saved_scopes;
334 /* The nearest enclosing template, if any. */
335 const struct demangle_component *current_template;
338 #ifdef CP_DEMANGLE_DEBUG
339 static void d_dump (struct demangle_component *, int);
342 static struct demangle_component *
343 d_make_empty (struct d_info *);
345 static struct demangle_component *
346 d_make_comp (struct d_info *, enum demangle_component_type,
347 struct demangle_component *,
348 struct demangle_component *);
350 static struct demangle_component *
351 d_make_name (struct d_info *, const char *, int);
353 static struct demangle_component *
354 d_make_demangle_mangled_name (struct d_info *, const char *);
356 static struct demangle_component *
357 d_make_builtin_type (struct d_info *,
358 const struct demangle_builtin_type_info *);
360 static struct demangle_component *
361 d_make_operator (struct d_info *,
362 const struct demangle_operator_info *);
364 static struct demangle_component *
365 d_make_extended_operator (struct d_info *, int,
366 struct demangle_component *);
368 static struct demangle_component *
369 d_make_ctor (struct d_info *, enum gnu_v3_ctor_kinds,
370 struct demangle_component *);
372 static struct demangle_component *
373 d_make_dtor (struct d_info *, enum gnu_v3_dtor_kinds,
374 struct demangle_component *);
376 static struct demangle_component *
377 d_make_template_param (struct d_info *, long);
379 static struct demangle_component *
380 d_make_sub (struct d_info *, const char *, int);
383 has_return_type (struct demangle_component *);
386 is_ctor_dtor_or_conversion (struct demangle_component *);
388 static struct demangle_component *d_encoding (struct d_info *, int);
390 static struct demangle_component *d_name (struct d_info *);
392 static struct demangle_component *d_nested_name (struct d_info *);
394 static struct demangle_component *d_prefix (struct d_info *);
396 static struct demangle_component *d_unqualified_name (struct d_info *);
398 static struct demangle_component *d_source_name (struct d_info *);
400 static long d_number (struct d_info *);
402 static struct demangle_component *d_identifier (struct d_info *, int);
404 static struct demangle_component *d_operator_name (struct d_info *);
406 static struct demangle_component *d_special_name (struct d_info *);
408 static int d_call_offset (struct d_info *, int);
410 static struct demangle_component *d_ctor_dtor_name (struct d_info *);
412 static struct demangle_component **
413 d_cv_qualifiers (struct d_info *, struct demangle_component **, int);
415 static struct demangle_component *
416 d_ref_qualifier (struct d_info *, struct demangle_component *);
418 static struct demangle_component *
419 d_function_type (struct d_info *);
421 static struct demangle_component *
422 d_bare_function_type (struct d_info *, int);
424 static struct demangle_component *
425 d_class_enum_type (struct d_info *);
427 static struct demangle_component *d_array_type (struct d_info *);
429 static struct demangle_component *d_vector_type (struct d_info *);
431 static struct demangle_component *
432 d_pointer_to_member_type (struct d_info *);
434 static struct demangle_component *
435 d_template_param (struct d_info *);
437 static struct demangle_component *d_template_args (struct d_info *);
439 static struct demangle_component *
440 d_template_arg (struct d_info *);
442 static struct demangle_component *d_expression (struct d_info *);
444 static struct demangle_component *d_expr_primary (struct d_info *);
446 static struct demangle_component *d_local_name (struct d_info *);
448 static int d_discriminator (struct d_info *);
450 static struct demangle_component *d_lambda (struct d_info *);
452 static struct demangle_component *d_unnamed_type (struct d_info *);
454 static struct demangle_component *
455 d_clone_suffix (struct d_info *, struct demangle_component *);
458 d_add_substitution (struct d_info *, struct demangle_component *);
460 static struct demangle_component *d_substitution (struct d_info *, int);
462 static void d_checkpoint (struct d_info *, struct d_info_checkpoint *);
464 static void d_backtrack (struct d_info *, struct d_info_checkpoint *);
466 static void d_growable_string_init (struct d_growable_string *, size_t);
469 d_growable_string_resize (struct d_growable_string *, size_t);
472 d_growable_string_append_buffer (struct d_growable_string *,
473 const char *, size_t);
475 d_growable_string_callback_adapter (const char *, size_t, void *);
478 d_print_init (struct d_print_info *, demangle_callbackref, void *);
480 static inline void d_print_error (struct d_print_info *);
482 static inline int d_print_saw_error (struct d_print_info *);
484 static inline void d_print_flush (struct d_print_info *);
486 static inline void d_append_char (struct d_print_info *, char);
488 static inline void d_append_buffer (struct d_print_info *,
489 const char *, size_t);
491 static inline void d_append_string (struct d_print_info *, const char *);
493 static inline char d_last_char (struct d_print_info *);
496 d_print_comp (struct d_print_info *, int, const struct demangle_component *);
499 d_print_java_identifier (struct d_print_info *, const char *, int);
502 d_print_mod_list (struct d_print_info *, int, struct d_print_mod *, int);
505 d_print_mod (struct d_print_info *, int, const struct demangle_component *);
508 d_print_function_type (struct d_print_info *, int,
509 const struct demangle_component *,
510 struct d_print_mod *);
513 d_print_array_type (struct d_print_info *, int,
514 const struct demangle_component *,
515 struct d_print_mod *);
518 d_print_expr_op (struct d_print_info *, int, const struct demangle_component *);
521 d_print_cast (struct d_print_info *, int, const struct demangle_component *);
523 static int d_demangle_callback (const char *, int,
524 demangle_callbackref, void *);
525 static char *d_demangle (const char *, int, size_t *);
527 #ifdef CP_DEMANGLE_DEBUG
530 d_dump (struct demangle_component *dc, int indent)
537 printf ("failed demangling\n");
541 for (i = 0; i < indent; ++i)
546 case DEMANGLE_COMPONENT_NAME:
547 printf ("name '%.*s'\n", dc->u.s_name.len, dc->u.s_name.s);
549 case DEMANGLE_COMPONENT_TAGGED_NAME:
550 printf ("tagged name\n");
551 d_dump (dc->u.s_binary.left, indent + 2);
552 d_dump (dc->u.s_binary.right, indent + 2);
554 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
555 printf ("template parameter %ld\n", dc->u.s_number.number);
557 case DEMANGLE_COMPONENT_CTOR:
558 printf ("constructor %d\n", (int) dc->u.s_ctor.kind);
559 d_dump (dc->u.s_ctor.name, indent + 2);
561 case DEMANGLE_COMPONENT_DTOR:
562 printf ("destructor %d\n", (int) dc->u.s_dtor.kind);
563 d_dump (dc->u.s_dtor.name, indent + 2);
565 case DEMANGLE_COMPONENT_SUB_STD:
566 printf ("standard substitution %s\n", dc->u.s_string.string);
568 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
569 printf ("builtin type %s\n", dc->u.s_builtin.type->name);
571 case DEMANGLE_COMPONENT_OPERATOR:
572 printf ("operator %s\n", dc->u.s_operator.op->name);
574 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
575 printf ("extended operator with %d args\n",
576 dc->u.s_extended_operator.args);
577 d_dump (dc->u.s_extended_operator.name, indent + 2);
580 case DEMANGLE_COMPONENT_QUAL_NAME:
581 printf ("qualified name\n");
583 case DEMANGLE_COMPONENT_LOCAL_NAME:
584 printf ("local name\n");
586 case DEMANGLE_COMPONENT_TYPED_NAME:
587 printf ("typed name\n");
589 case DEMANGLE_COMPONENT_TEMPLATE:
590 printf ("template\n");
592 case DEMANGLE_COMPONENT_VTABLE:
595 case DEMANGLE_COMPONENT_VTT:
598 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
599 printf ("construction vtable\n");
601 case DEMANGLE_COMPONENT_TYPEINFO:
602 printf ("typeinfo\n");
604 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
605 printf ("typeinfo name\n");
607 case DEMANGLE_COMPONENT_TYPEINFO_FN:
608 printf ("typeinfo function\n");
610 case DEMANGLE_COMPONENT_THUNK:
613 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
614 printf ("virtual thunk\n");
616 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
617 printf ("covariant thunk\n");
619 case DEMANGLE_COMPONENT_JAVA_CLASS:
620 printf ("java class\n");
622 case DEMANGLE_COMPONENT_GUARD:
625 case DEMANGLE_COMPONENT_REFTEMP:
626 printf ("reference temporary\n");
628 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
629 printf ("hidden alias\n");
631 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
632 printf ("transaction clone\n");
634 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
635 printf ("non-transaction clone\n");
637 case DEMANGLE_COMPONENT_RESTRICT:
638 printf ("restrict\n");
640 case DEMANGLE_COMPONENT_VOLATILE:
641 printf ("volatile\n");
643 case DEMANGLE_COMPONENT_CONST:
646 case DEMANGLE_COMPONENT_RESTRICT_THIS:
647 printf ("restrict this\n");
649 case DEMANGLE_COMPONENT_VOLATILE_THIS:
650 printf ("volatile this\n");
652 case DEMANGLE_COMPONENT_CONST_THIS:
653 printf ("const this\n");
655 case DEMANGLE_COMPONENT_REFERENCE_THIS:
656 printf ("reference this\n");
658 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
659 printf ("rvalue reference this\n");
661 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
662 printf ("vendor type qualifier\n");
664 case DEMANGLE_COMPONENT_POINTER:
665 printf ("pointer\n");
667 case DEMANGLE_COMPONENT_REFERENCE:
668 printf ("reference\n");
670 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
671 printf ("rvalue reference\n");
673 case DEMANGLE_COMPONENT_COMPLEX:
674 printf ("complex\n");
676 case DEMANGLE_COMPONENT_IMAGINARY:
677 printf ("imaginary\n");
679 case DEMANGLE_COMPONENT_VENDOR_TYPE:
680 printf ("vendor type\n");
682 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
683 printf ("function type\n");
685 case DEMANGLE_COMPONENT_ARRAY_TYPE:
686 printf ("array type\n");
688 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
689 printf ("pointer to member type\n");
691 case DEMANGLE_COMPONENT_FIXED_TYPE:
692 printf ("fixed-point type\n");
694 case DEMANGLE_COMPONENT_ARGLIST:
695 printf ("argument list\n");
697 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
698 printf ("template argument list\n");
700 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
701 printf ("initializer list\n");
703 case DEMANGLE_COMPONENT_CAST:
706 case DEMANGLE_COMPONENT_NULLARY:
707 printf ("nullary operator\n");
709 case DEMANGLE_COMPONENT_UNARY:
710 printf ("unary operator\n");
712 case DEMANGLE_COMPONENT_BINARY:
713 printf ("binary operator\n");
715 case DEMANGLE_COMPONENT_BINARY_ARGS:
716 printf ("binary operator arguments\n");
718 case DEMANGLE_COMPONENT_TRINARY:
719 printf ("trinary operator\n");
721 case DEMANGLE_COMPONENT_TRINARY_ARG1:
722 printf ("trinary operator arguments 1\n");
724 case DEMANGLE_COMPONENT_TRINARY_ARG2:
725 printf ("trinary operator arguments 1\n");
727 case DEMANGLE_COMPONENT_LITERAL:
728 printf ("literal\n");
730 case DEMANGLE_COMPONENT_LITERAL_NEG:
731 printf ("negative literal\n");
733 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
734 printf ("java resource\n");
736 case DEMANGLE_COMPONENT_COMPOUND_NAME:
737 printf ("compound name\n");
739 case DEMANGLE_COMPONENT_CHARACTER:
740 printf ("character '%c'\n", dc->u.s_character.character);
742 case DEMANGLE_COMPONENT_DECLTYPE:
743 printf ("decltype\n");
745 case DEMANGLE_COMPONENT_PACK_EXPANSION:
746 printf ("pack expansion\n");
748 case DEMANGLE_COMPONENT_TLS_INIT:
749 printf ("tls init function\n");
751 case DEMANGLE_COMPONENT_TLS_WRAPPER:
752 printf ("tls wrapper function\n");
754 case DEMANGLE_COMPONENT_DEFAULT_ARG:
755 printf ("default argument %d\n", dc->u.s_unary_num.num);
756 d_dump (dc->u.s_unary_num.sub, indent+2);
758 case DEMANGLE_COMPONENT_LAMBDA:
759 printf ("lambda %d\n", dc->u.s_unary_num.num);
760 d_dump (dc->u.s_unary_num.sub, indent+2);
764 d_dump (d_left (dc), indent + 2);
765 d_dump (d_right (dc), indent + 2);
768 #endif /* CP_DEMANGLE_DEBUG */
770 /* Fill in a DEMANGLE_COMPONENT_NAME. */
772 CP_STATIC_IF_GLIBCPP_V3
774 cplus_demangle_fill_name (struct demangle_component *p, const char *s, int len)
776 if (p == NULL || s == NULL || len == 0)
778 p->type = DEMANGLE_COMPONENT_NAME;
780 p->u.s_name.len = len;
784 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
786 CP_STATIC_IF_GLIBCPP_V3
788 cplus_demangle_fill_extended_operator (struct demangle_component *p, int args,
789 struct demangle_component *name)
791 if (p == NULL || args < 0 || name == NULL)
793 p->type = DEMANGLE_COMPONENT_EXTENDED_OPERATOR;
794 p->u.s_extended_operator.args = args;
795 p->u.s_extended_operator.name = name;
799 /* Fill in a DEMANGLE_COMPONENT_CTOR. */
801 CP_STATIC_IF_GLIBCPP_V3
803 cplus_demangle_fill_ctor (struct demangle_component *p,
804 enum gnu_v3_ctor_kinds kind,
805 struct demangle_component *name)
809 || (int) kind < gnu_v3_complete_object_ctor
810 || (int) kind > gnu_v3_object_ctor_group)
812 p->type = DEMANGLE_COMPONENT_CTOR;
813 p->u.s_ctor.kind = kind;
814 p->u.s_ctor.name = name;
818 /* Fill in a DEMANGLE_COMPONENT_DTOR. */
820 CP_STATIC_IF_GLIBCPP_V3
822 cplus_demangle_fill_dtor (struct demangle_component *p,
823 enum gnu_v3_dtor_kinds kind,
824 struct demangle_component *name)
828 || (int) kind < gnu_v3_deleting_dtor
829 || (int) kind > gnu_v3_object_dtor_group)
831 p->type = DEMANGLE_COMPONENT_DTOR;
832 p->u.s_dtor.kind = kind;
833 p->u.s_dtor.name = name;
837 /* Add a new component. */
839 static struct demangle_component *
840 d_make_empty (struct d_info *di)
842 struct demangle_component *p;
844 if (di->next_comp >= di->num_comps)
846 p = &di->comps[di->next_comp];
851 /* Add a new generic component. */
853 static struct demangle_component *
854 d_make_comp (struct d_info *di, enum demangle_component_type type,
855 struct demangle_component *left,
856 struct demangle_component *right)
858 struct demangle_component *p;
860 /* We check for errors here. A typical error would be a NULL return
861 from a subroutine. We catch those here, and return NULL
865 /* These types require two parameters. */
866 case DEMANGLE_COMPONENT_QUAL_NAME:
867 case DEMANGLE_COMPONENT_LOCAL_NAME:
868 case DEMANGLE_COMPONENT_TYPED_NAME:
869 case DEMANGLE_COMPONENT_TAGGED_NAME:
870 case DEMANGLE_COMPONENT_TEMPLATE:
871 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
872 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
873 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
874 case DEMANGLE_COMPONENT_UNARY:
875 case DEMANGLE_COMPONENT_BINARY:
876 case DEMANGLE_COMPONENT_BINARY_ARGS:
877 case DEMANGLE_COMPONENT_TRINARY:
878 case DEMANGLE_COMPONENT_TRINARY_ARG1:
879 case DEMANGLE_COMPONENT_LITERAL:
880 case DEMANGLE_COMPONENT_LITERAL_NEG:
881 case DEMANGLE_COMPONENT_COMPOUND_NAME:
882 case DEMANGLE_COMPONENT_VECTOR_TYPE:
883 case DEMANGLE_COMPONENT_CLONE:
884 if (left == NULL || right == NULL)
888 /* These types only require one parameter. */
889 case DEMANGLE_COMPONENT_VTABLE:
890 case DEMANGLE_COMPONENT_VTT:
891 case DEMANGLE_COMPONENT_TYPEINFO:
892 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
893 case DEMANGLE_COMPONENT_TYPEINFO_FN:
894 case DEMANGLE_COMPONENT_THUNK:
895 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
896 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
897 case DEMANGLE_COMPONENT_JAVA_CLASS:
898 case DEMANGLE_COMPONENT_GUARD:
899 case DEMANGLE_COMPONENT_TLS_INIT:
900 case DEMANGLE_COMPONENT_TLS_WRAPPER:
901 case DEMANGLE_COMPONENT_REFTEMP:
902 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
903 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
904 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
905 case DEMANGLE_COMPONENT_POINTER:
906 case DEMANGLE_COMPONENT_REFERENCE:
907 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
908 case DEMANGLE_COMPONENT_COMPLEX:
909 case DEMANGLE_COMPONENT_IMAGINARY:
910 case DEMANGLE_COMPONENT_VENDOR_TYPE:
911 case DEMANGLE_COMPONENT_CAST:
912 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
913 case DEMANGLE_COMPONENT_DECLTYPE:
914 case DEMANGLE_COMPONENT_PACK_EXPANSION:
915 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
916 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
917 case DEMANGLE_COMPONENT_NULLARY:
918 case DEMANGLE_COMPONENT_TRINARY_ARG2:
923 /* This needs a right parameter, but the left parameter can be
925 case DEMANGLE_COMPONENT_ARRAY_TYPE:
926 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
931 /* These are allowed to have no parameters--in some cases they
932 will be filled in later. */
933 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
934 case DEMANGLE_COMPONENT_RESTRICT:
935 case DEMANGLE_COMPONENT_VOLATILE:
936 case DEMANGLE_COMPONENT_CONST:
937 case DEMANGLE_COMPONENT_RESTRICT_THIS:
938 case DEMANGLE_COMPONENT_VOLATILE_THIS:
939 case DEMANGLE_COMPONENT_CONST_THIS:
940 case DEMANGLE_COMPONENT_REFERENCE_THIS:
941 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
942 case DEMANGLE_COMPONENT_ARGLIST:
943 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
946 /* Other types should not be seen here. */
951 p = d_make_empty (di);
955 p->u.s_binary.left = left;
956 p->u.s_binary.right = right;
961 /* Add a new demangle mangled name component. */
963 static struct demangle_component *
964 d_make_demangle_mangled_name (struct d_info *di, const char *s)
966 if (d_peek_char (di) != '_' || d_peek_next_char (di) != 'Z')
967 return d_make_name (di, s, strlen (s));
969 return d_encoding (di, 0);
972 /* Add a new name component. */
974 static struct demangle_component *
975 d_make_name (struct d_info *di, const char *s, int len)
977 struct demangle_component *p;
979 p = d_make_empty (di);
980 if (! cplus_demangle_fill_name (p, s, len))
985 /* Add a new builtin type component. */
987 static struct demangle_component *
988 d_make_builtin_type (struct d_info *di,
989 const struct demangle_builtin_type_info *type)
991 struct demangle_component *p;
995 p = d_make_empty (di);
998 p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE;
999 p->u.s_builtin.type = type;
1004 /* Add a new operator component. */
1006 static struct demangle_component *
1007 d_make_operator (struct d_info *di, const struct demangle_operator_info *op)
1009 struct demangle_component *p;
1011 p = d_make_empty (di);
1014 p->type = DEMANGLE_COMPONENT_OPERATOR;
1015 p->u.s_operator.op = op;
1020 /* Add a new extended operator component. */
1022 static struct demangle_component *
1023 d_make_extended_operator (struct d_info *di, int args,
1024 struct demangle_component *name)
1026 struct demangle_component *p;
1028 p = d_make_empty (di);
1029 if (! cplus_demangle_fill_extended_operator (p, args, name))
1034 static struct demangle_component *
1035 d_make_default_arg (struct d_info *di, int num,
1036 struct demangle_component *sub)
1038 struct demangle_component *p = d_make_empty (di);
1041 p->type = DEMANGLE_COMPONENT_DEFAULT_ARG;
1042 p->u.s_unary_num.num = num;
1043 p->u.s_unary_num.sub = sub;
1048 /* Add a new constructor component. */
1050 static struct demangle_component *
1051 d_make_ctor (struct d_info *di, enum gnu_v3_ctor_kinds kind,
1052 struct demangle_component *name)
1054 struct demangle_component *p;
1056 p = d_make_empty (di);
1057 if (! cplus_demangle_fill_ctor (p, kind, name))
1062 /* Add a new destructor component. */
1064 static struct demangle_component *
1065 d_make_dtor (struct d_info *di, enum gnu_v3_dtor_kinds kind,
1066 struct demangle_component *name)
1068 struct demangle_component *p;
1070 p = d_make_empty (di);
1071 if (! cplus_demangle_fill_dtor (p, kind, name))
1076 /* Add a new template parameter. */
1078 static struct demangle_component *
1079 d_make_template_param (struct d_info *di, long i)
1081 struct demangle_component *p;
1083 p = d_make_empty (di);
1086 p->type = DEMANGLE_COMPONENT_TEMPLATE_PARAM;
1087 p->u.s_number.number = i;
1092 /* Add a new function parameter. */
1094 static struct demangle_component *
1095 d_make_function_param (struct d_info *di, long i)
1097 struct demangle_component *p;
1099 p = d_make_empty (di);
1102 p->type = DEMANGLE_COMPONENT_FUNCTION_PARAM;
1103 p->u.s_number.number = i;
1108 /* Add a new standard substitution component. */
1110 static struct demangle_component *
1111 d_make_sub (struct d_info *di, const char *name, int len)
1113 struct demangle_component *p;
1115 p = d_make_empty (di);
1118 p->type = DEMANGLE_COMPONENT_SUB_STD;
1119 p->u.s_string.string = name;
1120 p->u.s_string.len = len;
1125 /* <mangled-name> ::= _Z <encoding> [<clone-suffix>]*
1127 TOP_LEVEL is non-zero when called at the top level. */
1129 CP_STATIC_IF_GLIBCPP_V3
1130 struct demangle_component *
1131 cplus_demangle_mangled_name (struct d_info *di, int top_level)
1133 struct demangle_component *p;
1135 if (! d_check_char (di, '_')
1136 /* Allow missing _ if not at toplevel to work around a
1137 bug in G++ abi-version=2 mangling; see the comment in
1138 write_template_arg. */
1141 if (! d_check_char (di, 'Z'))
1143 p = d_encoding (di, top_level);
1145 /* If at top level and parsing parameters, check for a clone
1147 if (top_level && (di->options & DMGL_PARAMS) != 0)
1148 while (d_peek_char (di) == '.'
1149 && (IS_LOWER (d_peek_next_char (di))
1150 || d_peek_next_char (di) == '_'
1151 || IS_DIGIT (d_peek_next_char (di))))
1152 p = d_clone_suffix (di, p);
1157 /* Return whether a function should have a return type. The argument
1158 is the function name, which may be qualified in various ways. The
1159 rules are that template functions have return types with some
1160 exceptions, function types which are not part of a function name
1161 mangling have return types with some exceptions, and non-template
1162 function names do not have return types. The exceptions are that
1163 constructors, destructors, and conversion operators do not have
1167 has_return_type (struct demangle_component *dc)
1175 case DEMANGLE_COMPONENT_TEMPLATE:
1176 return ! is_ctor_dtor_or_conversion (d_left (dc));
1177 case DEMANGLE_COMPONENT_RESTRICT_THIS:
1178 case DEMANGLE_COMPONENT_VOLATILE_THIS:
1179 case DEMANGLE_COMPONENT_CONST_THIS:
1180 case DEMANGLE_COMPONENT_REFERENCE_THIS:
1181 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
1182 return has_return_type (d_left (dc));
1186 /* Return whether a name is a constructor, a destructor, or a
1187 conversion operator. */
1190 is_ctor_dtor_or_conversion (struct demangle_component *dc)
1198 case DEMANGLE_COMPONENT_QUAL_NAME:
1199 case DEMANGLE_COMPONENT_LOCAL_NAME:
1200 return is_ctor_dtor_or_conversion (d_right (dc));
1201 case DEMANGLE_COMPONENT_CTOR:
1202 case DEMANGLE_COMPONENT_DTOR:
1203 case DEMANGLE_COMPONENT_CAST:
1208 /* <encoding> ::= <(function) name> <bare-function-type>
1212 TOP_LEVEL is non-zero when called at the top level, in which case
1213 if DMGL_PARAMS is not set we do not demangle the function
1214 parameters. We only set this at the top level, because otherwise
1215 we would not correctly demangle names in local scopes. */
1217 static struct demangle_component *
1218 d_encoding (struct d_info *di, int top_level)
1220 char peek = d_peek_char (di);
1222 if (peek == 'G' || peek == 'T')
1223 return d_special_name (di);
1226 struct demangle_component *dc;
1230 if (dc != NULL && top_level && (di->options & DMGL_PARAMS) == 0)
1232 /* Strip off any initial CV-qualifiers, as they really apply
1233 to the `this' parameter, and they were not output by the
1234 v2 demangler without DMGL_PARAMS. */
1235 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1236 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1237 || dc->type == DEMANGLE_COMPONENT_CONST_THIS
1238 || dc->type == DEMANGLE_COMPONENT_REFERENCE_THIS
1239 || dc->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)
1242 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1243 there may be CV-qualifiers on its right argument which
1244 really apply here; this happens when parsing a class
1245 which is local to a function. */
1246 if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME)
1248 struct demangle_component *dcr;
1251 while (dcr->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1252 || dcr->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1253 || dcr->type == DEMANGLE_COMPONENT_CONST_THIS
1254 || dcr->type == DEMANGLE_COMPONENT_REFERENCE_THIS
1255 || dcr->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)
1257 dc->u.s_binary.right = dcr;
1263 peek = d_peek_char (di);
1264 if (dc == NULL || peek == '\0' || peek == 'E')
1266 return d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, dc,
1267 d_bare_function_type (di, has_return_type (dc)));
1271 /* <tagged-name> ::= <name> B <source-name> */
1273 static struct demangle_component *
1274 d_abi_tags (struct d_info *di, struct demangle_component *dc)
1277 while (peek = d_peek_char (di),
1280 struct demangle_component *tag;
1282 tag = d_source_name (di);
1283 dc = d_make_comp (di, DEMANGLE_COMPONENT_TAGGED_NAME, dc, tag);
1288 /* <name> ::= <nested-name>
1290 ::= <unscoped-template-name> <template-args>
1293 <unscoped-name> ::= <unqualified-name>
1294 ::= St <unqualified-name>
1296 <unscoped-template-name> ::= <unscoped-name>
1300 static struct demangle_component *
1301 d_name (struct d_info *di)
1303 char peek = d_peek_char (di);
1304 struct demangle_component *dc;
1309 return d_nested_name (di);
1312 return d_local_name (di);
1315 return d_unqualified_name (di);
1321 if (d_peek_next_char (di) != 't')
1323 dc = d_substitution (di, 0);
1329 dc = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME,
1330 d_make_name (di, "std", 3),
1331 d_unqualified_name (di));
1336 if (d_peek_char (di) != 'I')
1338 /* The grammar does not permit this case to occur if we
1339 called d_substitution() above (i.e., subst == 1). We
1340 don't bother to check. */
1344 /* This is <template-args>, which means that we just saw
1345 <unscoped-template-name>, which is a substitution
1346 candidate if we didn't just get it from a
1350 if (! d_add_substitution (di, dc))
1353 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1354 d_template_args (di));
1362 dc = d_unqualified_name (di);
1363 if (d_peek_char (di) == 'I')
1365 /* This is <template-args>, which means that we just saw
1366 <unscoped-template-name>, which is a substitution
1368 if (! d_add_substitution (di, dc))
1370 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1371 d_template_args (di));
1377 /* <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
1378 ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
1381 static struct demangle_component *
1382 d_nested_name (struct d_info *di)
1384 struct demangle_component *ret;
1385 struct demangle_component **pret;
1386 struct demangle_component *rqual;
1388 if (! d_check_char (di, 'N'))
1391 pret = d_cv_qualifiers (di, &ret, 1);
1395 /* Parse the ref-qualifier now and then attach it
1396 once we have something to attach it to. */
1397 rqual = d_ref_qualifier (di, NULL);
1399 *pret = d_prefix (di);
1405 d_left (rqual) = ret;
1409 if (! d_check_char (di, 'E'))
1415 /* <prefix> ::= <prefix> <unqualified-name>
1416 ::= <template-prefix> <template-args>
1417 ::= <template-param>
1422 <template-prefix> ::= <prefix> <(template) unqualified-name>
1423 ::= <template-param>
1427 static struct demangle_component *
1428 d_prefix (struct d_info *di)
1430 struct demangle_component *ret = NULL;
1435 enum demangle_component_type comb_type;
1436 struct demangle_component *dc;
1438 peek = d_peek_char (di);
1442 /* The older code accepts a <local-name> here, but I don't see
1443 that in the grammar. The older code does not accept a
1444 <template-param> here. */
1446 comb_type = DEMANGLE_COMPONENT_QUAL_NAME;
1449 char peek2 = d_peek_next_char (di);
1450 if (peek2 == 'T' || peek2 == 't')
1452 dc = cplus_demangle_type (di);
1454 /* Destructor name. */
1455 dc = d_unqualified_name (di);
1457 else if (IS_DIGIT (peek)
1462 dc = d_unqualified_name (di);
1463 else if (peek == 'S')
1464 dc = d_substitution (di, 1);
1465 else if (peek == 'I')
1469 comb_type = DEMANGLE_COMPONENT_TEMPLATE;
1470 dc = d_template_args (di);
1472 else if (peek == 'T')
1473 dc = d_template_param (di);
1474 else if (peek == 'E')
1476 else if (peek == 'M')
1478 /* Initializer scope for a lambda. We don't need to represent
1479 this; the normal code will just treat the variable as a type
1480 scope, which gives appropriate output. */
1492 ret = d_make_comp (di, comb_type, ret, dc);
1494 if (peek != 'S' && d_peek_char (di) != 'E')
1496 if (! d_add_substitution (di, ret))
1502 /* <unqualified-name> ::= <operator-name>
1503 ::= <ctor-dtor-name>
1505 ::= <local-source-name>
1507 <local-source-name> ::= L <source-name> <discriminator>
1510 static struct demangle_component *
1511 d_unqualified_name (struct d_info *di)
1513 struct demangle_component *ret;
1516 peek = d_peek_char (di);
1517 if (IS_DIGIT (peek))
1518 ret = d_source_name (di);
1519 else if (IS_LOWER (peek))
1521 ret = d_operator_name (di);
1522 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_OPERATOR)
1524 di->expansion += sizeof "operator" + ret->u.s_operator.op->len - 2;
1525 if (!strcmp (ret->u.s_operator.op->code, "li"))
1526 ret = d_make_comp (di, DEMANGLE_COMPONENT_UNARY, ret,
1527 d_source_name (di));
1530 else if (peek == 'C' || peek == 'D')
1531 ret = d_ctor_dtor_name (di);
1532 else if (peek == 'L')
1536 ret = d_source_name (di);
1539 if (! d_discriminator (di))
1542 else if (peek == 'U')
1544 switch (d_peek_next_char (di))
1547 ret = d_lambda (di);
1550 ret = d_unnamed_type (di);
1559 if (d_peek_char (di) == 'B')
1560 ret = d_abi_tags (di, ret);
1564 /* <source-name> ::= <(positive length) number> <identifier> */
1566 static struct demangle_component *
1567 d_source_name (struct d_info *di)
1570 struct demangle_component *ret;
1572 len = d_number (di);
1575 ret = d_identifier (di, len);
1576 di->last_name = ret;
1580 /* number ::= [n] <(non-negative decimal integer)> */
1583 d_number (struct d_info *di)
1590 peek = d_peek_char (di);
1595 peek = d_peek_char (di);
1601 if (! IS_DIGIT (peek))
1607 ret = ret * 10 + peek - '0';
1609 peek = d_peek_char (di);
1613 /* Like d_number, but returns a demangle_component. */
1615 static struct demangle_component *
1616 d_number_component (struct d_info *di)
1618 struct demangle_component *ret = d_make_empty (di);
1621 ret->type = DEMANGLE_COMPONENT_NUMBER;
1622 ret->u.s_number.number = d_number (di);
1627 /* identifier ::= <(unqualified source code identifier)> */
1629 static struct demangle_component *
1630 d_identifier (struct d_info *di, int len)
1636 if (di->send - name < len)
1639 d_advance (di, len);
1641 /* A Java mangled name may have a trailing '$' if it is a C++
1642 keyword. This '$' is not included in the length count. We just
1644 if ((di->options & DMGL_JAVA) != 0
1645 && d_peek_char (di) == '$')
1648 /* Look for something which looks like a gcc encoding of an
1649 anonymous namespace, and replace it with a more user friendly
1651 if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
1652 && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX,
1653 ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0)
1657 s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN;
1658 if ((*s == '.' || *s == '_' || *s == '$')
1661 di->expansion -= len - sizeof "(anonymous namespace)";
1662 return d_make_name (di, "(anonymous namespace)",
1663 sizeof "(anonymous namespace)" - 1);
1667 return d_make_name (di, name, len);
1670 /* operator_name ::= many different two character encodings.
1672 ::= v <digit> <source-name>
1674 This list is sorted for binary search. */
1676 #define NL(s) s, (sizeof s) - 1
1678 CP_STATIC_IF_GLIBCPP_V3
1679 const struct demangle_operator_info cplus_demangle_operators[] =
1681 { "aN", NL ("&="), 2 },
1682 { "aS", NL ("="), 2 },
1683 { "aa", NL ("&&"), 2 },
1684 { "ad", NL ("&"), 1 },
1685 { "an", NL ("&"), 2 },
1686 { "at", NL ("alignof "), 1 },
1687 { "az", NL ("alignof "), 1 },
1688 { "cc", NL ("const_cast"), 2 },
1689 { "cl", NL ("()"), 2 },
1690 { "cm", NL (","), 2 },
1691 { "co", NL ("~"), 1 },
1692 { "dV", NL ("/="), 2 },
1693 { "da", NL ("delete[] "), 1 },
1694 { "dc", NL ("dynamic_cast"), 2 },
1695 { "de", NL ("*"), 1 },
1696 { "dl", NL ("delete "), 1 },
1697 { "ds", NL (".*"), 2 },
1698 { "dt", NL ("."), 2 },
1699 { "dv", NL ("/"), 2 },
1700 { "eO", NL ("^="), 2 },
1701 { "eo", NL ("^"), 2 },
1702 { "eq", NL ("=="), 2 },
1703 { "ge", NL (">="), 2 },
1704 { "gs", NL ("::"), 1 },
1705 { "gt", NL (">"), 2 },
1706 { "ix", NL ("[]"), 2 },
1707 { "lS", NL ("<<="), 2 },
1708 { "le", NL ("<="), 2 },
1709 { "li", NL ("operator\"\" "), 1 },
1710 { "ls", NL ("<<"), 2 },
1711 { "lt", NL ("<"), 2 },
1712 { "mI", NL ("-="), 2 },
1713 { "mL", NL ("*="), 2 },
1714 { "mi", NL ("-"), 2 },
1715 { "ml", NL ("*"), 2 },
1716 { "mm", NL ("--"), 1 },
1717 { "na", NL ("new[]"), 3 },
1718 { "ne", NL ("!="), 2 },
1719 { "ng", NL ("-"), 1 },
1720 { "nt", NL ("!"), 1 },
1721 { "nw", NL ("new"), 3 },
1722 { "oR", NL ("|="), 2 },
1723 { "oo", NL ("||"), 2 },
1724 { "or", NL ("|"), 2 },
1725 { "pL", NL ("+="), 2 },
1726 { "pl", NL ("+"), 2 },
1727 { "pm", NL ("->*"), 2 },
1728 { "pp", NL ("++"), 1 },
1729 { "ps", NL ("+"), 1 },
1730 { "pt", NL ("->"), 2 },
1731 { "qu", NL ("?"), 3 },
1732 { "rM", NL ("%="), 2 },
1733 { "rS", NL (">>="), 2 },
1734 { "rc", NL ("reinterpret_cast"), 2 },
1735 { "rm", NL ("%"), 2 },
1736 { "rs", NL (">>"), 2 },
1737 { "sc", NL ("static_cast"), 2 },
1738 { "st", NL ("sizeof "), 1 },
1739 { "sz", NL ("sizeof "), 1 },
1740 { "tr", NL ("throw"), 0 },
1741 { "tw", NL ("throw "), 1 },
1742 { NULL, NULL, 0, 0 }
1745 static struct demangle_component *
1746 d_operator_name (struct d_info *di)
1751 c1 = d_next_char (di);
1752 c2 = d_next_char (di);
1753 if (c1 == 'v' && IS_DIGIT (c2))
1754 return d_make_extended_operator (di, c2 - '0', d_source_name (di));
1755 else if (c1 == 'c' && c2 == 'v')
1757 struct demangle_component *type;
1758 int was_conversion = di->is_conversion;
1760 di->is_conversion = ! di->is_expression;
1761 type = cplus_demangle_type (di);
1762 di->is_conversion = was_conversion;
1763 return d_make_comp (di, DEMANGLE_COMPONENT_CAST, type, NULL);
1767 /* LOW is the inclusive lower bound. */
1769 /* HIGH is the exclusive upper bound. We subtract one to ignore
1770 the sentinel at the end of the array. */
1771 int high = ((sizeof (cplus_demangle_operators)
1772 / sizeof (cplus_demangle_operators[0]))
1778 const struct demangle_operator_info *p;
1780 i = low + (high - low) / 2;
1781 p = cplus_demangle_operators + i;
1783 if (c1 == p->code[0] && c2 == p->code[1])
1784 return d_make_operator (di, p);
1786 if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1]))
1796 static struct demangle_component *
1797 d_make_character (struct d_info *di, int c)
1799 struct demangle_component *p;
1800 p = d_make_empty (di);
1803 p->type = DEMANGLE_COMPONENT_CHARACTER;
1804 p->u.s_character.character = c;
1809 static struct demangle_component *
1810 d_java_resource (struct d_info *di)
1812 struct demangle_component *p = NULL;
1813 struct demangle_component *next = NULL;
1818 len = d_number (di);
1822 /* Eat the leading '_'. */
1823 if (d_next_char (di) != '_')
1836 /* Each chunk is either a '$' escape... */
1854 next = d_make_character (di, c);
1862 /* ... or a sequence of characters. */
1865 while (i < len && str[i] && str[i] != '$')
1868 next = d_make_name (di, str, i);
1881 p = d_make_comp (di, DEMANGLE_COMPONENT_COMPOUND_NAME, p, next);
1887 p = d_make_comp (di, DEMANGLE_COMPONENT_JAVA_RESOURCE, p, NULL);
1892 /* <special-name> ::= TV <type>
1896 ::= GV <(object) name>
1897 ::= T <call-offset> <(base) encoding>
1898 ::= Tc <call-offset> <call-offset> <(base) encoding>
1899 Also g++ extensions:
1900 ::= TC <type> <(offset) number> _ <(base) type>
1905 ::= Gr <resource name>
1910 static struct demangle_component *
1911 d_special_name (struct d_info *di)
1913 di->expansion += 20;
1914 if (d_check_char (di, 'T'))
1916 switch (d_next_char (di))
1920 return d_make_comp (di, DEMANGLE_COMPONENT_VTABLE,
1921 cplus_demangle_type (di), NULL);
1923 di->expansion -= 10;
1924 return d_make_comp (di, DEMANGLE_COMPONENT_VTT,
1925 cplus_demangle_type (di), NULL);
1927 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO,
1928 cplus_demangle_type (di), NULL);
1930 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_NAME,
1931 cplus_demangle_type (di), NULL);
1934 if (! d_call_offset (di, 'h'))
1936 return d_make_comp (di, DEMANGLE_COMPONENT_THUNK,
1937 d_encoding (di, 0), NULL);
1940 if (! d_call_offset (di, 'v'))
1942 return d_make_comp (di, DEMANGLE_COMPONENT_VIRTUAL_THUNK,
1943 d_encoding (di, 0), NULL);
1946 if (! d_call_offset (di, '\0'))
1948 if (! d_call_offset (di, '\0'))
1950 return d_make_comp (di, DEMANGLE_COMPONENT_COVARIANT_THUNK,
1951 d_encoding (di, 0), NULL);
1955 struct demangle_component *derived_type;
1957 struct demangle_component *base_type;
1959 derived_type = cplus_demangle_type (di);
1960 offset = d_number (di);
1963 if (! d_check_char (di, '_'))
1965 base_type = cplus_demangle_type (di);
1966 /* We don't display the offset. FIXME: We should display
1967 it in verbose mode. */
1969 return d_make_comp (di, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE,
1970 base_type, derived_type);
1974 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_FN,
1975 cplus_demangle_type (di), NULL);
1977 return d_make_comp (di, DEMANGLE_COMPONENT_JAVA_CLASS,
1978 cplus_demangle_type (di), NULL);
1981 return d_make_comp (di, DEMANGLE_COMPONENT_TLS_INIT,
1985 return d_make_comp (di, DEMANGLE_COMPONENT_TLS_WRAPPER,
1992 else if (d_check_char (di, 'G'))
1994 switch (d_next_char (di))
1997 return d_make_comp (di, DEMANGLE_COMPONENT_GUARD, d_name (di), NULL);
2001 struct demangle_component *name = d_name (di);
2002 return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, name,
2003 d_number_component (di));
2007 return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS,
2008 d_encoding (di, 0), NULL);
2011 switch (d_next_char (di))
2014 return d_make_comp (di, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE,
2015 d_encoding (di, 0), NULL);
2017 /* ??? The proposal is that other letters (such as 'h') stand
2018 for different variants of transaction cloning, such as
2019 compiling directly for hardware transaction support. But
2020 they still should all be transactional clones of some sort
2021 so go ahead and call them that. */
2023 return d_make_comp (di, DEMANGLE_COMPONENT_TRANSACTION_CLONE,
2024 d_encoding (di, 0), NULL);
2028 return d_java_resource (di);
2038 /* <call-offset> ::= h <nv-offset> _
2041 <nv-offset> ::= <(offset) number>
2043 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
2045 The C parameter, if not '\0', is a character we just read which is
2046 the start of the <call-offset>.
2048 We don't display the offset information anywhere. FIXME: We should
2049 display it in verbose mode. */
2052 d_call_offset (struct d_info *di, int c)
2055 c = d_next_char (di);
2062 if (! d_check_char (di, '_'))
2069 if (! d_check_char (di, '_'))
2075 /* <ctor-dtor-name> ::= C1
2083 static struct demangle_component *
2084 d_ctor_dtor_name (struct d_info *di)
2086 if (di->last_name != NULL)
2088 if (di->last_name->type == DEMANGLE_COMPONENT_NAME)
2089 di->expansion += di->last_name->u.s_name.len;
2090 else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD)
2091 di->expansion += di->last_name->u.s_string.len;
2093 switch (d_peek_char (di))
2097 enum gnu_v3_ctor_kinds kind;
2099 switch (d_peek_next_char (di))
2102 kind = gnu_v3_complete_object_ctor;
2105 kind = gnu_v3_base_object_ctor;
2108 kind = gnu_v3_complete_object_allocating_ctor;
2111 kind = gnu_v3_object_ctor_group;
2117 return d_make_ctor (di, kind, di->last_name);
2122 enum gnu_v3_dtor_kinds kind;
2124 switch (d_peek_next_char (di))
2127 kind = gnu_v3_deleting_dtor;
2130 kind = gnu_v3_complete_object_dtor;
2133 kind = gnu_v3_base_object_dtor;
2136 kind = gnu_v3_object_dtor_group;
2142 return d_make_dtor (di, kind, di->last_name);
2150 /* <type> ::= <builtin-type>
2152 ::= <class-enum-type>
2154 ::= <pointer-to-member-type>
2155 ::= <template-param>
2156 ::= <template-template-param> <template-args>
2158 ::= <CV-qualifiers> <type>
2161 ::= O <type> (C++0x)
2164 ::= U <source-name> <type>
2166 <builtin-type> ::= various one letter codes
2170 CP_STATIC_IF_GLIBCPP_V3
2171 const struct demangle_builtin_type_info
2172 cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] =
2174 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT },
2175 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL },
2176 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT },
2177 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT },
2178 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT },
2179 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT },
2180 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT },
2181 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT },
2182 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT },
2183 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED },
2184 /* k */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2185 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG },
2186 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG },
2187 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT },
2188 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2190 /* p */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2191 /* q */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2192 /* r */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2193 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT },
2194 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
2195 /* u */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2196 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID },
2197 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT },
2198 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG },
2199 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2200 D_PRINT_UNSIGNED_LONG_LONG },
2201 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT },
2202 /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT },
2203 /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT },
2204 /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT },
2205 /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT },
2206 /* 30 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT },
2207 /* 31 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT },
2208 /* 32 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"),
2212 CP_STATIC_IF_GLIBCPP_V3
2213 struct demangle_component *
2214 cplus_demangle_type (struct d_info *di)
2217 struct demangle_component *ret;
2220 /* The ABI specifies that when CV-qualifiers are used, the base type
2221 is substitutable, and the fully qualified type is substitutable,
2222 but the base type with a strict subset of the CV-qualifiers is
2223 not substitutable. The natural recursive implementation of the
2224 CV-qualifiers would cause subsets to be substitutable, so instead
2225 we pull them all off now.
2227 FIXME: The ABI says that order-insensitive vendor qualifiers
2228 should be handled in the same way, but we have no way to tell
2229 which vendor qualifiers are order-insensitive and which are
2230 order-sensitive. So we just assume that they are all
2231 order-sensitive. g++ 3.4 supports only one vendor qualifier,
2232 __vector, and it treats it as order-sensitive when mangling
2235 peek = d_peek_char (di);
2236 if (peek == 'r' || peek == 'V' || peek == 'K')
2238 struct demangle_component **pret;
2240 pret = d_cv_qualifiers (di, &ret, 0);
2243 if (d_peek_char (di) == 'F')
2245 /* cv-qualifiers before a function type apply to 'this',
2246 so avoid adding the unqualified function type to
2247 the substitution list. */
2248 *pret = d_function_type (di);
2251 *pret = cplus_demangle_type (di);
2254 if ((*pret)->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
2255 || (*pret)->type == DEMANGLE_COMPONENT_REFERENCE_THIS)
2257 /* Move the ref-qualifier outside the cv-qualifiers so that
2258 they are printed in the right order. */
2259 struct demangle_component *fn = d_left (*pret);
2260 d_left (*pret) = ret;
2264 if (! d_add_substitution (di, ret))
2273 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2274 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
2275 case 'o': case 's': case 't':
2276 case 'v': case 'w': case 'x': case 'y': case 'z':
2277 ret = d_make_builtin_type (di,
2278 &cplus_demangle_builtin_types[peek - 'a']);
2279 di->expansion += ret->u.s_builtin.type->len;
2286 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE,
2287 d_source_name (di), NULL);
2291 ret = d_function_type (di);
2294 case '0': case '1': case '2': case '3': case '4':
2295 case '5': case '6': case '7': case '8': case '9':
2298 ret = d_class_enum_type (di);
2302 ret = d_array_type (di);
2306 ret = d_pointer_to_member_type (di);
2310 ret = d_template_param (di);
2311 if (d_peek_char (di) == 'I')
2313 /* This may be <template-template-param> <template-args>.
2314 If this is the type for a conversion operator, we can
2315 have a <template-template-param> here only by following
2316 a derivation like this:
2319 -> <template-prefix> <template-args>
2320 -> <prefix> <template-unqualified-name> <template-args>
2321 -> <unqualified-name> <template-unqualified-name> <template-args>
2322 -> <source-name> <template-unqualified-name> <template-args>
2323 -> <source-name> <operator-name> <template-args>
2324 -> <source-name> cv <type> <template-args>
2325 -> <source-name> cv <template-template-param> <template-args> <template-args>
2327 where the <template-args> is followed by another.
2328 Otherwise, we must have a derivation like this:
2331 -> <template-prefix> <template-args>
2332 -> <prefix> <template-unqualified-name> <template-args>
2333 -> <unqualified-name> <template-unqualified-name> <template-args>
2334 -> <source-name> <template-unqualified-name> <template-args>
2335 -> <source-name> <operator-name> <template-args>
2336 -> <source-name> cv <type> <template-args>
2337 -> <source-name> cv <template-param> <template-args>
2339 where we need to leave the <template-args> to be processed
2340 by d_prefix (following the <template-prefix>).
2342 The <template-template-param> part is a substitution
2344 if (! di->is_conversion)
2346 if (! d_add_substitution (di, ret))
2348 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2349 d_template_args (di));
2353 struct demangle_component *args;
2354 struct d_info_checkpoint checkpoint;
2356 d_checkpoint (di, &checkpoint);
2357 args = d_template_args (di);
2358 if (d_peek_char (di) == 'I')
2360 if (! d_add_substitution (di, ret))
2362 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2366 d_backtrack (di, &checkpoint);
2372 /* If this is a special substitution, then it is the start of
2373 <class-enum-type>. */
2377 peek_next = d_peek_next_char (di);
2378 if (IS_DIGIT (peek_next)
2380 || IS_UPPER (peek_next))
2382 ret = d_substitution (di, 0);
2383 /* The substituted name may have been a template name and
2384 may be followed by tepmlate args. */
2385 if (d_peek_char (di) == 'I')
2386 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2387 d_template_args (di));
2393 ret = d_class_enum_type (di);
2394 /* If the substitution was a complete type, then it is not
2395 a new substitution candidate. However, if the
2396 substitution was followed by template arguments, then
2397 the whole thing is a substitution candidate. */
2398 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD)
2406 ret = d_make_comp (di, DEMANGLE_COMPONENT_RVALUE_REFERENCE,
2407 cplus_demangle_type (di), NULL);
2412 ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER,
2413 cplus_demangle_type (di), NULL);
2418 ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE,
2419 cplus_demangle_type (di), NULL);
2424 ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX,
2425 cplus_demangle_type (di), NULL);
2430 ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY,
2431 cplus_demangle_type (di), NULL);
2436 ret = d_source_name (di);
2437 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL,
2438 cplus_demangle_type (di), ret);
2444 peek = d_next_char (di);
2449 /* decltype (expression) */
2450 ret = d_make_comp (di, DEMANGLE_COMPONENT_DECLTYPE,
2451 d_expression (di), NULL);
2452 if (ret && d_next_char (di) != 'E')
2458 /* Pack expansion. */
2459 ret = d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
2460 cplus_demangle_type (di), NULL);
2466 ret = d_make_name (di, "auto", 4);
2470 /* 32-bit decimal floating point */
2471 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[26]);
2472 di->expansion += ret->u.s_builtin.type->len;
2476 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[27]);
2477 di->expansion += ret->u.s_builtin.type->len;
2481 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[28]);
2482 di->expansion += ret->u.s_builtin.type->len;
2485 /* 16-bit half-precision FP */
2486 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[29]);
2487 di->expansion += ret->u.s_builtin.type->len;
2491 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[30]);
2492 di->expansion += ret->u.s_builtin.type->len;
2496 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[31]);
2497 di->expansion += ret->u.s_builtin.type->len;
2501 /* Fixed point types. DF<int bits><length><fract bits><sat> */
2502 ret = d_make_empty (di);
2503 ret->type = DEMANGLE_COMPONENT_FIXED_TYPE;
2504 if ((ret->u.s_fixed.accum = IS_DIGIT (d_peek_char (di))))
2505 /* For demangling we don't care about the bits. */
2507 ret->u.s_fixed.length = cplus_demangle_type (di);
2508 if (ret->u.s_fixed.length == NULL)
2511 peek = d_next_char (di);
2512 ret->u.s_fixed.sat = (peek == 's');
2516 ret = d_vector_type (di);
2521 /* decltype(nullptr) */
2522 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[32]);
2523 di->expansion += ret->u.s_builtin.type->len;
2537 if (! d_add_substitution (di, ret))
2544 /* <CV-qualifiers> ::= [r] [V] [K] */
2546 static struct demangle_component **
2547 d_cv_qualifiers (struct d_info *di,
2548 struct demangle_component **pret, int member_fn)
2550 struct demangle_component **pstart;
2554 peek = d_peek_char (di);
2555 while (peek == 'r' || peek == 'V' || peek == 'K')
2557 enum demangle_component_type t;
2563 ? DEMANGLE_COMPONENT_RESTRICT_THIS
2564 : DEMANGLE_COMPONENT_RESTRICT);
2565 di->expansion += sizeof "restrict";
2567 else if (peek == 'V')
2570 ? DEMANGLE_COMPONENT_VOLATILE_THIS
2571 : DEMANGLE_COMPONENT_VOLATILE);
2572 di->expansion += sizeof "volatile";
2577 ? DEMANGLE_COMPONENT_CONST_THIS
2578 : DEMANGLE_COMPONENT_CONST);
2579 di->expansion += sizeof "const";
2582 *pret = d_make_comp (di, t, NULL, NULL);
2585 pret = &d_left (*pret);
2587 peek = d_peek_char (di);
2590 if (!member_fn && peek == 'F')
2592 while (pstart != pret)
2594 switch ((*pstart)->type)
2596 case DEMANGLE_COMPONENT_RESTRICT:
2597 (*pstart)->type = DEMANGLE_COMPONENT_RESTRICT_THIS;
2599 case DEMANGLE_COMPONENT_VOLATILE:
2600 (*pstart)->type = DEMANGLE_COMPONENT_VOLATILE_THIS;
2602 case DEMANGLE_COMPONENT_CONST:
2603 (*pstart)->type = DEMANGLE_COMPONENT_CONST_THIS;
2608 pstart = &d_left (*pstart);
2615 /* <ref-qualifier> ::= R
2618 static struct demangle_component *
2619 d_ref_qualifier (struct d_info *di, struct demangle_component *sub)
2621 struct demangle_component *ret = sub;
2624 peek = d_peek_char (di);
2625 if (peek == 'R' || peek == 'O')
2627 enum demangle_component_type t;
2630 t = DEMANGLE_COMPONENT_REFERENCE_THIS;
2631 di->expansion += sizeof "&";
2635 t = DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS;
2636 di->expansion += sizeof "&&";
2640 ret = d_make_comp (di, t, ret, NULL);
2646 /* <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] E */
2648 static struct demangle_component *
2649 d_function_type (struct d_info *di)
2651 struct demangle_component *ret;
2653 if (! d_check_char (di, 'F'))
2655 if (d_peek_char (di) == 'Y')
2657 /* Function has C linkage. We don't print this information.
2658 FIXME: We should print it in verbose mode. */
2661 ret = d_bare_function_type (di, 1);
2662 ret = d_ref_qualifier (di, ret);
2664 if (! d_check_char (di, 'E'))
2671 static struct demangle_component *
2672 d_parmlist (struct d_info *di)
2674 struct demangle_component *tl;
2675 struct demangle_component **ptl;
2681 struct demangle_component *type;
2683 char peek = d_peek_char (di);
2684 if (peek == '\0' || peek == 'E' || peek == '.')
2686 if ((peek == 'R' || peek == 'O')
2687 && d_peek_next_char (di) == 'E')
2688 /* Function ref-qualifier, not a ref prefix for a parameter type. */
2690 type = cplus_demangle_type (di);
2693 *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL);
2696 ptl = &d_right (*ptl);
2699 /* There should be at least one parameter type besides the optional
2700 return type. A function which takes no arguments will have a
2701 single parameter type void. */
2705 /* If we have a single parameter type void, omit it. */
2706 if (d_right (tl) == NULL
2707 && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
2708 && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
2710 di->expansion -= d_left (tl)->u.s_builtin.type->len;
2717 /* <bare-function-type> ::= [J]<type>+ */
2719 static struct demangle_component *
2720 d_bare_function_type (struct d_info *di, int has_return_type)
2722 struct demangle_component *return_type;
2723 struct demangle_component *tl;
2726 /* Detect special qualifier indicating that the first argument
2727 is the return type. */
2728 peek = d_peek_char (di);
2732 has_return_type = 1;
2735 if (has_return_type)
2737 return_type = cplus_demangle_type (di);
2738 if (return_type == NULL)
2744 tl = d_parmlist (di);
2748 return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE,
2752 /* <class-enum-type> ::= <name> */
2754 static struct demangle_component *
2755 d_class_enum_type (struct d_info *di)
2760 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2761 ::= A [<(dimension) expression>] _ <(element) type>
2764 static struct demangle_component *
2765 d_array_type (struct d_info *di)
2768 struct demangle_component *dim;
2770 if (! d_check_char (di, 'A'))
2773 peek = d_peek_char (di);
2776 else if (IS_DIGIT (peek))
2784 peek = d_peek_char (di);
2786 while (IS_DIGIT (peek));
2787 dim = d_make_name (di, s, d_str (di) - s);
2793 dim = d_expression (di);
2798 if (! d_check_char (di, '_'))
2801 return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim,
2802 cplus_demangle_type (di));
2805 /* <vector-type> ::= Dv <number> _ <type>
2806 ::= Dv _ <expression> _ <type> */
2808 static struct demangle_component *
2809 d_vector_type (struct d_info *di)
2812 struct demangle_component *dim;
2814 peek = d_peek_char (di);
2818 dim = d_expression (di);
2821 dim = d_number_component (di);
2826 if (! d_check_char (di, '_'))
2829 return d_make_comp (di, DEMANGLE_COMPONENT_VECTOR_TYPE, dim,
2830 cplus_demangle_type (di));
2833 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
2835 static struct demangle_component *
2836 d_pointer_to_member_type (struct d_info *di)
2838 struct demangle_component *cl;
2839 struct demangle_component *mem;
2841 if (! d_check_char (di, 'M'))
2844 cl = cplus_demangle_type (di);
2848 /* The ABI says, "The type of a non-static member function is considered
2849 to be different, for the purposes of substitution, from the type of a
2850 namespace-scope or static member function whose type appears
2851 similar. The types of two non-static member functions are considered
2852 to be different, for the purposes of substitution, if the functions
2853 are members of different classes. In other words, for the purposes of
2854 substitution, the class of which the function is a member is
2855 considered part of the type of function."
2857 For a pointer to member function, this call to cplus_demangle_type
2858 will end up adding a (possibly qualified) non-member function type to
2859 the substitution table, which is not correct; however, the member
2860 function type will never be used in a substitution, so putting the
2861 wrong type in the substitution table is harmless. */
2863 mem = cplus_demangle_type (di);
2867 return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem);
2870 /* <non-negative number> _ */
2873 d_compact_number (struct d_info *di)
2876 if (d_peek_char (di) == '_')
2878 else if (d_peek_char (di) == 'n')
2881 num = d_number (di) + 1;
2883 if (! d_check_char (di, '_'))
2888 /* <template-param> ::= T_
2889 ::= T <(parameter-2 non-negative) number> _
2892 static struct demangle_component *
2893 d_template_param (struct d_info *di)
2897 if (! d_check_char (di, 'T'))
2900 param = d_compact_number (di);
2906 return d_make_template_param (di, param);
2909 /* <template-args> ::= I <template-arg>+ E */
2911 static struct demangle_component *
2912 d_template_args (struct d_info *di)
2914 struct demangle_component *hold_last_name;
2915 struct demangle_component *al;
2916 struct demangle_component **pal;
2918 /* Preserve the last name we saw--don't let the template arguments
2919 clobber it, as that would give us the wrong name for a subsequent
2920 constructor or destructor. */
2921 hold_last_name = di->last_name;
2923 if (d_peek_char (di) != 'I'
2924 && d_peek_char (di) != 'J')
2928 if (d_peek_char (di) == 'E')
2930 /* An argument pack can be empty. */
2932 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, NULL, NULL);
2939 struct demangle_component *a;
2941 a = d_template_arg (di);
2945 *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL);
2948 pal = &d_right (*pal);
2950 if (d_peek_char (di) == 'E')
2957 di->last_name = hold_last_name;
2962 /* <template-arg> ::= <type>
2963 ::= X <expression> E
2967 static struct demangle_component *
2968 d_template_arg (struct d_info *di)
2970 struct demangle_component *ret;
2972 switch (d_peek_char (di))
2976 ret = d_expression (di);
2977 if (! d_check_char (di, 'E'))
2982 return d_expr_primary (di);
2986 /* An argument pack. */
2987 return d_template_args (di);
2990 return cplus_demangle_type (di);
2994 /* Parse a sequence of expressions until we hit the terminator
2997 static struct demangle_component *
2998 d_exprlist (struct d_info *di, char terminator)
3000 struct demangle_component *list = NULL;
3001 struct demangle_component **p = &list;
3003 if (d_peek_char (di) == terminator)
3006 return d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, NULL, NULL);
3011 struct demangle_component *arg = d_expression (di);
3015 *p = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, arg, NULL);
3020 if (d_peek_char (di) == terminator)
3030 /* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
3031 dynamic_cast, static_cast or reinterpret_cast. */
3034 op_is_new_cast (struct demangle_component *op)
3036 const char *code = op->u.s_operator.op->code;
3037 return (code[1] == 'c'
3038 && (code[0] == 's' || code[0] == 'd'
3039 || code[0] == 'c' || code[0] == 'r'));
3042 /* <expression> ::= <(unary) operator-name> <expression>
3043 ::= <(binary) operator-name> <expression> <expression>
3044 ::= <(trinary) operator-name> <expression> <expression> <expression>
3045 ::= cl <expression>+ E
3047 ::= <template-param>
3048 ::= sr <type> <unqualified-name>
3049 ::= sr <type> <unqualified-name> <template-args>
3053 static inline struct demangle_component *
3054 d_expression_1 (struct d_info *di)
3058 peek = d_peek_char (di);
3060 return d_expr_primary (di);
3061 else if (peek == 'T')
3062 return d_template_param (di);
3063 else if (peek == 's' && d_peek_next_char (di) == 'r')
3065 struct demangle_component *type;
3066 struct demangle_component *name;
3069 type = cplus_demangle_type (di);
3070 name = d_unqualified_name (di);
3071 if (d_peek_char (di) != 'I')
3072 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name);
3074 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type,
3075 d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3076 d_template_args (di)));
3078 else if (peek == 's' && d_peek_next_char (di) == 'p')
3081 return d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
3082 d_expression_1 (di), NULL);
3084 else if (peek == 'f' && d_peek_next_char (di) == 'p')
3086 /* Function parameter used in a late-specified return type. */
3089 if (d_peek_char (di) == 'T')
3091 /* 'this' parameter. */
3097 index = d_compact_number (di) + 1;
3101 return d_make_function_param (di, index);
3103 else if (IS_DIGIT (peek)
3104 || (peek == 'o' && d_peek_next_char (di) == 'n'))
3106 /* We can get an unqualified name as an expression in the case of
3107 a dependent function call, i.e. decltype(f(t)). */
3108 struct demangle_component *name;
3111 /* operator-function-id, i.e. operator+(t). */
3114 name = d_unqualified_name (di);
3117 if (d_peek_char (di) == 'I')
3118 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3119 d_template_args (di));
3123 else if ((peek == 'i' || peek == 't')
3124 && d_peek_next_char (di) == 'l')
3126 /* Brace-enclosed initializer list, untyped or typed. */
3127 struct demangle_component *type = NULL;
3129 type = cplus_demangle_type (di);
3131 return d_make_comp (di, DEMANGLE_COMPONENT_INITIALIZER_LIST,
3132 type, d_exprlist (di, 'E'));
3136 struct demangle_component *op;
3137 const char *code = NULL;
3140 op = d_operator_name (di);
3144 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
3146 code = op->u.s_operator.op->code;
3147 di->expansion += op->u.s_operator.op->len - 2;
3148 if (strcmp (code, "st") == 0)
3149 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3150 cplus_demangle_type (di));
3157 case DEMANGLE_COMPONENT_OPERATOR:
3158 args = op->u.s_operator.op->args;
3160 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
3161 args = op->u.s_extended_operator.args;
3163 case DEMANGLE_COMPONENT_CAST:
3171 return d_make_comp (di, DEMANGLE_COMPONENT_NULLARY, op, NULL);
3175 struct demangle_component *operand;
3178 if (code && (code[0] == 'p' || code[0] == 'm')
3179 && code[1] == code[0])
3180 /* pp_ and mm_ are the prefix variants. */
3181 suffix = !d_check_char (di, '_');
3183 if (op->type == DEMANGLE_COMPONENT_CAST
3184 && d_check_char (di, '_'))
3185 operand = d_exprlist (di, 'E');
3187 operand = d_expression_1 (di);
3190 /* Indicate the suffix variant for d_print_comp. */
3191 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3193 DEMANGLE_COMPONENT_BINARY_ARGS,
3196 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3201 struct demangle_component *left;
3202 struct demangle_component *right;
3204 if (op_is_new_cast (op))
3205 left = cplus_demangle_type (di);
3207 left = d_expression_1 (di);
3208 if (!strcmp (code, "cl"))
3209 right = d_exprlist (di, 'E');
3210 else if (!strcmp (code, "dt") || !strcmp (code, "pt"))
3212 right = d_unqualified_name (di);
3213 if (d_peek_char (di) == 'I')
3214 right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE,
3215 right, d_template_args (di));
3218 right = d_expression_1 (di);
3220 return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
3222 DEMANGLE_COMPONENT_BINARY_ARGS,
3227 struct demangle_component *first;
3228 struct demangle_component *second;
3229 struct demangle_component *third;
3231 if (!strcmp (code, "qu"))
3233 /* ?: expression. */
3234 first = d_expression_1 (di);
3235 second = d_expression_1 (di);
3236 third = d_expression_1 (di);
3238 else if (code[0] == 'n')
3240 /* new-expression. */
3241 if (code[1] != 'w' && code[1] != 'a')
3243 first = d_exprlist (di, '_');
3244 second = cplus_demangle_type (di);
3245 if (d_peek_char (di) == 'E')
3250 else if (d_peek_char (di) == 'p'
3251 && d_peek_next_char (di) == 'i')
3253 /* Parenthesized initializer. */
3255 third = d_exprlist (di, 'E');
3257 else if (d_peek_char (di) == 'i'
3258 && d_peek_next_char (di) == 'l')
3259 /* initializer-list. */
3260 third = d_expression_1 (di);
3266 return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op,
3268 DEMANGLE_COMPONENT_TRINARY_ARG1,
3271 DEMANGLE_COMPONENT_TRINARY_ARG2,
3280 static struct demangle_component *
3281 d_expression (struct d_info *di)
3283 struct demangle_component *ret;
3284 int was_expression = di->is_expression;
3286 di->is_expression = 1;
3287 ret = d_expression_1 (di);
3288 di->is_expression = was_expression;
3292 /* <expr-primary> ::= L <type> <(value) number> E
3293 ::= L <type> <(value) float> E
3294 ::= L <mangled-name> E
3297 static struct demangle_component *
3298 d_expr_primary (struct d_info *di)
3300 struct demangle_component *ret;
3302 if (! d_check_char (di, 'L'))
3304 if (d_peek_char (di) == '_'
3305 /* Workaround for G++ bug; see comment in write_template_arg. */
3306 || d_peek_char (di) == 'Z')
3307 ret = cplus_demangle_mangled_name (di, 0);
3310 struct demangle_component *type;
3311 enum demangle_component_type t;
3314 type = cplus_demangle_type (di);
3318 /* If we have a type we know how to print, we aren't going to
3319 print the type name itself. */
3320 if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
3321 && type->u.s_builtin.type->print != D_PRINT_DEFAULT)
3322 di->expansion -= type->u.s_builtin.type->len;
3324 /* Rather than try to interpret the literal value, we just
3325 collect it as a string. Note that it's possible to have a
3326 floating point literal here. The ABI specifies that the
3327 format of such literals is machine independent. That's fine,
3328 but what's not fine is that versions of g++ up to 3.2 with
3329 -fabi-version=1 used upper case letters in the hex constant,
3330 and dumped out gcc's internal representation. That makes it
3331 hard to tell where the constant ends, and hard to dump the
3332 constant in any readable form anyhow. We don't attempt to
3333 handle these cases. */
3335 t = DEMANGLE_COMPONENT_LITERAL;
3336 if (d_peek_char (di) == 'n')
3338 t = DEMANGLE_COMPONENT_LITERAL_NEG;
3342 while (d_peek_char (di) != 'E')
3344 if (d_peek_char (di) == '\0')
3348 ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s));
3350 if (! d_check_char (di, 'E'))
3355 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3356 ::= Z <(function) encoding> E s [<discriminator>]
3357 ::= Z <(function) encoding> E d [<parameter> number>] _ <entity name>
3360 static struct demangle_component *
3361 d_local_name (struct d_info *di)
3363 struct demangle_component *function;
3365 if (! d_check_char (di, 'Z'))
3368 function = d_encoding (di, 0);
3370 if (! d_check_char (di, 'E'))
3373 if (d_peek_char (di) == 's')
3376 if (! d_discriminator (di))
3378 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function,
3379 d_make_name (di, "string literal",
3380 sizeof "string literal" - 1));
3384 struct demangle_component *name;
3387 if (d_peek_char (di) == 'd')
3389 /* Default argument scope: d <number> _. */
3391 num = d_compact_number (di);
3400 /* Lambdas and unnamed types have internal discriminators. */
3401 case DEMANGLE_COMPONENT_LAMBDA:
3402 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
3405 if (! d_discriminator (di))
3409 name = d_make_default_arg (di, num, name);
3410 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
3414 /* <discriminator> ::= _ <(non-negative) number>
3416 We demangle the discriminator, but we don't print it out. FIXME:
3417 We should print it out in verbose mode. */
3420 d_discriminator (struct d_info *di)
3424 if (d_peek_char (di) != '_')
3427 discrim = d_number (di);
3433 /* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */
3435 static struct demangle_component *
3436 d_lambda (struct d_info *di)
3438 struct demangle_component *tl;
3439 struct demangle_component *ret;
3442 if (! d_check_char (di, 'U'))
3444 if (! d_check_char (di, 'l'))
3447 tl = d_parmlist (di);
3451 if (! d_check_char (di, 'E'))
3454 num = d_compact_number (di);
3458 ret = d_make_empty (di);
3461 ret->type = DEMANGLE_COMPONENT_LAMBDA;
3462 ret->u.s_unary_num.sub = tl;
3463 ret->u.s_unary_num.num = num;
3466 if (! d_add_substitution (di, ret))
3472 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
3474 static struct demangle_component *
3475 d_unnamed_type (struct d_info *di)
3477 struct demangle_component *ret;
3480 if (! d_check_char (di, 'U'))
3482 if (! d_check_char (di, 't'))
3485 num = d_compact_number (di);
3489 ret = d_make_empty (di);
3492 ret->type = DEMANGLE_COMPONENT_UNNAMED_TYPE;
3493 ret->u.s_number.number = num;
3496 if (! d_add_substitution (di, ret))
3502 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
3505 static struct demangle_component *
3506 d_clone_suffix (struct d_info *di, struct demangle_component *encoding)
3508 const char *suffix = d_str (di);
3509 const char *pend = suffix;
3510 struct demangle_component *n;
3512 if (*pend == '.' && (IS_LOWER (pend[1]) || pend[1] == '_'))
3515 while (IS_LOWER (*pend) || *pend == '_')
3518 while (*pend == '.' && IS_DIGIT (pend[1]))
3521 while (IS_DIGIT (*pend))
3524 d_advance (di, pend - suffix);
3525 n = d_make_name (di, suffix, pend - suffix);
3526 return d_make_comp (di, DEMANGLE_COMPONENT_CLONE, encoding, n);
3529 /* Add a new substitution. */
3532 d_add_substitution (struct d_info *di, struct demangle_component *dc)
3536 if (di->next_sub >= di->num_subs)
3538 di->subs[di->next_sub] = dc;
3543 /* <substitution> ::= S <seq-id> _
3553 If PREFIX is non-zero, then this type is being used as a prefix in
3554 a qualified name. In this case, for the standard substitutions, we
3555 need to check whether we are being used as a prefix for a
3556 constructor or destructor, and return a full template name.
3557 Otherwise we will get something like std::iostream::~iostream()
3558 which does not correspond particularly well to any function which
3559 actually appears in the source.
3562 static const struct d_standard_sub_info standard_subs[] =
3567 { 'a', NL ("std::allocator"),
3568 NL ("std::allocator"),
3570 { 'b', NL ("std::basic_string"),
3571 NL ("std::basic_string"),
3572 NL ("basic_string") },
3573 { 's', NL ("std::string"),
3574 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
3575 NL ("basic_string") },
3576 { 'i', NL ("std::istream"),
3577 NL ("std::basic_istream<char, std::char_traits<char> >"),
3578 NL ("basic_istream") },
3579 { 'o', NL ("std::ostream"),
3580 NL ("std::basic_ostream<char, std::char_traits<char> >"),
3581 NL ("basic_ostream") },
3582 { 'd', NL ("std::iostream"),
3583 NL ("std::basic_iostream<char, std::char_traits<char> >"),
3584 NL ("basic_iostream") }
3587 static struct demangle_component *
3588 d_substitution (struct d_info *di, int prefix)
3592 if (! d_check_char (di, 'S'))
3595 c = d_next_char (di);
3596 if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
3605 unsigned int new_id;
3608 new_id = id * 36 + c - '0';
3609 else if (IS_UPPER (c))
3610 new_id = id * 36 + c - 'A' + 10;
3616 c = d_next_char (di);
3623 if (id >= (unsigned int) di->next_sub)
3628 return di->subs[id];
3633 const struct d_standard_sub_info *p;
3634 const struct d_standard_sub_info *pend;
3636 verbose = (di->options & DMGL_VERBOSE) != 0;
3637 if (! verbose && prefix)
3641 peek = d_peek_char (di);
3642 if (peek == 'C' || peek == 'D')
3646 pend = (&standard_subs[0]
3647 + sizeof standard_subs / sizeof standard_subs[0]);
3648 for (p = &standard_subs[0]; p < pend; ++p)
3655 if (p->set_last_name != NULL)
3656 di->last_name = d_make_sub (di, p->set_last_name,
3657 p->set_last_name_len);
3660 s = p->full_expansion;
3665 s = p->simple_expansion;
3666 len = p->simple_len;
3668 di->expansion += len;
3669 return d_make_sub (di, s, len);
3678 d_checkpoint (struct d_info *di, struct d_info_checkpoint *checkpoint)
3680 checkpoint->n = di->n;
3681 checkpoint->next_comp = di->next_comp;
3682 checkpoint->next_sub = di->next_sub;
3683 checkpoint->did_subs = di->did_subs;
3684 checkpoint->expansion = di->expansion;
3688 d_backtrack (struct d_info *di, struct d_info_checkpoint *checkpoint)
3690 di->n = checkpoint->n;
3691 di->next_comp = checkpoint->next_comp;
3692 di->next_sub = checkpoint->next_sub;
3693 di->did_subs = checkpoint->did_subs;
3694 di->expansion = checkpoint->expansion;
3697 /* Initialize a growable string. */
3700 d_growable_string_init (struct d_growable_string *dgs, size_t estimate)
3705 dgs->allocation_failure = 0;
3708 d_growable_string_resize (dgs, estimate);
3711 /* Grow a growable string to a given size. */
3714 d_growable_string_resize (struct d_growable_string *dgs, size_t need)
3719 if (dgs->allocation_failure)
3722 /* Start allocation at two bytes to avoid any possibility of confusion
3723 with the special value of 1 used as a return in *palc to indicate
3724 allocation failures. */
3725 newalc = dgs->alc > 0 ? dgs->alc : 2;
3726 while (newalc < need)
3729 newbuf = (char *) realloc (dgs->buf, newalc);
3736 dgs->allocation_failure = 1;
3743 /* Append a buffer to a growable string. */
3746 d_growable_string_append_buffer (struct d_growable_string *dgs,
3747 const char *s, size_t l)
3751 need = dgs->len + l + 1;
3752 if (need > dgs->alc)
3753 d_growable_string_resize (dgs, need);
3755 if (dgs->allocation_failure)
3758 memcpy (dgs->buf + dgs->len, s, l);
3759 dgs->buf[dgs->len + l] = '\0';
3763 /* Bridge growable strings to the callback mechanism. */
3766 d_growable_string_callback_adapter (const char *s, size_t l, void *opaque)
3768 struct d_growable_string *dgs = (struct d_growable_string*) opaque;
3770 d_growable_string_append_buffer (dgs, s, l);
3773 /* Initialize a print information structure. */
3776 d_print_init (struct d_print_info *dpi, demangle_callbackref callback,
3780 dpi->last_char = '\0';
3781 dpi->templates = NULL;
3782 dpi->modifiers = NULL;
3783 dpi->pack_index = 0;
3784 dpi->flush_count = 0;
3786 dpi->callback = callback;
3787 dpi->opaque = opaque;
3789 dpi->demangle_failure = 0;
3791 dpi->saved_scopes = NULL;
3792 dpi->num_saved_scopes = 0;
3793 dpi->current_template = NULL;
3796 /* Free a print information structure. */
3799 d_print_free (struct d_print_info *dpi)
3803 for (i = 0; i < dpi->num_saved_scopes; i++)
3805 struct d_print_template *ts, *tn;
3807 for (ts = dpi->saved_scopes[i].templates; ts != NULL; ts = tn)
3814 free (dpi->saved_scopes);
3817 /* Indicate that an error occurred during printing, and test for error. */
3820 d_print_error (struct d_print_info *dpi)
3822 dpi->demangle_failure = 1;
3826 d_print_saw_error (struct d_print_info *dpi)
3828 return dpi->demangle_failure != 0;
3831 /* Flush buffered characters to the callback. */
3834 d_print_flush (struct d_print_info *dpi)
3836 dpi->buf[dpi->len] = '\0';
3837 dpi->callback (dpi->buf, dpi->len, dpi->opaque);
3842 /* Append characters and buffers for printing. */
3845 d_append_char (struct d_print_info *dpi, char c)
3847 if (dpi->len == sizeof (dpi->buf) - 1)
3848 d_print_flush (dpi);
3850 dpi->buf[dpi->len++] = c;
3855 d_append_buffer (struct d_print_info *dpi, const char *s, size_t l)
3859 for (i = 0; i < l; i++)
3860 d_append_char (dpi, s[i]);
3864 d_append_string (struct d_print_info *dpi, const char *s)
3866 d_append_buffer (dpi, s, strlen (s));
3870 d_append_num (struct d_print_info *dpi, long l)
3873 sprintf (buf,"%ld", l);
3874 d_append_string (dpi, buf);
3878 d_last_char (struct d_print_info *dpi)
3880 return dpi->last_char;
3883 /* Turn components into a human readable string. OPTIONS is the
3884 options bits passed to the demangler. DC is the tree to print.
3885 CALLBACK is a function to call to flush demangled string segments
3886 as they fill the intermediate buffer, and OPAQUE is a generalized
3887 callback argument. On success, this returns 1. On failure,
3888 it returns 0, indicating a bad parse. It does not use heap
3889 memory to build an output string, so cannot encounter memory
3890 allocation failure. */
3892 CP_STATIC_IF_GLIBCPP_V3
3894 cplus_demangle_print_callback (int options,
3895 const struct demangle_component *dc,
3896 demangle_callbackref callback, void *opaque)
3898 struct d_print_info dpi;
3901 d_print_init (&dpi, callback, opaque);
3903 d_print_comp (&dpi, options, dc);
3905 d_print_flush (&dpi);
3907 success = ! d_print_saw_error (&dpi);
3908 d_print_free (&dpi);
3912 /* Turn components into a human readable string. OPTIONS is the
3913 options bits passed to the demangler. DC is the tree to print.
3914 ESTIMATE is a guess at the length of the result. This returns a
3915 string allocated by malloc, or NULL on error. On success, this
3916 sets *PALC to the size of the allocated buffer. On failure, this
3917 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
3920 CP_STATIC_IF_GLIBCPP_V3
3922 cplus_demangle_print (int options, const struct demangle_component *dc,
3923 int estimate, size_t *palc)
3925 struct d_growable_string dgs;
3927 d_growable_string_init (&dgs, estimate);
3929 if (! cplus_demangle_print_callback (options, dc,
3930 d_growable_string_callback_adapter,
3938 *palc = dgs.allocation_failure ? 1 : dgs.alc;
3942 /* Returns the I'th element of the template arglist ARGS, or NULL on
3945 static struct demangle_component *
3946 d_index_template_argument (struct demangle_component *args, int i)
3948 struct demangle_component *a;
3954 if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
3960 if (i != 0 || a == NULL)
3966 /* Returns the template argument from the current context indicated by DC,
3967 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
3969 static struct demangle_component *
3970 d_lookup_template_argument (struct d_print_info *dpi,
3971 const struct demangle_component *dc)
3973 if (dpi->templates == NULL)
3975 d_print_error (dpi);
3979 return d_index_template_argument
3980 (d_right (dpi->templates->template_decl),
3981 dc->u.s_number.number);
3984 /* Returns a template argument pack used in DC (any will do), or NULL. */
3986 static struct demangle_component *
3987 d_find_pack (struct d_print_info *dpi,
3988 const struct demangle_component *dc)
3990 struct demangle_component *a;
3996 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
3997 a = d_lookup_template_argument (dpi, dc);
3998 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4002 case DEMANGLE_COMPONENT_PACK_EXPANSION:
4005 case DEMANGLE_COMPONENT_LAMBDA:
4006 case DEMANGLE_COMPONENT_NAME:
4007 case DEMANGLE_COMPONENT_TAGGED_NAME:
4008 case DEMANGLE_COMPONENT_OPERATOR:
4009 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4010 case DEMANGLE_COMPONENT_SUB_STD:
4011 case DEMANGLE_COMPONENT_CHARACTER:
4012 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
4013 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
4016 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4017 return d_find_pack (dpi, dc->u.s_extended_operator.name);
4018 case DEMANGLE_COMPONENT_CTOR:
4019 return d_find_pack (dpi, dc->u.s_ctor.name);
4020 case DEMANGLE_COMPONENT_DTOR:
4021 return d_find_pack (dpi, dc->u.s_dtor.name);
4024 a = d_find_pack (dpi, d_left (dc));
4027 return d_find_pack (dpi, d_right (dc));
4031 /* Returns the length of the template argument pack DC. */
4034 d_pack_length (const struct demangle_component *dc)
4037 while (dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
4038 && d_left (dc) != NULL)
4046 /* DC is a component of a mangled expression. Print it, wrapped in parens
4050 d_print_subexpr (struct d_print_info *dpi, int options,
4051 const struct demangle_component *dc)
4054 if (dc->type == DEMANGLE_COMPONENT_NAME
4055 || dc->type == DEMANGLE_COMPONENT_QUAL_NAME
4056 || dc->type == DEMANGLE_COMPONENT_INITIALIZER_LIST
4057 || dc->type == DEMANGLE_COMPONENT_FUNCTION_PARAM)
4060 d_append_char (dpi, '(');
4061 d_print_comp (dpi, options, dc);
4063 d_append_char (dpi, ')');
4066 /* Return a shallow copy of the current list of templates.
4067 On error d_print_error is called and a partial list may
4068 be returned. Whatever is returned must be freed. */
4070 static struct d_print_template *
4071 d_copy_templates (struct d_print_info *dpi)
4073 struct d_print_template *src, *result, **link = &result;
4075 for (src = dpi->templates; src != NULL; src = src->next)
4077 struct d_print_template *dst =
4078 (struct d_print_template *) malloc (sizeof (struct d_print_template));
4082 d_print_error (dpi);
4086 dst->template_decl = src->template_decl;
4096 /* Subroutine to handle components. */
4099 d_print_comp (struct d_print_info *dpi, int options,
4100 const struct demangle_component *dc)
4102 /* Magic variable to let reference smashing skip over the next modifier
4103 without needing to modify *dc. */
4104 const struct demangle_component *mod_inner = NULL;
4106 /* Variable used to store the current templates while a previously
4107 captured scope is used. */
4108 struct d_print_template *saved_templates;
4110 /* Nonzero if templates have been stored in the above variable. */
4111 int need_template_restore = 0;
4115 d_print_error (dpi);
4118 if (d_print_saw_error (dpi))
4123 case DEMANGLE_COMPONENT_NAME:
4124 if ((options & DMGL_JAVA) == 0)
4125 d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len);
4127 d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
4130 case DEMANGLE_COMPONENT_TAGGED_NAME:
4131 d_print_comp (dpi, options, d_left (dc));
4132 d_append_string (dpi, "[abi:");
4133 d_print_comp (dpi, options, d_right (dc));
4134 d_append_char (dpi, ']');
4137 case DEMANGLE_COMPONENT_QUAL_NAME:
4138 case DEMANGLE_COMPONENT_LOCAL_NAME:
4139 d_print_comp (dpi, options, d_left (dc));
4140 if ((options & DMGL_JAVA) == 0)
4141 d_append_string (dpi, "::");
4143 d_append_char (dpi, '.');
4145 struct demangle_component *local_name = d_right (dc);
4146 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4148 d_append_string (dpi, "{default arg#");
4149 d_append_num (dpi, local_name->u.s_unary_num.num + 1);
4150 d_append_string (dpi, "}::");
4151 local_name = local_name->u.s_unary_num.sub;
4153 d_print_comp (dpi, options, local_name);
4157 case DEMANGLE_COMPONENT_TYPED_NAME:
4159 struct d_print_mod *hold_modifiers;
4160 struct demangle_component *typed_name;
4161 struct d_print_mod adpm[4];
4163 struct d_print_template dpt;
4165 /* Pass the name down to the type so that it can be printed in
4166 the right place for the type. We also have to pass down
4167 any CV-qualifiers, which apply to the this parameter. */
4168 hold_modifiers = dpi->modifiers;
4171 typed_name = d_left (dc);
4172 while (typed_name != NULL)
4174 if (i >= sizeof adpm / sizeof adpm[0])
4176 d_print_error (dpi);
4180 adpm[i].next = dpi->modifiers;
4181 dpi->modifiers = &adpm[i];
4182 adpm[i].mod = typed_name;
4183 adpm[i].printed = 0;
4184 adpm[i].templates = dpi->templates;
4187 if (typed_name->type != DEMANGLE_COMPONENT_RESTRICT_THIS
4188 && typed_name->type != DEMANGLE_COMPONENT_VOLATILE_THIS
4189 && typed_name->type != DEMANGLE_COMPONENT_CONST_THIS
4190 && typed_name->type != DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
4191 && typed_name->type != DEMANGLE_COMPONENT_REFERENCE_THIS)
4194 typed_name = d_left (typed_name);
4197 if (typed_name == NULL)
4199 d_print_error (dpi);
4203 /* If typed_name is a template, then it applies to the
4204 function type as well. */
4205 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
4207 dpt.next = dpi->templates;
4208 dpi->templates = &dpt;
4209 dpt.template_decl = typed_name;
4212 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
4213 there may be CV-qualifiers on its right argument which
4214 really apply here; this happens when parsing a class which
4215 is local to a function. */
4216 if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME)
4218 struct demangle_component *local_name;
4220 local_name = d_right (typed_name);
4221 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4222 local_name = local_name->u.s_unary_num.sub;
4223 while (local_name->type == DEMANGLE_COMPONENT_RESTRICT_THIS
4224 || local_name->type == DEMANGLE_COMPONENT_VOLATILE_THIS
4225 || local_name->type == DEMANGLE_COMPONENT_CONST_THIS
4226 || local_name->type == DEMANGLE_COMPONENT_REFERENCE_THIS
4227 || (local_name->type
4228 == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS))
4230 if (i >= sizeof adpm / sizeof adpm[0])
4232 d_print_error (dpi);
4236 adpm[i] = adpm[i - 1];
4237 adpm[i].next = &adpm[i - 1];
4238 dpi->modifiers = &adpm[i];
4240 adpm[i - 1].mod = local_name;
4241 adpm[i - 1].printed = 0;
4242 adpm[i - 1].templates = dpi->templates;
4245 local_name = d_left (local_name);
4249 d_print_comp (dpi, options, d_right (dc));
4251 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
4252 dpi->templates = dpt.next;
4254 /* If the modifiers didn't get printed by the type, print them
4259 if (! adpm[i].printed)
4261 d_append_char (dpi, ' ');
4262 d_print_mod (dpi, options, adpm[i].mod);
4266 dpi->modifiers = hold_modifiers;
4271 case DEMANGLE_COMPONENT_TEMPLATE:
4273 struct d_print_mod *hold_dpm;
4274 struct demangle_component *dcl;
4275 const struct demangle_component *hold_current;
4277 /* This template may need to be referenced by a cast operator
4278 contained in its subtree. */
4279 hold_current = dpi->current_template;
4280 dpi->current_template = dc;
4282 /* Don't push modifiers into a template definition. Doing so
4283 could give the wrong definition for a template argument.
4284 Instead, treat the template essentially as a name. */
4286 hold_dpm = dpi->modifiers;
4287 dpi->modifiers = NULL;
4291 if ((options & DMGL_JAVA) != 0
4292 && dcl->type == DEMANGLE_COMPONENT_NAME
4293 && dcl->u.s_name.len == 6
4294 && strncmp (dcl->u.s_name.s, "JArray", 6) == 0)
4296 /* Special-case Java arrays, so that JArray<TYPE> appears
4297 instead as TYPE[]. */
4299 d_print_comp (dpi, options, d_right (dc));
4300 d_append_string (dpi, "[]");
4304 d_print_comp (dpi, options, dcl);
4305 if (d_last_char (dpi) == '<')
4306 d_append_char (dpi, ' ');
4307 d_append_char (dpi, '<');
4308 d_print_comp (dpi, options, d_right (dc));
4309 /* Avoid generating two consecutive '>' characters, to avoid
4310 the C++ syntactic ambiguity. */
4311 if (d_last_char (dpi) == '>')
4312 d_append_char (dpi, ' ');
4313 d_append_char (dpi, '>');
4316 dpi->modifiers = hold_dpm;
4317 dpi->current_template = hold_current;
4322 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4324 struct d_print_template *hold_dpt;
4325 struct demangle_component *a = d_lookup_template_argument (dpi, dc);
4327 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4328 a = d_index_template_argument (a, dpi->pack_index);
4332 d_print_error (dpi);
4336 /* While processing this parameter, we need to pop the list of
4337 templates. This is because the template parameter may
4338 itself be a reference to a parameter of an outer
4341 hold_dpt = dpi->templates;
4342 dpi->templates = hold_dpt->next;
4344 d_print_comp (dpi, options, a);
4346 dpi->templates = hold_dpt;
4351 case DEMANGLE_COMPONENT_CTOR:
4352 d_print_comp (dpi, options, dc->u.s_ctor.name);
4355 case DEMANGLE_COMPONENT_DTOR:
4356 d_append_char (dpi, '~');
4357 d_print_comp (dpi, options, dc->u.s_dtor.name);
4360 case DEMANGLE_COMPONENT_VTABLE:
4361 d_append_string (dpi, "vtable for ");
4362 d_print_comp (dpi, options, d_left (dc));
4365 case DEMANGLE_COMPONENT_VTT:
4366 d_append_string (dpi, "VTT for ");
4367 d_print_comp (dpi, options, d_left (dc));
4370 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
4371 d_append_string (dpi, "construction vtable for ");
4372 d_print_comp (dpi, options, d_left (dc));
4373 d_append_string (dpi, "-in-");
4374 d_print_comp (dpi, options, d_right (dc));
4377 case DEMANGLE_COMPONENT_TYPEINFO:
4378 d_append_string (dpi, "typeinfo for ");
4379 d_print_comp (dpi, options, d_left (dc));
4382 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
4383 d_append_string (dpi, "typeinfo name for ");
4384 d_print_comp (dpi, options, d_left (dc));
4387 case DEMANGLE_COMPONENT_TYPEINFO_FN:
4388 d_append_string (dpi, "typeinfo fn for ");
4389 d_print_comp (dpi, options, d_left (dc));
4392 case DEMANGLE_COMPONENT_THUNK:
4393 d_append_string (dpi, "non-virtual thunk to ");
4394 d_print_comp (dpi, options, d_left (dc));
4397 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
4398 d_append_string (dpi, "virtual thunk to ");
4399 d_print_comp (dpi, options, d_left (dc));
4402 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
4403 d_append_string (dpi, "covariant return thunk to ");
4404 d_print_comp (dpi, options, d_left (dc));
4407 case DEMANGLE_COMPONENT_JAVA_CLASS:
4408 d_append_string (dpi, "java Class for ");
4409 d_print_comp (dpi, options, d_left (dc));
4412 case DEMANGLE_COMPONENT_GUARD:
4413 d_append_string (dpi, "guard variable for ");
4414 d_print_comp (dpi, options, d_left (dc));
4417 case DEMANGLE_COMPONENT_TLS_INIT:
4418 d_append_string (dpi, "TLS init function for ");
4419 d_print_comp (dpi, options, d_left (dc));
4422 case DEMANGLE_COMPONENT_TLS_WRAPPER:
4423 d_append_string (dpi, "TLS wrapper function for ");
4424 d_print_comp (dpi, options, d_left (dc));
4427 case DEMANGLE_COMPONENT_REFTEMP:
4428 d_append_string (dpi, "reference temporary #");
4429 d_print_comp (dpi, options, d_right (dc));
4430 d_append_string (dpi, " for ");
4431 d_print_comp (dpi, options, d_left (dc));
4434 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
4435 d_append_string (dpi, "hidden alias for ");
4436 d_print_comp (dpi, options, d_left (dc));
4439 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
4440 d_append_string (dpi, "transaction clone for ");
4441 d_print_comp (dpi, options, d_left (dc));
4444 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
4445 d_append_string (dpi, "non-transaction clone for ");
4446 d_print_comp (dpi, options, d_left (dc));
4449 case DEMANGLE_COMPONENT_SUB_STD:
4450 d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len);
4453 case DEMANGLE_COMPONENT_RESTRICT:
4454 case DEMANGLE_COMPONENT_VOLATILE:
4455 case DEMANGLE_COMPONENT_CONST:
4457 struct d_print_mod *pdpm;
4459 /* When printing arrays, it's possible to have cases where the
4460 same CV-qualifier gets pushed on the stack multiple times.
4461 We only need to print it once. */
4463 for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next)
4465 if (! pdpm->printed)
4467 if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT
4468 && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE
4469 && pdpm->mod->type != DEMANGLE_COMPONENT_CONST)
4471 if (pdpm->mod->type == dc->type)
4473 d_print_comp (dpi, options, d_left (dc));
4481 case DEMANGLE_COMPONENT_REFERENCE:
4482 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
4484 /* Handle reference smashing: & + && = &. */
4485 const struct demangle_component *sub = d_left (dc);
4486 if (sub->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
4488 struct demangle_component *a;
4489 struct d_saved_scope *scope = NULL, *scopes;
4492 for (i = 0; i < dpi->num_saved_scopes; i++)
4493 if (dpi->saved_scopes[i].container == sub)
4494 scope = &dpi->saved_scopes[i];
4500 /* This is the first time SUB has been traversed.
4501 We need to capture the current templates so
4502 they can be restored if SUB is reentered as a
4504 ++dpi->num_saved_scopes;
4505 size = sizeof (struct d_saved_scope) * dpi->num_saved_scopes;
4506 scopes = (struct d_saved_scope *) realloc (dpi->saved_scopes,
4510 d_print_error (dpi);
4514 dpi->saved_scopes = scopes;
4515 scope = dpi->saved_scopes + (dpi->num_saved_scopes - 1);
4517 scope->container = sub;
4518 scope->templates = d_copy_templates (dpi);
4519 if (d_print_saw_error (dpi))
4524 /* This traversal is reentering SUB as a substition.
4525 Restore the original templates temporarily. */
4526 saved_templates = dpi->templates;
4527 dpi->templates = scope->templates;
4528 need_template_restore = 1;
4531 a = d_lookup_template_argument (dpi, sub);
4532 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4533 a = d_index_template_argument (a, dpi->pack_index);
4537 if (need_template_restore)
4538 dpi->templates = saved_templates;
4540 d_print_error (dpi);
4547 if (sub->type == DEMANGLE_COMPONENT_REFERENCE
4548 || sub->type == dc->type)
4550 else if (sub->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE)
4551 mod_inner = d_left (sub);
4555 case DEMANGLE_COMPONENT_RESTRICT_THIS:
4556 case DEMANGLE_COMPONENT_VOLATILE_THIS:
4557 case DEMANGLE_COMPONENT_CONST_THIS:
4558 case DEMANGLE_COMPONENT_REFERENCE_THIS:
4559 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
4560 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
4561 case DEMANGLE_COMPONENT_POINTER:
4562 case DEMANGLE_COMPONENT_COMPLEX:
4563 case DEMANGLE_COMPONENT_IMAGINARY:
4566 /* We keep a list of modifiers on the stack. */
4567 struct d_print_mod dpm;
4569 dpm.next = dpi->modifiers;
4570 dpi->modifiers = &dpm;
4573 dpm.templates = dpi->templates;
4576 mod_inner = d_left (dc);
4578 d_print_comp (dpi, options, mod_inner);
4580 /* If the modifier didn't get printed by the type, print it
4583 d_print_mod (dpi, options, dc);
4585 dpi->modifiers = dpm.next;
4587 if (need_template_restore)
4588 dpi->templates = saved_templates;
4593 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4594 if ((options & DMGL_JAVA) == 0)
4595 d_append_buffer (dpi, dc->u.s_builtin.type->name,
4596 dc->u.s_builtin.type->len);
4598 d_append_buffer (dpi, dc->u.s_builtin.type->java_name,
4599 dc->u.s_builtin.type->java_len);
4602 case DEMANGLE_COMPONENT_VENDOR_TYPE:
4603 d_print_comp (dpi, options, d_left (dc));
4606 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
4608 if ((options & DMGL_RET_POSTFIX) != 0)
4609 d_print_function_type (dpi,
4610 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4611 dc, dpi->modifiers);
4613 /* Print return type if present */
4614 if (d_left (dc) != NULL && (options & DMGL_RET_POSTFIX) != 0)
4615 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4617 else if (d_left (dc) != NULL && (options & DMGL_RET_DROP) == 0)
4619 struct d_print_mod dpm;
4621 /* We must pass this type down as a modifier in order to
4622 print it in the right location. */
4623 dpm.next = dpi->modifiers;
4624 dpi->modifiers = &dpm;
4627 dpm.templates = dpi->templates;
4629 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4632 dpi->modifiers = dpm.next;
4637 /* In standard prefix notation, there is a space between the
4638 return type and the function signature. */
4639 if ((options & DMGL_RET_POSTFIX) == 0)
4640 d_append_char (dpi, ' ');
4643 if ((options & DMGL_RET_POSTFIX) == 0)
4644 d_print_function_type (dpi,
4645 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4646 dc, dpi->modifiers);
4651 case DEMANGLE_COMPONENT_ARRAY_TYPE:
4653 struct d_print_mod *hold_modifiers;
4654 struct d_print_mod adpm[4];
4656 struct d_print_mod *pdpm;
4658 /* We must pass this type down as a modifier in order to print
4659 multi-dimensional arrays correctly. If the array itself is
4660 CV-qualified, we act as though the element type were
4661 CV-qualified. We do this by copying the modifiers down
4662 rather than fiddling pointers, so that we don't wind up
4663 with a d_print_mod higher on the stack pointing into our
4664 stack frame after we return. */
4666 hold_modifiers = dpi->modifiers;
4668 adpm[0].next = hold_modifiers;
4669 dpi->modifiers = &adpm[0];
4671 adpm[0].printed = 0;
4672 adpm[0].templates = dpi->templates;
4675 pdpm = hold_modifiers;
4677 && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT
4678 || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE
4679 || pdpm->mod->type == DEMANGLE_COMPONENT_CONST))
4681 if (! pdpm->printed)
4683 if (i >= sizeof adpm / sizeof adpm[0])
4685 d_print_error (dpi);
4690 adpm[i].next = dpi->modifiers;
4691 dpi->modifiers = &adpm[i];
4699 d_print_comp (dpi, options, d_right (dc));
4701 dpi->modifiers = hold_modifiers;
4703 if (adpm[0].printed)
4709 d_print_mod (dpi, options, adpm[i].mod);
4712 d_print_array_type (dpi, options, dc, dpi->modifiers);
4717 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
4718 case DEMANGLE_COMPONENT_VECTOR_TYPE:
4720 struct d_print_mod dpm;
4722 dpm.next = dpi->modifiers;
4723 dpi->modifiers = &dpm;
4726 dpm.templates = dpi->templates;
4728 d_print_comp (dpi, options, d_right (dc));
4730 /* If the modifier didn't get printed by the type, print it
4733 d_print_mod (dpi, options, dc);
4735 dpi->modifiers = dpm.next;
4740 case DEMANGLE_COMPONENT_FIXED_TYPE:
4741 if (dc->u.s_fixed.sat)
4742 d_append_string (dpi, "_Sat ");
4743 /* Don't print "int _Accum". */
4744 if (dc->u.s_fixed.length->u.s_builtin.type
4745 != &cplus_demangle_builtin_types['i'-'a'])
4747 d_print_comp (dpi, options, dc->u.s_fixed.length);
4748 d_append_char (dpi, ' ');
4750 if (dc->u.s_fixed.accum)
4751 d_append_string (dpi, "_Accum");
4753 d_append_string (dpi, "_Fract");
4756 case DEMANGLE_COMPONENT_ARGLIST:
4757 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
4758 if (d_left (dc) != NULL)
4759 d_print_comp (dpi, options, d_left (dc));
4760 if (d_right (dc) != NULL)
4763 unsigned long int flush_count;
4764 /* Make sure ", " isn't flushed by d_append_string, otherwise
4765 dpi->len -= 2 wouldn't work. */
4766 if (dpi->len >= sizeof (dpi->buf) - 2)
4767 d_print_flush (dpi);
4768 d_append_string (dpi, ", ");
4770 flush_count = dpi->flush_count;
4771 d_print_comp (dpi, options, d_right (dc));
4772 /* If that didn't print anything (which can happen with empty
4773 template argument packs), remove the comma and space. */
4774 if (dpi->flush_count == flush_count && dpi->len == len)
4779 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
4781 struct demangle_component *type = d_left (dc);
4782 struct demangle_component *list = d_right (dc);
4785 d_print_comp (dpi, options, type);
4786 d_append_char (dpi, '{');
4787 d_print_comp (dpi, options, list);
4788 d_append_char (dpi, '}');
4792 case DEMANGLE_COMPONENT_OPERATOR:
4794 const struct demangle_operator_info *op = dc->u.s_operator.op;
4797 d_append_string (dpi, "operator");
4798 /* Add a space before new/delete. */
4799 if (IS_LOWER (op->name[0]))
4800 d_append_char (dpi, ' ');
4801 /* Omit a trailing space. */
4802 if (op->name[len-1] == ' ')
4804 d_append_buffer (dpi, op->name, len);
4808 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4809 d_append_string (dpi, "operator ");
4810 d_print_comp (dpi, options, dc->u.s_extended_operator.name);
4813 case DEMANGLE_COMPONENT_CAST:
4814 d_append_string (dpi, "operator ");
4815 d_print_cast (dpi, options, dc);
4818 case DEMANGLE_COMPONENT_NULLARY:
4819 d_print_expr_op (dpi, options, d_left (dc));
4822 case DEMANGLE_COMPONENT_UNARY:
4824 struct demangle_component *op = d_left (dc);
4825 struct demangle_component *operand = d_right (dc);
4826 const char *code = NULL;
4828 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
4830 code = op->u.s_operator.op->code;
4831 if (!strcmp (code, "ad"))
4833 /* Don't print the argument list for the address of a
4835 if (operand->type == DEMANGLE_COMPONENT_TYPED_NAME
4836 && d_left (operand)->type == DEMANGLE_COMPONENT_QUAL_NAME
4837 && d_right (operand)->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
4838 operand = d_left (operand);
4840 if (operand->type == DEMANGLE_COMPONENT_BINARY_ARGS)
4842 /* This indicates a suffix operator. */
4843 operand = d_left (operand);
4844 d_print_subexpr (dpi, options, operand);
4845 d_print_expr_op (dpi, options, op);
4850 if (op->type != DEMANGLE_COMPONENT_CAST)
4851 d_print_expr_op (dpi, options, op);
4854 d_append_char (dpi, '(');
4855 d_print_cast (dpi, options, op);
4856 d_append_char (dpi, ')');
4858 if (code && !strcmp (code, "gs"))
4859 /* Avoid parens after '::'. */
4860 d_print_comp (dpi, options, operand);
4861 else if (code && !strcmp (code, "st"))
4862 /* Always print parens for sizeof (type). */
4864 d_append_char (dpi, '(');
4865 d_print_comp (dpi, options, operand);
4866 d_append_char (dpi, ')');
4869 d_print_subexpr (dpi, options, operand);
4873 case DEMANGLE_COMPONENT_BINARY:
4874 if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS)
4876 d_print_error (dpi);
4880 if (op_is_new_cast (d_left (dc)))
4882 d_print_expr_op (dpi, options, d_left (dc));
4883 d_append_char (dpi, '<');
4884 d_print_comp (dpi, options, d_left (d_right (dc)));
4885 d_append_string (dpi, ">(");
4886 d_print_comp (dpi, options, d_right (d_right (dc)));
4887 d_append_char (dpi, ')');
4891 /* We wrap an expression which uses the greater-than operator in
4892 an extra layer of parens so that it does not get confused
4893 with the '>' which ends the template parameters. */
4894 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
4895 && d_left (dc)->u.s_operator.op->len == 1
4896 && d_left (dc)->u.s_operator.op->name[0] == '>')
4897 d_append_char (dpi, '(');
4899 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") == 0
4900 && d_left (d_right (dc))->type == DEMANGLE_COMPONENT_TYPED_NAME)
4902 /* Function call used in an expression should not have printed types
4903 of the function arguments. Values of the function arguments still
4904 get printed below. */
4906 const struct demangle_component *func = d_left (d_right (dc));
4908 if (d_right (func)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
4909 d_print_error (dpi);
4910 d_print_subexpr (dpi, options, d_left (func));
4913 d_print_subexpr (dpi, options, d_left (d_right (dc)));
4914 if (strcmp (d_left (dc)->u.s_operator.op->code, "ix") == 0)
4916 d_append_char (dpi, '[');
4917 d_print_comp (dpi, options, d_right (d_right (dc)));
4918 d_append_char (dpi, ']');
4922 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") != 0)
4923 d_print_expr_op (dpi, options, d_left (dc));
4924 d_print_subexpr (dpi, options, d_right (d_right (dc)));
4927 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
4928 && d_left (dc)->u.s_operator.op->len == 1
4929 && d_left (dc)->u.s_operator.op->name[0] == '>')
4930 d_append_char (dpi, ')');
4934 case DEMANGLE_COMPONENT_BINARY_ARGS:
4935 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
4936 d_print_error (dpi);
4939 case DEMANGLE_COMPONENT_TRINARY:
4940 if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1
4941 || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2)
4943 d_print_error (dpi);
4947 struct demangle_component *op = d_left (dc);
4948 struct demangle_component *first = d_left (d_right (dc));
4949 struct demangle_component *second = d_left (d_right (d_right (dc)));
4950 struct demangle_component *third = d_right (d_right (d_right (dc)));
4952 if (!strcmp (op->u.s_operator.op->code, "qu"))
4954 d_print_subexpr (dpi, options, first);
4955 d_print_expr_op (dpi, options, op);
4956 d_print_subexpr (dpi, options, second);
4957 d_append_string (dpi, " : ");
4958 d_print_subexpr (dpi, options, third);
4962 d_append_string (dpi, "new ");
4963 if (d_left (first) != NULL)
4965 d_print_subexpr (dpi, options, first);
4966 d_append_char (dpi, ' ');
4968 d_print_comp (dpi, options, second);
4970 d_print_subexpr (dpi, options, third);
4975 case DEMANGLE_COMPONENT_TRINARY_ARG1:
4976 case DEMANGLE_COMPONENT_TRINARY_ARG2:
4977 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
4978 d_print_error (dpi);
4981 case DEMANGLE_COMPONENT_LITERAL:
4982 case DEMANGLE_COMPONENT_LITERAL_NEG:
4984 enum d_builtin_type_print tp;
4986 /* For some builtin types, produce simpler output. */
4987 tp = D_PRINT_DEFAULT;
4988 if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE)
4990 tp = d_left (dc)->u.s_builtin.type->print;
4994 case D_PRINT_UNSIGNED:
4996 case D_PRINT_UNSIGNED_LONG:
4997 case D_PRINT_LONG_LONG:
4998 case D_PRINT_UNSIGNED_LONG_LONG:
4999 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME)
5001 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
5002 d_append_char (dpi, '-');
5003 d_print_comp (dpi, options, d_right (dc));
5008 case D_PRINT_UNSIGNED:
5009 d_append_char (dpi, 'u');
5012 d_append_char (dpi, 'l');
5014 case D_PRINT_UNSIGNED_LONG:
5015 d_append_string (dpi, "ul");
5017 case D_PRINT_LONG_LONG:
5018 d_append_string (dpi, "ll");
5020 case D_PRINT_UNSIGNED_LONG_LONG:
5021 d_append_string (dpi, "ull");
5029 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME
5030 && d_right (dc)->u.s_name.len == 1
5031 && dc->type == DEMANGLE_COMPONENT_LITERAL)
5033 switch (d_right (dc)->u.s_name.s[0])
5036 d_append_string (dpi, "false");
5039 d_append_string (dpi, "true");
5052 d_append_char (dpi, '(');
5053 d_print_comp (dpi, options, d_left (dc));
5054 d_append_char (dpi, ')');
5055 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
5056 d_append_char (dpi, '-');
5057 if (tp == D_PRINT_FLOAT)
5058 d_append_char (dpi, '[');
5059 d_print_comp (dpi, options, d_right (dc));
5060 if (tp == D_PRINT_FLOAT)
5061 d_append_char (dpi, ']');
5065 case DEMANGLE_COMPONENT_NUMBER:
5066 d_append_num (dpi, dc->u.s_number.number);
5069 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
5070 d_append_string (dpi, "java resource ");
5071 d_print_comp (dpi, options, d_left (dc));
5074 case DEMANGLE_COMPONENT_COMPOUND_NAME:
5075 d_print_comp (dpi, options, d_left (dc));
5076 d_print_comp (dpi, options, d_right (dc));
5079 case DEMANGLE_COMPONENT_CHARACTER:
5080 d_append_char (dpi, dc->u.s_character.character);
5083 case DEMANGLE_COMPONENT_DECLTYPE:
5084 d_append_string (dpi, "decltype (");
5085 d_print_comp (dpi, options, d_left (dc));
5086 d_append_char (dpi, ')');
5089 case DEMANGLE_COMPONENT_PACK_EXPANSION:
5093 struct demangle_component *a = d_find_pack (dpi, d_left (dc));
5096 /* d_find_pack won't find anything if the only packs involved
5097 in this expansion are function parameter packs; in that
5098 case, just print the pattern and "...". */
5099 d_print_subexpr (dpi, options, d_left (dc));
5100 d_append_string (dpi, "...");
5104 len = d_pack_length (a);
5106 for (i = 0; i < len; ++i)
5108 dpi->pack_index = i;
5109 d_print_comp (dpi, options, dc);
5111 d_append_string (dpi, ", ");
5116 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
5118 long num = dc->u.s_number.number;
5120 d_append_string (dpi, "this");
5123 d_append_string (dpi, "{parm#");
5124 d_append_num (dpi, num);
5125 d_append_char (dpi, '}');
5130 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
5131 d_append_string (dpi, "global constructors keyed to ");
5132 d_print_comp (dpi, options, dc->u.s_binary.left);
5135 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
5136 d_append_string (dpi, "global destructors keyed to ");
5137 d_print_comp (dpi, options, dc->u.s_binary.left);
5140 case DEMANGLE_COMPONENT_LAMBDA:
5141 d_append_string (dpi, "{lambda(");
5142 d_print_comp (dpi, options, dc->u.s_unary_num.sub);
5143 d_append_string (dpi, ")#");
5144 d_append_num (dpi, dc->u.s_unary_num.num + 1);
5145 d_append_char (dpi, '}');
5148 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
5149 d_append_string (dpi, "{unnamed type#");
5150 d_append_num (dpi, dc->u.s_number.number + 1);
5151 d_append_char (dpi, '}');
5154 case DEMANGLE_COMPONENT_CLONE:
5155 d_print_comp (dpi, options, d_left (dc));
5156 d_append_string (dpi, " [clone ");
5157 d_print_comp (dpi, options, d_right (dc));
5158 d_append_char (dpi, ']');
5162 d_print_error (dpi);
5167 /* Print a Java dentifier. For Java we try to handle encoded extended
5168 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
5169 so we don't it for C++. Characters are encoded as
5173 d_print_java_identifier (struct d_print_info *dpi, const char *name, int len)
5179 for (p = name; p < end; ++p)
5190 for (q = p + 3; q < end; ++q)
5196 else if (*q >= 'A' && *q <= 'F')
5197 dig = *q - 'A' + 10;
5198 else if (*q >= 'a' && *q <= 'f')
5199 dig = *q - 'a' + 10;
5205 /* If the Unicode character is larger than 256, we don't try
5206 to deal with it here. FIXME. */
5207 if (q < end && *q == '_' && c < 256)
5209 d_append_char (dpi, c);
5215 d_append_char (dpi, *p);
5219 /* Print a list of modifiers. SUFFIX is 1 if we are printing
5220 qualifiers on this after printing a function. */
5223 d_print_mod_list (struct d_print_info *dpi, int options,
5224 struct d_print_mod *mods, int suffix)
5226 struct d_print_template *hold_dpt;
5228 if (mods == NULL || d_print_saw_error (dpi))
5233 && (mods->mod->type == DEMANGLE_COMPONENT_RESTRICT_THIS
5234 || mods->mod->type == DEMANGLE_COMPONENT_VOLATILE_THIS
5235 || mods->mod->type == DEMANGLE_COMPONENT_CONST_THIS
5236 || mods->mod->type == DEMANGLE_COMPONENT_REFERENCE_THIS
5238 == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS))))
5240 d_print_mod_list (dpi, options, mods->next, suffix);
5246 hold_dpt = dpi->templates;
5247 dpi->templates = mods->templates;
5249 if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
5251 d_print_function_type (dpi, options, mods->mod, mods->next);
5252 dpi->templates = hold_dpt;
5255 else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
5257 d_print_array_type (dpi, options, mods->mod, mods->next);
5258 dpi->templates = hold_dpt;
5261 else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME)
5263 struct d_print_mod *hold_modifiers;
5264 struct demangle_component *dc;
5266 /* When this is on the modifier stack, we have pulled any
5267 qualifiers off the right argument already. Otherwise, we
5268 print it as usual, but don't let the left argument see any
5271 hold_modifiers = dpi->modifiers;
5272 dpi->modifiers = NULL;
5273 d_print_comp (dpi, options, d_left (mods->mod));
5274 dpi->modifiers = hold_modifiers;
5276 if ((options & DMGL_JAVA) == 0)
5277 d_append_string (dpi, "::");
5279 d_append_char (dpi, '.');
5281 dc = d_right (mods->mod);
5283 if (dc->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
5285 d_append_string (dpi, "{default arg#");
5286 d_append_num (dpi, dc->u.s_unary_num.num + 1);
5287 d_append_string (dpi, "}::");
5288 dc = dc->u.s_unary_num.sub;
5291 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
5292 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
5293 || dc->type == DEMANGLE_COMPONENT_CONST_THIS
5294 || dc->type == DEMANGLE_COMPONENT_REFERENCE_THIS
5295 || dc->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)
5298 d_print_comp (dpi, options, dc);
5300 dpi->templates = hold_dpt;
5304 d_print_mod (dpi, options, mods->mod);
5306 dpi->templates = hold_dpt;
5308 d_print_mod_list (dpi, options, mods->next, suffix);
5311 /* Print a modifier. */
5314 d_print_mod (struct d_print_info *dpi, int options,
5315 const struct demangle_component *mod)
5319 case DEMANGLE_COMPONENT_RESTRICT:
5320 case DEMANGLE_COMPONENT_RESTRICT_THIS:
5321 d_append_string (dpi, " restrict");
5323 case DEMANGLE_COMPONENT_VOLATILE:
5324 case DEMANGLE_COMPONENT_VOLATILE_THIS:
5325 d_append_string (dpi, " volatile");
5327 case DEMANGLE_COMPONENT_CONST:
5328 case DEMANGLE_COMPONENT_CONST_THIS:
5329 d_append_string (dpi, " const");
5331 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5332 d_append_char (dpi, ' ');
5333 d_print_comp (dpi, options, d_right (mod));
5335 case DEMANGLE_COMPONENT_POINTER:
5336 /* There is no pointer symbol in Java. */
5337 if ((options & DMGL_JAVA) == 0)
5338 d_append_char (dpi, '*');
5340 case DEMANGLE_COMPONENT_REFERENCE_THIS:
5341 /* For the ref-qualifier, put a space before the &. */
5342 d_append_char (dpi, ' ');
5343 case DEMANGLE_COMPONENT_REFERENCE:
5344 d_append_char (dpi, '&');
5346 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
5347 d_append_char (dpi, ' ');
5348 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5349 d_append_string (dpi, "&&");
5351 case DEMANGLE_COMPONENT_COMPLEX:
5352 d_append_string (dpi, "complex ");
5354 case DEMANGLE_COMPONENT_IMAGINARY:
5355 d_append_string (dpi, "imaginary ");
5357 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5358 if (d_last_char (dpi) != '(')
5359 d_append_char (dpi, ' ');
5360 d_print_comp (dpi, options, d_left (mod));
5361 d_append_string (dpi, "::*");
5363 case DEMANGLE_COMPONENT_TYPED_NAME:
5364 d_print_comp (dpi, options, d_left (mod));
5366 case DEMANGLE_COMPONENT_VECTOR_TYPE:
5367 d_append_string (dpi, " __vector(");
5368 d_print_comp (dpi, options, d_left (mod));
5369 d_append_char (dpi, ')');
5373 /* Otherwise, we have something that won't go back on the
5374 modifier stack, so we can just print it. */
5375 d_print_comp (dpi, options, mod);
5380 /* Print a function type, except for the return type. */
5383 d_print_function_type (struct d_print_info *dpi, int options,
5384 const struct demangle_component *dc,
5385 struct d_print_mod *mods)
5389 struct d_print_mod *p;
5390 struct d_print_mod *hold_modifiers;
5394 for (p = mods; p != NULL; p = p->next)
5399 switch (p->mod->type)
5401 case DEMANGLE_COMPONENT_POINTER:
5402 case DEMANGLE_COMPONENT_REFERENCE:
5403 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5406 case DEMANGLE_COMPONENT_RESTRICT:
5407 case DEMANGLE_COMPONENT_VOLATILE:
5408 case DEMANGLE_COMPONENT_CONST:
5409 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5410 case DEMANGLE_COMPONENT_COMPLEX:
5411 case DEMANGLE_COMPONENT_IMAGINARY:
5412 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5416 case DEMANGLE_COMPONENT_RESTRICT_THIS:
5417 case DEMANGLE_COMPONENT_VOLATILE_THIS:
5418 case DEMANGLE_COMPONENT_CONST_THIS:
5419 case DEMANGLE_COMPONENT_REFERENCE_THIS:
5420 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
5433 if (d_last_char (dpi) != '('
5434 && d_last_char (dpi) != '*')
5437 if (need_space && d_last_char (dpi) != ' ')
5438 d_append_char (dpi, ' ');
5439 d_append_char (dpi, '(');
5442 hold_modifiers = dpi->modifiers;
5443 dpi->modifiers = NULL;
5445 d_print_mod_list (dpi, options, mods, 0);
5448 d_append_char (dpi, ')');
5450 d_append_char (dpi, '(');
5452 if (d_right (dc) != NULL)
5453 d_print_comp (dpi, options, d_right (dc));
5455 d_append_char (dpi, ')');
5457 d_print_mod_list (dpi, options, mods, 1);
5459 dpi->modifiers = hold_modifiers;
5462 /* Print an array type, except for the element type. */
5465 d_print_array_type (struct d_print_info *dpi, int options,
5466 const struct demangle_component *dc,
5467 struct d_print_mod *mods)
5475 struct d_print_mod *p;
5478 for (p = mods; p != NULL; p = p->next)
5482 if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
5497 d_append_string (dpi, " (");
5499 d_print_mod_list (dpi, options, mods, 0);
5502 d_append_char (dpi, ')');
5506 d_append_char (dpi, ' ');
5508 d_append_char (dpi, '[');
5510 if (d_left (dc) != NULL)
5511 d_print_comp (dpi, options, d_left (dc));
5513 d_append_char (dpi, ']');
5516 /* Print an operator in an expression. */
5519 d_print_expr_op (struct d_print_info *dpi, int options,
5520 const struct demangle_component *dc)
5522 if (dc->type == DEMANGLE_COMPONENT_OPERATOR)
5523 d_append_buffer (dpi, dc->u.s_operator.op->name,
5524 dc->u.s_operator.op->len);
5526 d_print_comp (dpi, options, dc);
5532 d_print_cast (struct d_print_info *dpi, int options,
5533 const struct demangle_component *dc)
5535 struct d_print_template dpt;
5537 /* For a cast operator, we need the template parameters from
5538 the enclosing template in scope for processing the type. */
5539 if (dpi->current_template != NULL)
5541 dpt.next = dpi->templates;
5542 dpi->templates = &dpt;
5543 dpt.template_decl = dpi->current_template;
5546 if (d_left (dc)->type != DEMANGLE_COMPONENT_TEMPLATE)
5548 d_print_comp (dpi, options, d_left (dc));
5549 if (dpi->current_template != NULL)
5550 dpi->templates = dpt.next;
5554 d_print_comp (dpi, options, d_left (d_left (dc)));
5556 /* For a templated cast operator, we need to remove the template
5557 parameters from scope after printing the operator name,
5558 so we need to handle the template printing here. */
5559 if (dpi->current_template != NULL)
5560 dpi->templates = dpt.next;
5562 if (d_last_char (dpi) == '<')
5563 d_append_char (dpi, ' ');
5564 d_append_char (dpi, '<');
5565 d_print_comp (dpi, options, d_right (d_left (dc)));
5566 /* Avoid generating two consecutive '>' characters, to avoid
5567 the C++ syntactic ambiguity. */
5568 if (d_last_char (dpi) == '>')
5569 d_append_char (dpi, ' ');
5570 d_append_char (dpi, '>');
5574 /* Initialize the information structure we use to pass around
5577 CP_STATIC_IF_GLIBCPP_V3
5579 cplus_demangle_init_info (const char *mangled, int options, size_t len,
5583 di->send = mangled + len;
5584 di->options = options;
5588 /* We can not need more components than twice the number of chars in
5589 the mangled string. Most components correspond directly to
5590 chars, but the ARGLIST types are exceptions. */
5591 di->num_comps = 2 * len;
5594 /* Similarly, we can not need more substitutions than there are
5595 chars in the mangled string. */
5600 di->last_name = NULL;
5603 di->is_expression = 0;
5604 di->is_conversion = 0;
5607 /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
5608 mangled name, return strings in repeated callback giving the demangled
5609 name. OPTIONS is the usual libiberty demangler options. On success,
5610 this returns 1. On failure, returns 0. */
5613 d_demangle_callback (const char *mangled, int options,
5614 demangle_callbackref callback, void *opaque)
5625 struct demangle_component *dc;
5628 if (mangled[0] == '_' && mangled[1] == 'Z')
5630 else if (strncmp (mangled, "_GLOBAL_", 8) == 0
5631 && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
5632 && (mangled[9] == 'D' || mangled[9] == 'I')
5633 && mangled[10] == '_')
5634 type = mangled[9] == 'I' ? DCT_GLOBAL_CTORS : DCT_GLOBAL_DTORS;
5637 if ((options & DMGL_TYPES) == 0)
5642 cplus_demangle_init_info (mangled, options, strlen (mangled), &di);
5645 #ifdef CP_DYNAMIC_ARRAYS
5646 __extension__ struct demangle_component comps[di.num_comps];
5647 __extension__ struct demangle_component *subs[di.num_subs];
5652 di.comps = alloca (di.num_comps * sizeof (*di.comps));
5653 di.subs = alloca (di.num_subs * sizeof (*di.subs));
5659 dc = cplus_demangle_type (&di);
5662 dc = cplus_demangle_mangled_name (&di, 1);
5664 case DCT_GLOBAL_CTORS:
5665 case DCT_GLOBAL_DTORS:
5666 d_advance (&di, 11);
5667 dc = d_make_comp (&di,
5668 (type == DCT_GLOBAL_CTORS
5669 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
5670 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS),
5671 d_make_demangle_mangled_name (&di, d_str (&di)),
5673 d_advance (&di, strlen (d_str (&di)));
5677 /* If DMGL_PARAMS is set, then if we didn't consume the entire
5678 mangled string, then we didn't successfully demangle it. If
5679 DMGL_PARAMS is not set, we didn't look at the trailing
5681 if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0')
5684 #ifdef CP_DEMANGLE_DEBUG
5688 status = (dc != NULL)
5689 ? cplus_demangle_print_callback (options, dc, callback, opaque)
5696 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
5697 name, return a buffer allocated with malloc holding the demangled
5698 name. OPTIONS is the usual libiberty demangler options. On
5699 success, this sets *PALC to the allocated size of the returned
5700 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
5701 a memory allocation failure, and returns NULL. */
5704 d_demangle (const char *mangled, int options, size_t *palc)
5706 struct d_growable_string dgs;
5709 d_growable_string_init (&dgs, 0);
5711 status = d_demangle_callback (mangled, options,
5712 d_growable_string_callback_adapter, &dgs);
5720 *palc = dgs.allocation_failure ? 1 : dgs.alc;
5724 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
5726 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
5728 /* ia64 ABI-mandated entry point in the C++ runtime library for
5729 performing demangling. MANGLED_NAME is a NUL-terminated character
5730 string containing the name to be demangled.
5732 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
5733 *LENGTH bytes, into which the demangled name is stored. If
5734 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
5735 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
5736 is placed in a region of memory allocated with malloc.
5738 If LENGTH is non-NULL, the length of the buffer containing the
5739 demangled name, is placed in *LENGTH.
5741 The return value is a pointer to the start of the NUL-terminated
5742 demangled name, or NULL if the demangling fails. The caller is
5743 responsible for deallocating this memory using free.
5745 *STATUS is set to one of the following values:
5746 0: The demangling operation succeeded.
5747 -1: A memory allocation failure occurred.
5748 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
5749 -3: One of the arguments is invalid.
5751 The demangling is performed using the C++ ABI mangling rules, with
5755 __cxa_demangle (const char *mangled_name, char *output_buffer,
5756 size_t *length, int *status)
5761 if (mangled_name == NULL)
5768 if (output_buffer != NULL && length == NULL)
5775 demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc);
5777 if (demangled == NULL)
5789 if (output_buffer == NULL)
5796 if (strlen (demangled) < *length)
5798 strcpy (output_buffer, demangled);
5800 demangled = output_buffer;
5804 free (output_buffer);
5815 extern int __gcclibcxx_demangle_callback (const char *,
5817 (const char *, size_t, void *),
5820 /* Alternative, allocationless entry point in the C++ runtime library
5821 for performing demangling. MANGLED_NAME is a NUL-terminated character
5822 string containing the name to be demangled.
5824 CALLBACK is a callback function, called with demangled string
5825 segments as demangling progresses; it is called at least once,
5826 but may be called more than once. OPAQUE is a generalized pointer
5827 used as a callback argument.
5829 The return code is one of the following values, equivalent to
5830 the STATUS values of __cxa_demangle() (excluding -1, since this
5831 function performs no memory allocations):
5832 0: The demangling operation succeeded.
5833 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
5834 -3: One of the arguments is invalid.
5836 The demangling is performed using the C++ ABI mangling rules, with
5840 __gcclibcxx_demangle_callback (const char *mangled_name,
5841 void (*callback) (const char *, size_t, void *),
5846 if (mangled_name == NULL || callback == NULL)
5849 status = d_demangle_callback (mangled_name, DMGL_PARAMS | DMGL_TYPES,
5857 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
5859 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
5860 mangled name, return a buffer allocated with malloc holding the
5861 demangled name. Otherwise, return NULL. */
5864 cplus_demangle_v3 (const char *mangled, int options)
5868 return d_demangle (mangled, options, &alc);
5872 cplus_demangle_v3_callback (const char *mangled, int options,
5873 demangle_callbackref callback, void *opaque)
5875 return d_demangle_callback (mangled, options, callback, opaque);
5878 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
5879 conventions, but the output formatting is a little different.
5880 This instructs the C++ demangler not to emit pointer characters ("*"), to
5881 use Java's namespace separator symbol ("." instead of "::"), and to output
5882 JArray<TYPE> as TYPE[]. */
5885 java_demangle_v3 (const char *mangled)
5889 return d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, &alc);
5893 java_demangle_v3_callback (const char *mangled,
5894 demangle_callbackref callback, void *opaque)
5896 return d_demangle_callback (mangled,
5897 DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX,
5901 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
5903 #ifndef IN_GLIBCPP_V3
5905 /* Demangle a string in order to find out whether it is a constructor
5906 or destructor. Return non-zero on success. Set *CTOR_KIND and
5907 *DTOR_KIND appropriately. */
5910 is_ctor_or_dtor (const char *mangled,
5911 enum gnu_v3_ctor_kinds *ctor_kind,
5912 enum gnu_v3_dtor_kinds *dtor_kind)
5915 struct demangle_component *dc;
5918 *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
5919 *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
5921 cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di);
5924 #ifdef CP_DYNAMIC_ARRAYS
5925 __extension__ struct demangle_component comps[di.num_comps];
5926 __extension__ struct demangle_component *subs[di.num_subs];
5931 di.comps = alloca (di.num_comps * sizeof (*di.comps));
5932 di.subs = alloca (di.num_subs * sizeof (*di.subs));
5935 dc = cplus_demangle_mangled_name (&di, 1);
5937 /* Note that because we did not pass DMGL_PARAMS, we don't expect
5938 to demangle the entire string. */
5945 /* These cannot appear on a constructor or destructor. */
5946 case DEMANGLE_COMPONENT_RESTRICT_THIS:
5947 case DEMANGLE_COMPONENT_VOLATILE_THIS:
5948 case DEMANGLE_COMPONENT_CONST_THIS:
5949 case DEMANGLE_COMPONENT_REFERENCE_THIS:
5950 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
5954 case DEMANGLE_COMPONENT_TYPED_NAME:
5955 case DEMANGLE_COMPONENT_TEMPLATE:
5958 case DEMANGLE_COMPONENT_QUAL_NAME:
5959 case DEMANGLE_COMPONENT_LOCAL_NAME:
5962 case DEMANGLE_COMPONENT_CTOR:
5963 *ctor_kind = dc->u.s_ctor.kind;
5967 case DEMANGLE_COMPONENT_DTOR:
5968 *dtor_kind = dc->u.s_dtor.kind;
5979 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
5980 name. A non-zero return indicates the type of constructor. */
5982 enum gnu_v3_ctor_kinds
5983 is_gnu_v3_mangled_ctor (const char *name)
5985 enum gnu_v3_ctor_kinds ctor_kind;
5986 enum gnu_v3_dtor_kinds dtor_kind;
5988 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
5989 return (enum gnu_v3_ctor_kinds) 0;
5994 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
5995 name. A non-zero return indicates the type of destructor. */
5997 enum gnu_v3_dtor_kinds
5998 is_gnu_v3_mangled_dtor (const char *name)
6000 enum gnu_v3_ctor_kinds ctor_kind;
6001 enum gnu_v3_dtor_kinds dtor_kind;
6003 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
6004 return (enum gnu_v3_dtor_kinds) 0;
6008 #endif /* IN_GLIBCPP_V3 */
6010 #ifdef STANDALONE_DEMANGLER
6013 #include "dyn-string.h"
6015 static void print_usage (FILE* fp, int exit_value);
6017 #define IS_ALPHA(CHAR) \
6018 (((CHAR) >= 'a' && (CHAR) <= 'z') \
6019 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
6021 /* Non-zero if CHAR is a character than can occur in a mangled name. */
6022 #define is_mangled_char(CHAR) \
6023 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
6024 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
6026 /* The name of this program, as invoked. */
6027 const char* program_name;
6029 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
6032 print_usage (FILE* fp, int exit_value)
6034 fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
6035 fprintf (fp, "Options:\n");
6036 fprintf (fp, " -h,--help Display this message.\n");
6037 fprintf (fp, " -p,--no-params Don't display function parameters\n");
6038 fprintf (fp, " -v,--verbose Produce verbose demanglings.\n");
6039 fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n");
6044 /* Option specification for getopt_long. */
6045 static const struct option long_options[] =
6047 { "help", no_argument, NULL, 'h' },
6048 { "no-params", no_argument, NULL, 'p' },
6049 { "verbose", no_argument, NULL, 'v' },
6050 { NULL, no_argument, NULL, 0 },
6053 /* Main entry for a demangling filter executable. It will demangle
6054 its command line arguments, if any. If none are provided, it will
6055 filter stdin to stdout, replacing any recognized mangled C++ names
6056 with their demangled equivalents. */
6059 main (int argc, char *argv[])
6063 int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
6065 /* Use the program name of this program, as invoked. */
6066 program_name = argv[0];
6068 /* Parse options. */
6071 opt_char = getopt_long (argc, argv, "hpv", long_options, NULL);
6074 case '?': /* Unrecognized option. */
6075 print_usage (stderr, 1);
6079 print_usage (stdout, 0);
6083 options &= ~ DMGL_PARAMS;
6087 options |= DMGL_VERBOSE;
6091 while (opt_char != -1);
6094 /* No command line arguments were provided. Filter stdin. */
6096 dyn_string_t mangled = dyn_string_new (3);
6099 /* Read all of input. */
6100 while (!feof (stdin))
6104 /* Pile characters into mangled until we hit one that can't
6105 occur in a mangled name. */
6107 while (!feof (stdin) && is_mangled_char (c))
6109 dyn_string_append_char (mangled, c);
6115 if (dyn_string_length (mangled) > 0)
6117 #ifdef IN_GLIBCPP_V3
6118 s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL);
6120 s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
6130 /* It might not have been a mangled name. Print the
6132 fputs (dyn_string_buf (mangled), stdout);
6135 dyn_string_clear (mangled);
6138 /* If we haven't hit EOF yet, we've read one character that
6139 can't occur in a mangled name, so print it out. */
6144 dyn_string_delete (mangled);
6147 /* Demangle command line arguments. */
6149 /* Loop over command line arguments. */
6150 for (i = optind; i < argc; ++i)
6153 #ifdef IN_GLIBCPP_V3
6157 /* Attempt to demangle. */
6158 #ifdef IN_GLIBCPP_V3
6159 s = __cxa_demangle (argv[i], NULL, NULL, &status);
6161 s = cplus_demangle_v3 (argv[i], options);
6164 /* If it worked, print the demangled name. */
6172 #ifdef IN_GLIBCPP_V3
6173 fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status);
6175 fprintf (stderr, "Failed: %s\n", argv[i]);
6184 #endif /* STANDALONE_DEMANGLER */