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 enum { D_PRINT_BUFFER_LENGTH = 256 };
281 /* Fixed-length allocated buffer for demangled data, flushed to the
282 callback with a NUL termination once full. */
283 char buf[D_PRINT_BUFFER_LENGTH];
284 /* Current length of data in buffer. */
286 /* The last character printed, saved individually so that it survives
289 /* Callback function to handle demangled buffer flush. */
290 demangle_callbackref callback;
291 /* Opaque callback argument. */
293 /* The current list of templates, if any. */
294 struct d_print_template *templates;
295 /* The current list of modifiers (e.g., pointer, reference, etc.),
297 struct d_print_mod *modifiers;
298 /* Set to 1 if we saw a demangling error. */
299 int demangle_failure;
300 /* The current index into any template argument packs we are using
303 /* Number of d_print_flush calls so far. */
304 unsigned long int flush_count;
307 #ifdef CP_DEMANGLE_DEBUG
308 static void d_dump (struct demangle_component *, int);
311 static struct demangle_component *
312 d_make_empty (struct d_info *);
314 static struct demangle_component *
315 d_make_comp (struct d_info *, enum demangle_component_type,
316 struct demangle_component *,
317 struct demangle_component *);
319 static struct demangle_component *
320 d_make_name (struct d_info *, const char *, int);
322 static struct demangle_component *
323 d_make_demangle_mangled_name (struct d_info *, const char *);
325 static struct demangle_component *
326 d_make_builtin_type (struct d_info *,
327 const struct demangle_builtin_type_info *);
329 static struct demangle_component *
330 d_make_operator (struct d_info *,
331 const struct demangle_operator_info *);
333 static struct demangle_component *
334 d_make_extended_operator (struct d_info *, int,
335 struct demangle_component *);
337 static struct demangle_component *
338 d_make_ctor (struct d_info *, enum gnu_v3_ctor_kinds,
339 struct demangle_component *);
341 static struct demangle_component *
342 d_make_dtor (struct d_info *, enum gnu_v3_dtor_kinds,
343 struct demangle_component *);
345 static struct demangle_component *
346 d_make_template_param (struct d_info *, long);
348 static struct demangle_component *
349 d_make_sub (struct d_info *, const char *, int);
352 has_return_type (struct demangle_component *);
355 is_ctor_dtor_or_conversion (struct demangle_component *);
357 static struct demangle_component *d_encoding (struct d_info *, int);
359 static struct demangle_component *d_name (struct d_info *);
361 static struct demangle_component *d_nested_name (struct d_info *);
363 static struct demangle_component *d_prefix (struct d_info *);
365 static struct demangle_component *d_unqualified_name (struct d_info *);
367 static struct demangle_component *d_source_name (struct d_info *);
369 static long d_number (struct d_info *);
371 static struct demangle_component *d_identifier (struct d_info *, int);
373 static struct demangle_component *d_operator_name (struct d_info *);
375 static struct demangle_component *d_special_name (struct d_info *);
377 static int d_call_offset (struct d_info *, int);
379 static struct demangle_component *d_ctor_dtor_name (struct d_info *);
381 static struct demangle_component **
382 d_cv_qualifiers (struct d_info *, struct demangle_component **, int);
384 static struct demangle_component *
385 d_function_type (struct d_info *);
387 static struct demangle_component *
388 d_bare_function_type (struct d_info *, int);
390 static struct demangle_component *
391 d_class_enum_type (struct d_info *);
393 static struct demangle_component *d_array_type (struct d_info *);
395 static struct demangle_component *d_vector_type (struct d_info *);
397 static struct demangle_component *
398 d_pointer_to_member_type (struct d_info *);
400 static struct demangle_component *
401 d_template_param (struct d_info *);
403 static struct demangle_component *d_template_args (struct d_info *);
405 static struct demangle_component *
406 d_template_arg (struct d_info *);
408 static struct demangle_component *d_expression (struct d_info *);
410 static struct demangle_component *d_expr_primary (struct d_info *);
412 static struct demangle_component *d_local_name (struct d_info *);
414 static int d_discriminator (struct d_info *);
416 static struct demangle_component *d_lambda (struct d_info *);
418 static struct demangle_component *d_unnamed_type (struct d_info *);
420 static struct demangle_component *
421 d_clone_suffix (struct d_info *, struct demangle_component *);
424 d_add_substitution (struct d_info *, struct demangle_component *);
426 static struct demangle_component *d_substitution (struct d_info *, int);
428 static void d_growable_string_init (struct d_growable_string *, size_t);
431 d_growable_string_resize (struct d_growable_string *, size_t);
434 d_growable_string_append_buffer (struct d_growable_string *,
435 const char *, size_t);
437 d_growable_string_callback_adapter (const char *, size_t, void *);
440 d_print_init (struct d_print_info *, demangle_callbackref, void *);
442 static inline void d_print_error (struct d_print_info *);
444 static inline int d_print_saw_error (struct d_print_info *);
446 static inline void d_print_flush (struct d_print_info *);
448 static inline void d_append_char (struct d_print_info *, char);
450 static inline void d_append_buffer (struct d_print_info *,
451 const char *, size_t);
453 static inline void d_append_string (struct d_print_info *, const char *);
455 static inline char d_last_char (struct d_print_info *);
458 d_print_comp (struct d_print_info *, int, const struct demangle_component *);
461 d_print_java_identifier (struct d_print_info *, const char *, int);
464 d_print_mod_list (struct d_print_info *, int, struct d_print_mod *, int);
467 d_print_mod (struct d_print_info *, int, const struct demangle_component *);
470 d_print_function_type (struct d_print_info *, int,
471 const struct demangle_component *,
472 struct d_print_mod *);
475 d_print_array_type (struct d_print_info *, int,
476 const struct demangle_component *,
477 struct d_print_mod *);
480 d_print_expr_op (struct d_print_info *, int, const struct demangle_component *);
483 d_print_cast (struct d_print_info *, int, const struct demangle_component *);
485 static int d_demangle_callback (const char *, int,
486 demangle_callbackref, void *);
487 static char *d_demangle (const char *, int, size_t *);
489 #ifdef CP_DEMANGLE_DEBUG
492 d_dump (struct demangle_component *dc, int indent)
499 printf ("failed demangling\n");
503 for (i = 0; i < indent; ++i)
508 case DEMANGLE_COMPONENT_NAME:
509 printf ("name '%.*s'\n", dc->u.s_name.len, dc->u.s_name.s);
511 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
512 printf ("template parameter %ld\n", dc->u.s_number.number);
514 case DEMANGLE_COMPONENT_CTOR:
515 printf ("constructor %d\n", (int) dc->u.s_ctor.kind);
516 d_dump (dc->u.s_ctor.name, indent + 2);
518 case DEMANGLE_COMPONENT_DTOR:
519 printf ("destructor %d\n", (int) dc->u.s_dtor.kind);
520 d_dump (dc->u.s_dtor.name, indent + 2);
522 case DEMANGLE_COMPONENT_SUB_STD:
523 printf ("standard substitution %s\n", dc->u.s_string.string);
525 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
526 printf ("builtin type %s\n", dc->u.s_builtin.type->name);
528 case DEMANGLE_COMPONENT_OPERATOR:
529 printf ("operator %s\n", dc->u.s_operator.op->name);
531 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
532 printf ("extended operator with %d args\n",
533 dc->u.s_extended_operator.args);
534 d_dump (dc->u.s_extended_operator.name, indent + 2);
537 case DEMANGLE_COMPONENT_QUAL_NAME:
538 printf ("qualified name\n");
540 case DEMANGLE_COMPONENT_LOCAL_NAME:
541 printf ("local name\n");
543 case DEMANGLE_COMPONENT_TYPED_NAME:
544 printf ("typed name\n");
546 case DEMANGLE_COMPONENT_TEMPLATE:
547 printf ("template\n");
549 case DEMANGLE_COMPONENT_VTABLE:
552 case DEMANGLE_COMPONENT_VTT:
555 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
556 printf ("construction vtable\n");
558 case DEMANGLE_COMPONENT_TYPEINFO:
559 printf ("typeinfo\n");
561 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
562 printf ("typeinfo name\n");
564 case DEMANGLE_COMPONENT_TYPEINFO_FN:
565 printf ("typeinfo function\n");
567 case DEMANGLE_COMPONENT_THUNK:
570 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
571 printf ("virtual thunk\n");
573 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
574 printf ("covariant thunk\n");
576 case DEMANGLE_COMPONENT_JAVA_CLASS:
577 printf ("java class\n");
579 case DEMANGLE_COMPONENT_GUARD:
582 case DEMANGLE_COMPONENT_REFTEMP:
583 printf ("reference temporary\n");
585 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
586 printf ("hidden alias\n");
588 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
589 printf ("transaction clone\n");
591 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
592 printf ("non-transaction clone\n");
594 case DEMANGLE_COMPONENT_RESTRICT:
595 printf ("restrict\n");
597 case DEMANGLE_COMPONENT_VOLATILE:
598 printf ("volatile\n");
600 case DEMANGLE_COMPONENT_CONST:
603 case DEMANGLE_COMPONENT_RESTRICT_THIS:
604 printf ("restrict this\n");
606 case DEMANGLE_COMPONENT_VOLATILE_THIS:
607 printf ("volatile this\n");
609 case DEMANGLE_COMPONENT_CONST_THIS:
610 printf ("const this\n");
612 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
613 printf ("vendor type qualifier\n");
615 case DEMANGLE_COMPONENT_POINTER:
616 printf ("pointer\n");
618 case DEMANGLE_COMPONENT_REFERENCE:
619 printf ("reference\n");
621 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
622 printf ("rvalue reference\n");
624 case DEMANGLE_COMPONENT_COMPLEX:
625 printf ("complex\n");
627 case DEMANGLE_COMPONENT_IMAGINARY:
628 printf ("imaginary\n");
630 case DEMANGLE_COMPONENT_VENDOR_TYPE:
631 printf ("vendor type\n");
633 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
634 printf ("function type\n");
636 case DEMANGLE_COMPONENT_ARRAY_TYPE:
637 printf ("array type\n");
639 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
640 printf ("pointer to member type\n");
642 case DEMANGLE_COMPONENT_FIXED_TYPE:
643 printf ("fixed-point type\n");
645 case DEMANGLE_COMPONENT_ARGLIST:
646 printf ("argument list\n");
648 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
649 printf ("template argument list\n");
651 case DEMANGLE_COMPONENT_CAST:
654 case DEMANGLE_COMPONENT_UNARY:
655 printf ("unary operator\n");
657 case DEMANGLE_COMPONENT_BINARY:
658 printf ("binary operator\n");
660 case DEMANGLE_COMPONENT_BINARY_ARGS:
661 printf ("binary operator arguments\n");
663 case DEMANGLE_COMPONENT_TRINARY:
664 printf ("trinary operator\n");
666 case DEMANGLE_COMPONENT_TRINARY_ARG1:
667 printf ("trinary operator arguments 1\n");
669 case DEMANGLE_COMPONENT_TRINARY_ARG2:
670 printf ("trinary operator arguments 1\n");
672 case DEMANGLE_COMPONENT_LITERAL:
673 printf ("literal\n");
675 case DEMANGLE_COMPONENT_LITERAL_NEG:
676 printf ("negative literal\n");
678 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
679 printf ("java resource\n");
681 case DEMANGLE_COMPONENT_COMPOUND_NAME:
682 printf ("compound name\n");
684 case DEMANGLE_COMPONENT_CHARACTER:
685 printf ("character '%c'\n", dc->u.s_character.character);
687 case DEMANGLE_COMPONENT_DECLTYPE:
688 printf ("decltype\n");
690 case DEMANGLE_COMPONENT_PACK_EXPANSION:
691 printf ("pack expansion\n");
695 d_dump (d_left (dc), indent + 2);
696 d_dump (d_right (dc), indent + 2);
699 #endif /* CP_DEMANGLE_DEBUG */
701 /* Fill in a DEMANGLE_COMPONENT_NAME. */
703 CP_STATIC_IF_GLIBCPP_V3
705 cplus_demangle_fill_name (struct demangle_component *p, const char *s, int len)
707 if (p == NULL || s == NULL || len == 0)
709 p->type = DEMANGLE_COMPONENT_NAME;
711 p->u.s_name.len = len;
715 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
717 CP_STATIC_IF_GLIBCPP_V3
719 cplus_demangle_fill_extended_operator (struct demangle_component *p, int args,
720 struct demangle_component *name)
722 if (p == NULL || args < 0 || name == NULL)
724 p->type = DEMANGLE_COMPONENT_EXTENDED_OPERATOR;
725 p->u.s_extended_operator.args = args;
726 p->u.s_extended_operator.name = name;
730 /* Fill in a DEMANGLE_COMPONENT_CTOR. */
732 CP_STATIC_IF_GLIBCPP_V3
734 cplus_demangle_fill_ctor (struct demangle_component *p,
735 enum gnu_v3_ctor_kinds kind,
736 struct demangle_component *name)
740 || (int) kind < gnu_v3_complete_object_ctor
741 || (int) kind > gnu_v3_object_ctor_group)
743 p->type = DEMANGLE_COMPONENT_CTOR;
744 p->u.s_ctor.kind = kind;
745 p->u.s_ctor.name = name;
749 /* Fill in a DEMANGLE_COMPONENT_DTOR. */
751 CP_STATIC_IF_GLIBCPP_V3
753 cplus_demangle_fill_dtor (struct demangle_component *p,
754 enum gnu_v3_dtor_kinds kind,
755 struct demangle_component *name)
759 || (int) kind < gnu_v3_deleting_dtor
760 || (int) kind > gnu_v3_object_dtor_group)
762 p->type = DEMANGLE_COMPONENT_DTOR;
763 p->u.s_dtor.kind = kind;
764 p->u.s_dtor.name = name;
768 /* Add a new component. */
770 static struct demangle_component *
771 d_make_empty (struct d_info *di)
773 struct demangle_component *p;
775 if (di->next_comp >= di->num_comps)
777 p = &di->comps[di->next_comp];
782 /* Add a new generic component. */
784 static struct demangle_component *
785 d_make_comp (struct d_info *di, enum demangle_component_type type,
786 struct demangle_component *left,
787 struct demangle_component *right)
789 struct demangle_component *p;
791 /* We check for errors here. A typical error would be a NULL return
792 from a subroutine. We catch those here, and return NULL
796 /* These types require two parameters. */
797 case DEMANGLE_COMPONENT_QUAL_NAME:
798 case DEMANGLE_COMPONENT_LOCAL_NAME:
799 case DEMANGLE_COMPONENT_TYPED_NAME:
800 case DEMANGLE_COMPONENT_TEMPLATE:
801 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
802 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
803 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
804 case DEMANGLE_COMPONENT_UNARY:
805 case DEMANGLE_COMPONENT_BINARY:
806 case DEMANGLE_COMPONENT_BINARY_ARGS:
807 case DEMANGLE_COMPONENT_TRINARY:
808 case DEMANGLE_COMPONENT_TRINARY_ARG1:
809 case DEMANGLE_COMPONENT_TRINARY_ARG2:
810 case DEMANGLE_COMPONENT_LITERAL:
811 case DEMANGLE_COMPONENT_LITERAL_NEG:
812 case DEMANGLE_COMPONENT_COMPOUND_NAME:
813 case DEMANGLE_COMPONENT_VECTOR_TYPE:
814 case DEMANGLE_COMPONENT_CLONE:
815 if (left == NULL || right == NULL)
819 /* These types only require one parameter. */
820 case DEMANGLE_COMPONENT_VTABLE:
821 case DEMANGLE_COMPONENT_VTT:
822 case DEMANGLE_COMPONENT_TYPEINFO:
823 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
824 case DEMANGLE_COMPONENT_TYPEINFO_FN:
825 case DEMANGLE_COMPONENT_THUNK:
826 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
827 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
828 case DEMANGLE_COMPONENT_JAVA_CLASS:
829 case DEMANGLE_COMPONENT_GUARD:
830 case DEMANGLE_COMPONENT_REFTEMP:
831 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
832 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
833 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
834 case DEMANGLE_COMPONENT_POINTER:
835 case DEMANGLE_COMPONENT_REFERENCE:
836 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
837 case DEMANGLE_COMPONENT_COMPLEX:
838 case DEMANGLE_COMPONENT_IMAGINARY:
839 case DEMANGLE_COMPONENT_VENDOR_TYPE:
840 case DEMANGLE_COMPONENT_CAST:
841 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
842 case DEMANGLE_COMPONENT_DECLTYPE:
843 case DEMANGLE_COMPONENT_PACK_EXPANSION:
844 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
845 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
850 /* This needs a right parameter, but the left parameter can be
852 case DEMANGLE_COMPONENT_ARRAY_TYPE:
857 /* These are allowed to have no parameters--in some cases they
858 will be filled in later. */
859 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
860 case DEMANGLE_COMPONENT_RESTRICT:
861 case DEMANGLE_COMPONENT_VOLATILE:
862 case DEMANGLE_COMPONENT_CONST:
863 case DEMANGLE_COMPONENT_RESTRICT_THIS:
864 case DEMANGLE_COMPONENT_VOLATILE_THIS:
865 case DEMANGLE_COMPONENT_CONST_THIS:
866 case DEMANGLE_COMPONENT_ARGLIST:
867 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
870 /* Other types should not be seen here. */
875 p = d_make_empty (di);
879 p->u.s_binary.left = left;
880 p->u.s_binary.right = right;
885 /* Add a new demangle mangled name component. */
887 static struct demangle_component *
888 d_make_demangle_mangled_name (struct d_info *di, const char *s)
890 if (d_peek_char (di) != '_' || d_peek_next_char (di) != 'Z')
891 return d_make_name (di, s, strlen (s));
893 return d_encoding (di, 0);
896 /* Add a new name component. */
898 static struct demangle_component *
899 d_make_name (struct d_info *di, const char *s, int len)
901 struct demangle_component *p;
903 p = d_make_empty (di);
904 if (! cplus_demangle_fill_name (p, s, len))
909 /* Add a new builtin type component. */
911 static struct demangle_component *
912 d_make_builtin_type (struct d_info *di,
913 const struct demangle_builtin_type_info *type)
915 struct demangle_component *p;
919 p = d_make_empty (di);
922 p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE;
923 p->u.s_builtin.type = type;
928 /* Add a new operator component. */
930 static struct demangle_component *
931 d_make_operator (struct d_info *di, const struct demangle_operator_info *op)
933 struct demangle_component *p;
935 p = d_make_empty (di);
938 p->type = DEMANGLE_COMPONENT_OPERATOR;
939 p->u.s_operator.op = op;
944 /* Add a new extended operator component. */
946 static struct demangle_component *
947 d_make_extended_operator (struct d_info *di, int args,
948 struct demangle_component *name)
950 struct demangle_component *p;
952 p = d_make_empty (di);
953 if (! cplus_demangle_fill_extended_operator (p, args, name))
958 static struct demangle_component *
959 d_make_default_arg (struct d_info *di, int num,
960 struct demangle_component *sub)
962 struct demangle_component *p = d_make_empty (di);
965 p->type = DEMANGLE_COMPONENT_DEFAULT_ARG;
966 p->u.s_unary_num.num = num;
967 p->u.s_unary_num.sub = sub;
972 /* Add a new constructor component. */
974 static struct demangle_component *
975 d_make_ctor (struct d_info *di, enum gnu_v3_ctor_kinds kind,
976 struct demangle_component *name)
978 struct demangle_component *p;
980 p = d_make_empty (di);
981 if (! cplus_demangle_fill_ctor (p, kind, name))
986 /* Add a new destructor component. */
988 static struct demangle_component *
989 d_make_dtor (struct d_info *di, enum gnu_v3_dtor_kinds kind,
990 struct demangle_component *name)
992 struct demangle_component *p;
994 p = d_make_empty (di);
995 if (! cplus_demangle_fill_dtor (p, kind, name))
1000 /* Add a new template parameter. */
1002 static struct demangle_component *
1003 d_make_template_param (struct d_info *di, long i)
1005 struct demangle_component *p;
1007 p = d_make_empty (di);
1010 p->type = DEMANGLE_COMPONENT_TEMPLATE_PARAM;
1011 p->u.s_number.number = i;
1016 /* Add a new function parameter. */
1018 static struct demangle_component *
1019 d_make_function_param (struct d_info *di, long i)
1021 struct demangle_component *p;
1023 p = d_make_empty (di);
1026 p->type = DEMANGLE_COMPONENT_FUNCTION_PARAM;
1027 p->u.s_number.number = i;
1032 /* Add a new standard substitution component. */
1034 static struct demangle_component *
1035 d_make_sub (struct d_info *di, const char *name, int len)
1037 struct demangle_component *p;
1039 p = d_make_empty (di);
1042 p->type = DEMANGLE_COMPONENT_SUB_STD;
1043 p->u.s_string.string = name;
1044 p->u.s_string.len = len;
1049 /* <mangled-name> ::= _Z <encoding> [<clone-suffix>]*
1051 TOP_LEVEL is non-zero when called at the top level. */
1053 CP_STATIC_IF_GLIBCPP_V3
1054 struct demangle_component *
1055 cplus_demangle_mangled_name (struct d_info *di, int top_level)
1057 struct demangle_component *p;
1059 if (! d_check_char (di, '_')
1060 /* Allow missing _ if not at toplevel to work around a
1061 bug in G++ abi-version=2 mangling; see the comment in
1062 write_template_arg. */
1065 if (! d_check_char (di, 'Z'))
1067 p = d_encoding (di, top_level);
1069 /* If at top level and parsing parameters, check for a clone
1071 if (top_level && (di->options & DMGL_PARAMS) != 0)
1072 while (d_peek_char (di) == '.'
1073 && (IS_LOWER (d_peek_next_char (di))
1074 || d_peek_next_char (di) == '_'
1075 || IS_DIGIT (d_peek_next_char (di))))
1076 p = d_clone_suffix (di, p);
1081 /* Return whether a function should have a return type. The argument
1082 is the function name, which may be qualified in various ways. The
1083 rules are that template functions have return types with some
1084 exceptions, function types which are not part of a function name
1085 mangling have return types with some exceptions, and non-template
1086 function names do not have return types. The exceptions are that
1087 constructors, destructors, and conversion operators do not have
1091 has_return_type (struct demangle_component *dc)
1099 case DEMANGLE_COMPONENT_TEMPLATE:
1100 return ! is_ctor_dtor_or_conversion (d_left (dc));
1101 case DEMANGLE_COMPONENT_RESTRICT_THIS:
1102 case DEMANGLE_COMPONENT_VOLATILE_THIS:
1103 case DEMANGLE_COMPONENT_CONST_THIS:
1104 return has_return_type (d_left (dc));
1108 /* Return whether a name is a constructor, a destructor, or a
1109 conversion operator. */
1112 is_ctor_dtor_or_conversion (struct demangle_component *dc)
1120 case DEMANGLE_COMPONENT_QUAL_NAME:
1121 case DEMANGLE_COMPONENT_LOCAL_NAME:
1122 return is_ctor_dtor_or_conversion (d_right (dc));
1123 case DEMANGLE_COMPONENT_CTOR:
1124 case DEMANGLE_COMPONENT_DTOR:
1125 case DEMANGLE_COMPONENT_CAST:
1130 /* <encoding> ::= <(function) name> <bare-function-type>
1134 TOP_LEVEL is non-zero when called at the top level, in which case
1135 if DMGL_PARAMS is not set we do not demangle the function
1136 parameters. We only set this at the top level, because otherwise
1137 we would not correctly demangle names in local scopes. */
1139 static struct demangle_component *
1140 d_encoding (struct d_info *di, int top_level)
1142 char peek = d_peek_char (di);
1144 if (peek == 'G' || peek == 'T')
1145 return d_special_name (di);
1148 struct demangle_component *dc;
1152 if (dc != NULL && top_level && (di->options & DMGL_PARAMS) == 0)
1154 /* Strip off any initial CV-qualifiers, as they really apply
1155 to the `this' parameter, and they were not output by the
1156 v2 demangler without DMGL_PARAMS. */
1157 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1158 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1159 || dc->type == DEMANGLE_COMPONENT_CONST_THIS)
1162 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1163 there may be CV-qualifiers on its right argument which
1164 really apply here; this happens when parsing a class
1165 which is local to a function. */
1166 if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME)
1168 struct demangle_component *dcr;
1171 while (dcr->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1172 || dcr->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1173 || dcr->type == DEMANGLE_COMPONENT_CONST_THIS)
1175 dc->u.s_binary.right = dcr;
1181 peek = d_peek_char (di);
1182 if (dc == NULL || peek == '\0' || peek == 'E')
1184 return d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, dc,
1185 d_bare_function_type (di, has_return_type (dc)));
1189 /* <name> ::= <nested-name>
1191 ::= <unscoped-template-name> <template-args>
1194 <unscoped-name> ::= <unqualified-name>
1195 ::= St <unqualified-name>
1197 <unscoped-template-name> ::= <unscoped-name>
1201 static struct demangle_component *
1202 d_name (struct d_info *di)
1204 char peek = d_peek_char (di);
1205 struct demangle_component *dc;
1210 return d_nested_name (di);
1213 return d_local_name (di);
1217 return d_unqualified_name (di);
1223 if (d_peek_next_char (di) != 't')
1225 dc = d_substitution (di, 0);
1231 dc = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME,
1232 d_make_name (di, "std", 3),
1233 d_unqualified_name (di));
1238 if (d_peek_char (di) != 'I')
1240 /* The grammar does not permit this case to occur if we
1241 called d_substitution() above (i.e., subst == 1). We
1242 don't bother to check. */
1246 /* This is <template-args>, which means that we just saw
1247 <unscoped-template-name>, which is a substitution
1248 candidate if we didn't just get it from a
1252 if (! d_add_substitution (di, dc))
1255 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1256 d_template_args (di));
1263 dc = d_unqualified_name (di);
1264 if (d_peek_char (di) == 'I')
1266 /* This is <template-args>, which means that we just saw
1267 <unscoped-template-name>, which is a substitution
1269 if (! d_add_substitution (di, dc))
1271 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1272 d_template_args (di));
1278 /* <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
1279 ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
1282 static struct demangle_component *
1283 d_nested_name (struct d_info *di)
1285 struct demangle_component *ret;
1286 struct demangle_component **pret;
1288 if (! d_check_char (di, 'N'))
1291 pret = d_cv_qualifiers (di, &ret, 1);
1295 *pret = d_prefix (di);
1299 if (! d_check_char (di, 'E'))
1305 /* <prefix> ::= <prefix> <unqualified-name>
1306 ::= <template-prefix> <template-args>
1307 ::= <template-param>
1312 <template-prefix> ::= <prefix> <(template) unqualified-name>
1313 ::= <template-param>
1317 static struct demangle_component *
1318 d_prefix (struct d_info *di)
1320 struct demangle_component *ret = NULL;
1325 enum demangle_component_type comb_type;
1326 struct demangle_component *dc;
1328 peek = d_peek_char (di);
1332 /* The older code accepts a <local-name> here, but I don't see
1333 that in the grammar. The older code does not accept a
1334 <template-param> here. */
1336 comb_type = DEMANGLE_COMPONENT_QUAL_NAME;
1339 char peek2 = d_peek_next_char (di);
1340 if (peek2 == 'T' || peek2 == 't')
1342 dc = cplus_demangle_type (di);
1344 /* Destructor name. */
1345 dc = d_unqualified_name (di);
1347 else if (IS_DIGIT (peek)
1352 dc = d_unqualified_name (di);
1353 else if (peek == 'S')
1354 dc = d_substitution (di, 1);
1355 else if (peek == 'I')
1359 comb_type = DEMANGLE_COMPONENT_TEMPLATE;
1360 dc = d_template_args (di);
1362 else if (peek == 'T')
1363 dc = d_template_param (di);
1364 else if (peek == 'E')
1366 else if (peek == 'M')
1368 /* Initializer scope for a lambda. We don't need to represent
1369 this; the normal code will just treat the variable as a type
1370 scope, which gives appropriate output. */
1382 ret = d_make_comp (di, comb_type, ret, dc);
1384 if (peek != 'S' && d_peek_char (di) != 'E')
1386 if (! d_add_substitution (di, ret))
1392 /* <unqualified-name> ::= <operator-name>
1393 ::= <ctor-dtor-name>
1395 ::= <local-source-name>
1397 <local-source-name> ::= L <source-name> <discriminator>
1400 static struct demangle_component *
1401 d_unqualified_name (struct d_info *di)
1405 peek = d_peek_char (di);
1406 if (IS_DIGIT (peek))
1407 return d_source_name (di);
1408 else if (IS_LOWER (peek))
1410 struct demangle_component *ret;
1412 ret = d_operator_name (di);
1413 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_OPERATOR)
1414 di->expansion += sizeof "operator" + ret->u.s_operator.op->len - 2;
1417 else if (peek == 'C' || peek == 'D')
1418 return d_ctor_dtor_name (di);
1419 else if (peek == 'L')
1421 struct demangle_component * ret;
1425 ret = d_source_name (di);
1428 if (! d_discriminator (di))
1432 else if (peek == 'U')
1434 switch (d_peek_next_char (di))
1437 return d_lambda (di);
1439 return d_unnamed_type (di);
1448 /* <source-name> ::= <(positive length) number> <identifier> */
1450 static struct demangle_component *
1451 d_source_name (struct d_info *di)
1454 struct demangle_component *ret;
1456 len = d_number (di);
1459 ret = d_identifier (di, len);
1460 di->last_name = ret;
1464 /* number ::= [n] <(non-negative decimal integer)> */
1467 d_number (struct d_info *di)
1474 peek = d_peek_char (di);
1479 peek = d_peek_char (di);
1485 if (! IS_DIGIT (peek))
1491 ret = ret * 10 + peek - '0';
1493 peek = d_peek_char (di);
1497 /* Like d_number, but returns a demangle_component. */
1499 static struct demangle_component *
1500 d_number_component (struct d_info *di)
1502 struct demangle_component *ret = d_make_empty (di);
1505 ret->type = DEMANGLE_COMPONENT_NUMBER;
1506 ret->u.s_number.number = d_number (di);
1511 /* identifier ::= <(unqualified source code identifier)> */
1513 static struct demangle_component *
1514 d_identifier (struct d_info *di, int len)
1520 if (di->send - name < len)
1523 d_advance (di, len);
1525 /* A Java mangled name may have a trailing '$' if it is a C++
1526 keyword. This '$' is not included in the length count. We just
1528 if ((di->options & DMGL_JAVA) != 0
1529 && d_peek_char (di) == '$')
1532 /* Look for something which looks like a gcc encoding of an
1533 anonymous namespace, and replace it with a more user friendly
1535 if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
1536 && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX,
1537 ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0)
1541 s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN;
1542 if ((*s == '.' || *s == '_' || *s == '$')
1545 di->expansion -= len - sizeof "(anonymous namespace)";
1546 return d_make_name (di, "(anonymous namespace)",
1547 sizeof "(anonymous namespace)" - 1);
1551 return d_make_name (di, name, len);
1554 /* operator_name ::= many different two character encodings.
1556 ::= v <digit> <source-name>
1558 This list is sorted for binary search. */
1560 #define NL(s) s, (sizeof s) - 1
1562 CP_STATIC_IF_GLIBCPP_V3
1563 const struct demangle_operator_info cplus_demangle_operators[] =
1565 { "aN", NL ("&="), 2 },
1566 { "aS", NL ("="), 2 },
1567 { "aa", NL ("&&"), 2 },
1568 { "ad", NL ("&"), 1 },
1569 { "an", NL ("&"), 2 },
1570 { "at", NL ("alignof "), 1 },
1571 { "az", NL ("alignof "), 1 },
1572 { "cl", NL ("()"), 2 },
1573 { "cm", NL (","), 2 },
1574 { "co", NL ("~"), 1 },
1575 { "dV", NL ("/="), 2 },
1576 { "da", NL ("delete[]"), 1 },
1577 { "de", NL ("*"), 1 },
1578 { "dl", NL ("delete"), 1 },
1579 { "dt", NL ("."), 2 },
1580 { "dv", NL ("/"), 2 },
1581 { "eO", NL ("^="), 2 },
1582 { "eo", NL ("^"), 2 },
1583 { "eq", NL ("=="), 2 },
1584 { "ge", NL (">="), 2 },
1585 { "gt", NL (">"), 2 },
1586 { "ix", NL ("[]"), 2 },
1587 { "lS", NL ("<<="), 2 },
1588 { "le", NL ("<="), 2 },
1589 { "ls", NL ("<<"), 2 },
1590 { "lt", NL ("<"), 2 },
1591 { "mI", NL ("-="), 2 },
1592 { "mL", NL ("*="), 2 },
1593 { "mi", NL ("-"), 2 },
1594 { "ml", NL ("*"), 2 },
1595 { "mm", NL ("--"), 1 },
1596 { "na", NL ("new[]"), 1 },
1597 { "ne", NL ("!="), 2 },
1598 { "ng", NL ("-"), 1 },
1599 { "nt", NL ("!"), 1 },
1600 { "nw", NL ("new"), 1 },
1601 { "oR", NL ("|="), 2 },
1602 { "oo", NL ("||"), 2 },
1603 { "or", NL ("|"), 2 },
1604 { "pL", NL ("+="), 2 },
1605 { "pl", NL ("+"), 2 },
1606 { "pm", NL ("->*"), 2 },
1607 { "pp", NL ("++"), 1 },
1608 { "ps", NL ("+"), 1 },
1609 { "pt", NL ("->"), 2 },
1610 { "qu", NL ("?"), 3 },
1611 { "rM", NL ("%="), 2 },
1612 { "rS", NL (">>="), 2 },
1613 { "rm", NL ("%"), 2 },
1614 { "rs", NL (">>"), 2 },
1615 { "st", NL ("sizeof "), 1 },
1616 { "sz", NL ("sizeof "), 1 },
1617 { NULL, NULL, 0, 0 }
1620 static struct demangle_component *
1621 d_operator_name (struct d_info *di)
1626 c1 = d_next_char (di);
1627 c2 = d_next_char (di);
1628 if (c1 == 'v' && IS_DIGIT (c2))
1629 return d_make_extended_operator (di, c2 - '0', d_source_name (di));
1630 else if (c1 == 'c' && c2 == 'v')
1631 return d_make_comp (di, DEMANGLE_COMPONENT_CAST,
1632 cplus_demangle_type (di), NULL);
1635 /* LOW is the inclusive lower bound. */
1637 /* HIGH is the exclusive upper bound. We subtract one to ignore
1638 the sentinel at the end of the array. */
1639 int high = ((sizeof (cplus_demangle_operators)
1640 / sizeof (cplus_demangle_operators[0]))
1646 const struct demangle_operator_info *p;
1648 i = low + (high - low) / 2;
1649 p = cplus_demangle_operators + i;
1651 if (c1 == p->code[0] && c2 == p->code[1])
1652 return d_make_operator (di, p);
1654 if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1]))
1664 static struct demangle_component *
1665 d_make_character (struct d_info *di, int c)
1667 struct demangle_component *p;
1668 p = d_make_empty (di);
1671 p->type = DEMANGLE_COMPONENT_CHARACTER;
1672 p->u.s_character.character = c;
1677 static struct demangle_component *
1678 d_java_resource (struct d_info *di)
1680 struct demangle_component *p = NULL;
1681 struct demangle_component *next = NULL;
1686 len = d_number (di);
1690 /* Eat the leading '_'. */
1691 if (d_next_char (di) != '_')
1704 /* Each chunk is either a '$' escape... */
1722 next = d_make_character (di, c);
1730 /* ... or a sequence of characters. */
1733 while (i < len && str[i] && str[i] != '$')
1736 next = d_make_name (di, str, i);
1749 p = d_make_comp (di, DEMANGLE_COMPONENT_COMPOUND_NAME, p, next);
1755 p = d_make_comp (di, DEMANGLE_COMPONENT_JAVA_RESOURCE, p, NULL);
1760 /* <special-name> ::= TV <type>
1764 ::= GV <(object) name>
1765 ::= T <call-offset> <(base) encoding>
1766 ::= Tc <call-offset> <call-offset> <(base) encoding>
1767 Also g++ extensions:
1768 ::= TC <type> <(offset) number> _ <(base) type>
1773 ::= Gr <resource name>
1778 static struct demangle_component *
1779 d_special_name (struct d_info *di)
1781 di->expansion += 20;
1782 if (d_check_char (di, 'T'))
1784 switch (d_next_char (di))
1788 return d_make_comp (di, DEMANGLE_COMPONENT_VTABLE,
1789 cplus_demangle_type (di), NULL);
1791 di->expansion -= 10;
1792 return d_make_comp (di, DEMANGLE_COMPONENT_VTT,
1793 cplus_demangle_type (di), NULL);
1795 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO,
1796 cplus_demangle_type (di), NULL);
1798 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_NAME,
1799 cplus_demangle_type (di), NULL);
1802 if (! d_call_offset (di, 'h'))
1804 return d_make_comp (di, DEMANGLE_COMPONENT_THUNK,
1805 d_encoding (di, 0), NULL);
1808 if (! d_call_offset (di, 'v'))
1810 return d_make_comp (di, DEMANGLE_COMPONENT_VIRTUAL_THUNK,
1811 d_encoding (di, 0), NULL);
1814 if (! d_call_offset (di, '\0'))
1816 if (! d_call_offset (di, '\0'))
1818 return d_make_comp (di, DEMANGLE_COMPONENT_COVARIANT_THUNK,
1819 d_encoding (di, 0), NULL);
1823 struct demangle_component *derived_type;
1825 struct demangle_component *base_type;
1827 derived_type = cplus_demangle_type (di);
1828 offset = d_number (di);
1831 if (! d_check_char (di, '_'))
1833 base_type = cplus_demangle_type (di);
1834 /* We don't display the offset. FIXME: We should display
1835 it in verbose mode. */
1837 return d_make_comp (di, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE,
1838 base_type, derived_type);
1842 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_FN,
1843 cplus_demangle_type (di), NULL);
1845 return d_make_comp (di, DEMANGLE_COMPONENT_JAVA_CLASS,
1846 cplus_demangle_type (di), NULL);
1852 else if (d_check_char (di, 'G'))
1854 switch (d_next_char (di))
1857 return d_make_comp (di, DEMANGLE_COMPONENT_GUARD, d_name (di), NULL);
1861 struct demangle_component *name = d_name (di);
1862 return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, name,
1863 d_number_component (di));
1867 return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS,
1868 d_encoding (di, 0), NULL);
1871 switch (d_next_char (di))
1874 return d_make_comp (di, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE,
1875 d_encoding (di, 0), NULL);
1877 /* ??? The proposal is that other letters (such as 'h') stand
1878 for different variants of transaction cloning, such as
1879 compiling directly for hardware transaction support. But
1880 they still should all be transactional clones of some sort
1881 so go ahead and call them that. */
1883 return d_make_comp (di, DEMANGLE_COMPONENT_TRANSACTION_CLONE,
1884 d_encoding (di, 0), NULL);
1888 return d_java_resource (di);
1898 /* <call-offset> ::= h <nv-offset> _
1901 <nv-offset> ::= <(offset) number>
1903 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
1905 The C parameter, if not '\0', is a character we just read which is
1906 the start of the <call-offset>.
1908 We don't display the offset information anywhere. FIXME: We should
1909 display it in verbose mode. */
1912 d_call_offset (struct d_info *di, int c)
1915 c = d_next_char (di);
1922 if (! d_check_char (di, '_'))
1929 if (! d_check_char (di, '_'))
1935 /* <ctor-dtor-name> ::= C1
1943 static struct demangle_component *
1944 d_ctor_dtor_name (struct d_info *di)
1946 if (di->last_name != NULL)
1948 if (di->last_name->type == DEMANGLE_COMPONENT_NAME)
1949 di->expansion += di->last_name->u.s_name.len;
1950 else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD)
1951 di->expansion += di->last_name->u.s_string.len;
1953 switch (d_peek_char (di))
1957 enum gnu_v3_ctor_kinds kind;
1959 switch (d_peek_next_char (di))
1962 kind = gnu_v3_complete_object_ctor;
1965 kind = gnu_v3_base_object_ctor;
1968 kind = gnu_v3_complete_object_allocating_ctor;
1971 kind = gnu_v3_object_ctor_group;
1977 return d_make_ctor (di, kind, di->last_name);
1982 enum gnu_v3_dtor_kinds kind;
1984 switch (d_peek_next_char (di))
1987 kind = gnu_v3_deleting_dtor;
1990 kind = gnu_v3_complete_object_dtor;
1993 kind = gnu_v3_base_object_dtor;
1996 kind = gnu_v3_object_dtor_group;
2002 return d_make_dtor (di, kind, di->last_name);
2010 /* <type> ::= <builtin-type>
2012 ::= <class-enum-type>
2014 ::= <pointer-to-member-type>
2015 ::= <template-param>
2016 ::= <template-template-param> <template-args>
2018 ::= <CV-qualifiers> <type>
2021 ::= O <type> (C++0x)
2024 ::= U <source-name> <type>
2026 <builtin-type> ::= various one letter codes
2030 CP_STATIC_IF_GLIBCPP_V3
2031 const struct demangle_builtin_type_info
2032 cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] =
2034 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT },
2035 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL },
2036 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT },
2037 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT },
2038 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT },
2039 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT },
2040 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT },
2041 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT },
2042 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT },
2043 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED },
2044 /* k */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2045 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG },
2046 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG },
2047 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT },
2048 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2050 /* p */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2051 /* q */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2052 /* r */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2053 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT },
2054 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
2055 /* u */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2056 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID },
2057 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT },
2058 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG },
2059 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2060 D_PRINT_UNSIGNED_LONG_LONG },
2061 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT },
2062 /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT },
2063 /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT },
2064 /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT },
2065 /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT },
2066 /* 30 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT },
2067 /* 31 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT },
2068 /* 32 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"),
2072 CP_STATIC_IF_GLIBCPP_V3
2073 struct demangle_component *
2074 cplus_demangle_type (struct d_info *di)
2077 struct demangle_component *ret;
2080 /* The ABI specifies that when CV-qualifiers are used, the base type
2081 is substitutable, and the fully qualified type is substitutable,
2082 but the base type with a strict subset of the CV-qualifiers is
2083 not substitutable. The natural recursive implementation of the
2084 CV-qualifiers would cause subsets to be substitutable, so instead
2085 we pull them all off now.
2087 FIXME: The ABI says that order-insensitive vendor qualifiers
2088 should be handled in the same way, but we have no way to tell
2089 which vendor qualifiers are order-insensitive and which are
2090 order-sensitive. So we just assume that they are all
2091 order-sensitive. g++ 3.4 supports only one vendor qualifier,
2092 __vector, and it treats it as order-sensitive when mangling
2095 peek = d_peek_char (di);
2096 if (peek == 'r' || peek == 'V' || peek == 'K')
2098 struct demangle_component **pret;
2100 pret = d_cv_qualifiers (di, &ret, 0);
2103 *pret = cplus_demangle_type (di);
2104 if (! *pret || ! d_add_substitution (di, ret))
2113 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2114 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
2115 case 'o': case 's': case 't':
2116 case 'v': case 'w': case 'x': case 'y': case 'z':
2117 ret = d_make_builtin_type (di,
2118 &cplus_demangle_builtin_types[peek - 'a']);
2119 di->expansion += ret->u.s_builtin.type->len;
2126 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE,
2127 d_source_name (di), NULL);
2131 ret = d_function_type (di);
2134 case '0': case '1': case '2': case '3': case '4':
2135 case '5': case '6': case '7': case '8': case '9':
2138 ret = d_class_enum_type (di);
2142 ret = d_array_type (di);
2146 ret = d_pointer_to_member_type (di);
2150 ret = d_template_param (di);
2151 if (d_peek_char (di) == 'I')
2153 /* This is <template-template-param> <template-args>. The
2154 <template-template-param> part is a substitution
2156 if (! d_add_substitution (di, ret))
2158 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2159 d_template_args (di));
2164 /* If this is a special substitution, then it is the start of
2165 <class-enum-type>. */
2169 peek_next = d_peek_next_char (di);
2170 if (IS_DIGIT (peek_next)
2172 || IS_UPPER (peek_next))
2174 ret = d_substitution (di, 0);
2175 /* The substituted name may have been a template name and
2176 may be followed by tepmlate args. */
2177 if (d_peek_char (di) == 'I')
2178 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2179 d_template_args (di));
2185 ret = d_class_enum_type (di);
2186 /* If the substitution was a complete type, then it is not
2187 a new substitution candidate. However, if the
2188 substitution was followed by template arguments, then
2189 the whole thing is a substitution candidate. */
2190 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD)
2198 ret = d_make_comp (di, DEMANGLE_COMPONENT_RVALUE_REFERENCE,
2199 cplus_demangle_type (di), NULL);
2204 ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER,
2205 cplus_demangle_type (di), NULL);
2210 ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE,
2211 cplus_demangle_type (di), NULL);
2216 ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX,
2217 cplus_demangle_type (di), NULL);
2222 ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY,
2223 cplus_demangle_type (di), NULL);
2228 ret = d_source_name (di);
2229 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL,
2230 cplus_demangle_type (di), ret);
2236 peek = d_next_char (di);
2241 /* decltype (expression) */
2242 ret = d_make_comp (di, DEMANGLE_COMPONENT_DECLTYPE,
2243 d_expression (di), NULL);
2244 if (ret && d_next_char (di) != 'E')
2250 /* Pack expansion. */
2251 ret = d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
2252 cplus_demangle_type (di), NULL);
2257 /* 32-bit decimal floating point */
2258 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[26]);
2259 di->expansion += ret->u.s_builtin.type->len;
2263 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[27]);
2264 di->expansion += ret->u.s_builtin.type->len;
2268 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[28]);
2269 di->expansion += ret->u.s_builtin.type->len;
2272 /* 16-bit half-precision FP */
2273 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[29]);
2274 di->expansion += ret->u.s_builtin.type->len;
2278 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[30]);
2279 di->expansion += ret->u.s_builtin.type->len;
2283 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[31]);
2284 di->expansion += ret->u.s_builtin.type->len;
2288 /* Fixed point types. DF<int bits><length><fract bits><sat> */
2289 ret = d_make_empty (di);
2290 ret->type = DEMANGLE_COMPONENT_FIXED_TYPE;
2291 if ((ret->u.s_fixed.accum = IS_DIGIT (d_peek_char (di))))
2292 /* For demangling we don't care about the bits. */
2294 ret->u.s_fixed.length = cplus_demangle_type (di);
2295 if (ret->u.s_fixed.length == NULL)
2298 peek = d_next_char (di);
2299 ret->u.s_fixed.sat = (peek == 's');
2303 ret = d_vector_type (di);
2308 /* decltype(nullptr) */
2309 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[32]);
2310 di->expansion += ret->u.s_builtin.type->len;
2324 if (! d_add_substitution (di, ret))
2331 /* <CV-qualifiers> ::= [r] [V] [K] */
2333 static struct demangle_component **
2334 d_cv_qualifiers (struct d_info *di,
2335 struct demangle_component **pret, int member_fn)
2337 struct demangle_component **pstart;
2341 peek = d_peek_char (di);
2342 while (peek == 'r' || peek == 'V' || peek == 'K')
2344 enum demangle_component_type t;
2350 ? DEMANGLE_COMPONENT_RESTRICT_THIS
2351 : DEMANGLE_COMPONENT_RESTRICT);
2352 di->expansion += sizeof "restrict";
2354 else if (peek == 'V')
2357 ? DEMANGLE_COMPONENT_VOLATILE_THIS
2358 : DEMANGLE_COMPONENT_VOLATILE);
2359 di->expansion += sizeof "volatile";
2364 ? DEMANGLE_COMPONENT_CONST_THIS
2365 : DEMANGLE_COMPONENT_CONST);
2366 di->expansion += sizeof "const";
2369 *pret = d_make_comp (di, t, NULL, NULL);
2372 pret = &d_left (*pret);
2374 peek = d_peek_char (di);
2377 if (!member_fn && peek == 'F')
2379 while (pstart != pret)
2381 switch ((*pstart)->type)
2383 case DEMANGLE_COMPONENT_RESTRICT:
2384 (*pstart)->type = DEMANGLE_COMPONENT_RESTRICT_THIS;
2386 case DEMANGLE_COMPONENT_VOLATILE:
2387 (*pstart)->type = DEMANGLE_COMPONENT_VOLATILE_THIS;
2389 case DEMANGLE_COMPONENT_CONST:
2390 (*pstart)->type = DEMANGLE_COMPONENT_CONST_THIS;
2395 pstart = &d_left (*pstart);
2402 /* <function-type> ::= F [Y] <bare-function-type> E */
2404 static struct demangle_component *
2405 d_function_type (struct d_info *di)
2407 struct demangle_component *ret;
2409 if (! d_check_char (di, 'F'))
2411 if (d_peek_char (di) == 'Y')
2413 /* Function has C linkage. We don't print this information.
2414 FIXME: We should print it in verbose mode. */
2417 ret = d_bare_function_type (di, 1);
2418 if (! d_check_char (di, 'E'))
2425 static struct demangle_component *
2426 d_parmlist (struct d_info *di)
2428 struct demangle_component *tl;
2429 struct demangle_component **ptl;
2435 struct demangle_component *type;
2437 char peek = d_peek_char (di);
2438 if (peek == '\0' || peek == 'E' || peek == '.')
2440 type = cplus_demangle_type (di);
2443 *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL);
2446 ptl = &d_right (*ptl);
2449 /* There should be at least one parameter type besides the optional
2450 return type. A function which takes no arguments will have a
2451 single parameter type void. */
2455 /* If we have a single parameter type void, omit it. */
2456 if (d_right (tl) == NULL
2457 && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
2458 && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
2460 di->expansion -= d_left (tl)->u.s_builtin.type->len;
2467 /* <bare-function-type> ::= [J]<type>+ */
2469 static struct demangle_component *
2470 d_bare_function_type (struct d_info *di, int has_return_type)
2472 struct demangle_component *return_type;
2473 struct demangle_component *tl;
2476 /* Detect special qualifier indicating that the first argument
2477 is the return type. */
2478 peek = d_peek_char (di);
2482 has_return_type = 1;
2485 if (has_return_type)
2487 return_type = cplus_demangle_type (di);
2488 if (return_type == NULL)
2494 tl = d_parmlist (di);
2498 return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE,
2502 /* <class-enum-type> ::= <name> */
2504 static struct demangle_component *
2505 d_class_enum_type (struct d_info *di)
2510 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2511 ::= A [<(dimension) expression>] _ <(element) type>
2514 static struct demangle_component *
2515 d_array_type (struct d_info *di)
2518 struct demangle_component *dim;
2520 if (! d_check_char (di, 'A'))
2523 peek = d_peek_char (di);
2526 else if (IS_DIGIT (peek))
2534 peek = d_peek_char (di);
2536 while (IS_DIGIT (peek));
2537 dim = d_make_name (di, s, d_str (di) - s);
2543 dim = d_expression (di);
2548 if (! d_check_char (di, '_'))
2551 return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim,
2552 cplus_demangle_type (di));
2555 /* <vector-type> ::= Dv <number> _ <type>
2556 ::= Dv _ <expression> _ <type> */
2558 static struct demangle_component *
2559 d_vector_type (struct d_info *di)
2562 struct demangle_component *dim;
2564 peek = d_peek_char (di);
2568 dim = d_expression (di);
2571 dim = d_number_component (di);
2576 if (! d_check_char (di, '_'))
2579 return d_make_comp (di, DEMANGLE_COMPONENT_VECTOR_TYPE, dim,
2580 cplus_demangle_type (di));
2583 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
2585 static struct demangle_component *
2586 d_pointer_to_member_type (struct d_info *di)
2588 struct demangle_component *cl;
2589 struct demangle_component *mem;
2590 struct demangle_component **pmem;
2592 if (! d_check_char (di, 'M'))
2595 cl = cplus_demangle_type (di);
2597 /* The ABI specifies that any type can be a substitution source, and
2598 that M is followed by two types, and that when a CV-qualified
2599 type is seen both the base type and the CV-qualified types are
2600 substitution sources. The ABI also specifies that for a pointer
2601 to a CV-qualified member function, the qualifiers are attached to
2602 the second type. Given the grammar, a plain reading of the ABI
2603 suggests that both the CV-qualified member function and the
2604 non-qualified member function are substitution sources. However,
2605 g++ does not work that way. g++ treats only the CV-qualified
2606 member function as a substitution source. FIXME. So to work
2607 with g++, we need to pull off the CV-qualifiers here, in order to
2608 avoid calling add_substitution() in cplus_demangle_type(). But
2609 for a CV-qualified member which is not a function, g++ does
2610 follow the ABI, so we need to handle that case here by calling
2611 d_add_substitution ourselves. */
2613 pmem = d_cv_qualifiers (di, &mem, 1);
2616 *pmem = cplus_demangle_type (di);
2620 if (pmem != &mem && (*pmem)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
2622 if (! d_add_substitution (di, mem))
2626 return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem);
2629 /* <non-negative number> _ */
2632 d_compact_number (struct d_info *di)
2635 if (d_peek_char (di) == '_')
2637 else if (d_peek_char (di) == 'n')
2640 num = d_number (di) + 1;
2642 if (! d_check_char (di, '_'))
2647 /* <template-param> ::= T_
2648 ::= T <(parameter-2 non-negative) number> _
2651 static struct demangle_component *
2652 d_template_param (struct d_info *di)
2656 if (! d_check_char (di, 'T'))
2659 param = d_compact_number (di);
2665 return d_make_template_param (di, param);
2668 /* <template-args> ::= I <template-arg>+ E */
2670 static struct demangle_component *
2671 d_template_args (struct d_info *di)
2673 struct demangle_component *hold_last_name;
2674 struct demangle_component *al;
2675 struct demangle_component **pal;
2677 /* Preserve the last name we saw--don't let the template arguments
2678 clobber it, as that would give us the wrong name for a subsequent
2679 constructor or destructor. */
2680 hold_last_name = di->last_name;
2682 if (! d_check_char (di, 'I'))
2685 if (d_peek_char (di) == 'E')
2687 /* An argument pack can be empty. */
2689 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, NULL, NULL);
2696 struct demangle_component *a;
2698 a = d_template_arg (di);
2702 *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL);
2705 pal = &d_right (*pal);
2707 if (d_peek_char (di) == 'E')
2714 di->last_name = hold_last_name;
2719 /* <template-arg> ::= <type>
2720 ::= X <expression> E
2724 static struct demangle_component *
2725 d_template_arg (struct d_info *di)
2727 struct demangle_component *ret;
2729 switch (d_peek_char (di))
2733 ret = d_expression (di);
2734 if (! d_check_char (di, 'E'))
2739 return d_expr_primary (di);
2742 /* An argument pack. */
2743 return d_template_args (di);
2746 return cplus_demangle_type (di);
2750 /* Subroutine of <expression> ::= cl <expression>+ E */
2752 static struct demangle_component *
2753 d_exprlist (struct d_info *di)
2755 struct demangle_component *list = NULL;
2756 struct demangle_component **p = &list;
2758 if (d_peek_char (di) == 'E')
2761 return d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, NULL, NULL);
2766 struct demangle_component *arg = d_expression (di);
2770 *p = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, arg, NULL);
2775 if (d_peek_char (di) == 'E')
2785 /* <expression> ::= <(unary) operator-name> <expression>
2786 ::= <(binary) operator-name> <expression> <expression>
2787 ::= <(trinary) operator-name> <expression> <expression> <expression>
2788 ::= cl <expression>+ E
2790 ::= <template-param>
2791 ::= sr <type> <unqualified-name>
2792 ::= sr <type> <unqualified-name> <template-args>
2796 static struct demangle_component *
2797 d_expression (struct d_info *di)
2801 peek = d_peek_char (di);
2803 return d_expr_primary (di);
2804 else if (peek == 'T')
2805 return d_template_param (di);
2806 else if (peek == 's' && d_peek_next_char (di) == 'r')
2808 struct demangle_component *type;
2809 struct demangle_component *name;
2812 type = cplus_demangle_type (di);
2813 name = d_unqualified_name (di);
2814 if (d_peek_char (di) != 'I')
2815 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name);
2817 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type,
2818 d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
2819 d_template_args (di)));
2821 else if (peek == 's' && d_peek_next_char (di) == 'p')
2824 return d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
2825 d_expression (di), NULL);
2827 else if (peek == 'f' && d_peek_next_char (di) == 'p')
2829 /* Function parameter used in a late-specified return type. */
2832 if (d_peek_char (di) == 'T')
2834 /* 'this' parameter. */
2840 index = d_compact_number (di) + 1;
2844 return d_make_function_param (di, index);
2846 else if (IS_DIGIT (peek)
2847 || (peek == 'o' && d_peek_next_char (di) == 'n'))
2849 /* We can get an unqualified name as an expression in the case of
2850 a dependent function call, i.e. decltype(f(t)). */
2851 struct demangle_component *name;
2854 /* operator-function-id, i.e. operator+(t). */
2857 name = d_unqualified_name (di);
2860 if (d_peek_char (di) == 'I')
2861 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
2862 d_template_args (di));
2868 struct demangle_component *op;
2871 op = d_operator_name (di);
2875 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
2876 di->expansion += op->u.s_operator.op->len - 2;
2878 if (op->type == DEMANGLE_COMPONENT_OPERATOR
2879 && strcmp (op->u.s_operator.op->code, "st") == 0)
2880 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
2881 cplus_demangle_type (di));
2887 case DEMANGLE_COMPONENT_OPERATOR:
2888 args = op->u.s_operator.op->args;
2890 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
2891 args = op->u.s_extended_operator.args;
2893 case DEMANGLE_COMPONENT_CAST:
2902 struct demangle_component *operand;
2903 if (op->type == DEMANGLE_COMPONENT_CAST
2904 && d_check_char (di, '_'))
2905 operand = d_exprlist (di);
2907 operand = d_expression (di);
2908 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
2913 struct demangle_component *left;
2914 struct demangle_component *right;
2915 const char *code = op->u.s_operator.op->code;
2917 left = d_expression (di);
2918 if (!strcmp (code, "cl"))
2919 right = d_exprlist (di);
2920 else if (!strcmp (code, "dt") || !strcmp (code, "pt"))
2922 right = d_unqualified_name (di);
2923 if (d_peek_char (di) == 'I')
2924 right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE,
2925 right, d_template_args (di));
2928 right = d_expression (di);
2930 return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
2932 DEMANGLE_COMPONENT_BINARY_ARGS,
2937 struct demangle_component *first;
2938 struct demangle_component *second;
2940 first = d_expression (di);
2941 second = d_expression (di);
2942 return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op,
2944 DEMANGLE_COMPONENT_TRINARY_ARG1,
2947 DEMANGLE_COMPONENT_TRINARY_ARG2,
2949 d_expression (di))));
2957 /* <expr-primary> ::= L <type> <(value) number> E
2958 ::= L <type> <(value) float> E
2959 ::= L <mangled-name> E
2962 static struct demangle_component *
2963 d_expr_primary (struct d_info *di)
2965 struct demangle_component *ret;
2967 if (! d_check_char (di, 'L'))
2969 if (d_peek_char (di) == '_'
2970 /* Workaround for G++ bug; see comment in write_template_arg. */
2971 || d_peek_char (di) == 'Z')
2972 ret = cplus_demangle_mangled_name (di, 0);
2975 struct demangle_component *type;
2976 enum demangle_component_type t;
2979 type = cplus_demangle_type (di);
2983 /* If we have a type we know how to print, we aren't going to
2984 print the type name itself. */
2985 if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
2986 && type->u.s_builtin.type->print != D_PRINT_DEFAULT)
2987 di->expansion -= type->u.s_builtin.type->len;
2989 /* Rather than try to interpret the literal value, we just
2990 collect it as a string. Note that it's possible to have a
2991 floating point literal here. The ABI specifies that the
2992 format of such literals is machine independent. That's fine,
2993 but what's not fine is that versions of g++ up to 3.2 with
2994 -fabi-version=1 used upper case letters in the hex constant,
2995 and dumped out gcc's internal representation. That makes it
2996 hard to tell where the constant ends, and hard to dump the
2997 constant in any readable form anyhow. We don't attempt to
2998 handle these cases. */
3000 t = DEMANGLE_COMPONENT_LITERAL;
3001 if (d_peek_char (di) == 'n')
3003 t = DEMANGLE_COMPONENT_LITERAL_NEG;
3007 while (d_peek_char (di) != 'E')
3009 if (d_peek_char (di) == '\0')
3013 ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s));
3015 if (! d_check_char (di, 'E'))
3020 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3021 ::= Z <(function) encoding> E s [<discriminator>]
3024 static struct demangle_component *
3025 d_local_name (struct d_info *di)
3027 struct demangle_component *function;
3029 if (! d_check_char (di, 'Z'))
3032 function = d_encoding (di, 0);
3034 if (! d_check_char (di, 'E'))
3037 if (d_peek_char (di) == 's')
3040 if (! d_discriminator (di))
3042 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function,
3043 d_make_name (di, "string literal",
3044 sizeof "string literal" - 1));
3048 struct demangle_component *name;
3051 if (d_peek_char (di) == 'd')
3053 /* Default argument scope: d <number> _. */
3055 num = d_compact_number (di);
3064 /* Lambdas and unnamed types have internal discriminators. */
3065 case DEMANGLE_COMPONENT_LAMBDA:
3066 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
3069 if (! d_discriminator (di))
3073 name = d_make_default_arg (di, num, name);
3074 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
3078 /* <discriminator> ::= _ <(non-negative) number>
3080 We demangle the discriminator, but we don't print it out. FIXME:
3081 We should print it out in verbose mode. */
3084 d_discriminator (struct d_info *di)
3088 if (d_peek_char (di) != '_')
3091 discrim = d_number (di);
3097 /* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */
3099 static struct demangle_component *
3100 d_lambda (struct d_info *di)
3102 struct demangle_component *tl;
3103 struct demangle_component *ret;
3106 if (! d_check_char (di, 'U'))
3108 if (! d_check_char (di, 'l'))
3111 tl = d_parmlist (di);
3115 if (! d_check_char (di, 'E'))
3118 num = d_compact_number (di);
3122 ret = d_make_empty (di);
3125 ret->type = DEMANGLE_COMPONENT_LAMBDA;
3126 ret->u.s_unary_num.sub = tl;
3127 ret->u.s_unary_num.num = num;
3130 if (! d_add_substitution (di, ret))
3136 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
3138 static struct demangle_component *
3139 d_unnamed_type (struct d_info *di)
3141 struct demangle_component *ret;
3144 if (! d_check_char (di, 'U'))
3146 if (! d_check_char (di, 't'))
3149 num = d_compact_number (di);
3153 ret = d_make_empty (di);
3156 ret->type = DEMANGLE_COMPONENT_UNNAMED_TYPE;
3157 ret->u.s_number.number = num;
3160 if (! d_add_substitution (di, ret))
3166 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
3169 static struct demangle_component *
3170 d_clone_suffix (struct d_info *di, struct demangle_component *encoding)
3172 const char *suffix = d_str (di);
3173 const char *pend = suffix;
3174 struct demangle_component *n;
3176 if (*pend == '.' && (IS_LOWER (pend[1]) || pend[1] == '_'))
3179 while (IS_LOWER (*pend) || *pend == '_')
3182 while (*pend == '.' && IS_DIGIT (pend[1]))
3185 while (IS_DIGIT (*pend))
3188 d_advance (di, pend - suffix);
3189 n = d_make_name (di, suffix, pend - suffix);
3190 return d_make_comp (di, DEMANGLE_COMPONENT_CLONE, encoding, n);
3193 /* Add a new substitution. */
3196 d_add_substitution (struct d_info *di, struct demangle_component *dc)
3200 if (di->next_sub >= di->num_subs)
3202 di->subs[di->next_sub] = dc;
3207 /* <substitution> ::= S <seq-id> _
3217 If PREFIX is non-zero, then this type is being used as a prefix in
3218 a qualified name. In this case, for the standard substitutions, we
3219 need to check whether we are being used as a prefix for a
3220 constructor or destructor, and return a full template name.
3221 Otherwise we will get something like std::iostream::~iostream()
3222 which does not correspond particularly well to any function which
3223 actually appears in the source.
3226 static const struct d_standard_sub_info standard_subs[] =
3231 { 'a', NL ("std::allocator"),
3232 NL ("std::allocator"),
3234 { 'b', NL ("std::basic_string"),
3235 NL ("std::basic_string"),
3236 NL ("basic_string") },
3237 { 's', NL ("std::string"),
3238 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
3239 NL ("basic_string") },
3240 { 'i', NL ("std::istream"),
3241 NL ("std::basic_istream<char, std::char_traits<char> >"),
3242 NL ("basic_istream") },
3243 { 'o', NL ("std::ostream"),
3244 NL ("std::basic_ostream<char, std::char_traits<char> >"),
3245 NL ("basic_ostream") },
3246 { 'd', NL ("std::iostream"),
3247 NL ("std::basic_iostream<char, std::char_traits<char> >"),
3248 NL ("basic_iostream") }
3251 static struct demangle_component *
3252 d_substitution (struct d_info *di, int prefix)
3256 if (! d_check_char (di, 'S'))
3259 c = d_next_char (di);
3260 if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
3269 unsigned int new_id;
3272 new_id = id * 36 + c - '0';
3273 else if (IS_UPPER (c))
3274 new_id = id * 36 + c - 'A' + 10;
3280 c = d_next_char (di);
3287 if (id >= (unsigned int) di->next_sub)
3292 return di->subs[id];
3297 const struct d_standard_sub_info *p;
3298 const struct d_standard_sub_info *pend;
3300 verbose = (di->options & DMGL_VERBOSE) != 0;
3301 if (! verbose && prefix)
3305 peek = d_peek_char (di);
3306 if (peek == 'C' || peek == 'D')
3310 pend = (&standard_subs[0]
3311 + sizeof standard_subs / sizeof standard_subs[0]);
3312 for (p = &standard_subs[0]; p < pend; ++p)
3319 if (p->set_last_name != NULL)
3320 di->last_name = d_make_sub (di, p->set_last_name,
3321 p->set_last_name_len);
3324 s = p->full_expansion;
3329 s = p->simple_expansion;
3330 len = p->simple_len;
3332 di->expansion += len;
3333 return d_make_sub (di, s, len);
3341 /* Initialize a growable string. */
3344 d_growable_string_init (struct d_growable_string *dgs, size_t estimate)
3349 dgs->allocation_failure = 0;
3352 d_growable_string_resize (dgs, estimate);
3355 /* Grow a growable string to a given size. */
3358 d_growable_string_resize (struct d_growable_string *dgs, size_t need)
3363 if (dgs->allocation_failure)
3366 /* Start allocation at two bytes to avoid any possibility of confusion
3367 with the special value of 1 used as a return in *palc to indicate
3368 allocation failures. */
3369 newalc = dgs->alc > 0 ? dgs->alc : 2;
3370 while (newalc < need)
3373 newbuf = (char *) realloc (dgs->buf, newalc);
3380 dgs->allocation_failure = 1;
3387 /* Append a buffer to a growable string. */
3390 d_growable_string_append_buffer (struct d_growable_string *dgs,
3391 const char *s, size_t l)
3395 need = dgs->len + l + 1;
3396 if (need > dgs->alc)
3397 d_growable_string_resize (dgs, need);
3399 if (dgs->allocation_failure)
3402 memcpy (dgs->buf + dgs->len, s, l);
3403 dgs->buf[dgs->len + l] = '\0';
3407 /* Bridge growable strings to the callback mechanism. */
3410 d_growable_string_callback_adapter (const char *s, size_t l, void *opaque)
3412 struct d_growable_string *dgs = (struct d_growable_string*) opaque;
3414 d_growable_string_append_buffer (dgs, s, l);
3417 /* Initialize a print information structure. */
3420 d_print_init (struct d_print_info *dpi, demangle_callbackref callback,
3424 dpi->last_char = '\0';
3425 dpi->templates = NULL;
3426 dpi->modifiers = NULL;
3427 dpi->pack_index = 0;
3428 dpi->flush_count = 0;
3430 dpi->callback = callback;
3431 dpi->opaque = opaque;
3433 dpi->demangle_failure = 0;
3436 /* Indicate that an error occurred during printing, and test for error. */
3439 d_print_error (struct d_print_info *dpi)
3441 dpi->demangle_failure = 1;
3445 d_print_saw_error (struct d_print_info *dpi)
3447 return dpi->demangle_failure != 0;
3450 /* Flush buffered characters to the callback. */
3453 d_print_flush (struct d_print_info *dpi)
3455 dpi->buf[dpi->len] = '\0';
3456 dpi->callback (dpi->buf, dpi->len, dpi->opaque);
3461 /* Append characters and buffers for printing. */
3464 d_append_char (struct d_print_info *dpi, char c)
3466 if (dpi->len == sizeof (dpi->buf) - 1)
3467 d_print_flush (dpi);
3469 dpi->buf[dpi->len++] = c;
3474 d_append_buffer (struct d_print_info *dpi, const char *s, size_t l)
3478 for (i = 0; i < l; i++)
3479 d_append_char (dpi, s[i]);
3483 d_append_string (struct d_print_info *dpi, const char *s)
3485 d_append_buffer (dpi, s, strlen (s));
3489 d_append_num (struct d_print_info *dpi, long l)
3492 sprintf (buf,"%ld", l);
3493 d_append_string (dpi, buf);
3497 d_last_char (struct d_print_info *dpi)
3499 return dpi->last_char;
3502 /* Turn components into a human readable string. OPTIONS is the
3503 options bits passed to the demangler. DC is the tree to print.
3504 CALLBACK is a function to call to flush demangled string segments
3505 as they fill the intermediate buffer, and OPAQUE is a generalized
3506 callback argument. On success, this returns 1. On failure,
3507 it returns 0, indicating a bad parse. It does not use heap
3508 memory to build an output string, so cannot encounter memory
3509 allocation failure. */
3511 CP_STATIC_IF_GLIBCPP_V3
3513 cplus_demangle_print_callback (int options,
3514 const struct demangle_component *dc,
3515 demangle_callbackref callback, void *opaque)
3517 struct d_print_info dpi;
3519 d_print_init (&dpi, callback, opaque);
3521 d_print_comp (&dpi, options, dc);
3523 d_print_flush (&dpi);
3525 return ! d_print_saw_error (&dpi);
3528 /* Turn components into a human readable string. OPTIONS is the
3529 options bits passed to the demangler. DC is the tree to print.
3530 ESTIMATE is a guess at the length of the result. This returns a
3531 string allocated by malloc, or NULL on error. On success, this
3532 sets *PALC to the size of the allocated buffer. On failure, this
3533 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
3536 CP_STATIC_IF_GLIBCPP_V3
3538 cplus_demangle_print (int options, const struct demangle_component *dc,
3539 int estimate, size_t *palc)
3541 struct d_growable_string dgs;
3543 d_growable_string_init (&dgs, estimate);
3545 if (! cplus_demangle_print_callback (options, dc,
3546 d_growable_string_callback_adapter,
3554 *palc = dgs.allocation_failure ? 1 : dgs.alc;
3558 /* Returns the I'th element of the template arglist ARGS, or NULL on
3561 static struct demangle_component *
3562 d_index_template_argument (struct demangle_component *args, int i)
3564 struct demangle_component *a;
3570 if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
3576 if (i != 0 || a == NULL)
3582 /* Returns the template argument from the current context indicated by DC,
3583 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
3585 static struct demangle_component *
3586 d_lookup_template_argument (struct d_print_info *dpi,
3587 const struct demangle_component *dc)
3589 if (dpi->templates == NULL)
3591 d_print_error (dpi);
3595 return d_index_template_argument
3596 (d_right (dpi->templates->template_decl),
3597 dc->u.s_number.number);
3600 /* Returns a template argument pack used in DC (any will do), or NULL. */
3602 static struct demangle_component *
3603 d_find_pack (struct d_print_info *dpi,
3604 const struct demangle_component *dc)
3606 struct demangle_component *a;
3612 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
3613 a = d_lookup_template_argument (dpi, dc);
3614 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
3618 case DEMANGLE_COMPONENT_PACK_EXPANSION:
3621 case DEMANGLE_COMPONENT_LAMBDA:
3622 case DEMANGLE_COMPONENT_NAME:
3623 case DEMANGLE_COMPONENT_OPERATOR:
3624 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
3625 case DEMANGLE_COMPONENT_SUB_STD:
3626 case DEMANGLE_COMPONENT_CHARACTER:
3627 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
3630 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
3631 return d_find_pack (dpi, dc->u.s_extended_operator.name);
3632 case DEMANGLE_COMPONENT_CTOR:
3633 return d_find_pack (dpi, dc->u.s_ctor.name);
3634 case DEMANGLE_COMPONENT_DTOR:
3635 return d_find_pack (dpi, dc->u.s_dtor.name);
3638 a = d_find_pack (dpi, d_left (dc));
3641 return d_find_pack (dpi, d_right (dc));
3645 /* Returns the length of the template argument pack DC. */
3648 d_pack_length (const struct demangle_component *dc)
3651 while (dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
3652 && d_left (dc) != NULL)
3660 /* DC is a component of a mangled expression. Print it, wrapped in parens
3664 d_print_subexpr (struct d_print_info *dpi, int options,
3665 const struct demangle_component *dc)
3668 if (dc->type == DEMANGLE_COMPONENT_NAME
3669 || dc->type == DEMANGLE_COMPONENT_FUNCTION_PARAM)
3672 d_append_char (dpi, '(');
3673 d_print_comp (dpi, options, dc);
3675 d_append_char (dpi, ')');
3678 /* Subroutine to handle components. */
3681 d_print_comp (struct d_print_info *dpi, int options,
3682 const struct demangle_component *dc)
3684 /* Magic variable to let reference smashing skip over the next modifier
3685 without needing to modify *dc. */
3686 const struct demangle_component *mod_inner = NULL;
3690 d_print_error (dpi);
3693 if (d_print_saw_error (dpi))
3698 case DEMANGLE_COMPONENT_NAME:
3699 if ((options & DMGL_JAVA) == 0)
3700 d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len);
3702 d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
3705 case DEMANGLE_COMPONENT_QUAL_NAME:
3706 case DEMANGLE_COMPONENT_LOCAL_NAME:
3707 d_print_comp (dpi, options, d_left (dc));
3708 if ((options & DMGL_JAVA) == 0)
3709 d_append_string (dpi, "::");
3711 d_append_char (dpi, '.');
3712 d_print_comp (dpi, options, d_right (dc));
3715 case DEMANGLE_COMPONENT_TYPED_NAME:
3717 struct d_print_mod *hold_modifiers;
3718 struct demangle_component *typed_name;
3719 struct d_print_mod adpm[4];
3721 struct d_print_template dpt;
3723 /* Pass the name down to the type so that it can be printed in
3724 the right place for the type. We also have to pass down
3725 any CV-qualifiers, which apply to the this parameter. */
3726 hold_modifiers = dpi->modifiers;
3729 typed_name = d_left (dc);
3730 while (typed_name != NULL)
3732 if (i >= sizeof adpm / sizeof adpm[0])
3734 d_print_error (dpi);
3738 adpm[i].next = dpi->modifiers;
3739 dpi->modifiers = &adpm[i];
3740 adpm[i].mod = typed_name;
3741 adpm[i].printed = 0;
3742 adpm[i].templates = dpi->templates;
3745 if (typed_name->type != DEMANGLE_COMPONENT_RESTRICT_THIS
3746 && typed_name->type != DEMANGLE_COMPONENT_VOLATILE_THIS
3747 && typed_name->type != DEMANGLE_COMPONENT_CONST_THIS)
3750 typed_name = d_left (typed_name);
3753 if (typed_name == NULL)
3755 d_print_error (dpi);
3759 /* If typed_name is a template, then it applies to the
3760 function type as well. */
3761 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
3763 dpt.next = dpi->templates;
3764 dpi->templates = &dpt;
3765 dpt.template_decl = typed_name;
3768 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
3769 there may be CV-qualifiers on its right argument which
3770 really apply here; this happens when parsing a class which
3771 is local to a function. */
3772 if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME)
3774 struct demangle_component *local_name;
3776 local_name = d_right (typed_name);
3777 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
3778 local_name = local_name->u.s_unary_num.sub;
3779 while (local_name->type == DEMANGLE_COMPONENT_RESTRICT_THIS
3780 || local_name->type == DEMANGLE_COMPONENT_VOLATILE_THIS
3781 || local_name->type == DEMANGLE_COMPONENT_CONST_THIS)
3783 if (i >= sizeof adpm / sizeof adpm[0])
3785 d_print_error (dpi);
3789 adpm[i] = adpm[i - 1];
3790 adpm[i].next = &adpm[i - 1];
3791 dpi->modifiers = &adpm[i];
3793 adpm[i - 1].mod = local_name;
3794 adpm[i - 1].printed = 0;
3795 adpm[i - 1].templates = dpi->templates;
3798 local_name = d_left (local_name);
3802 d_print_comp (dpi, options, d_right (dc));
3804 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
3805 dpi->templates = dpt.next;
3807 /* If the modifiers didn't get printed by the type, print them
3812 if (! adpm[i].printed)
3814 d_append_char (dpi, ' ');
3815 d_print_mod (dpi, options, adpm[i].mod);
3819 dpi->modifiers = hold_modifiers;
3824 case DEMANGLE_COMPONENT_TEMPLATE:
3826 struct d_print_mod *hold_dpm;
3827 struct demangle_component *dcl;
3829 /* Don't push modifiers into a template definition. Doing so
3830 could give the wrong definition for a template argument.
3831 Instead, treat the template essentially as a name. */
3833 hold_dpm = dpi->modifiers;
3834 dpi->modifiers = NULL;
3838 if ((options & DMGL_JAVA) != 0
3839 && dcl->type == DEMANGLE_COMPONENT_NAME
3840 && dcl->u.s_name.len == 6
3841 && strncmp (dcl->u.s_name.s, "JArray", 6) == 0)
3843 /* Special-case Java arrays, so that JArray<TYPE> appears
3844 instead as TYPE[]. */
3846 d_print_comp (dpi, options, d_right (dc));
3847 d_append_string (dpi, "[]");
3851 d_print_comp (dpi, options, dcl);
3852 if (d_last_char (dpi) == '<')
3853 d_append_char (dpi, ' ');
3854 d_append_char (dpi, '<');
3855 d_print_comp (dpi, options, d_right (dc));
3856 /* Avoid generating two consecutive '>' characters, to avoid
3857 the C++ syntactic ambiguity. */
3858 if (d_last_char (dpi) == '>')
3859 d_append_char (dpi, ' ');
3860 d_append_char (dpi, '>');
3863 dpi->modifiers = hold_dpm;
3868 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
3870 struct d_print_template *hold_dpt;
3871 struct demangle_component *a = d_lookup_template_argument (dpi, dc);
3873 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
3874 a = d_index_template_argument (a, dpi->pack_index);
3878 d_print_error (dpi);
3882 /* While processing this parameter, we need to pop the list of
3883 templates. This is because the template parameter may
3884 itself be a reference to a parameter of an outer
3887 hold_dpt = dpi->templates;
3888 dpi->templates = hold_dpt->next;
3890 d_print_comp (dpi, options, a);
3892 dpi->templates = hold_dpt;
3897 case DEMANGLE_COMPONENT_CTOR:
3898 d_print_comp (dpi, options, dc->u.s_ctor.name);
3901 case DEMANGLE_COMPONENT_DTOR:
3902 d_append_char (dpi, '~');
3903 d_print_comp (dpi, options, dc->u.s_dtor.name);
3906 case DEMANGLE_COMPONENT_VTABLE:
3907 d_append_string (dpi, "vtable for ");
3908 d_print_comp (dpi, options, d_left (dc));
3911 case DEMANGLE_COMPONENT_VTT:
3912 d_append_string (dpi, "VTT for ");
3913 d_print_comp (dpi, options, d_left (dc));
3916 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
3917 d_append_string (dpi, "construction vtable for ");
3918 d_print_comp (dpi, options, d_left (dc));
3919 d_append_string (dpi, "-in-");
3920 d_print_comp (dpi, options, d_right (dc));
3923 case DEMANGLE_COMPONENT_TYPEINFO:
3924 d_append_string (dpi, "typeinfo for ");
3925 d_print_comp (dpi, options, d_left (dc));
3928 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
3929 d_append_string (dpi, "typeinfo name for ");
3930 d_print_comp (dpi, options, d_left (dc));
3933 case DEMANGLE_COMPONENT_TYPEINFO_FN:
3934 d_append_string (dpi, "typeinfo fn for ");
3935 d_print_comp (dpi, options, d_left (dc));
3938 case DEMANGLE_COMPONENT_THUNK:
3939 d_append_string (dpi, "non-virtual thunk to ");
3940 d_print_comp (dpi, options, d_left (dc));
3943 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
3944 d_append_string (dpi, "virtual thunk to ");
3945 d_print_comp (dpi, options, d_left (dc));
3948 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
3949 d_append_string (dpi, "covariant return thunk to ");
3950 d_print_comp (dpi, options, d_left (dc));
3953 case DEMANGLE_COMPONENT_JAVA_CLASS:
3954 d_append_string (dpi, "java Class for ");
3955 d_print_comp (dpi, options, d_left (dc));
3958 case DEMANGLE_COMPONENT_GUARD:
3959 d_append_string (dpi, "guard variable for ");
3960 d_print_comp (dpi, options, d_left (dc));
3963 case DEMANGLE_COMPONENT_REFTEMP:
3964 d_append_string (dpi, "reference temporary #");
3965 d_print_comp (dpi, options, d_right (dc));
3966 d_append_string (dpi, " for ");
3967 d_print_comp (dpi, options, d_left (dc));
3970 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
3971 d_append_string (dpi, "hidden alias for ");
3972 d_print_comp (dpi, options, d_left (dc));
3975 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
3976 d_append_string (dpi, "transaction clone for ");
3977 d_print_comp (dpi, options, d_left (dc));
3980 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
3981 d_append_string (dpi, "non-transaction clone for ");
3982 d_print_comp (dpi, options, d_left (dc));
3985 case DEMANGLE_COMPONENT_SUB_STD:
3986 d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len);
3989 case DEMANGLE_COMPONENT_RESTRICT:
3990 case DEMANGLE_COMPONENT_VOLATILE:
3991 case DEMANGLE_COMPONENT_CONST:
3993 struct d_print_mod *pdpm;
3995 /* When printing arrays, it's possible to have cases where the
3996 same CV-qualifier gets pushed on the stack multiple times.
3997 We only need to print it once. */
3999 for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next)
4001 if (! pdpm->printed)
4003 if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT
4004 && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE
4005 && pdpm->mod->type != DEMANGLE_COMPONENT_CONST)
4007 if (pdpm->mod->type == dc->type)
4009 d_print_comp (dpi, options, d_left (dc));
4017 case DEMANGLE_COMPONENT_REFERENCE:
4018 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
4020 /* Handle reference smashing: & + && = &. */
4021 const struct demangle_component *sub = d_left (dc);
4022 if (sub->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
4024 struct demangle_component *a = d_lookup_template_argument (dpi, sub);
4025 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4026 a = d_index_template_argument (a, dpi->pack_index);
4030 d_print_error (dpi);
4037 if (sub->type == DEMANGLE_COMPONENT_REFERENCE
4038 || sub->type == dc->type)
4040 else if (sub->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE)
4041 mod_inner = d_left (sub);
4045 case DEMANGLE_COMPONENT_RESTRICT_THIS:
4046 case DEMANGLE_COMPONENT_VOLATILE_THIS:
4047 case DEMANGLE_COMPONENT_CONST_THIS:
4048 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
4049 case DEMANGLE_COMPONENT_POINTER:
4050 case DEMANGLE_COMPONENT_COMPLEX:
4051 case DEMANGLE_COMPONENT_IMAGINARY:
4054 /* We keep a list of modifiers on the stack. */
4055 struct d_print_mod dpm;
4057 dpm.next = dpi->modifiers;
4058 dpi->modifiers = &dpm;
4061 dpm.templates = dpi->templates;
4064 mod_inner = d_left (dc);
4066 d_print_comp (dpi, options, mod_inner);
4068 /* If the modifier didn't get printed by the type, print it
4071 d_print_mod (dpi, options, dc);
4073 dpi->modifiers = dpm.next;
4078 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4079 if ((options & DMGL_JAVA) == 0)
4080 d_append_buffer (dpi, dc->u.s_builtin.type->name,
4081 dc->u.s_builtin.type->len);
4083 d_append_buffer (dpi, dc->u.s_builtin.type->java_name,
4084 dc->u.s_builtin.type->java_len);
4087 case DEMANGLE_COMPONENT_VENDOR_TYPE:
4088 d_print_comp (dpi, options, d_left (dc));
4091 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
4093 if ((options & DMGL_RET_POSTFIX) != 0)
4094 d_print_function_type (dpi,
4095 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4096 dc, dpi->modifiers);
4098 /* Print return type if present */
4099 if (d_left (dc) != NULL && (options & DMGL_RET_POSTFIX) != 0)
4100 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4102 else if (d_left (dc) != NULL && (options & DMGL_RET_DROP) == 0)
4104 struct d_print_mod dpm;
4106 /* We must pass this type down as a modifier in order to
4107 print it in the right location. */
4108 dpm.next = dpi->modifiers;
4109 dpi->modifiers = &dpm;
4112 dpm.templates = dpi->templates;
4114 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4117 dpi->modifiers = dpm.next;
4122 /* In standard prefix notation, there is a space between the
4123 return type and the function signature. */
4124 if ((options & DMGL_RET_POSTFIX) == 0)
4125 d_append_char (dpi, ' ');
4128 if ((options & DMGL_RET_POSTFIX) == 0)
4129 d_print_function_type (dpi,
4130 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4131 dc, dpi->modifiers);
4136 case DEMANGLE_COMPONENT_ARRAY_TYPE:
4138 struct d_print_mod *hold_modifiers;
4139 struct d_print_mod adpm[4];
4141 struct d_print_mod *pdpm;
4143 /* We must pass this type down as a modifier in order to print
4144 multi-dimensional arrays correctly. If the array itself is
4145 CV-qualified, we act as though the element type were
4146 CV-qualified. We do this by copying the modifiers down
4147 rather than fiddling pointers, so that we don't wind up
4148 with a d_print_mod higher on the stack pointing into our
4149 stack frame after we return. */
4151 hold_modifiers = dpi->modifiers;
4153 adpm[0].next = hold_modifiers;
4154 dpi->modifiers = &adpm[0];
4156 adpm[0].printed = 0;
4157 adpm[0].templates = dpi->templates;
4160 pdpm = hold_modifiers;
4162 && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT
4163 || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE
4164 || pdpm->mod->type == DEMANGLE_COMPONENT_CONST))
4166 if (! pdpm->printed)
4168 if (i >= sizeof adpm / sizeof adpm[0])
4170 d_print_error (dpi);
4175 adpm[i].next = dpi->modifiers;
4176 dpi->modifiers = &adpm[i];
4184 d_print_comp (dpi, options, d_right (dc));
4186 dpi->modifiers = hold_modifiers;
4188 if (adpm[0].printed)
4194 d_print_mod (dpi, options, adpm[i].mod);
4197 d_print_array_type (dpi, options, dc, dpi->modifiers);
4202 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
4203 case DEMANGLE_COMPONENT_VECTOR_TYPE:
4205 struct d_print_mod dpm;
4207 dpm.next = dpi->modifiers;
4208 dpi->modifiers = &dpm;
4211 dpm.templates = dpi->templates;
4213 d_print_comp (dpi, options, d_right (dc));
4215 /* If the modifier didn't get printed by the type, print it
4218 d_print_mod (dpi, options, dc);
4220 dpi->modifiers = dpm.next;
4225 case DEMANGLE_COMPONENT_FIXED_TYPE:
4226 if (dc->u.s_fixed.sat)
4227 d_append_string (dpi, "_Sat ");
4228 /* Don't print "int _Accum". */
4229 if (dc->u.s_fixed.length->u.s_builtin.type
4230 != &cplus_demangle_builtin_types['i'-'a'])
4232 d_print_comp (dpi, options, dc->u.s_fixed.length);
4233 d_append_char (dpi, ' ');
4235 if (dc->u.s_fixed.accum)
4236 d_append_string (dpi, "_Accum");
4238 d_append_string (dpi, "_Fract");
4241 case DEMANGLE_COMPONENT_ARGLIST:
4242 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
4243 if (d_left (dc) != NULL)
4244 d_print_comp (dpi, options, d_left (dc));
4245 if (d_right (dc) != NULL)
4248 unsigned long int flush_count;
4249 /* Make sure ", " isn't flushed by d_append_string, otherwise
4250 dpi->len -= 2 wouldn't work. */
4251 if (dpi->len >= sizeof (dpi->buf) - 2)
4252 d_print_flush (dpi);
4253 d_append_string (dpi, ", ");
4255 flush_count = dpi->flush_count;
4256 d_print_comp (dpi, options, d_right (dc));
4257 /* If that didn't print anything (which can happen with empty
4258 template argument packs), remove the comma and space. */
4259 if (dpi->flush_count == flush_count && dpi->len == len)
4264 case DEMANGLE_COMPONENT_OPERATOR:
4268 d_append_string (dpi, "operator");
4269 c = dc->u.s_operator.op->name[0];
4271 d_append_char (dpi, ' ');
4272 d_append_buffer (dpi, dc->u.s_operator.op->name,
4273 dc->u.s_operator.op->len);
4277 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4278 d_append_string (dpi, "operator ");
4279 d_print_comp (dpi, options, dc->u.s_extended_operator.name);
4282 case DEMANGLE_COMPONENT_CAST:
4283 d_append_string (dpi, "operator ");
4284 d_print_cast (dpi, options, dc);
4287 case DEMANGLE_COMPONENT_UNARY:
4288 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
4289 && d_left (dc)->u.s_operator.op->len == 1
4290 && d_left (dc)->u.s_operator.op->name[0] == '&'
4291 && d_right (dc)->type == DEMANGLE_COMPONENT_TYPED_NAME
4292 && d_left (d_right (dc))->type == DEMANGLE_COMPONENT_QUAL_NAME
4293 && d_right (d_right (dc))->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
4295 /* Address of a function (therefore in an expression context) must
4296 have its argument list suppressed.
4298 unary operator ... dc
4299 operator & ... d_left (dc)
4300 typed name ... d_right (dc)
4301 qualified name ... d_left (d_right (dc))
4303 function type ... d_right (d_right (dc))
4307 d_print_expr_op (dpi, options, d_left (dc));
4308 d_print_comp (dpi, options, d_left (d_right (dc)));
4311 else if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
4312 && d_left (dc)->u.s_operator.op->len == 1
4313 && d_left (dc)->u.s_operator.op->name[0] == '&'
4314 && d_right (dc)->type == DEMANGLE_COMPONENT_QUAL_NAME)
4316 /* Keep also already processed variant without the argument list.
4318 unary operator ... dc
4319 operator & ... d_left (dc)
4320 qualified name ... d_right (dc)
4323 d_print_expr_op (dpi, options, d_left (dc));
4324 d_print_comp (dpi, options, d_right (dc));
4327 else if (d_left (dc)->type != DEMANGLE_COMPONENT_CAST)
4328 d_print_expr_op (dpi, options, d_left (dc));
4331 d_append_char (dpi, '(');
4332 d_print_cast (dpi, options, d_left (dc));
4333 d_append_char (dpi, ')');
4335 d_print_subexpr (dpi, options, d_right (dc));
4338 case DEMANGLE_COMPONENT_BINARY:
4339 if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS)
4341 d_print_error (dpi);
4345 /* We wrap an expression which uses the greater-than operator in
4346 an extra layer of parens so that it does not get confused
4347 with the '>' which ends the template parameters. */
4348 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
4349 && d_left (dc)->u.s_operator.op->len == 1
4350 && d_left (dc)->u.s_operator.op->name[0] == '>')
4351 d_append_char (dpi, '(');
4353 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") == 0
4354 && d_left (d_right (dc))->type == DEMANGLE_COMPONENT_TYPED_NAME)
4356 /* Function call used in an expression should not have printed types
4357 of the function arguments. Values of the function arguments still
4358 get printed below. */
4360 const struct demangle_component *func = d_left (d_right (dc));
4362 if (d_right (func)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
4363 d_print_error (dpi);
4364 d_print_subexpr (dpi, options, d_left (func));
4367 d_print_subexpr (dpi, options, d_left (d_right (dc)));
4368 if (strcmp (d_left (dc)->u.s_operator.op->code, "ix") == 0)
4370 d_append_char (dpi, '[');
4371 d_print_comp (dpi, options, d_right (d_right (dc)));
4372 d_append_char (dpi, ']');
4376 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") != 0)
4377 d_print_expr_op (dpi, options, d_left (dc));
4378 d_print_subexpr (dpi, options, d_right (d_right (dc)));
4381 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
4382 && d_left (dc)->u.s_operator.op->len == 1
4383 && d_left (dc)->u.s_operator.op->name[0] == '>')
4384 d_append_char (dpi, ')');
4388 case DEMANGLE_COMPONENT_BINARY_ARGS:
4389 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
4390 d_print_error (dpi);
4393 case DEMANGLE_COMPONENT_TRINARY:
4394 if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1
4395 || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2)
4397 d_print_error (dpi);
4400 d_print_subexpr (dpi, options, d_left (d_right (dc)));
4401 d_print_expr_op (dpi, options, d_left (dc));
4402 d_print_subexpr (dpi, options, d_left (d_right (d_right (dc))));
4403 d_append_string (dpi, " : ");
4404 d_print_subexpr (dpi, options, d_right (d_right (d_right (dc))));
4407 case DEMANGLE_COMPONENT_TRINARY_ARG1:
4408 case DEMANGLE_COMPONENT_TRINARY_ARG2:
4409 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
4410 d_print_error (dpi);
4413 case DEMANGLE_COMPONENT_LITERAL:
4414 case DEMANGLE_COMPONENT_LITERAL_NEG:
4416 enum d_builtin_type_print tp;
4418 /* For some builtin types, produce simpler output. */
4419 tp = D_PRINT_DEFAULT;
4420 if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE)
4422 tp = d_left (dc)->u.s_builtin.type->print;
4426 case D_PRINT_UNSIGNED:
4428 case D_PRINT_UNSIGNED_LONG:
4429 case D_PRINT_LONG_LONG:
4430 case D_PRINT_UNSIGNED_LONG_LONG:
4431 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME)
4433 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
4434 d_append_char (dpi, '-');
4435 d_print_comp (dpi, options, d_right (dc));
4440 case D_PRINT_UNSIGNED:
4441 d_append_char (dpi, 'u');
4444 d_append_char (dpi, 'l');
4446 case D_PRINT_UNSIGNED_LONG:
4447 d_append_string (dpi, "ul");
4449 case D_PRINT_LONG_LONG:
4450 d_append_string (dpi, "ll");
4452 case D_PRINT_UNSIGNED_LONG_LONG:
4453 d_append_string (dpi, "ull");
4461 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME
4462 && d_right (dc)->u.s_name.len == 1
4463 && dc->type == DEMANGLE_COMPONENT_LITERAL)
4465 switch (d_right (dc)->u.s_name.s[0])
4468 d_append_string (dpi, "false");
4471 d_append_string (dpi, "true");
4484 d_append_char (dpi, '(');
4485 d_print_comp (dpi, options, d_left (dc));
4486 d_append_char (dpi, ')');
4487 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
4488 d_append_char (dpi, '-');
4489 if (tp == D_PRINT_FLOAT)
4490 d_append_char (dpi, '[');
4491 d_print_comp (dpi, options, d_right (dc));
4492 if (tp == D_PRINT_FLOAT)
4493 d_append_char (dpi, ']');
4497 case DEMANGLE_COMPONENT_NUMBER:
4498 d_append_num (dpi, dc->u.s_number.number);
4501 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
4502 d_append_string (dpi, "java resource ");
4503 d_print_comp (dpi, options, d_left (dc));
4506 case DEMANGLE_COMPONENT_COMPOUND_NAME:
4507 d_print_comp (dpi, options, d_left (dc));
4508 d_print_comp (dpi, options, d_right (dc));
4511 case DEMANGLE_COMPONENT_CHARACTER:
4512 d_append_char (dpi, dc->u.s_character.character);
4515 case DEMANGLE_COMPONENT_DECLTYPE:
4516 d_append_string (dpi, "decltype (");
4517 d_print_comp (dpi, options, d_left (dc));
4518 d_append_char (dpi, ')');
4521 case DEMANGLE_COMPONENT_PACK_EXPANSION:
4525 struct demangle_component *a = d_find_pack (dpi, d_left (dc));
4528 /* d_find_pack won't find anything if the only packs involved
4529 in this expansion are function parameter packs; in that
4530 case, just print the pattern and "...". */
4531 d_print_subexpr (dpi, options, d_left (dc));
4532 d_append_string (dpi, "...");
4536 len = d_pack_length (a);
4538 for (i = 0; i < len; ++i)
4540 dpi->pack_index = i;
4541 d_print_comp (dpi, options, dc);
4543 d_append_string (dpi, ", ");
4548 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
4550 long num = dc->u.s_number.number;
4552 d_append_string (dpi, "this");
4555 d_append_string (dpi, "{parm#");
4556 d_append_num (dpi, num);
4557 d_append_char (dpi, '}');
4562 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
4563 d_append_string (dpi, "global constructors keyed to ");
4564 d_print_comp (dpi, options, dc->u.s_binary.left);
4567 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
4568 d_append_string (dpi, "global destructors keyed to ");
4569 d_print_comp (dpi, options, dc->u.s_binary.left);
4572 case DEMANGLE_COMPONENT_LAMBDA:
4573 d_append_string (dpi, "{lambda(");
4574 d_print_comp (dpi, options, dc->u.s_unary_num.sub);
4575 d_append_string (dpi, ")#");
4576 d_append_num (dpi, dc->u.s_unary_num.num + 1);
4577 d_append_char (dpi, '}');
4580 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
4581 d_append_string (dpi, "{unnamed type#");
4582 d_append_num (dpi, dc->u.s_number.number + 1);
4583 d_append_char (dpi, '}');
4586 case DEMANGLE_COMPONENT_CLONE:
4587 d_print_comp (dpi, options, d_left (dc));
4588 d_append_string (dpi, " [clone ");
4589 d_print_comp (dpi, options, d_right (dc));
4590 d_append_char (dpi, ']');
4594 d_print_error (dpi);
4599 /* Print a Java dentifier. For Java we try to handle encoded extended
4600 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
4601 so we don't it for C++. Characters are encoded as
4605 d_print_java_identifier (struct d_print_info *dpi, const char *name, int len)
4611 for (p = name; p < end; ++p)
4622 for (q = p + 3; q < end; ++q)
4628 else if (*q >= 'A' && *q <= 'F')
4629 dig = *q - 'A' + 10;
4630 else if (*q >= 'a' && *q <= 'f')
4631 dig = *q - 'a' + 10;
4637 /* If the Unicode character is larger than 256, we don't try
4638 to deal with it here. FIXME. */
4639 if (q < end && *q == '_' && c < 256)
4641 d_append_char (dpi, c);
4647 d_append_char (dpi, *p);
4651 /* Print a list of modifiers. SUFFIX is 1 if we are printing
4652 qualifiers on this after printing a function. */
4655 d_print_mod_list (struct d_print_info *dpi, int options,
4656 struct d_print_mod *mods, int suffix)
4658 struct d_print_template *hold_dpt;
4660 if (mods == NULL || d_print_saw_error (dpi))
4665 && (mods->mod->type == DEMANGLE_COMPONENT_RESTRICT_THIS
4666 || mods->mod->type == DEMANGLE_COMPONENT_VOLATILE_THIS
4667 || mods->mod->type == DEMANGLE_COMPONENT_CONST_THIS)))
4669 d_print_mod_list (dpi, options, mods->next, suffix);
4675 hold_dpt = dpi->templates;
4676 dpi->templates = mods->templates;
4678 if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
4680 d_print_function_type (dpi, options, mods->mod, mods->next);
4681 dpi->templates = hold_dpt;
4684 else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
4686 d_print_array_type (dpi, options, mods->mod, mods->next);
4687 dpi->templates = hold_dpt;
4690 else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME)
4692 struct d_print_mod *hold_modifiers;
4693 struct demangle_component *dc;
4695 /* When this is on the modifier stack, we have pulled any
4696 qualifiers off the right argument already. Otherwise, we
4697 print it as usual, but don't let the left argument see any
4700 hold_modifiers = dpi->modifiers;
4701 dpi->modifiers = NULL;
4702 d_print_comp (dpi, options, d_left (mods->mod));
4703 dpi->modifiers = hold_modifiers;
4705 if ((options & DMGL_JAVA) == 0)
4706 d_append_string (dpi, "::");
4708 d_append_char (dpi, '.');
4710 dc = d_right (mods->mod);
4712 if (dc->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4714 d_append_string (dpi, "{default arg#");
4715 d_append_num (dpi, dc->u.s_unary_num.num + 1);
4716 d_append_string (dpi, "}::");
4717 dc = dc->u.s_unary_num.sub;
4720 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
4721 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
4722 || dc->type == DEMANGLE_COMPONENT_CONST_THIS)
4725 d_print_comp (dpi, options, dc);
4727 dpi->templates = hold_dpt;
4731 d_print_mod (dpi, options, mods->mod);
4733 dpi->templates = hold_dpt;
4735 d_print_mod_list (dpi, options, mods->next, suffix);
4738 /* Print a modifier. */
4741 d_print_mod (struct d_print_info *dpi, int options,
4742 const struct demangle_component *mod)
4746 case DEMANGLE_COMPONENT_RESTRICT:
4747 case DEMANGLE_COMPONENT_RESTRICT_THIS:
4748 d_append_string (dpi, " restrict");
4750 case DEMANGLE_COMPONENT_VOLATILE:
4751 case DEMANGLE_COMPONENT_VOLATILE_THIS:
4752 d_append_string (dpi, " volatile");
4754 case DEMANGLE_COMPONENT_CONST:
4755 case DEMANGLE_COMPONENT_CONST_THIS:
4756 d_append_string (dpi, " const");
4758 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
4759 d_append_char (dpi, ' ');
4760 d_print_comp (dpi, options, d_right (mod));
4762 case DEMANGLE_COMPONENT_POINTER:
4763 /* There is no pointer symbol in Java. */
4764 if ((options & DMGL_JAVA) == 0)
4765 d_append_char (dpi, '*');
4767 case DEMANGLE_COMPONENT_REFERENCE:
4768 d_append_char (dpi, '&');
4770 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
4771 d_append_string (dpi, "&&");
4773 case DEMANGLE_COMPONENT_COMPLEX:
4774 d_append_string (dpi, "complex ");
4776 case DEMANGLE_COMPONENT_IMAGINARY:
4777 d_append_string (dpi, "imaginary ");
4779 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
4780 if (d_last_char (dpi) != '(')
4781 d_append_char (dpi, ' ');
4782 d_print_comp (dpi, options, d_left (mod));
4783 d_append_string (dpi, "::*");
4785 case DEMANGLE_COMPONENT_TYPED_NAME:
4786 d_print_comp (dpi, options, d_left (mod));
4788 case DEMANGLE_COMPONENT_VECTOR_TYPE:
4789 d_append_string (dpi, " __vector(");
4790 d_print_comp (dpi, options, d_left (mod));
4791 d_append_char (dpi, ')');
4795 /* Otherwise, we have something that won't go back on the
4796 modifier stack, so we can just print it. */
4797 d_print_comp (dpi, options, mod);
4802 /* Print a function type, except for the return type. */
4805 d_print_function_type (struct d_print_info *dpi, int options,
4806 const struct demangle_component *dc,
4807 struct d_print_mod *mods)
4811 struct d_print_mod *p;
4812 struct d_print_mod *hold_modifiers;
4816 for (p = mods; p != NULL; p = p->next)
4821 switch (p->mod->type)
4823 case DEMANGLE_COMPONENT_POINTER:
4824 case DEMANGLE_COMPONENT_REFERENCE:
4825 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
4828 case DEMANGLE_COMPONENT_RESTRICT:
4829 case DEMANGLE_COMPONENT_VOLATILE:
4830 case DEMANGLE_COMPONENT_CONST:
4831 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
4832 case DEMANGLE_COMPONENT_COMPLEX:
4833 case DEMANGLE_COMPONENT_IMAGINARY:
4834 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
4838 case DEMANGLE_COMPONENT_RESTRICT_THIS:
4839 case DEMANGLE_COMPONENT_VOLATILE_THIS:
4840 case DEMANGLE_COMPONENT_CONST_THIS:
4853 if (d_last_char (dpi) != '('
4854 && d_last_char (dpi) != '*')
4857 if (need_space && d_last_char (dpi) != ' ')
4858 d_append_char (dpi, ' ');
4859 d_append_char (dpi, '(');
4862 hold_modifiers = dpi->modifiers;
4863 dpi->modifiers = NULL;
4865 d_print_mod_list (dpi, options, mods, 0);
4868 d_append_char (dpi, ')');
4870 d_append_char (dpi, '(');
4872 if (d_right (dc) != NULL)
4873 d_print_comp (dpi, options, d_right (dc));
4875 d_append_char (dpi, ')');
4877 d_print_mod_list (dpi, options, mods, 1);
4879 dpi->modifiers = hold_modifiers;
4882 /* Print an array type, except for the element type. */
4885 d_print_array_type (struct d_print_info *dpi, int options,
4886 const struct demangle_component *dc,
4887 struct d_print_mod *mods)
4895 struct d_print_mod *p;
4898 for (p = mods; p != NULL; p = p->next)
4902 if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
4917 d_append_string (dpi, " (");
4919 d_print_mod_list (dpi, options, mods, 0);
4922 d_append_char (dpi, ')');
4926 d_append_char (dpi, ' ');
4928 d_append_char (dpi, '[');
4930 if (d_left (dc) != NULL)
4931 d_print_comp (dpi, options, d_left (dc));
4933 d_append_char (dpi, ']');
4936 /* Print an operator in an expression. */
4939 d_print_expr_op (struct d_print_info *dpi, int options,
4940 const struct demangle_component *dc)
4942 if (dc->type == DEMANGLE_COMPONENT_OPERATOR)
4943 d_append_buffer (dpi, dc->u.s_operator.op->name,
4944 dc->u.s_operator.op->len);
4946 d_print_comp (dpi, options, dc);
4952 d_print_cast (struct d_print_info *dpi, int options,
4953 const struct demangle_component *dc)
4955 if (d_left (dc)->type != DEMANGLE_COMPONENT_TEMPLATE)
4956 d_print_comp (dpi, options, d_left (dc));
4959 struct d_print_mod *hold_dpm;
4960 struct d_print_template dpt;
4962 /* It appears that for a templated cast operator, we need to put
4963 the template parameters in scope for the operator name, but
4964 not for the parameters. The effect is that we need to handle
4965 the template printing here. */
4967 hold_dpm = dpi->modifiers;
4968 dpi->modifiers = NULL;
4970 dpt.next = dpi->templates;
4971 dpi->templates = &dpt;
4972 dpt.template_decl = d_left (dc);
4974 d_print_comp (dpi, options, d_left (d_left (dc)));
4976 dpi->templates = dpt.next;
4978 if (d_last_char (dpi) == '<')
4979 d_append_char (dpi, ' ');
4980 d_append_char (dpi, '<');
4981 d_print_comp (dpi, options, d_right (d_left (dc)));
4982 /* Avoid generating two consecutive '>' characters, to avoid
4983 the C++ syntactic ambiguity. */
4984 if (d_last_char (dpi) == '>')
4985 d_append_char (dpi, ' ');
4986 d_append_char (dpi, '>');
4988 dpi->modifiers = hold_dpm;
4992 /* Initialize the information structure we use to pass around
4995 CP_STATIC_IF_GLIBCPP_V3
4997 cplus_demangle_init_info (const char *mangled, int options, size_t len,
5001 di->send = mangled + len;
5002 di->options = options;
5006 /* We can not need more components than twice the number of chars in
5007 the mangled string. Most components correspond directly to
5008 chars, but the ARGLIST types are exceptions. */
5009 di->num_comps = 2 * len;
5012 /* Similarly, we can not need more substitutions than there are
5013 chars in the mangled string. */
5018 di->last_name = NULL;
5023 /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
5024 mangled name, return strings in repeated callback giving the demangled
5025 name. OPTIONS is the usual libiberty demangler options. On success,
5026 this returns 1. On failure, returns 0. */
5029 d_demangle_callback (const char *mangled, int options,
5030 demangle_callbackref callback, void *opaque)
5041 struct demangle_component *dc;
5044 if (mangled[0] == '_' && mangled[1] == 'Z')
5046 else if (strncmp (mangled, "_GLOBAL_", 8) == 0
5047 && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
5048 && (mangled[9] == 'D' || mangled[9] == 'I')
5049 && mangled[10] == '_')
5050 type = mangled[9] == 'I' ? DCT_GLOBAL_CTORS : DCT_GLOBAL_DTORS;
5053 if ((options & DMGL_TYPES) == 0)
5058 cplus_demangle_init_info (mangled, options, strlen (mangled), &di);
5061 #ifdef CP_DYNAMIC_ARRAYS
5062 __extension__ struct demangle_component comps[di.num_comps];
5063 __extension__ struct demangle_component *subs[di.num_subs];
5068 di.comps = alloca (di.num_comps * sizeof (*di.comps));
5069 di.subs = alloca (di.num_subs * sizeof (*di.subs));
5075 dc = cplus_demangle_type (&di);
5078 dc = cplus_demangle_mangled_name (&di, 1);
5080 case DCT_GLOBAL_CTORS:
5081 case DCT_GLOBAL_DTORS:
5082 d_advance (&di, 11);
5083 dc = d_make_comp (&di,
5084 (type == DCT_GLOBAL_CTORS
5085 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
5086 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS),
5087 d_make_demangle_mangled_name (&di, d_str (&di)),
5089 d_advance (&di, strlen (d_str (&di)));
5093 /* If DMGL_PARAMS is set, then if we didn't consume the entire
5094 mangled string, then we didn't successfully demangle it. If
5095 DMGL_PARAMS is not set, we didn't look at the trailing
5097 if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0')
5100 #ifdef CP_DEMANGLE_DEBUG
5104 status = (dc != NULL)
5105 ? cplus_demangle_print_callback (options, dc, callback, opaque)
5112 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
5113 name, return a buffer allocated with malloc holding the demangled
5114 name. OPTIONS is the usual libiberty demangler options. On
5115 success, this sets *PALC to the allocated size of the returned
5116 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
5117 a memory allocation failure, and returns NULL. */
5120 d_demangle (const char *mangled, int options, size_t *palc)
5122 struct d_growable_string dgs;
5125 d_growable_string_init (&dgs, 0);
5127 status = d_demangle_callback (mangled, options,
5128 d_growable_string_callback_adapter, &dgs);
5136 *palc = dgs.allocation_failure ? 1 : dgs.alc;
5140 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
5142 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
5144 /* ia64 ABI-mandated entry point in the C++ runtime library for
5145 performing demangling. MANGLED_NAME is a NUL-terminated character
5146 string containing the name to be demangled.
5148 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
5149 *LENGTH bytes, into which the demangled name is stored. If
5150 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
5151 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
5152 is placed in a region of memory allocated with malloc.
5154 If LENGTH is non-NULL, the length of the buffer containing the
5155 demangled name, is placed in *LENGTH.
5157 The return value is a pointer to the start of the NUL-terminated
5158 demangled name, or NULL if the demangling fails. The caller is
5159 responsible for deallocating this memory using free.
5161 *STATUS is set to one of the following values:
5162 0: The demangling operation succeeded.
5163 -1: A memory allocation failure occurred.
5164 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
5165 -3: One of the arguments is invalid.
5167 The demangling is performed using the C++ ABI mangling rules, with
5171 __cxa_demangle (const char *mangled_name, char *output_buffer,
5172 size_t *length, int *status)
5177 if (mangled_name == NULL)
5184 if (output_buffer != NULL && length == NULL)
5191 demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc);
5193 if (demangled == NULL)
5205 if (output_buffer == NULL)
5212 if (strlen (demangled) < *length)
5214 strcpy (output_buffer, demangled);
5216 demangled = output_buffer;
5220 free (output_buffer);
5231 extern int __gcclibcxx_demangle_callback (const char *,
5233 (const char *, size_t, void *),
5236 /* Alternative, allocationless entry point in the C++ runtime library
5237 for performing demangling. MANGLED_NAME is a NUL-terminated character
5238 string containing the name to be demangled.
5240 CALLBACK is a callback function, called with demangled string
5241 segments as demangling progresses; it is called at least once,
5242 but may be called more than once. OPAQUE is a generalized pointer
5243 used as a callback argument.
5245 The return code is one of the following values, equivalent to
5246 the STATUS values of __cxa_demangle() (excluding -1, since this
5247 function performs no memory allocations):
5248 0: The demangling operation succeeded.
5249 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
5250 -3: One of the arguments is invalid.
5252 The demangling is performed using the C++ ABI mangling rules, with
5256 __gcclibcxx_demangle_callback (const char *mangled_name,
5257 void (*callback) (const char *, size_t, void *),
5262 if (mangled_name == NULL || callback == NULL)
5265 status = d_demangle_callback (mangled_name, DMGL_PARAMS | DMGL_TYPES,
5273 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
5275 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
5276 mangled name, return a buffer allocated with malloc holding the
5277 demangled name. Otherwise, return NULL. */
5280 cplus_demangle_v3 (const char *mangled, int options)
5284 return d_demangle (mangled, options, &alc);
5288 cplus_demangle_v3_callback (const char *mangled, int options,
5289 demangle_callbackref callback, void *opaque)
5291 return d_demangle_callback (mangled, options, callback, opaque);
5294 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
5295 conventions, but the output formatting is a little different.
5296 This instructs the C++ demangler not to emit pointer characters ("*"), to
5297 use Java's namespace separator symbol ("." instead of "::"), and to output
5298 JArray<TYPE> as TYPE[]. */
5301 java_demangle_v3 (const char *mangled)
5305 return d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, &alc);
5309 java_demangle_v3_callback (const char *mangled,
5310 demangle_callbackref callback, void *opaque)
5312 return d_demangle_callback (mangled,
5313 DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX,
5317 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
5319 #ifndef IN_GLIBCPP_V3
5321 /* Demangle a string in order to find out whether it is a constructor
5322 or destructor. Return non-zero on success. Set *CTOR_KIND and
5323 *DTOR_KIND appropriately. */
5326 is_ctor_or_dtor (const char *mangled,
5327 enum gnu_v3_ctor_kinds *ctor_kind,
5328 enum gnu_v3_dtor_kinds *dtor_kind)
5331 struct demangle_component *dc;
5334 *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
5335 *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
5337 cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di);
5340 #ifdef CP_DYNAMIC_ARRAYS
5341 __extension__ struct demangle_component comps[di.num_comps];
5342 __extension__ struct demangle_component *subs[di.num_subs];
5347 di.comps = alloca (di.num_comps * sizeof (*di.comps));
5348 di.subs = alloca (di.num_subs * sizeof (*di.subs));
5351 dc = cplus_demangle_mangled_name (&di, 1);
5353 /* Note that because we did not pass DMGL_PARAMS, we don't expect
5354 to demangle the entire string. */
5364 case DEMANGLE_COMPONENT_TYPED_NAME:
5365 case DEMANGLE_COMPONENT_TEMPLATE:
5366 case DEMANGLE_COMPONENT_RESTRICT_THIS:
5367 case DEMANGLE_COMPONENT_VOLATILE_THIS:
5368 case DEMANGLE_COMPONENT_CONST_THIS:
5371 case DEMANGLE_COMPONENT_QUAL_NAME:
5372 case DEMANGLE_COMPONENT_LOCAL_NAME:
5375 case DEMANGLE_COMPONENT_CTOR:
5376 *ctor_kind = dc->u.s_ctor.kind;
5380 case DEMANGLE_COMPONENT_DTOR:
5381 *dtor_kind = dc->u.s_dtor.kind;
5392 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
5393 name. A non-zero return indicates the type of constructor. */
5395 enum gnu_v3_ctor_kinds
5396 is_gnu_v3_mangled_ctor (const char *name)
5398 enum gnu_v3_ctor_kinds ctor_kind;
5399 enum gnu_v3_dtor_kinds dtor_kind;
5401 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
5402 return (enum gnu_v3_ctor_kinds) 0;
5407 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
5408 name. A non-zero return indicates the type of destructor. */
5410 enum gnu_v3_dtor_kinds
5411 is_gnu_v3_mangled_dtor (const char *name)
5413 enum gnu_v3_ctor_kinds ctor_kind;
5414 enum gnu_v3_dtor_kinds dtor_kind;
5416 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
5417 return (enum gnu_v3_dtor_kinds) 0;
5421 #endif /* IN_GLIBCPP_V3 */
5423 #ifdef STANDALONE_DEMANGLER
5426 #include "dyn-string.h"
5428 static void print_usage (FILE* fp, int exit_value);
5430 #define IS_ALPHA(CHAR) \
5431 (((CHAR) >= 'a' && (CHAR) <= 'z') \
5432 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
5434 /* Non-zero if CHAR is a character than can occur in a mangled name. */
5435 #define is_mangled_char(CHAR) \
5436 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
5437 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
5439 /* The name of this program, as invoked. */
5440 const char* program_name;
5442 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
5445 print_usage (FILE* fp, int exit_value)
5447 fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
5448 fprintf (fp, "Options:\n");
5449 fprintf (fp, " -h,--help Display this message.\n");
5450 fprintf (fp, " -p,--no-params Don't display function parameters\n");
5451 fprintf (fp, " -v,--verbose Produce verbose demanglings.\n");
5452 fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n");
5457 /* Option specification for getopt_long. */
5458 static const struct option long_options[] =
5460 { "help", no_argument, NULL, 'h' },
5461 { "no-params", no_argument, NULL, 'p' },
5462 { "verbose", no_argument, NULL, 'v' },
5463 { NULL, no_argument, NULL, 0 },
5466 /* Main entry for a demangling filter executable. It will demangle
5467 its command line arguments, if any. If none are provided, it will
5468 filter stdin to stdout, replacing any recognized mangled C++ names
5469 with their demangled equivalents. */
5472 main (int argc, char *argv[])
5476 int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
5478 /* Use the program name of this program, as invoked. */
5479 program_name = argv[0];
5481 /* Parse options. */
5484 opt_char = getopt_long (argc, argv, "hpv", long_options, NULL);
5487 case '?': /* Unrecognized option. */
5488 print_usage (stderr, 1);
5492 print_usage (stdout, 0);
5496 options &= ~ DMGL_PARAMS;
5500 options |= DMGL_VERBOSE;
5504 while (opt_char != -1);
5507 /* No command line arguments were provided. Filter stdin. */
5509 dyn_string_t mangled = dyn_string_new (3);
5512 /* Read all of input. */
5513 while (!feof (stdin))
5517 /* Pile characters into mangled until we hit one that can't
5518 occur in a mangled name. */
5520 while (!feof (stdin) && is_mangled_char (c))
5522 dyn_string_append_char (mangled, c);
5528 if (dyn_string_length (mangled) > 0)
5530 #ifdef IN_GLIBCPP_V3
5531 s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL);
5533 s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
5543 /* It might not have been a mangled name. Print the
5545 fputs (dyn_string_buf (mangled), stdout);
5548 dyn_string_clear (mangled);
5551 /* If we haven't hit EOF yet, we've read one character that
5552 can't occur in a mangled name, so print it out. */
5557 dyn_string_delete (mangled);
5560 /* Demangle command line arguments. */
5562 /* Loop over command line arguments. */
5563 for (i = optind; i < argc; ++i)
5566 #ifdef IN_GLIBCPP_V3
5570 /* Attempt to demangle. */
5571 #ifdef IN_GLIBCPP_V3
5572 s = __cxa_demangle (argv[i], NULL, NULL, &status);
5574 s = cplus_demangle_v3 (argv[i], options);
5577 /* If it worked, print the demangled name. */
5585 #ifdef IN_GLIBCPP_V3
5586 fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status);
5588 fprintf (stderr, "Failed: %s\n", argv[i]);
5597 #endif /* STANDALONE_DEMANGLER */