Index: gcc/fortran/resolve.c
[official-gcc.git] / libiberty / cp-demangle.c
blob029151e320aadddd23642470434b5aa90761f9e1
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
20 executable.)
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
41 name.
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
58 demangle_callbackref
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
64 cplus_demangle_print
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:
73 IN_LIBGCC2
74 If defined, this file defines the following functions, q.v.:
75 char *__cxa_demangle (const char *mangled, char *buf, size_t *len,
76 int *status)
77 int __gcclibcxx_demangle_callback (const char *,
78 void (*)
79 (const char *, size_t, void *),
80 void *)
81 instead of cplus_demangle_v3[_callback]() and
82 java_demangle_v3[_callback]().
84 IN_GLIBCPP_V3
85 If defined, this file defines only __cxa_demangle() and
86 __gcclibcxx_demangle_callback(), and no other publically visible
87 functions or variables.
89 STANDALONE_DEMANGLER
90 If defined, this file defines a main() function which demangles
91 any arguments, or, if none, demangles stdin.
93 CP_DEMANGLE_DEBUG
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__)
99 #pragma alloca
100 #endif
102 #ifdef HAVE_CONFIG_H
103 #include "config.h"
104 #endif
106 #include <stdio.h>
108 #ifdef HAVE_STDLIB_H
109 #include <stdlib.h>
110 #endif
111 #ifdef HAVE_STRING_H
112 #include <string.h>
113 #endif
115 #ifdef HAVE_ALLOCA_H
116 # include <alloca.h>
117 #else
118 # ifndef alloca
119 # ifdef __GNUC__
120 # define alloca __builtin_alloca
121 # else
122 extern char *alloca ();
123 # endif /* __GNUC__ */
124 # endif /* alloca */
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
135 file. */
136 #ifdef IN_GLIBCPP_V3
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
144 static int
145 d_fill_extended_operator (struct demangle_component *, int,
146 struct demangle_component *);
148 #define cplus_demangle_fill_ctor d_fill_ctor
149 static int
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
154 static int
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. */
180 #ifdef __GNUC__
181 #define CP_DYNAMIC_ARRAYS
182 #else
183 #ifdef __STDC__
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
195 V3 demangler code.
197 As of this writing this file has the following undefined references
198 when compiled with -DIN_GLIBCPP_V3: realloc, free, memcpy, strcpy,
199 strcat, strlen. */
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. */
216 char code;
217 /* The simple string it expands to. */
218 const char *simple_expansion;
219 /* The length of the simple expansion. */
220 int simple_len;
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. */
225 int full_len;
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;
245 /* This template. */
246 const struct demangle_component *template_decl;
249 /* A list of type modifiers. This is used while printing. */
251 struct d_print_mod
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;
256 /* The modifier. */
257 const struct demangle_component *mod;
258 /* Whether this modifier was printed. */
259 int 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. */
269 char *buf;
270 /* Current length of data in buffer. */
271 size_t len;
272 /* Allocated size of buffer. */
273 size_t alc;
274 /* Set to 1 if we had a memory allocation failure. */
275 int allocation_failure;
278 /* A demangle component and some scope captured when it was first
279 traversed. */
281 struct d_saved_scope
283 /* The component whose scope this is. */
284 const struct demangle_component *container;
285 /* The list of templates, if any, that was current when this
286 scope was captured. */
287 struct d_print_template *templates;
290 /* Checkpoint structure to allow backtracking. This holds copies
291 of the fields of struct d_info that need to be restored
292 if a trial parse needs to be backtracked over. */
294 struct d_info_checkpoint
296 const char *n;
297 int next_comp;
298 int next_sub;
299 int did_subs;
300 int expansion;
303 enum { D_PRINT_BUFFER_LENGTH = 256 };
304 struct d_print_info
306 /* Fixed-length allocated buffer for demangled data, flushed to the
307 callback with a NUL termination once full. */
308 char buf[D_PRINT_BUFFER_LENGTH];
309 /* Current length of data in buffer. */
310 size_t len;
311 /* The last character printed, saved individually so that it survives
312 any buffer flush. */
313 char last_char;
314 /* Callback function to handle demangled buffer flush. */
315 demangle_callbackref callback;
316 /* Opaque callback argument. */
317 void *opaque;
318 /* The current list of templates, if any. */
319 struct d_print_template *templates;
320 /* The current list of modifiers (e.g., pointer, reference, etc.),
321 if any. */
322 struct d_print_mod *modifiers;
323 /* Set to 1 if we saw a demangling error. */
324 int demangle_failure;
325 /* The current index into any template argument packs we are using
326 for printing. */
327 int pack_index;
328 /* Number of d_print_flush calls so far. */
329 unsigned long int flush_count;
330 /* Array of saved scopes for evaluating substitutions. */
331 struct d_saved_scope *saved_scopes;
332 /* Number of saved scopes in the above array. */
333 int num_saved_scopes;
334 /* The nearest enclosing template, if any. */
335 const struct demangle_component *current_template;
338 #ifdef CP_DEMANGLE_DEBUG
339 static void d_dump (struct demangle_component *, int);
340 #endif
342 static struct demangle_component *
343 d_make_empty (struct d_info *);
345 static struct demangle_component *
346 d_make_comp (struct d_info *, enum demangle_component_type,
347 struct demangle_component *,
348 struct demangle_component *);
350 static struct demangle_component *
351 d_make_name (struct d_info *, const char *, int);
353 static struct demangle_component *
354 d_make_demangle_mangled_name (struct d_info *, const char *);
356 static struct demangle_component *
357 d_make_builtin_type (struct d_info *,
358 const struct demangle_builtin_type_info *);
360 static struct demangle_component *
361 d_make_operator (struct d_info *,
362 const struct demangle_operator_info *);
364 static struct demangle_component *
365 d_make_extended_operator (struct d_info *, int,
366 struct demangle_component *);
368 static struct demangle_component *
369 d_make_ctor (struct d_info *, enum gnu_v3_ctor_kinds,
370 struct demangle_component *);
372 static struct demangle_component *
373 d_make_dtor (struct d_info *, enum gnu_v3_dtor_kinds,
374 struct demangle_component *);
376 static struct demangle_component *
377 d_make_template_param (struct d_info *, long);
379 static struct demangle_component *
380 d_make_sub (struct d_info *, const char *, int);
382 static int
383 has_return_type (struct demangle_component *);
385 static int
386 is_ctor_dtor_or_conversion (struct demangle_component *);
388 static struct demangle_component *d_encoding (struct d_info *, int);
390 static struct demangle_component *d_name (struct d_info *);
392 static struct demangle_component *d_nested_name (struct d_info *);
394 static struct demangle_component *d_prefix (struct d_info *);
396 static struct demangle_component *d_unqualified_name (struct d_info *);
398 static struct demangle_component *d_source_name (struct d_info *);
400 static long d_number (struct d_info *);
402 static struct demangle_component *d_identifier (struct d_info *, int);
404 static struct demangle_component *d_operator_name (struct d_info *);
406 static struct demangle_component *d_special_name (struct d_info *);
408 static int d_call_offset (struct d_info *, int);
410 static struct demangle_component *d_ctor_dtor_name (struct d_info *);
412 static struct demangle_component **
413 d_cv_qualifiers (struct d_info *, struct demangle_component **, int);
415 static struct demangle_component *
416 d_ref_qualifier (struct d_info *, struct demangle_component *);
418 static struct demangle_component *
419 d_function_type (struct d_info *);
421 static struct demangle_component *
422 d_bare_function_type (struct d_info *, int);
424 static struct demangle_component *
425 d_class_enum_type (struct d_info *);
427 static struct demangle_component *d_array_type (struct d_info *);
429 static struct demangle_component *d_vector_type (struct d_info *);
431 static struct demangle_component *
432 d_pointer_to_member_type (struct d_info *);
434 static struct demangle_component *
435 d_template_param (struct d_info *);
437 static struct demangle_component *d_template_args (struct d_info *);
439 static struct demangle_component *
440 d_template_arg (struct d_info *);
442 static struct demangle_component *d_expression (struct d_info *);
444 static struct demangle_component *d_expr_primary (struct d_info *);
446 static struct demangle_component *d_local_name (struct d_info *);
448 static int d_discriminator (struct d_info *);
450 static struct demangle_component *d_lambda (struct d_info *);
452 static struct demangle_component *d_unnamed_type (struct d_info *);
454 static struct demangle_component *
455 d_clone_suffix (struct d_info *, struct demangle_component *);
457 static int
458 d_add_substitution (struct d_info *, struct demangle_component *);
460 static struct demangle_component *d_substitution (struct d_info *, int);
462 static void d_checkpoint (struct d_info *, struct d_info_checkpoint *);
464 static void d_backtrack (struct d_info *, struct d_info_checkpoint *);
466 static void d_growable_string_init (struct d_growable_string *, size_t);
468 static inline void
469 d_growable_string_resize (struct d_growable_string *, size_t);
471 static inline void
472 d_growable_string_append_buffer (struct d_growable_string *,
473 const char *, size_t);
474 static void
475 d_growable_string_callback_adapter (const char *, size_t, void *);
477 static void
478 d_print_init (struct d_print_info *, demangle_callbackref, void *);
480 static inline void d_print_error (struct d_print_info *);
482 static inline int d_print_saw_error (struct d_print_info *);
484 static inline void d_print_flush (struct d_print_info *);
486 static inline void d_append_char (struct d_print_info *, char);
488 static inline void d_append_buffer (struct d_print_info *,
489 const char *, size_t);
491 static inline void d_append_string (struct d_print_info *, const char *);
493 static inline char d_last_char (struct d_print_info *);
495 static void
496 d_print_comp (struct d_print_info *, int, const struct demangle_component *);
498 static void
499 d_print_java_identifier (struct d_print_info *, const char *, int);
501 static void
502 d_print_mod_list (struct d_print_info *, int, struct d_print_mod *, int);
504 static void
505 d_print_mod (struct d_print_info *, int, const struct demangle_component *);
507 static void
508 d_print_function_type (struct d_print_info *, int,
509 const struct demangle_component *,
510 struct d_print_mod *);
512 static void
513 d_print_array_type (struct d_print_info *, int,
514 const struct demangle_component *,
515 struct d_print_mod *);
517 static void
518 d_print_expr_op (struct d_print_info *, int, const struct demangle_component *);
520 static void
521 d_print_cast (struct d_print_info *, int, const struct demangle_component *);
523 static int d_demangle_callback (const char *, int,
524 demangle_callbackref, void *);
525 static char *d_demangle (const char *, int, size_t *);
527 #ifdef CP_DEMANGLE_DEBUG
529 static void
530 d_dump (struct demangle_component *dc, int indent)
532 int i;
534 if (dc == NULL)
536 if (indent == 0)
537 printf ("failed demangling\n");
538 return;
541 for (i = 0; i < indent; ++i)
542 putchar (' ');
544 switch (dc->type)
546 case DEMANGLE_COMPONENT_NAME:
547 printf ("name '%.*s'\n", dc->u.s_name.len, dc->u.s_name.s);
548 return;
549 case DEMANGLE_COMPONENT_TAGGED_NAME:
550 printf ("tagged name\n");
551 d_dump (dc->u.s_binary.left, indent + 2);
552 d_dump (dc->u.s_binary.right, indent + 2);
553 return;
554 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
555 printf ("template parameter %ld\n", dc->u.s_number.number);
556 return;
557 case DEMANGLE_COMPONENT_CTOR:
558 printf ("constructor %d\n", (int) dc->u.s_ctor.kind);
559 d_dump (dc->u.s_ctor.name, indent + 2);
560 return;
561 case DEMANGLE_COMPONENT_DTOR:
562 printf ("destructor %d\n", (int) dc->u.s_dtor.kind);
563 d_dump (dc->u.s_dtor.name, indent + 2);
564 return;
565 case DEMANGLE_COMPONENT_SUB_STD:
566 printf ("standard substitution %s\n", dc->u.s_string.string);
567 return;
568 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
569 printf ("builtin type %s\n", dc->u.s_builtin.type->name);
570 return;
571 case DEMANGLE_COMPONENT_OPERATOR:
572 printf ("operator %s\n", dc->u.s_operator.op->name);
573 return;
574 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
575 printf ("extended operator with %d args\n",
576 dc->u.s_extended_operator.args);
577 d_dump (dc->u.s_extended_operator.name, indent + 2);
578 return;
580 case DEMANGLE_COMPONENT_QUAL_NAME:
581 printf ("qualified name\n");
582 break;
583 case DEMANGLE_COMPONENT_LOCAL_NAME:
584 printf ("local name\n");
585 break;
586 case DEMANGLE_COMPONENT_TYPED_NAME:
587 printf ("typed name\n");
588 break;
589 case DEMANGLE_COMPONENT_TEMPLATE:
590 printf ("template\n");
591 break;
592 case DEMANGLE_COMPONENT_VTABLE:
593 printf ("vtable\n");
594 break;
595 case DEMANGLE_COMPONENT_VTT:
596 printf ("VTT\n");
597 break;
598 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
599 printf ("construction vtable\n");
600 break;
601 case DEMANGLE_COMPONENT_TYPEINFO:
602 printf ("typeinfo\n");
603 break;
604 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
605 printf ("typeinfo name\n");
606 break;
607 case DEMANGLE_COMPONENT_TYPEINFO_FN:
608 printf ("typeinfo function\n");
609 break;
610 case DEMANGLE_COMPONENT_THUNK:
611 printf ("thunk\n");
612 break;
613 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
614 printf ("virtual thunk\n");
615 break;
616 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
617 printf ("covariant thunk\n");
618 break;
619 case DEMANGLE_COMPONENT_JAVA_CLASS:
620 printf ("java class\n");
621 break;
622 case DEMANGLE_COMPONENT_GUARD:
623 printf ("guard\n");
624 break;
625 case DEMANGLE_COMPONENT_REFTEMP:
626 printf ("reference temporary\n");
627 break;
628 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
629 printf ("hidden alias\n");
630 break;
631 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
632 printf ("transaction clone\n");
633 break;
634 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
635 printf ("non-transaction clone\n");
636 break;
637 case DEMANGLE_COMPONENT_RESTRICT:
638 printf ("restrict\n");
639 break;
640 case DEMANGLE_COMPONENT_VOLATILE:
641 printf ("volatile\n");
642 break;
643 case DEMANGLE_COMPONENT_CONST:
644 printf ("const\n");
645 break;
646 case DEMANGLE_COMPONENT_RESTRICT_THIS:
647 printf ("restrict this\n");
648 break;
649 case DEMANGLE_COMPONENT_VOLATILE_THIS:
650 printf ("volatile this\n");
651 break;
652 case DEMANGLE_COMPONENT_CONST_THIS:
653 printf ("const this\n");
654 break;
655 case DEMANGLE_COMPONENT_REFERENCE_THIS:
656 printf ("reference this\n");
657 break;
658 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
659 printf ("rvalue reference this\n");
660 break;
661 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
662 printf ("vendor type qualifier\n");
663 break;
664 case DEMANGLE_COMPONENT_POINTER:
665 printf ("pointer\n");
666 break;
667 case DEMANGLE_COMPONENT_REFERENCE:
668 printf ("reference\n");
669 break;
670 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
671 printf ("rvalue reference\n");
672 break;
673 case DEMANGLE_COMPONENT_COMPLEX:
674 printf ("complex\n");
675 break;
676 case DEMANGLE_COMPONENT_IMAGINARY:
677 printf ("imaginary\n");
678 break;
679 case DEMANGLE_COMPONENT_VENDOR_TYPE:
680 printf ("vendor type\n");
681 break;
682 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
683 printf ("function type\n");
684 break;
685 case DEMANGLE_COMPONENT_ARRAY_TYPE:
686 printf ("array type\n");
687 break;
688 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
689 printf ("pointer to member type\n");
690 break;
691 case DEMANGLE_COMPONENT_FIXED_TYPE:
692 printf ("fixed-point type\n");
693 break;
694 case DEMANGLE_COMPONENT_ARGLIST:
695 printf ("argument list\n");
696 break;
697 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
698 printf ("template argument list\n");
699 break;
700 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
701 printf ("initializer list\n");
702 break;
703 case DEMANGLE_COMPONENT_CAST:
704 printf ("cast\n");
705 break;
706 case DEMANGLE_COMPONENT_NULLARY:
707 printf ("nullary operator\n");
708 break;
709 case DEMANGLE_COMPONENT_UNARY:
710 printf ("unary operator\n");
711 break;
712 case DEMANGLE_COMPONENT_BINARY:
713 printf ("binary operator\n");
714 break;
715 case DEMANGLE_COMPONENT_BINARY_ARGS:
716 printf ("binary operator arguments\n");
717 break;
718 case DEMANGLE_COMPONENT_TRINARY:
719 printf ("trinary operator\n");
720 break;
721 case DEMANGLE_COMPONENT_TRINARY_ARG1:
722 printf ("trinary operator arguments 1\n");
723 break;
724 case DEMANGLE_COMPONENT_TRINARY_ARG2:
725 printf ("trinary operator arguments 1\n");
726 break;
727 case DEMANGLE_COMPONENT_LITERAL:
728 printf ("literal\n");
729 break;
730 case DEMANGLE_COMPONENT_LITERAL_NEG:
731 printf ("negative literal\n");
732 break;
733 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
734 printf ("java resource\n");
735 break;
736 case DEMANGLE_COMPONENT_COMPOUND_NAME:
737 printf ("compound name\n");
738 break;
739 case DEMANGLE_COMPONENT_CHARACTER:
740 printf ("character '%c'\n", dc->u.s_character.character);
741 return;
742 case DEMANGLE_COMPONENT_DECLTYPE:
743 printf ("decltype\n");
744 break;
745 case DEMANGLE_COMPONENT_PACK_EXPANSION:
746 printf ("pack expansion\n");
747 break;
748 case DEMANGLE_COMPONENT_TLS_INIT:
749 printf ("tls init function\n");
750 break;
751 case DEMANGLE_COMPONENT_TLS_WRAPPER:
752 printf ("tls wrapper function\n");
753 break;
754 case DEMANGLE_COMPONENT_DEFAULT_ARG:
755 printf ("default argument %d\n", dc->u.s_unary_num.num);
756 d_dump (dc->u.s_unary_num.sub, indent+2);
757 return;
758 case DEMANGLE_COMPONENT_LAMBDA:
759 printf ("lambda %d\n", dc->u.s_unary_num.num);
760 d_dump (dc->u.s_unary_num.sub, indent+2);
761 return;
764 d_dump (d_left (dc), indent + 2);
765 d_dump (d_right (dc), indent + 2);
768 #endif /* CP_DEMANGLE_DEBUG */
770 /* Fill in a DEMANGLE_COMPONENT_NAME. */
772 CP_STATIC_IF_GLIBCPP_V3
774 cplus_demangle_fill_name (struct demangle_component *p, const char *s, int len)
776 if (p == NULL || s == NULL || len == 0)
777 return 0;
778 p->type = DEMANGLE_COMPONENT_NAME;
779 p->u.s_name.s = s;
780 p->u.s_name.len = len;
781 return 1;
784 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
786 CP_STATIC_IF_GLIBCPP_V3
788 cplus_demangle_fill_extended_operator (struct demangle_component *p, int args,
789 struct demangle_component *name)
791 if (p == NULL || args < 0 || name == NULL)
792 return 0;
793 p->type = DEMANGLE_COMPONENT_EXTENDED_OPERATOR;
794 p->u.s_extended_operator.args = args;
795 p->u.s_extended_operator.name = name;
796 return 1;
799 /* Fill in a DEMANGLE_COMPONENT_CTOR. */
801 CP_STATIC_IF_GLIBCPP_V3
803 cplus_demangle_fill_ctor (struct demangle_component *p,
804 enum gnu_v3_ctor_kinds kind,
805 struct demangle_component *name)
807 if (p == NULL
808 || name == NULL
809 || (int) kind < gnu_v3_complete_object_ctor
810 || (int) kind > gnu_v3_object_ctor_group)
811 return 0;
812 p->type = DEMANGLE_COMPONENT_CTOR;
813 p->u.s_ctor.kind = kind;
814 p->u.s_ctor.name = name;
815 return 1;
818 /* Fill in a DEMANGLE_COMPONENT_DTOR. */
820 CP_STATIC_IF_GLIBCPP_V3
822 cplus_demangle_fill_dtor (struct demangle_component *p,
823 enum gnu_v3_dtor_kinds kind,
824 struct demangle_component *name)
826 if (p == NULL
827 || name == NULL
828 || (int) kind < gnu_v3_deleting_dtor
829 || (int) kind > gnu_v3_object_dtor_group)
830 return 0;
831 p->type = DEMANGLE_COMPONENT_DTOR;
832 p->u.s_dtor.kind = kind;
833 p->u.s_dtor.name = name;
834 return 1;
837 /* Add a new component. */
839 static struct demangle_component *
840 d_make_empty (struct d_info *di)
842 struct demangle_component *p;
844 if (di->next_comp >= di->num_comps)
845 return NULL;
846 p = &di->comps[di->next_comp];
847 ++di->next_comp;
848 return p;
851 /* Add a new generic component. */
853 static struct demangle_component *
854 d_make_comp (struct d_info *di, enum demangle_component_type type,
855 struct demangle_component *left,
856 struct demangle_component *right)
858 struct demangle_component *p;
860 /* We check for errors here. A typical error would be a NULL return
861 from a subroutine. We catch those here, and return NULL
862 upward. */
863 switch (type)
865 /* These types require two parameters. */
866 case DEMANGLE_COMPONENT_QUAL_NAME:
867 case DEMANGLE_COMPONENT_LOCAL_NAME:
868 case DEMANGLE_COMPONENT_TYPED_NAME:
869 case DEMANGLE_COMPONENT_TAGGED_NAME:
870 case DEMANGLE_COMPONENT_TEMPLATE:
871 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
872 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
873 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
874 case DEMANGLE_COMPONENT_UNARY:
875 case DEMANGLE_COMPONENT_BINARY:
876 case DEMANGLE_COMPONENT_BINARY_ARGS:
877 case DEMANGLE_COMPONENT_TRINARY:
878 case DEMANGLE_COMPONENT_TRINARY_ARG1:
879 case DEMANGLE_COMPONENT_LITERAL:
880 case DEMANGLE_COMPONENT_LITERAL_NEG:
881 case DEMANGLE_COMPONENT_COMPOUND_NAME:
882 case DEMANGLE_COMPONENT_VECTOR_TYPE:
883 case DEMANGLE_COMPONENT_CLONE:
884 if (left == NULL || right == NULL)
885 return NULL;
886 break;
888 /* These types only require one parameter. */
889 case DEMANGLE_COMPONENT_VTABLE:
890 case DEMANGLE_COMPONENT_VTT:
891 case DEMANGLE_COMPONENT_TYPEINFO:
892 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
893 case DEMANGLE_COMPONENT_TYPEINFO_FN:
894 case DEMANGLE_COMPONENT_THUNK:
895 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
896 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
897 case DEMANGLE_COMPONENT_JAVA_CLASS:
898 case DEMANGLE_COMPONENT_GUARD:
899 case DEMANGLE_COMPONENT_TLS_INIT:
900 case DEMANGLE_COMPONENT_TLS_WRAPPER:
901 case DEMANGLE_COMPONENT_REFTEMP:
902 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
903 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
904 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
905 case DEMANGLE_COMPONENT_POINTER:
906 case DEMANGLE_COMPONENT_REFERENCE:
907 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
908 case DEMANGLE_COMPONENT_COMPLEX:
909 case DEMANGLE_COMPONENT_IMAGINARY:
910 case DEMANGLE_COMPONENT_VENDOR_TYPE:
911 case DEMANGLE_COMPONENT_CAST:
912 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
913 case DEMANGLE_COMPONENT_DECLTYPE:
914 case DEMANGLE_COMPONENT_PACK_EXPANSION:
915 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
916 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
917 case DEMANGLE_COMPONENT_NULLARY:
918 case DEMANGLE_COMPONENT_TRINARY_ARG2:
919 if (left == NULL)
920 return NULL;
921 break;
923 /* This needs a right parameter, but the left parameter can be
924 empty. */
925 case DEMANGLE_COMPONENT_ARRAY_TYPE:
926 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
927 if (right == NULL)
928 return NULL;
929 break;
931 /* These are allowed to have no parameters--in some cases they
932 will be filled in later. */
933 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
934 case DEMANGLE_COMPONENT_RESTRICT:
935 case DEMANGLE_COMPONENT_VOLATILE:
936 case DEMANGLE_COMPONENT_CONST:
937 case DEMANGLE_COMPONENT_RESTRICT_THIS:
938 case DEMANGLE_COMPONENT_VOLATILE_THIS:
939 case DEMANGLE_COMPONENT_CONST_THIS:
940 case DEMANGLE_COMPONENT_REFERENCE_THIS:
941 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
942 case DEMANGLE_COMPONENT_ARGLIST:
943 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
944 break;
946 /* Other types should not be seen here. */
947 default:
948 return NULL;
951 p = d_make_empty (di);
952 if (p != NULL)
954 p->type = type;
955 p->u.s_binary.left = left;
956 p->u.s_binary.right = right;
958 return p;
961 /* Add a new demangle mangled name component. */
963 static struct demangle_component *
964 d_make_demangle_mangled_name (struct d_info *di, const char *s)
966 if (d_peek_char (di) != '_' || d_peek_next_char (di) != 'Z')
967 return d_make_name (di, s, strlen (s));
968 d_advance (di, 2);
969 return d_encoding (di, 0);
972 /* Add a new name component. */
974 static struct demangle_component *
975 d_make_name (struct d_info *di, const char *s, int len)
977 struct demangle_component *p;
979 p = d_make_empty (di);
980 if (! cplus_demangle_fill_name (p, s, len))
981 return NULL;
982 return p;
985 /* Add a new builtin type component. */
987 static struct demangle_component *
988 d_make_builtin_type (struct d_info *di,
989 const struct demangle_builtin_type_info *type)
991 struct demangle_component *p;
993 if (type == NULL)
994 return NULL;
995 p = d_make_empty (di);
996 if (p != NULL)
998 p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE;
999 p->u.s_builtin.type = type;
1001 return p;
1004 /* Add a new operator component. */
1006 static struct demangle_component *
1007 d_make_operator (struct d_info *di, const struct demangle_operator_info *op)
1009 struct demangle_component *p;
1011 p = d_make_empty (di);
1012 if (p != NULL)
1014 p->type = DEMANGLE_COMPONENT_OPERATOR;
1015 p->u.s_operator.op = op;
1017 return p;
1020 /* Add a new extended operator component. */
1022 static struct demangle_component *
1023 d_make_extended_operator (struct d_info *di, int args,
1024 struct demangle_component *name)
1026 struct demangle_component *p;
1028 p = d_make_empty (di);
1029 if (! cplus_demangle_fill_extended_operator (p, args, name))
1030 return NULL;
1031 return p;
1034 static struct demangle_component *
1035 d_make_default_arg (struct d_info *di, int num,
1036 struct demangle_component *sub)
1038 struct demangle_component *p = d_make_empty (di);
1039 if (p)
1041 p->type = DEMANGLE_COMPONENT_DEFAULT_ARG;
1042 p->u.s_unary_num.num = num;
1043 p->u.s_unary_num.sub = sub;
1045 return p;
1048 /* Add a new constructor component. */
1050 static struct demangle_component *
1051 d_make_ctor (struct d_info *di, enum gnu_v3_ctor_kinds kind,
1052 struct demangle_component *name)
1054 struct demangle_component *p;
1056 p = d_make_empty (di);
1057 if (! cplus_demangle_fill_ctor (p, kind, name))
1058 return NULL;
1059 return p;
1062 /* Add a new destructor component. */
1064 static struct demangle_component *
1065 d_make_dtor (struct d_info *di, enum gnu_v3_dtor_kinds kind,
1066 struct demangle_component *name)
1068 struct demangle_component *p;
1070 p = d_make_empty (di);
1071 if (! cplus_demangle_fill_dtor (p, kind, name))
1072 return NULL;
1073 return p;
1076 /* Add a new template parameter. */
1078 static struct demangle_component *
1079 d_make_template_param (struct d_info *di, long i)
1081 struct demangle_component *p;
1083 p = d_make_empty (di);
1084 if (p != NULL)
1086 p->type = DEMANGLE_COMPONENT_TEMPLATE_PARAM;
1087 p->u.s_number.number = i;
1089 return p;
1092 /* Add a new function parameter. */
1094 static struct demangle_component *
1095 d_make_function_param (struct d_info *di, long i)
1097 struct demangle_component *p;
1099 p = d_make_empty (di);
1100 if (p != NULL)
1102 p->type = DEMANGLE_COMPONENT_FUNCTION_PARAM;
1103 p->u.s_number.number = i;
1105 return p;
1108 /* Add a new standard substitution component. */
1110 static struct demangle_component *
1111 d_make_sub (struct d_info *di, const char *name, int len)
1113 struct demangle_component *p;
1115 p = d_make_empty (di);
1116 if (p != NULL)
1118 p->type = DEMANGLE_COMPONENT_SUB_STD;
1119 p->u.s_string.string = name;
1120 p->u.s_string.len = len;
1122 return p;
1125 /* <mangled-name> ::= _Z <encoding> [<clone-suffix>]*
1127 TOP_LEVEL is non-zero when called at the top level. */
1129 CP_STATIC_IF_GLIBCPP_V3
1130 struct demangle_component *
1131 cplus_demangle_mangled_name (struct d_info *di, int top_level)
1133 struct demangle_component *p;
1135 if (! d_check_char (di, '_')
1136 /* Allow missing _ if not at toplevel to work around a
1137 bug in G++ abi-version=2 mangling; see the comment in
1138 write_template_arg. */
1139 && top_level)
1140 return NULL;
1141 if (! d_check_char (di, 'Z'))
1142 return NULL;
1143 p = d_encoding (di, top_level);
1145 /* If at top level and parsing parameters, check for a clone
1146 suffix. */
1147 if (top_level && (di->options & DMGL_PARAMS) != 0)
1148 while (d_peek_char (di) == '.'
1149 && (IS_LOWER (d_peek_next_char (di))
1150 || d_peek_next_char (di) == '_'
1151 || IS_DIGIT (d_peek_next_char (di))))
1152 p = d_clone_suffix (di, p);
1154 return p;
1157 /* Return whether a function should have a return type. The argument
1158 is the function name, which may be qualified in various ways. The
1159 rules are that template functions have return types with some
1160 exceptions, function types which are not part of a function name
1161 mangling have return types with some exceptions, and non-template
1162 function names do not have return types. The exceptions are that
1163 constructors, destructors, and conversion operators do not have
1164 return types. */
1166 static int
1167 has_return_type (struct demangle_component *dc)
1169 if (dc == NULL)
1170 return 0;
1171 switch (dc->type)
1173 default:
1174 return 0;
1175 case DEMANGLE_COMPONENT_TEMPLATE:
1176 return ! is_ctor_dtor_or_conversion (d_left (dc));
1177 case DEMANGLE_COMPONENT_RESTRICT_THIS:
1178 case DEMANGLE_COMPONENT_VOLATILE_THIS:
1179 case DEMANGLE_COMPONENT_CONST_THIS:
1180 case DEMANGLE_COMPONENT_REFERENCE_THIS:
1181 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
1182 return has_return_type (d_left (dc));
1186 /* Return whether a name is a constructor, a destructor, or a
1187 conversion operator. */
1189 static int
1190 is_ctor_dtor_or_conversion (struct demangle_component *dc)
1192 if (dc == NULL)
1193 return 0;
1194 switch (dc->type)
1196 default:
1197 return 0;
1198 case DEMANGLE_COMPONENT_QUAL_NAME:
1199 case DEMANGLE_COMPONENT_LOCAL_NAME:
1200 return is_ctor_dtor_or_conversion (d_right (dc));
1201 case DEMANGLE_COMPONENT_CTOR:
1202 case DEMANGLE_COMPONENT_DTOR:
1203 case DEMANGLE_COMPONENT_CAST:
1204 return 1;
1208 /* <encoding> ::= <(function) name> <bare-function-type>
1209 ::= <(data) name>
1210 ::= <special-name>
1212 TOP_LEVEL is non-zero when called at the top level, in which case
1213 if DMGL_PARAMS is not set we do not demangle the function
1214 parameters. We only set this at the top level, because otherwise
1215 we would not correctly demangle names in local scopes. */
1217 static struct demangle_component *
1218 d_encoding (struct d_info *di, int top_level)
1220 char peek = d_peek_char (di);
1222 if (peek == 'G' || peek == 'T')
1223 return d_special_name (di);
1224 else
1226 struct demangle_component *dc;
1228 dc = d_name (di);
1230 if (dc != NULL && top_level && (di->options & DMGL_PARAMS) == 0)
1232 /* Strip off any initial CV-qualifiers, as they really apply
1233 to the `this' parameter, and they were not output by the
1234 v2 demangler without DMGL_PARAMS. */
1235 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1236 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1237 || dc->type == DEMANGLE_COMPONENT_CONST_THIS
1238 || dc->type == DEMANGLE_COMPONENT_REFERENCE_THIS
1239 || dc->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)
1240 dc = d_left (dc);
1242 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1243 there may be CV-qualifiers on its right argument which
1244 really apply here; this happens when parsing a class
1245 which is local to a function. */
1246 if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME)
1248 struct demangle_component *dcr;
1250 dcr = d_right (dc);
1251 while (dcr->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1252 || dcr->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1253 || dcr->type == DEMANGLE_COMPONENT_CONST_THIS
1254 || dcr->type == DEMANGLE_COMPONENT_REFERENCE_THIS
1255 || dcr->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)
1256 dcr = d_left (dcr);
1257 dc->u.s_binary.right = dcr;
1260 return dc;
1263 peek = d_peek_char (di);
1264 if (dc == NULL || peek == '\0' || peek == 'E')
1265 return dc;
1266 return d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, dc,
1267 d_bare_function_type (di, has_return_type (dc)));
1271 /* <tagged-name> ::= <name> B <source-name> */
1273 static struct demangle_component *
1274 d_abi_tags (struct d_info *di, struct demangle_component *dc)
1276 char peek;
1277 while (peek = d_peek_char (di),
1278 peek == 'B')
1280 struct demangle_component *tag;
1281 d_advance (di, 1);
1282 tag = d_source_name (di);
1283 dc = d_make_comp (di, DEMANGLE_COMPONENT_TAGGED_NAME, dc, tag);
1285 return dc;
1288 /* <name> ::= <nested-name>
1289 ::= <unscoped-name>
1290 ::= <unscoped-template-name> <template-args>
1291 ::= <local-name>
1293 <unscoped-name> ::= <unqualified-name>
1294 ::= St <unqualified-name>
1296 <unscoped-template-name> ::= <unscoped-name>
1297 ::= <substitution>
1300 static struct demangle_component *
1301 d_name (struct d_info *di)
1303 char peek = d_peek_char (di);
1304 struct demangle_component *dc;
1306 switch (peek)
1308 case 'N':
1309 return d_nested_name (di);
1311 case 'Z':
1312 return d_local_name (di);
1314 case 'U':
1315 return d_unqualified_name (di);
1317 case 'S':
1319 int subst;
1321 if (d_peek_next_char (di) != 't')
1323 dc = d_substitution (di, 0);
1324 subst = 1;
1326 else
1328 d_advance (di, 2);
1329 dc = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME,
1330 d_make_name (di, "std", 3),
1331 d_unqualified_name (di));
1332 di->expansion += 3;
1333 subst = 0;
1336 if (d_peek_char (di) != 'I')
1338 /* The grammar does not permit this case to occur if we
1339 called d_substitution() above (i.e., subst == 1). We
1340 don't bother to check. */
1342 else
1344 /* This is <template-args>, which means that we just saw
1345 <unscoped-template-name>, which is a substitution
1346 candidate if we didn't just get it from a
1347 substitution. */
1348 if (! subst)
1350 if (! d_add_substitution (di, dc))
1351 return NULL;
1353 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1354 d_template_args (di));
1357 return dc;
1360 case 'L':
1361 default:
1362 dc = d_unqualified_name (di);
1363 if (d_peek_char (di) == 'I')
1365 /* This is <template-args>, which means that we just saw
1366 <unscoped-template-name>, which is a substitution
1367 candidate. */
1368 if (! d_add_substitution (di, dc))
1369 return NULL;
1370 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1371 d_template_args (di));
1373 return dc;
1377 /* <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
1378 ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
1381 static struct demangle_component *
1382 d_nested_name (struct d_info *di)
1384 struct demangle_component *ret;
1385 struct demangle_component **pret;
1386 struct demangle_component *rqual;
1388 if (! d_check_char (di, 'N'))
1389 return NULL;
1391 pret = d_cv_qualifiers (di, &ret, 1);
1392 if (pret == NULL)
1393 return NULL;
1395 /* Parse the ref-qualifier now and then attach it
1396 once we have something to attach it to. */
1397 rqual = d_ref_qualifier (di, NULL);
1399 *pret = d_prefix (di);
1400 if (*pret == NULL)
1401 return NULL;
1403 if (rqual)
1405 d_left (rqual) = ret;
1406 ret = rqual;
1409 if (! d_check_char (di, 'E'))
1410 return NULL;
1412 return ret;
1415 /* <prefix> ::= <prefix> <unqualified-name>
1416 ::= <template-prefix> <template-args>
1417 ::= <template-param>
1418 ::= <decltype>
1420 ::= <substitution>
1422 <template-prefix> ::= <prefix> <(template) unqualified-name>
1423 ::= <template-param>
1424 ::= <substitution>
1427 static struct demangle_component *
1428 d_prefix (struct d_info *di)
1430 struct demangle_component *ret = NULL;
1432 while (1)
1434 char peek;
1435 enum demangle_component_type comb_type;
1436 struct demangle_component *dc;
1438 peek = d_peek_char (di);
1439 if (peek == '\0')
1440 return NULL;
1442 /* The older code accepts a <local-name> here, but I don't see
1443 that in the grammar. The older code does not accept a
1444 <template-param> here. */
1446 comb_type = DEMANGLE_COMPONENT_QUAL_NAME;
1447 if (peek == 'D')
1449 char peek2 = d_peek_next_char (di);
1450 if (peek2 == 'T' || peek2 == 't')
1451 /* Decltype. */
1452 dc = cplus_demangle_type (di);
1453 else
1454 /* Destructor name. */
1455 dc = d_unqualified_name (di);
1457 else if (IS_DIGIT (peek)
1458 || IS_LOWER (peek)
1459 || peek == 'C'
1460 || peek == 'U'
1461 || peek == 'L')
1462 dc = d_unqualified_name (di);
1463 else if (peek == 'S')
1464 dc = d_substitution (di, 1);
1465 else if (peek == 'I')
1467 if (ret == NULL)
1468 return NULL;
1469 comb_type = DEMANGLE_COMPONENT_TEMPLATE;
1470 dc = d_template_args (di);
1472 else if (peek == 'T')
1473 dc = d_template_param (di);
1474 else if (peek == 'E')
1475 return ret;
1476 else if (peek == 'M')
1478 /* Initializer scope for a lambda. We don't need to represent
1479 this; the normal code will just treat the variable as a type
1480 scope, which gives appropriate output. */
1481 if (ret == NULL)
1482 return NULL;
1483 d_advance (di, 1);
1484 continue;
1486 else
1487 return NULL;
1489 if (ret == NULL)
1490 ret = dc;
1491 else
1492 ret = d_make_comp (di, comb_type, ret, dc);
1494 if (peek != 'S' && d_peek_char (di) != 'E')
1496 if (! d_add_substitution (di, ret))
1497 return NULL;
1502 /* <unqualified-name> ::= <operator-name>
1503 ::= <ctor-dtor-name>
1504 ::= <source-name>
1505 ::= <local-source-name>
1507 <local-source-name> ::= L <source-name> <discriminator>
1510 static struct demangle_component *
1511 d_unqualified_name (struct d_info *di)
1513 struct demangle_component *ret;
1514 char peek;
1516 peek = d_peek_char (di);
1517 if (IS_DIGIT (peek))
1518 ret = d_source_name (di);
1519 else if (IS_LOWER (peek))
1521 ret = d_operator_name (di);
1522 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_OPERATOR)
1524 di->expansion += sizeof "operator" + ret->u.s_operator.op->len - 2;
1525 if (!strcmp (ret->u.s_operator.op->code, "li"))
1526 ret = d_make_comp (di, DEMANGLE_COMPONENT_UNARY, ret,
1527 d_source_name (di));
1530 else if (peek == 'C' || peek == 'D')
1531 ret = d_ctor_dtor_name (di);
1532 else if (peek == 'L')
1534 d_advance (di, 1);
1536 ret = d_source_name (di);
1537 if (ret == NULL)
1538 return NULL;
1539 if (! d_discriminator (di))
1540 return NULL;
1542 else if (peek == 'U')
1544 switch (d_peek_next_char (di))
1546 case 'l':
1547 ret = d_lambda (di);
1548 break;
1549 case 't':
1550 ret = d_unnamed_type (di);
1551 break;
1552 default:
1553 return NULL;
1556 else
1557 return NULL;
1559 if (d_peek_char (di) == 'B')
1560 ret = d_abi_tags (di, ret);
1561 return ret;
1564 /* <source-name> ::= <(positive length) number> <identifier> */
1566 static struct demangle_component *
1567 d_source_name (struct d_info *di)
1569 long len;
1570 struct demangle_component *ret;
1572 len = d_number (di);
1573 if (len <= 0)
1574 return NULL;
1575 ret = d_identifier (di, len);
1576 di->last_name = ret;
1577 return ret;
1580 /* number ::= [n] <(non-negative decimal integer)> */
1582 static long
1583 d_number (struct d_info *di)
1585 int negative;
1586 char peek;
1587 long ret;
1589 negative = 0;
1590 peek = d_peek_char (di);
1591 if (peek == 'n')
1593 negative = 1;
1594 d_advance (di, 1);
1595 peek = d_peek_char (di);
1598 ret = 0;
1599 while (1)
1601 if (! IS_DIGIT (peek))
1603 if (negative)
1604 ret = - ret;
1605 return ret;
1607 ret = ret * 10 + peek - '0';
1608 d_advance (di, 1);
1609 peek = d_peek_char (di);
1613 /* Like d_number, but returns a demangle_component. */
1615 static struct demangle_component *
1616 d_number_component (struct d_info *di)
1618 struct demangle_component *ret = d_make_empty (di);
1619 if (ret)
1621 ret->type = DEMANGLE_COMPONENT_NUMBER;
1622 ret->u.s_number.number = d_number (di);
1624 return ret;
1627 /* identifier ::= <(unqualified source code identifier)> */
1629 static struct demangle_component *
1630 d_identifier (struct d_info *di, int len)
1632 const char *name;
1634 name = d_str (di);
1636 if (di->send - name < len)
1637 return NULL;
1639 d_advance (di, len);
1641 /* A Java mangled name may have a trailing '$' if it is a C++
1642 keyword. This '$' is not included in the length count. We just
1643 ignore the '$'. */
1644 if ((di->options & DMGL_JAVA) != 0
1645 && d_peek_char (di) == '$')
1646 d_advance (di, 1);
1648 /* Look for something which looks like a gcc encoding of an
1649 anonymous namespace, and replace it with a more user friendly
1650 name. */
1651 if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
1652 && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX,
1653 ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0)
1655 const char *s;
1657 s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN;
1658 if ((*s == '.' || *s == '_' || *s == '$')
1659 && s[1] == 'N')
1661 di->expansion -= len - sizeof "(anonymous namespace)";
1662 return d_make_name (di, "(anonymous namespace)",
1663 sizeof "(anonymous namespace)" - 1);
1667 return d_make_name (di, name, len);
1670 /* operator_name ::= many different two character encodings.
1671 ::= cv <type>
1672 ::= v <digit> <source-name>
1674 This list is sorted for binary search. */
1676 #define NL(s) s, (sizeof s) - 1
1678 CP_STATIC_IF_GLIBCPP_V3
1679 const struct demangle_operator_info cplus_demangle_operators[] =
1681 { "aN", NL ("&="), 2 },
1682 { "aS", NL ("="), 2 },
1683 { "aa", NL ("&&"), 2 },
1684 { "ad", NL ("&"), 1 },
1685 { "an", NL ("&"), 2 },
1686 { "at", NL ("alignof "), 1 },
1687 { "az", NL ("alignof "), 1 },
1688 { "cc", NL ("const_cast"), 2 },
1689 { "cl", NL ("()"), 2 },
1690 { "cm", NL (","), 2 },
1691 { "co", NL ("~"), 1 },
1692 { "dV", NL ("/="), 2 },
1693 { "da", NL ("delete[] "), 1 },
1694 { "dc", NL ("dynamic_cast"), 2 },
1695 { "de", NL ("*"), 1 },
1696 { "dl", NL ("delete "), 1 },
1697 { "ds", NL (".*"), 2 },
1698 { "dt", NL ("."), 2 },
1699 { "dv", NL ("/"), 2 },
1700 { "eO", NL ("^="), 2 },
1701 { "eo", NL ("^"), 2 },
1702 { "eq", NL ("=="), 2 },
1703 { "ge", NL (">="), 2 },
1704 { "gs", NL ("::"), 1 },
1705 { "gt", NL (">"), 2 },
1706 { "ix", NL ("[]"), 2 },
1707 { "lS", NL ("<<="), 2 },
1708 { "le", NL ("<="), 2 },
1709 { "li", NL ("operator\"\" "), 1 },
1710 { "ls", NL ("<<"), 2 },
1711 { "lt", NL ("<"), 2 },
1712 { "mI", NL ("-="), 2 },
1713 { "mL", NL ("*="), 2 },
1714 { "mi", NL ("-"), 2 },
1715 { "ml", NL ("*"), 2 },
1716 { "mm", NL ("--"), 1 },
1717 { "na", NL ("new[]"), 3 },
1718 { "ne", NL ("!="), 2 },
1719 { "ng", NL ("-"), 1 },
1720 { "nt", NL ("!"), 1 },
1721 { "nw", NL ("new"), 3 },
1722 { "oR", NL ("|="), 2 },
1723 { "oo", NL ("||"), 2 },
1724 { "or", NL ("|"), 2 },
1725 { "pL", NL ("+="), 2 },
1726 { "pl", NL ("+"), 2 },
1727 { "pm", NL ("->*"), 2 },
1728 { "pp", NL ("++"), 1 },
1729 { "ps", NL ("+"), 1 },
1730 { "pt", NL ("->"), 2 },
1731 { "qu", NL ("?"), 3 },
1732 { "rM", NL ("%="), 2 },
1733 { "rS", NL (">>="), 2 },
1734 { "rc", NL ("reinterpret_cast"), 2 },
1735 { "rm", NL ("%"), 2 },
1736 { "rs", NL (">>"), 2 },
1737 { "sc", NL ("static_cast"), 2 },
1738 { "st", NL ("sizeof "), 1 },
1739 { "sz", NL ("sizeof "), 1 },
1740 { "tr", NL ("throw"), 0 },
1741 { "tw", NL ("throw "), 1 },
1742 { NULL, NULL, 0, 0 }
1745 static struct demangle_component *
1746 d_operator_name (struct d_info *di)
1748 char c1;
1749 char c2;
1751 c1 = d_next_char (di);
1752 c2 = d_next_char (di);
1753 if (c1 == 'v' && IS_DIGIT (c2))
1754 return d_make_extended_operator (di, c2 - '0', d_source_name (di));
1755 else if (c1 == 'c' && c2 == 'v')
1757 struct demangle_component *type;
1758 int was_conversion = di->is_conversion;
1760 di->is_conversion = ! di->is_expression;
1761 type = cplus_demangle_type (di);
1762 di->is_conversion = was_conversion;
1763 return d_make_comp (di, DEMANGLE_COMPONENT_CAST, type, NULL);
1765 else
1767 /* LOW is the inclusive lower bound. */
1768 int low = 0;
1769 /* HIGH is the exclusive upper bound. We subtract one to ignore
1770 the sentinel at the end of the array. */
1771 int high = ((sizeof (cplus_demangle_operators)
1772 / sizeof (cplus_demangle_operators[0]))
1773 - 1);
1775 while (1)
1777 int i;
1778 const struct demangle_operator_info *p;
1780 i = low + (high - low) / 2;
1781 p = cplus_demangle_operators + i;
1783 if (c1 == p->code[0] && c2 == p->code[1])
1784 return d_make_operator (di, p);
1786 if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1]))
1787 high = i;
1788 else
1789 low = i + 1;
1790 if (low == high)
1791 return NULL;
1796 static struct demangle_component *
1797 d_make_character (struct d_info *di, int c)
1799 struct demangle_component *p;
1800 p = d_make_empty (di);
1801 if (p != NULL)
1803 p->type = DEMANGLE_COMPONENT_CHARACTER;
1804 p->u.s_character.character = c;
1806 return p;
1809 static struct demangle_component *
1810 d_java_resource (struct d_info *di)
1812 struct demangle_component *p = NULL;
1813 struct demangle_component *next = NULL;
1814 long len, i;
1815 char c;
1816 const char *str;
1818 len = d_number (di);
1819 if (len <= 1)
1820 return NULL;
1822 /* Eat the leading '_'. */
1823 if (d_next_char (di) != '_')
1824 return NULL;
1825 len--;
1827 str = d_str (di);
1828 i = 0;
1830 while (len > 0)
1832 c = str[i];
1833 if (!c)
1834 return NULL;
1836 /* Each chunk is either a '$' escape... */
1837 if (c == '$')
1839 i++;
1840 switch (str[i++])
1842 case 'S':
1843 c = '/';
1844 break;
1845 case '_':
1846 c = '.';
1847 break;
1848 case '$':
1849 c = '$';
1850 break;
1851 default:
1852 return NULL;
1854 next = d_make_character (di, c);
1855 d_advance (di, i);
1856 str = d_str (di);
1857 len -= i;
1858 i = 0;
1859 if (next == NULL)
1860 return NULL;
1862 /* ... or a sequence of characters. */
1863 else
1865 while (i < len && str[i] && str[i] != '$')
1866 i++;
1868 next = d_make_name (di, str, i);
1869 d_advance (di, i);
1870 str = d_str (di);
1871 len -= i;
1872 i = 0;
1873 if (next == NULL)
1874 return NULL;
1877 if (p == NULL)
1878 p = next;
1879 else
1881 p = d_make_comp (di, DEMANGLE_COMPONENT_COMPOUND_NAME, p, next);
1882 if (p == NULL)
1883 return NULL;
1887 p = d_make_comp (di, DEMANGLE_COMPONENT_JAVA_RESOURCE, p, NULL);
1889 return p;
1892 /* <special-name> ::= TV <type>
1893 ::= TT <type>
1894 ::= TI <type>
1895 ::= TS <type>
1896 ::= GV <(object) name>
1897 ::= T <call-offset> <(base) encoding>
1898 ::= Tc <call-offset> <call-offset> <(base) encoding>
1899 Also g++ extensions:
1900 ::= TC <type> <(offset) number> _ <(base) type>
1901 ::= TF <type>
1902 ::= TJ <type>
1903 ::= GR <name>
1904 ::= GA <encoding>
1905 ::= Gr <resource name>
1906 ::= GTt <encoding>
1907 ::= GTn <encoding>
1910 static struct demangle_component *
1911 d_special_name (struct d_info *di)
1913 di->expansion += 20;
1914 if (d_check_char (di, 'T'))
1916 switch (d_next_char (di))
1918 case 'V':
1919 di->expansion -= 5;
1920 return d_make_comp (di, DEMANGLE_COMPONENT_VTABLE,
1921 cplus_demangle_type (di), NULL);
1922 case 'T':
1923 di->expansion -= 10;
1924 return d_make_comp (di, DEMANGLE_COMPONENT_VTT,
1925 cplus_demangle_type (di), NULL);
1926 case 'I':
1927 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO,
1928 cplus_demangle_type (di), NULL);
1929 case 'S':
1930 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_NAME,
1931 cplus_demangle_type (di), NULL);
1933 case 'h':
1934 if (! d_call_offset (di, 'h'))
1935 return NULL;
1936 return d_make_comp (di, DEMANGLE_COMPONENT_THUNK,
1937 d_encoding (di, 0), NULL);
1939 case 'v':
1940 if (! d_call_offset (di, 'v'))
1941 return NULL;
1942 return d_make_comp (di, DEMANGLE_COMPONENT_VIRTUAL_THUNK,
1943 d_encoding (di, 0), NULL);
1945 case 'c':
1946 if (! d_call_offset (di, '\0'))
1947 return NULL;
1948 if (! d_call_offset (di, '\0'))
1949 return NULL;
1950 return d_make_comp (di, DEMANGLE_COMPONENT_COVARIANT_THUNK,
1951 d_encoding (di, 0), NULL);
1953 case 'C':
1955 struct demangle_component *derived_type;
1956 long offset;
1957 struct demangle_component *base_type;
1959 derived_type = cplus_demangle_type (di);
1960 offset = d_number (di);
1961 if (offset < 0)
1962 return NULL;
1963 if (! d_check_char (di, '_'))
1964 return NULL;
1965 base_type = cplus_demangle_type (di);
1966 /* We don't display the offset. FIXME: We should display
1967 it in verbose mode. */
1968 di->expansion += 5;
1969 return d_make_comp (di, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE,
1970 base_type, derived_type);
1973 case 'F':
1974 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_FN,
1975 cplus_demangle_type (di), NULL);
1976 case 'J':
1977 return d_make_comp (di, DEMANGLE_COMPONENT_JAVA_CLASS,
1978 cplus_demangle_type (di), NULL);
1980 case 'H':
1981 return d_make_comp (di, DEMANGLE_COMPONENT_TLS_INIT,
1982 d_name (di), NULL);
1984 case 'W':
1985 return d_make_comp (di, DEMANGLE_COMPONENT_TLS_WRAPPER,
1986 d_name (di), NULL);
1988 default:
1989 return NULL;
1992 else if (d_check_char (di, 'G'))
1994 switch (d_next_char (di))
1996 case 'V':
1997 return d_make_comp (di, DEMANGLE_COMPONENT_GUARD, d_name (di), NULL);
1999 case 'R':
2001 struct demangle_component *name = d_name (di);
2002 return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, name,
2003 d_number_component (di));
2006 case 'A':
2007 return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS,
2008 d_encoding (di, 0), NULL);
2010 case 'T':
2011 switch (d_next_char (di))
2013 case 'n':
2014 return d_make_comp (di, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE,
2015 d_encoding (di, 0), NULL);
2016 default:
2017 /* ??? The proposal is that other letters (such as 'h') stand
2018 for different variants of transaction cloning, such as
2019 compiling directly for hardware transaction support. But
2020 they still should all be transactional clones of some sort
2021 so go ahead and call them that. */
2022 case 't':
2023 return d_make_comp (di, DEMANGLE_COMPONENT_TRANSACTION_CLONE,
2024 d_encoding (di, 0), NULL);
2027 case 'r':
2028 return d_java_resource (di);
2030 default:
2031 return NULL;
2034 else
2035 return NULL;
2038 /* <call-offset> ::= h <nv-offset> _
2039 ::= v <v-offset> _
2041 <nv-offset> ::= <(offset) number>
2043 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
2045 The C parameter, if not '\0', is a character we just read which is
2046 the start of the <call-offset>.
2048 We don't display the offset information anywhere. FIXME: We should
2049 display it in verbose mode. */
2051 static int
2052 d_call_offset (struct d_info *di, int c)
2054 if (c == '\0')
2055 c = d_next_char (di);
2057 if (c == 'h')
2058 d_number (di);
2059 else if (c == 'v')
2061 d_number (di);
2062 if (! d_check_char (di, '_'))
2063 return 0;
2064 d_number (di);
2066 else
2067 return 0;
2069 if (! d_check_char (di, '_'))
2070 return 0;
2072 return 1;
2075 /* <ctor-dtor-name> ::= C1
2076 ::= C2
2077 ::= C3
2078 ::= D0
2079 ::= D1
2080 ::= D2
2083 static struct demangle_component *
2084 d_ctor_dtor_name (struct d_info *di)
2086 if (di->last_name != NULL)
2088 if (di->last_name->type == DEMANGLE_COMPONENT_NAME)
2089 di->expansion += di->last_name->u.s_name.len;
2090 else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD)
2091 di->expansion += di->last_name->u.s_string.len;
2093 switch (d_peek_char (di))
2095 case 'C':
2097 enum gnu_v3_ctor_kinds kind;
2099 switch (d_peek_next_char (di))
2101 case '1':
2102 kind = gnu_v3_complete_object_ctor;
2103 break;
2104 case '2':
2105 kind = gnu_v3_base_object_ctor;
2106 break;
2107 case '3':
2108 kind = gnu_v3_complete_object_allocating_ctor;
2109 break;
2110 case '5':
2111 kind = gnu_v3_object_ctor_group;
2112 break;
2113 default:
2114 return NULL;
2116 d_advance (di, 2);
2117 return d_make_ctor (di, kind, di->last_name);
2120 case 'D':
2122 enum gnu_v3_dtor_kinds kind;
2124 switch (d_peek_next_char (di))
2126 case '0':
2127 kind = gnu_v3_deleting_dtor;
2128 break;
2129 case '1':
2130 kind = gnu_v3_complete_object_dtor;
2131 break;
2132 case '2':
2133 kind = gnu_v3_base_object_dtor;
2134 break;
2135 case '5':
2136 kind = gnu_v3_object_dtor_group;
2137 break;
2138 default:
2139 return NULL;
2141 d_advance (di, 2);
2142 return d_make_dtor (di, kind, di->last_name);
2145 default:
2146 return NULL;
2150 /* <type> ::= <builtin-type>
2151 ::= <function-type>
2152 ::= <class-enum-type>
2153 ::= <array-type>
2154 ::= <pointer-to-member-type>
2155 ::= <template-param>
2156 ::= <template-template-param> <template-args>
2157 ::= <substitution>
2158 ::= <CV-qualifiers> <type>
2159 ::= P <type>
2160 ::= R <type>
2161 ::= O <type> (C++0x)
2162 ::= C <type>
2163 ::= G <type>
2164 ::= U <source-name> <type>
2166 <builtin-type> ::= various one letter codes
2167 ::= u <source-name>
2170 CP_STATIC_IF_GLIBCPP_V3
2171 const struct demangle_builtin_type_info
2172 cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] =
2174 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT },
2175 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL },
2176 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT },
2177 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT },
2178 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT },
2179 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT },
2180 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT },
2181 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT },
2182 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT },
2183 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED },
2184 /* k */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2185 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG },
2186 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG },
2187 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT },
2188 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2189 D_PRINT_DEFAULT },
2190 /* p */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2191 /* q */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2192 /* r */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2193 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT },
2194 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
2195 /* u */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2196 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID },
2197 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT },
2198 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG },
2199 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2200 D_PRINT_UNSIGNED_LONG_LONG },
2201 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT },
2202 /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT },
2203 /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT },
2204 /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT },
2205 /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT },
2206 /* 30 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT },
2207 /* 31 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT },
2208 /* 32 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"),
2209 D_PRINT_DEFAULT },
2212 CP_STATIC_IF_GLIBCPP_V3
2213 struct demangle_component *
2214 cplus_demangle_type (struct d_info *di)
2216 char peek;
2217 struct demangle_component *ret;
2218 int can_subst;
2220 /* The ABI specifies that when CV-qualifiers are used, the base type
2221 is substitutable, and the fully qualified type is substitutable,
2222 but the base type with a strict subset of the CV-qualifiers is
2223 not substitutable. The natural recursive implementation of the
2224 CV-qualifiers would cause subsets to be substitutable, so instead
2225 we pull them all off now.
2227 FIXME: The ABI says that order-insensitive vendor qualifiers
2228 should be handled in the same way, but we have no way to tell
2229 which vendor qualifiers are order-insensitive and which are
2230 order-sensitive. So we just assume that they are all
2231 order-sensitive. g++ 3.4 supports only one vendor qualifier,
2232 __vector, and it treats it as order-sensitive when mangling
2233 names. */
2235 peek = d_peek_char (di);
2236 if (peek == 'r' || peek == 'V' || peek == 'K')
2238 struct demangle_component **pret;
2240 pret = d_cv_qualifiers (di, &ret, 0);
2241 if (pret == NULL)
2242 return NULL;
2243 if (d_peek_char (di) == 'F')
2245 /* cv-qualifiers before a function type apply to 'this',
2246 so avoid adding the unqualified function type to
2247 the substitution list. */
2248 *pret = d_function_type (di);
2250 else
2251 *pret = cplus_demangle_type (di);
2252 if (!*pret)
2253 return NULL;
2254 if ((*pret)->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
2255 || (*pret)->type == DEMANGLE_COMPONENT_REFERENCE_THIS)
2257 /* Move the ref-qualifier outside the cv-qualifiers so that
2258 they are printed in the right order. */
2259 struct demangle_component *fn = d_left (*pret);
2260 d_left (*pret) = ret;
2261 ret = *pret;
2262 *pret = fn;
2264 if (! d_add_substitution (di, ret))
2265 return NULL;
2266 return ret;
2269 can_subst = 1;
2271 switch (peek)
2273 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2274 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
2275 case 'o': case 's': case 't':
2276 case 'v': case 'w': case 'x': case 'y': case 'z':
2277 ret = d_make_builtin_type (di,
2278 &cplus_demangle_builtin_types[peek - 'a']);
2279 di->expansion += ret->u.s_builtin.type->len;
2280 can_subst = 0;
2281 d_advance (di, 1);
2282 break;
2284 case 'u':
2285 d_advance (di, 1);
2286 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE,
2287 d_source_name (di), NULL);
2288 break;
2290 case 'F':
2291 ret = d_function_type (di);
2292 break;
2294 case '0': case '1': case '2': case '3': case '4':
2295 case '5': case '6': case '7': case '8': case '9':
2296 case 'N':
2297 case 'Z':
2298 ret = d_class_enum_type (di);
2299 break;
2301 case 'A':
2302 ret = d_array_type (di);
2303 break;
2305 case 'M':
2306 ret = d_pointer_to_member_type (di);
2307 break;
2309 case 'T':
2310 ret = d_template_param (di);
2311 if (d_peek_char (di) == 'I')
2313 /* This may be <template-template-param> <template-args>.
2314 If this is the type for a conversion operator, we can
2315 have a <template-template-param> here only by following
2316 a derivation like this:
2318 <nested-name>
2319 -> <template-prefix> <template-args>
2320 -> <prefix> <template-unqualified-name> <template-args>
2321 -> <unqualified-name> <template-unqualified-name> <template-args>
2322 -> <source-name> <template-unqualified-name> <template-args>
2323 -> <source-name> <operator-name> <template-args>
2324 -> <source-name> cv <type> <template-args>
2325 -> <source-name> cv <template-template-param> <template-args> <template-args>
2327 where the <template-args> is followed by another.
2328 Otherwise, we must have a derivation like this:
2330 <nested-name>
2331 -> <template-prefix> <template-args>
2332 -> <prefix> <template-unqualified-name> <template-args>
2333 -> <unqualified-name> <template-unqualified-name> <template-args>
2334 -> <source-name> <template-unqualified-name> <template-args>
2335 -> <source-name> <operator-name> <template-args>
2336 -> <source-name> cv <type> <template-args>
2337 -> <source-name> cv <template-param> <template-args>
2339 where we need to leave the <template-args> to be processed
2340 by d_prefix (following the <template-prefix>).
2342 The <template-template-param> part is a substitution
2343 candidate. */
2344 if (! di->is_conversion)
2346 if (! d_add_substitution (di, ret))
2347 return NULL;
2348 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2349 d_template_args (di));
2351 else
2353 struct demangle_component *args;
2354 struct d_info_checkpoint checkpoint;
2356 d_checkpoint (di, &checkpoint);
2357 args = d_template_args (di);
2358 if (d_peek_char (di) == 'I')
2360 if (! d_add_substitution (di, ret))
2361 return NULL;
2362 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2363 args);
2365 else
2366 d_backtrack (di, &checkpoint);
2369 break;
2371 case 'S':
2372 /* If this is a special substitution, then it is the start of
2373 <class-enum-type>. */
2375 char peek_next;
2377 peek_next = d_peek_next_char (di);
2378 if (IS_DIGIT (peek_next)
2379 || peek_next == '_'
2380 || IS_UPPER (peek_next))
2382 ret = d_substitution (di, 0);
2383 /* The substituted name may have been a template name and
2384 may be followed by tepmlate args. */
2385 if (d_peek_char (di) == 'I')
2386 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2387 d_template_args (di));
2388 else
2389 can_subst = 0;
2391 else
2393 ret = d_class_enum_type (di);
2394 /* If the substitution was a complete type, then it is not
2395 a new substitution candidate. However, if the
2396 substitution was followed by template arguments, then
2397 the whole thing is a substitution candidate. */
2398 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD)
2399 can_subst = 0;
2402 break;
2404 case 'O':
2405 d_advance (di, 1);
2406 ret = d_make_comp (di, DEMANGLE_COMPONENT_RVALUE_REFERENCE,
2407 cplus_demangle_type (di), NULL);
2408 break;
2410 case 'P':
2411 d_advance (di, 1);
2412 ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER,
2413 cplus_demangle_type (di), NULL);
2414 break;
2416 case 'R':
2417 d_advance (di, 1);
2418 ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE,
2419 cplus_demangle_type (di), NULL);
2420 break;
2422 case 'C':
2423 d_advance (di, 1);
2424 ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX,
2425 cplus_demangle_type (di), NULL);
2426 break;
2428 case 'G':
2429 d_advance (di, 1);
2430 ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY,
2431 cplus_demangle_type (di), NULL);
2432 break;
2434 case 'U':
2435 d_advance (di, 1);
2436 ret = d_source_name (di);
2437 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL,
2438 cplus_demangle_type (di), ret);
2439 break;
2441 case 'D':
2442 can_subst = 0;
2443 d_advance (di, 1);
2444 peek = d_next_char (di);
2445 switch (peek)
2447 case 'T':
2448 case 't':
2449 /* decltype (expression) */
2450 ret = d_make_comp (di, DEMANGLE_COMPONENT_DECLTYPE,
2451 d_expression (di), NULL);
2452 if (ret && d_next_char (di) != 'E')
2453 ret = NULL;
2454 can_subst = 1;
2455 break;
2457 case 'p':
2458 /* Pack expansion. */
2459 ret = d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
2460 cplus_demangle_type (di), NULL);
2461 can_subst = 1;
2462 break;
2464 case 'a':
2465 /* auto */
2466 ret = d_make_name (di, "auto", 4);
2467 break;
2469 case 'f':
2470 /* 32-bit decimal floating point */
2471 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[26]);
2472 di->expansion += ret->u.s_builtin.type->len;
2473 break;
2474 case 'd':
2475 /* 64-bit DFP */
2476 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[27]);
2477 di->expansion += ret->u.s_builtin.type->len;
2478 break;
2479 case 'e':
2480 /* 128-bit DFP */
2481 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[28]);
2482 di->expansion += ret->u.s_builtin.type->len;
2483 break;
2484 case 'h':
2485 /* 16-bit half-precision FP */
2486 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[29]);
2487 di->expansion += ret->u.s_builtin.type->len;
2488 break;
2489 case 's':
2490 /* char16_t */
2491 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[30]);
2492 di->expansion += ret->u.s_builtin.type->len;
2493 break;
2494 case 'i':
2495 /* char32_t */
2496 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[31]);
2497 di->expansion += ret->u.s_builtin.type->len;
2498 break;
2500 case 'F':
2501 /* Fixed point types. DF<int bits><length><fract bits><sat> */
2502 ret = d_make_empty (di);
2503 ret->type = DEMANGLE_COMPONENT_FIXED_TYPE;
2504 if ((ret->u.s_fixed.accum = IS_DIGIT (d_peek_char (di))))
2505 /* For demangling we don't care about the bits. */
2506 d_number (di);
2507 ret->u.s_fixed.length = cplus_demangle_type (di);
2508 if (ret->u.s_fixed.length == NULL)
2509 return NULL;
2510 d_number (di);
2511 peek = d_next_char (di);
2512 ret->u.s_fixed.sat = (peek == 's');
2513 break;
2515 case 'v':
2516 ret = d_vector_type (di);
2517 can_subst = 1;
2518 break;
2520 case 'n':
2521 /* decltype(nullptr) */
2522 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[32]);
2523 di->expansion += ret->u.s_builtin.type->len;
2524 break;
2526 default:
2527 return NULL;
2529 break;
2531 default:
2532 return NULL;
2535 if (can_subst)
2537 if (! d_add_substitution (di, ret))
2538 return NULL;
2541 return ret;
2544 /* <CV-qualifiers> ::= [r] [V] [K] */
2546 static struct demangle_component **
2547 d_cv_qualifiers (struct d_info *di,
2548 struct demangle_component **pret, int member_fn)
2550 struct demangle_component **pstart;
2551 char peek;
2553 pstart = pret;
2554 peek = d_peek_char (di);
2555 while (peek == 'r' || peek == 'V' || peek == 'K')
2557 enum demangle_component_type t;
2559 d_advance (di, 1);
2560 if (peek == 'r')
2562 t = (member_fn
2563 ? DEMANGLE_COMPONENT_RESTRICT_THIS
2564 : DEMANGLE_COMPONENT_RESTRICT);
2565 di->expansion += sizeof "restrict";
2567 else if (peek == 'V')
2569 t = (member_fn
2570 ? DEMANGLE_COMPONENT_VOLATILE_THIS
2571 : DEMANGLE_COMPONENT_VOLATILE);
2572 di->expansion += sizeof "volatile";
2574 else
2576 t = (member_fn
2577 ? DEMANGLE_COMPONENT_CONST_THIS
2578 : DEMANGLE_COMPONENT_CONST);
2579 di->expansion += sizeof "const";
2582 *pret = d_make_comp (di, t, NULL, NULL);
2583 if (*pret == NULL)
2584 return NULL;
2585 pret = &d_left (*pret);
2587 peek = d_peek_char (di);
2590 if (!member_fn && peek == 'F')
2592 while (pstart != pret)
2594 switch ((*pstart)->type)
2596 case DEMANGLE_COMPONENT_RESTRICT:
2597 (*pstart)->type = DEMANGLE_COMPONENT_RESTRICT_THIS;
2598 break;
2599 case DEMANGLE_COMPONENT_VOLATILE:
2600 (*pstart)->type = DEMANGLE_COMPONENT_VOLATILE_THIS;
2601 break;
2602 case DEMANGLE_COMPONENT_CONST:
2603 (*pstart)->type = DEMANGLE_COMPONENT_CONST_THIS;
2604 break;
2605 default:
2606 break;
2608 pstart = &d_left (*pstart);
2612 return pret;
2615 /* <ref-qualifier> ::= R
2616 ::= O */
2618 static struct demangle_component *
2619 d_ref_qualifier (struct d_info *di, struct demangle_component *sub)
2621 struct demangle_component *ret = sub;
2622 char peek;
2624 peek = d_peek_char (di);
2625 if (peek == 'R' || peek == 'O')
2627 enum demangle_component_type t;
2628 if (peek == 'R')
2630 t = DEMANGLE_COMPONENT_REFERENCE_THIS;
2631 di->expansion += sizeof "&";
2633 else
2635 t = DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS;
2636 di->expansion += sizeof "&&";
2638 d_advance (di, 1);
2640 ret = d_make_comp (di, t, ret, NULL);
2643 return ret;
2646 /* <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] E */
2648 static struct demangle_component *
2649 d_function_type (struct d_info *di)
2651 struct demangle_component *ret;
2653 if (! d_check_char (di, 'F'))
2654 return NULL;
2655 if (d_peek_char (di) == 'Y')
2657 /* Function has C linkage. We don't print this information.
2658 FIXME: We should print it in verbose mode. */
2659 d_advance (di, 1);
2661 ret = d_bare_function_type (di, 1);
2662 ret = d_ref_qualifier (di, ret);
2664 if (! d_check_char (di, 'E'))
2665 return NULL;
2666 return ret;
2669 /* <type>+ */
2671 static struct demangle_component *
2672 d_parmlist (struct d_info *di)
2674 struct demangle_component *tl;
2675 struct demangle_component **ptl;
2677 tl = NULL;
2678 ptl = &tl;
2679 while (1)
2681 struct demangle_component *type;
2683 char peek = d_peek_char (di);
2684 if (peek == '\0' || peek == 'E' || peek == '.')
2685 break;
2686 if ((peek == 'R' || peek == 'O')
2687 && d_peek_next_char (di) == 'E')
2688 /* Function ref-qualifier, not a ref prefix for a parameter type. */
2689 break;
2690 type = cplus_demangle_type (di);
2691 if (type == NULL)
2692 return NULL;
2693 *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL);
2694 if (*ptl == NULL)
2695 return NULL;
2696 ptl = &d_right (*ptl);
2699 /* There should be at least one parameter type besides the optional
2700 return type. A function which takes no arguments will have a
2701 single parameter type void. */
2702 if (tl == NULL)
2703 return NULL;
2705 /* If we have a single parameter type void, omit it. */
2706 if (d_right (tl) == NULL
2707 && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
2708 && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
2710 di->expansion -= d_left (tl)->u.s_builtin.type->len;
2711 d_left (tl) = NULL;
2714 return tl;
2717 /* <bare-function-type> ::= [J]<type>+ */
2719 static struct demangle_component *
2720 d_bare_function_type (struct d_info *di, int has_return_type)
2722 struct demangle_component *return_type;
2723 struct demangle_component *tl;
2724 char peek;
2726 /* Detect special qualifier indicating that the first argument
2727 is the return type. */
2728 peek = d_peek_char (di);
2729 if (peek == 'J')
2731 d_advance (di, 1);
2732 has_return_type = 1;
2735 if (has_return_type)
2737 return_type = cplus_demangle_type (di);
2738 if (return_type == NULL)
2739 return NULL;
2741 else
2742 return_type = NULL;
2744 tl = d_parmlist (di);
2745 if (tl == NULL)
2746 return NULL;
2748 return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE,
2749 return_type, tl);
2752 /* <class-enum-type> ::= <name> */
2754 static struct demangle_component *
2755 d_class_enum_type (struct d_info *di)
2757 return d_name (di);
2760 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2761 ::= A [<(dimension) expression>] _ <(element) type>
2764 static struct demangle_component *
2765 d_array_type (struct d_info *di)
2767 char peek;
2768 struct demangle_component *dim;
2770 if (! d_check_char (di, 'A'))
2771 return NULL;
2773 peek = d_peek_char (di);
2774 if (peek == '_')
2775 dim = NULL;
2776 else if (IS_DIGIT (peek))
2778 const char *s;
2780 s = d_str (di);
2783 d_advance (di, 1);
2784 peek = d_peek_char (di);
2786 while (IS_DIGIT (peek));
2787 dim = d_make_name (di, s, d_str (di) - s);
2788 if (dim == NULL)
2789 return NULL;
2791 else
2793 dim = d_expression (di);
2794 if (dim == NULL)
2795 return NULL;
2798 if (! d_check_char (di, '_'))
2799 return NULL;
2801 return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim,
2802 cplus_demangle_type (di));
2805 /* <vector-type> ::= Dv <number> _ <type>
2806 ::= Dv _ <expression> _ <type> */
2808 static struct demangle_component *
2809 d_vector_type (struct d_info *di)
2811 char peek;
2812 struct demangle_component *dim;
2814 peek = d_peek_char (di);
2815 if (peek == '_')
2817 d_advance (di, 1);
2818 dim = d_expression (di);
2820 else
2821 dim = d_number_component (di);
2823 if (dim == NULL)
2824 return NULL;
2826 if (! d_check_char (di, '_'))
2827 return NULL;
2829 return d_make_comp (di, DEMANGLE_COMPONENT_VECTOR_TYPE, dim,
2830 cplus_demangle_type (di));
2833 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
2835 static struct demangle_component *
2836 d_pointer_to_member_type (struct d_info *di)
2838 struct demangle_component *cl;
2839 struct demangle_component *mem;
2841 if (! d_check_char (di, 'M'))
2842 return NULL;
2844 cl = cplus_demangle_type (di);
2845 if (cl == NULL)
2846 return NULL;
2848 /* The ABI says, "The type of a non-static member function is considered
2849 to be different, for the purposes of substitution, from the type of a
2850 namespace-scope or static member function whose type appears
2851 similar. The types of two non-static member functions are considered
2852 to be different, for the purposes of substitution, if the functions
2853 are members of different classes. In other words, for the purposes of
2854 substitution, the class of which the function is a member is
2855 considered part of the type of function."
2857 For a pointer to member function, this call to cplus_demangle_type
2858 will end up adding a (possibly qualified) non-member function type to
2859 the substitution table, which is not correct; however, the member
2860 function type will never be used in a substitution, so putting the
2861 wrong type in the substitution table is harmless. */
2863 mem = cplus_demangle_type (di);
2864 if (mem == NULL)
2865 return NULL;
2867 return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem);
2870 /* <non-negative number> _ */
2872 static long
2873 d_compact_number (struct d_info *di)
2875 long num;
2876 if (d_peek_char (di) == '_')
2877 num = 0;
2878 else if (d_peek_char (di) == 'n')
2879 return -1;
2880 else
2881 num = d_number (di) + 1;
2883 if (! d_check_char (di, '_'))
2884 return -1;
2885 return num;
2888 /* <template-param> ::= T_
2889 ::= T <(parameter-2 non-negative) number> _
2892 static struct demangle_component *
2893 d_template_param (struct d_info *di)
2895 long param;
2897 if (! d_check_char (di, 'T'))
2898 return NULL;
2900 param = d_compact_number (di);
2901 if (param < 0)
2902 return NULL;
2904 ++di->did_subs;
2906 return d_make_template_param (di, param);
2909 /* <template-args> ::= I <template-arg>+ E */
2911 static struct demangle_component *
2912 d_template_args (struct d_info *di)
2914 struct demangle_component *hold_last_name;
2915 struct demangle_component *al;
2916 struct demangle_component **pal;
2918 /* Preserve the last name we saw--don't let the template arguments
2919 clobber it, as that would give us the wrong name for a subsequent
2920 constructor or destructor. */
2921 hold_last_name = di->last_name;
2923 if (d_peek_char (di) != 'I'
2924 && d_peek_char (di) != 'J')
2925 return NULL;
2926 d_advance (di, 1);
2928 if (d_peek_char (di) == 'E')
2930 /* An argument pack can be empty. */
2931 d_advance (di, 1);
2932 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, NULL, NULL);
2935 al = NULL;
2936 pal = &al;
2937 while (1)
2939 struct demangle_component *a;
2941 a = d_template_arg (di);
2942 if (a == NULL)
2943 return NULL;
2945 *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL);
2946 if (*pal == NULL)
2947 return NULL;
2948 pal = &d_right (*pal);
2950 if (d_peek_char (di) == 'E')
2952 d_advance (di, 1);
2953 break;
2957 di->last_name = hold_last_name;
2959 return al;
2962 /* <template-arg> ::= <type>
2963 ::= X <expression> E
2964 ::= <expr-primary>
2967 static struct demangle_component *
2968 d_template_arg (struct d_info *di)
2970 struct demangle_component *ret;
2972 switch (d_peek_char (di))
2974 case 'X':
2975 d_advance (di, 1);
2976 ret = d_expression (di);
2977 if (! d_check_char (di, 'E'))
2978 return NULL;
2979 return ret;
2981 case 'L':
2982 return d_expr_primary (di);
2984 case 'I':
2985 case 'J':
2986 /* An argument pack. */
2987 return d_template_args (di);
2989 default:
2990 return cplus_demangle_type (di);
2994 /* Parse a sequence of expressions until we hit the terminator
2995 character. */
2997 static struct demangle_component *
2998 d_exprlist (struct d_info *di, char terminator)
3000 struct demangle_component *list = NULL;
3001 struct demangle_component **p = &list;
3003 if (d_peek_char (di) == terminator)
3005 d_advance (di, 1);
3006 return d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, NULL, NULL);
3009 while (1)
3011 struct demangle_component *arg = d_expression (di);
3012 if (arg == NULL)
3013 return NULL;
3015 *p = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, arg, NULL);
3016 if (*p == NULL)
3017 return NULL;
3018 p = &d_right (*p);
3020 if (d_peek_char (di) == terminator)
3022 d_advance (di, 1);
3023 break;
3027 return list;
3030 /* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
3031 dynamic_cast, static_cast or reinterpret_cast. */
3033 static int
3034 op_is_new_cast (struct demangle_component *op)
3036 const char *code = op->u.s_operator.op->code;
3037 return (code[1] == 'c'
3038 && (code[0] == 's' || code[0] == 'd'
3039 || code[0] == 'c' || code[0] == 'r'));
3042 /* <expression> ::= <(unary) operator-name> <expression>
3043 ::= <(binary) operator-name> <expression> <expression>
3044 ::= <(trinary) operator-name> <expression> <expression> <expression>
3045 ::= cl <expression>+ E
3046 ::= st <type>
3047 ::= <template-param>
3048 ::= sr <type> <unqualified-name>
3049 ::= sr <type> <unqualified-name> <template-args>
3050 ::= <expr-primary>
3053 static inline struct demangle_component *
3054 d_expression_1 (struct d_info *di)
3056 char peek;
3058 peek = d_peek_char (di);
3059 if (peek == 'L')
3060 return d_expr_primary (di);
3061 else if (peek == 'T')
3062 return d_template_param (di);
3063 else if (peek == 's' && d_peek_next_char (di) == 'r')
3065 struct demangle_component *type;
3066 struct demangle_component *name;
3068 d_advance (di, 2);
3069 type = cplus_demangle_type (di);
3070 name = d_unqualified_name (di);
3071 if (d_peek_char (di) != 'I')
3072 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name);
3073 else
3074 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type,
3075 d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3076 d_template_args (di)));
3078 else if (peek == 's' && d_peek_next_char (di) == 'p')
3080 d_advance (di, 2);
3081 return d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
3082 d_expression_1 (di), NULL);
3084 else if (peek == 'f' && d_peek_next_char (di) == 'p')
3086 /* Function parameter used in a late-specified return type. */
3087 int index;
3088 d_advance (di, 2);
3089 if (d_peek_char (di) == 'T')
3091 /* 'this' parameter. */
3092 d_advance (di, 1);
3093 index = 0;
3095 else
3097 index = d_compact_number (di) + 1;
3098 if (index == 0)
3099 return NULL;
3101 return d_make_function_param (di, index);
3103 else if (IS_DIGIT (peek)
3104 || (peek == 'o' && d_peek_next_char (di) == 'n'))
3106 /* We can get an unqualified name as an expression in the case of
3107 a dependent function call, i.e. decltype(f(t)). */
3108 struct demangle_component *name;
3110 if (peek == 'o')
3111 /* operator-function-id, i.e. operator+(t). */
3112 d_advance (di, 2);
3114 name = d_unqualified_name (di);
3115 if (name == NULL)
3116 return NULL;
3117 if (d_peek_char (di) == 'I')
3118 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3119 d_template_args (di));
3120 else
3121 return name;
3123 else if ((peek == 'i' || peek == 't')
3124 && d_peek_next_char (di) == 'l')
3126 /* Brace-enclosed initializer list, untyped or typed. */
3127 struct demangle_component *type = NULL;
3128 if (peek == 't')
3129 type = cplus_demangle_type (di);
3130 d_advance (di, 2);
3131 return d_make_comp (di, DEMANGLE_COMPONENT_INITIALIZER_LIST,
3132 type, d_exprlist (di, 'E'));
3134 else
3136 struct demangle_component *op;
3137 const char *code = NULL;
3138 int args;
3140 op = d_operator_name (di);
3141 if (op == NULL)
3142 return NULL;
3144 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
3146 code = op->u.s_operator.op->code;
3147 di->expansion += op->u.s_operator.op->len - 2;
3148 if (strcmp (code, "st") == 0)
3149 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3150 cplus_demangle_type (di));
3153 switch (op->type)
3155 default:
3156 return NULL;
3157 case DEMANGLE_COMPONENT_OPERATOR:
3158 args = op->u.s_operator.op->args;
3159 break;
3160 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
3161 args = op->u.s_extended_operator.args;
3162 break;
3163 case DEMANGLE_COMPONENT_CAST:
3164 args = 1;
3165 break;
3168 switch (args)
3170 case 0:
3171 return d_make_comp (di, DEMANGLE_COMPONENT_NULLARY, op, NULL);
3173 case 1:
3175 struct demangle_component *operand;
3176 int suffix = 0;
3178 if (code && (code[0] == 'p' || code[0] == 'm')
3179 && code[1] == code[0])
3180 /* pp_ and mm_ are the prefix variants. */
3181 suffix = !d_check_char (di, '_');
3183 if (op->type == DEMANGLE_COMPONENT_CAST
3184 && d_check_char (di, '_'))
3185 operand = d_exprlist (di, 'E');
3186 else
3187 operand = d_expression_1 (di);
3189 if (suffix)
3190 /* Indicate the suffix variant for d_print_comp. */
3191 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3192 d_make_comp (di,
3193 DEMANGLE_COMPONENT_BINARY_ARGS,
3194 operand, operand));
3195 else
3196 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3197 operand);
3199 case 2:
3201 struct demangle_component *left;
3202 struct demangle_component *right;
3204 if (op_is_new_cast (op))
3205 left = cplus_demangle_type (di);
3206 else
3207 left = d_expression_1 (di);
3208 if (!strcmp (code, "cl"))
3209 right = d_exprlist (di, 'E');
3210 else if (!strcmp (code, "dt") || !strcmp (code, "pt"))
3212 right = d_unqualified_name (di);
3213 if (d_peek_char (di) == 'I')
3214 right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE,
3215 right, d_template_args (di));
3217 else
3218 right = d_expression_1 (di);
3220 return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
3221 d_make_comp (di,
3222 DEMANGLE_COMPONENT_BINARY_ARGS,
3223 left, right));
3225 case 3:
3227 struct demangle_component *first;
3228 struct demangle_component *second;
3229 struct demangle_component *third;
3231 if (!strcmp (code, "qu"))
3233 /* ?: expression. */
3234 first = d_expression_1 (di);
3235 second = d_expression_1 (di);
3236 third = d_expression_1 (di);
3238 else if (code[0] == 'n')
3240 /* new-expression. */
3241 if (code[1] != 'w' && code[1] != 'a')
3242 return NULL;
3243 first = d_exprlist (di, '_');
3244 second = cplus_demangle_type (di);
3245 if (d_peek_char (di) == 'E')
3247 d_advance (di, 1);
3248 third = NULL;
3250 else if (d_peek_char (di) == 'p'
3251 && d_peek_next_char (di) == 'i')
3253 /* Parenthesized initializer. */
3254 d_advance (di, 2);
3255 third = d_exprlist (di, 'E');
3257 else if (d_peek_char (di) == 'i'
3258 && d_peek_next_char (di) == 'l')
3259 /* initializer-list. */
3260 third = d_expression_1 (di);
3261 else
3262 return NULL;
3264 else
3265 return NULL;
3266 return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op,
3267 d_make_comp (di,
3268 DEMANGLE_COMPONENT_TRINARY_ARG1,
3269 first,
3270 d_make_comp (di,
3271 DEMANGLE_COMPONENT_TRINARY_ARG2,
3272 second, third)));
3274 default:
3275 return NULL;
3280 static struct demangle_component *
3281 d_expression (struct d_info *di)
3283 struct demangle_component *ret;
3284 int was_expression = di->is_expression;
3286 di->is_expression = 1;
3287 ret = d_expression_1 (di);
3288 di->is_expression = was_expression;
3289 return ret;
3292 /* <expr-primary> ::= L <type> <(value) number> E
3293 ::= L <type> <(value) float> E
3294 ::= L <mangled-name> E
3297 static struct demangle_component *
3298 d_expr_primary (struct d_info *di)
3300 struct demangle_component *ret;
3302 if (! d_check_char (di, 'L'))
3303 return NULL;
3304 if (d_peek_char (di) == '_'
3305 /* Workaround for G++ bug; see comment in write_template_arg. */
3306 || d_peek_char (di) == 'Z')
3307 ret = cplus_demangle_mangled_name (di, 0);
3308 else
3310 struct demangle_component *type;
3311 enum demangle_component_type t;
3312 const char *s;
3314 type = cplus_demangle_type (di);
3315 if (type == NULL)
3316 return NULL;
3318 /* If we have a type we know how to print, we aren't going to
3319 print the type name itself. */
3320 if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
3321 && type->u.s_builtin.type->print != D_PRINT_DEFAULT)
3322 di->expansion -= type->u.s_builtin.type->len;
3324 /* Rather than try to interpret the literal value, we just
3325 collect it as a string. Note that it's possible to have a
3326 floating point literal here. The ABI specifies that the
3327 format of such literals is machine independent. That's fine,
3328 but what's not fine is that versions of g++ up to 3.2 with
3329 -fabi-version=1 used upper case letters in the hex constant,
3330 and dumped out gcc's internal representation. That makes it
3331 hard to tell where the constant ends, and hard to dump the
3332 constant in any readable form anyhow. We don't attempt to
3333 handle these cases. */
3335 t = DEMANGLE_COMPONENT_LITERAL;
3336 if (d_peek_char (di) == 'n')
3338 t = DEMANGLE_COMPONENT_LITERAL_NEG;
3339 d_advance (di, 1);
3341 s = d_str (di);
3342 while (d_peek_char (di) != 'E')
3344 if (d_peek_char (di) == '\0')
3345 return NULL;
3346 d_advance (di, 1);
3348 ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s));
3350 if (! d_check_char (di, 'E'))
3351 return NULL;
3352 return ret;
3355 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3356 ::= Z <(function) encoding> E s [<discriminator>]
3357 ::= Z <(function) encoding> E d [<parameter> number>] _ <entity name>
3360 static struct demangle_component *
3361 d_local_name (struct d_info *di)
3363 struct demangle_component *function;
3365 if (! d_check_char (di, 'Z'))
3366 return NULL;
3368 function = d_encoding (di, 0);
3370 if (! d_check_char (di, 'E'))
3371 return NULL;
3373 if (d_peek_char (di) == 's')
3375 d_advance (di, 1);
3376 if (! d_discriminator (di))
3377 return NULL;
3378 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function,
3379 d_make_name (di, "string literal",
3380 sizeof "string literal" - 1));
3382 else
3384 struct demangle_component *name;
3385 int num = -1;
3387 if (d_peek_char (di) == 'd')
3389 /* Default argument scope: d <number> _. */
3390 d_advance (di, 1);
3391 num = d_compact_number (di);
3392 if (num < 0)
3393 return NULL;
3396 name = d_name (di);
3397 if (name)
3398 switch (name->type)
3400 /* Lambdas and unnamed types have internal discriminators. */
3401 case DEMANGLE_COMPONENT_LAMBDA:
3402 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
3403 break;
3404 default:
3405 if (! d_discriminator (di))
3406 return NULL;
3408 if (num >= 0)
3409 name = d_make_default_arg (di, num, name);
3410 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
3414 /* <discriminator> ::= _ <(non-negative) number>
3416 We demangle the discriminator, but we don't print it out. FIXME:
3417 We should print it out in verbose mode. */
3419 static int
3420 d_discriminator (struct d_info *di)
3422 long discrim;
3424 if (d_peek_char (di) != '_')
3425 return 1;
3426 d_advance (di, 1);
3427 discrim = d_number (di);
3428 if (discrim < 0)
3429 return 0;
3430 return 1;
3433 /* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */
3435 static struct demangle_component *
3436 d_lambda (struct d_info *di)
3438 struct demangle_component *tl;
3439 struct demangle_component *ret;
3440 int num;
3442 if (! d_check_char (di, 'U'))
3443 return NULL;
3444 if (! d_check_char (di, 'l'))
3445 return NULL;
3447 tl = d_parmlist (di);
3448 if (tl == NULL)
3449 return NULL;
3451 if (! d_check_char (di, 'E'))
3452 return NULL;
3454 num = d_compact_number (di);
3455 if (num < 0)
3456 return NULL;
3458 ret = d_make_empty (di);
3459 if (ret)
3461 ret->type = DEMANGLE_COMPONENT_LAMBDA;
3462 ret->u.s_unary_num.sub = tl;
3463 ret->u.s_unary_num.num = num;
3466 if (! d_add_substitution (di, ret))
3467 return NULL;
3469 return ret;
3472 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
3474 static struct demangle_component *
3475 d_unnamed_type (struct d_info *di)
3477 struct demangle_component *ret;
3478 long num;
3480 if (! d_check_char (di, 'U'))
3481 return NULL;
3482 if (! d_check_char (di, 't'))
3483 return NULL;
3485 num = d_compact_number (di);
3486 if (num < 0)
3487 return NULL;
3489 ret = d_make_empty (di);
3490 if (ret)
3492 ret->type = DEMANGLE_COMPONENT_UNNAMED_TYPE;
3493 ret->u.s_number.number = num;
3496 if (! d_add_substitution (di, ret))
3497 return NULL;
3499 return ret;
3502 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
3505 static struct demangle_component *
3506 d_clone_suffix (struct d_info *di, struct demangle_component *encoding)
3508 const char *suffix = d_str (di);
3509 const char *pend = suffix;
3510 struct demangle_component *n;
3512 if (*pend == '.' && (IS_LOWER (pend[1]) || pend[1] == '_'))
3514 pend += 2;
3515 while (IS_LOWER (*pend) || *pend == '_')
3516 ++pend;
3518 while (*pend == '.' && IS_DIGIT (pend[1]))
3520 pend += 2;
3521 while (IS_DIGIT (*pend))
3522 ++pend;
3524 d_advance (di, pend - suffix);
3525 n = d_make_name (di, suffix, pend - suffix);
3526 return d_make_comp (di, DEMANGLE_COMPONENT_CLONE, encoding, n);
3529 /* Add a new substitution. */
3531 static int
3532 d_add_substitution (struct d_info *di, struct demangle_component *dc)
3534 if (dc == NULL)
3535 return 0;
3536 if (di->next_sub >= di->num_subs)
3537 return 0;
3538 di->subs[di->next_sub] = dc;
3539 ++di->next_sub;
3540 return 1;
3543 /* <substitution> ::= S <seq-id> _
3544 ::= S_
3545 ::= St
3546 ::= Sa
3547 ::= Sb
3548 ::= Ss
3549 ::= Si
3550 ::= So
3551 ::= Sd
3553 If PREFIX is non-zero, then this type is being used as a prefix in
3554 a qualified name. In this case, for the standard substitutions, we
3555 need to check whether we are being used as a prefix for a
3556 constructor or destructor, and return a full template name.
3557 Otherwise we will get something like std::iostream::~iostream()
3558 which does not correspond particularly well to any function which
3559 actually appears in the source.
3562 static const struct d_standard_sub_info standard_subs[] =
3564 { 't', NL ("std"),
3565 NL ("std"),
3566 NULL, 0 },
3567 { 'a', NL ("std::allocator"),
3568 NL ("std::allocator"),
3569 NL ("allocator") },
3570 { 'b', NL ("std::basic_string"),
3571 NL ("std::basic_string"),
3572 NL ("basic_string") },
3573 { 's', NL ("std::string"),
3574 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
3575 NL ("basic_string") },
3576 { 'i', NL ("std::istream"),
3577 NL ("std::basic_istream<char, std::char_traits<char> >"),
3578 NL ("basic_istream") },
3579 { 'o', NL ("std::ostream"),
3580 NL ("std::basic_ostream<char, std::char_traits<char> >"),
3581 NL ("basic_ostream") },
3582 { 'd', NL ("std::iostream"),
3583 NL ("std::basic_iostream<char, std::char_traits<char> >"),
3584 NL ("basic_iostream") }
3587 static struct demangle_component *
3588 d_substitution (struct d_info *di, int prefix)
3590 char c;
3592 if (! d_check_char (di, 'S'))
3593 return NULL;
3595 c = d_next_char (di);
3596 if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
3598 unsigned int id;
3600 id = 0;
3601 if (c != '_')
3605 unsigned int new_id;
3607 if (IS_DIGIT (c))
3608 new_id = id * 36 + c - '0';
3609 else if (IS_UPPER (c))
3610 new_id = id * 36 + c - 'A' + 10;
3611 else
3612 return NULL;
3613 if (new_id < id)
3614 return NULL;
3615 id = new_id;
3616 c = d_next_char (di);
3618 while (c != '_');
3620 ++id;
3623 if (id >= (unsigned int) di->next_sub)
3624 return NULL;
3626 ++di->did_subs;
3628 return di->subs[id];
3630 else
3632 int verbose;
3633 const struct d_standard_sub_info *p;
3634 const struct d_standard_sub_info *pend;
3636 verbose = (di->options & DMGL_VERBOSE) != 0;
3637 if (! verbose && prefix)
3639 char peek;
3641 peek = d_peek_char (di);
3642 if (peek == 'C' || peek == 'D')
3643 verbose = 1;
3646 pend = (&standard_subs[0]
3647 + sizeof standard_subs / sizeof standard_subs[0]);
3648 for (p = &standard_subs[0]; p < pend; ++p)
3650 if (c == p->code)
3652 const char *s;
3653 int len;
3655 if (p->set_last_name != NULL)
3656 di->last_name = d_make_sub (di, p->set_last_name,
3657 p->set_last_name_len);
3658 if (verbose)
3660 s = p->full_expansion;
3661 len = p->full_len;
3663 else
3665 s = p->simple_expansion;
3666 len = p->simple_len;
3668 di->expansion += len;
3669 return d_make_sub (di, s, len);
3673 return NULL;
3677 static void
3678 d_checkpoint (struct d_info *di, struct d_info_checkpoint *checkpoint)
3680 checkpoint->n = di->n;
3681 checkpoint->next_comp = di->next_comp;
3682 checkpoint->next_sub = di->next_sub;
3683 checkpoint->did_subs = di->did_subs;
3684 checkpoint->expansion = di->expansion;
3687 static void
3688 d_backtrack (struct d_info *di, struct d_info_checkpoint *checkpoint)
3690 di->n = checkpoint->n;
3691 di->next_comp = checkpoint->next_comp;
3692 di->next_sub = checkpoint->next_sub;
3693 di->did_subs = checkpoint->did_subs;
3694 di->expansion = checkpoint->expansion;
3697 /* Initialize a growable string. */
3699 static void
3700 d_growable_string_init (struct d_growable_string *dgs, size_t estimate)
3702 dgs->buf = NULL;
3703 dgs->len = 0;
3704 dgs->alc = 0;
3705 dgs->allocation_failure = 0;
3707 if (estimate > 0)
3708 d_growable_string_resize (dgs, estimate);
3711 /* Grow a growable string to a given size. */
3713 static inline void
3714 d_growable_string_resize (struct d_growable_string *dgs, size_t need)
3716 size_t newalc;
3717 char *newbuf;
3719 if (dgs->allocation_failure)
3720 return;
3722 /* Start allocation at two bytes to avoid any possibility of confusion
3723 with the special value of 1 used as a return in *palc to indicate
3724 allocation failures. */
3725 newalc = dgs->alc > 0 ? dgs->alc : 2;
3726 while (newalc < need)
3727 newalc <<= 1;
3729 newbuf = (char *) realloc (dgs->buf, newalc);
3730 if (newbuf == NULL)
3732 free (dgs->buf);
3733 dgs->buf = NULL;
3734 dgs->len = 0;
3735 dgs->alc = 0;
3736 dgs->allocation_failure = 1;
3737 return;
3739 dgs->buf = newbuf;
3740 dgs->alc = newalc;
3743 /* Append a buffer to a growable string. */
3745 static inline void
3746 d_growable_string_append_buffer (struct d_growable_string *dgs,
3747 const char *s, size_t l)
3749 size_t need;
3751 need = dgs->len + l + 1;
3752 if (need > dgs->alc)
3753 d_growable_string_resize (dgs, need);
3755 if (dgs->allocation_failure)
3756 return;
3758 memcpy (dgs->buf + dgs->len, s, l);
3759 dgs->buf[dgs->len + l] = '\0';
3760 dgs->len += l;
3763 /* Bridge growable strings to the callback mechanism. */
3765 static void
3766 d_growable_string_callback_adapter (const char *s, size_t l, void *opaque)
3768 struct d_growable_string *dgs = (struct d_growable_string*) opaque;
3770 d_growable_string_append_buffer (dgs, s, l);
3773 /* Initialize a print information structure. */
3775 static void
3776 d_print_init (struct d_print_info *dpi, demangle_callbackref callback,
3777 void *opaque)
3779 dpi->len = 0;
3780 dpi->last_char = '\0';
3781 dpi->templates = NULL;
3782 dpi->modifiers = NULL;
3783 dpi->pack_index = 0;
3784 dpi->flush_count = 0;
3786 dpi->callback = callback;
3787 dpi->opaque = opaque;
3789 dpi->demangle_failure = 0;
3791 dpi->saved_scopes = NULL;
3792 dpi->num_saved_scopes = 0;
3793 dpi->current_template = NULL;
3796 /* Free a print information structure. */
3798 static void
3799 d_print_free (struct d_print_info *dpi)
3801 int i;
3803 for (i = 0; i < dpi->num_saved_scopes; i++)
3805 struct d_print_template *ts, *tn;
3807 for (ts = dpi->saved_scopes[i].templates; ts != NULL; ts = tn)
3809 tn = ts->next;
3810 free (ts);
3814 free (dpi->saved_scopes);
3817 /* Indicate that an error occurred during printing, and test for error. */
3819 static inline void
3820 d_print_error (struct d_print_info *dpi)
3822 dpi->demangle_failure = 1;
3825 static inline int
3826 d_print_saw_error (struct d_print_info *dpi)
3828 return dpi->demangle_failure != 0;
3831 /* Flush buffered characters to the callback. */
3833 static inline void
3834 d_print_flush (struct d_print_info *dpi)
3836 dpi->buf[dpi->len] = '\0';
3837 dpi->callback (dpi->buf, dpi->len, dpi->opaque);
3838 dpi->len = 0;
3839 dpi->flush_count++;
3842 /* Append characters and buffers for printing. */
3844 static inline void
3845 d_append_char (struct d_print_info *dpi, char c)
3847 if (dpi->len == sizeof (dpi->buf) - 1)
3848 d_print_flush (dpi);
3850 dpi->buf[dpi->len++] = c;
3851 dpi->last_char = c;
3854 static inline void
3855 d_append_buffer (struct d_print_info *dpi, const char *s, size_t l)
3857 size_t i;
3859 for (i = 0; i < l; i++)
3860 d_append_char (dpi, s[i]);
3863 static inline void
3864 d_append_string (struct d_print_info *dpi, const char *s)
3866 d_append_buffer (dpi, s, strlen (s));
3869 static inline void
3870 d_append_num (struct d_print_info *dpi, long l)
3872 char buf[25];
3873 sprintf (buf,"%ld", l);
3874 d_append_string (dpi, buf);
3877 static inline char
3878 d_last_char (struct d_print_info *dpi)
3880 return dpi->last_char;
3883 /* Turn components into a human readable string. OPTIONS is the
3884 options bits passed to the demangler. DC is the tree to print.
3885 CALLBACK is a function to call to flush demangled string segments
3886 as they fill the intermediate buffer, and OPAQUE is a generalized
3887 callback argument. On success, this returns 1. On failure,
3888 it returns 0, indicating a bad parse. It does not use heap
3889 memory to build an output string, so cannot encounter memory
3890 allocation failure. */
3892 CP_STATIC_IF_GLIBCPP_V3
3894 cplus_demangle_print_callback (int options,
3895 const struct demangle_component *dc,
3896 demangle_callbackref callback, void *opaque)
3898 struct d_print_info dpi;
3899 int success;
3901 d_print_init (&dpi, callback, opaque);
3903 d_print_comp (&dpi, options, dc);
3905 d_print_flush (&dpi);
3907 success = ! d_print_saw_error (&dpi);
3908 d_print_free (&dpi);
3909 return success;
3912 /* Turn components into a human readable string. OPTIONS is the
3913 options bits passed to the demangler. DC is the tree to print.
3914 ESTIMATE is a guess at the length of the result. This returns a
3915 string allocated by malloc, or NULL on error. On success, this
3916 sets *PALC to the size of the allocated buffer. On failure, this
3917 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
3918 failure. */
3920 CP_STATIC_IF_GLIBCPP_V3
3921 char *
3922 cplus_demangle_print (int options, const struct demangle_component *dc,
3923 int estimate, size_t *palc)
3925 struct d_growable_string dgs;
3927 d_growable_string_init (&dgs, estimate);
3929 if (! cplus_demangle_print_callback (options, dc,
3930 d_growable_string_callback_adapter,
3931 &dgs))
3933 free (dgs.buf);
3934 *palc = 0;
3935 return NULL;
3938 *palc = dgs.allocation_failure ? 1 : dgs.alc;
3939 return dgs.buf;
3942 /* Returns the I'th element of the template arglist ARGS, or NULL on
3943 failure. */
3945 static struct demangle_component *
3946 d_index_template_argument (struct demangle_component *args, int i)
3948 struct demangle_component *a;
3950 for (a = args;
3951 a != NULL;
3952 a = d_right (a))
3954 if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
3955 return NULL;
3956 if (i <= 0)
3957 break;
3958 --i;
3960 if (i != 0 || a == NULL)
3961 return NULL;
3963 return d_left (a);
3966 /* Returns the template argument from the current context indicated by DC,
3967 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
3969 static struct demangle_component *
3970 d_lookup_template_argument (struct d_print_info *dpi,
3971 const struct demangle_component *dc)
3973 if (dpi->templates == NULL)
3975 d_print_error (dpi);
3976 return NULL;
3979 return d_index_template_argument
3980 (d_right (dpi->templates->template_decl),
3981 dc->u.s_number.number);
3984 /* Returns a template argument pack used in DC (any will do), or NULL. */
3986 static struct demangle_component *
3987 d_find_pack (struct d_print_info *dpi,
3988 const struct demangle_component *dc)
3990 struct demangle_component *a;
3991 if (dc == NULL)
3992 return NULL;
3994 switch (dc->type)
3996 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
3997 a = d_lookup_template_argument (dpi, dc);
3998 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
3999 return a;
4000 return NULL;
4002 case DEMANGLE_COMPONENT_PACK_EXPANSION:
4003 return NULL;
4005 case DEMANGLE_COMPONENT_LAMBDA:
4006 case DEMANGLE_COMPONENT_NAME:
4007 case DEMANGLE_COMPONENT_TAGGED_NAME:
4008 case DEMANGLE_COMPONENT_OPERATOR:
4009 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4010 case DEMANGLE_COMPONENT_SUB_STD:
4011 case DEMANGLE_COMPONENT_CHARACTER:
4012 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
4013 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
4014 return NULL;
4016 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4017 return d_find_pack (dpi, dc->u.s_extended_operator.name);
4018 case DEMANGLE_COMPONENT_CTOR:
4019 return d_find_pack (dpi, dc->u.s_ctor.name);
4020 case DEMANGLE_COMPONENT_DTOR:
4021 return d_find_pack (dpi, dc->u.s_dtor.name);
4023 default:
4024 a = d_find_pack (dpi, d_left (dc));
4025 if (a)
4026 return a;
4027 return d_find_pack (dpi, d_right (dc));
4031 /* Returns the length of the template argument pack DC. */
4033 static int
4034 d_pack_length (const struct demangle_component *dc)
4036 int count = 0;
4037 while (dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
4038 && d_left (dc) != NULL)
4040 ++count;
4041 dc = d_right (dc);
4043 return count;
4046 /* DC is a component of a mangled expression. Print it, wrapped in parens
4047 if needed. */
4049 static void
4050 d_print_subexpr (struct d_print_info *dpi, int options,
4051 const struct demangle_component *dc)
4053 int simple = 0;
4054 if (dc->type == DEMANGLE_COMPONENT_NAME
4055 || dc->type == DEMANGLE_COMPONENT_QUAL_NAME
4056 || dc->type == DEMANGLE_COMPONENT_INITIALIZER_LIST
4057 || dc->type == DEMANGLE_COMPONENT_FUNCTION_PARAM)
4058 simple = 1;
4059 if (!simple)
4060 d_append_char (dpi, '(');
4061 d_print_comp (dpi, options, dc);
4062 if (!simple)
4063 d_append_char (dpi, ')');
4066 /* Return a shallow copy of the current list of templates.
4067 On error d_print_error is called and a partial list may
4068 be returned. Whatever is returned must be freed. */
4070 static struct d_print_template *
4071 d_copy_templates (struct d_print_info *dpi)
4073 struct d_print_template *src, *result, **link = &result;
4075 for (src = dpi->templates; src != NULL; src = src->next)
4077 struct d_print_template *dst =
4078 (struct d_print_template *) malloc (sizeof (struct d_print_template));
4080 if (dst == NULL)
4082 d_print_error (dpi);
4083 break;
4086 dst->template_decl = src->template_decl;
4087 *link = dst;
4088 link = &dst->next;
4091 *link = NULL;
4093 return result;
4096 /* Subroutine to handle components. */
4098 static void
4099 d_print_comp (struct d_print_info *dpi, int options,
4100 const struct demangle_component *dc)
4102 /* Magic variable to let reference smashing skip over the next modifier
4103 without needing to modify *dc. */
4104 const struct demangle_component *mod_inner = NULL;
4106 /* Variable used to store the current templates while a previously
4107 captured scope is used. */
4108 struct d_print_template *saved_templates;
4110 /* Nonzero if templates have been stored in the above variable. */
4111 int need_template_restore = 0;
4113 if (dc == NULL)
4115 d_print_error (dpi);
4116 return;
4118 if (d_print_saw_error (dpi))
4119 return;
4121 switch (dc->type)
4123 case DEMANGLE_COMPONENT_NAME:
4124 if ((options & DMGL_JAVA) == 0)
4125 d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len);
4126 else
4127 d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
4128 return;
4130 case DEMANGLE_COMPONENT_TAGGED_NAME:
4131 d_print_comp (dpi, options, d_left (dc));
4132 d_append_string (dpi, "[abi:");
4133 d_print_comp (dpi, options, d_right (dc));
4134 d_append_char (dpi, ']');
4135 return;
4137 case DEMANGLE_COMPONENT_QUAL_NAME:
4138 case DEMANGLE_COMPONENT_LOCAL_NAME:
4139 d_print_comp (dpi, options, d_left (dc));
4140 if ((options & DMGL_JAVA) == 0)
4141 d_append_string (dpi, "::");
4142 else
4143 d_append_char (dpi, '.');
4145 struct demangle_component *local_name = d_right (dc);
4146 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4148 d_append_string (dpi, "{default arg#");
4149 d_append_num (dpi, local_name->u.s_unary_num.num + 1);
4150 d_append_string (dpi, "}::");
4151 local_name = local_name->u.s_unary_num.sub;
4153 d_print_comp (dpi, options, local_name);
4155 return;
4157 case DEMANGLE_COMPONENT_TYPED_NAME:
4159 struct d_print_mod *hold_modifiers;
4160 struct demangle_component *typed_name;
4161 struct d_print_mod adpm[4];
4162 unsigned int i;
4163 struct d_print_template dpt;
4165 /* Pass the name down to the type so that it can be printed in
4166 the right place for the type. We also have to pass down
4167 any CV-qualifiers, which apply to the this parameter. */
4168 hold_modifiers = dpi->modifiers;
4169 dpi->modifiers = 0;
4170 i = 0;
4171 typed_name = d_left (dc);
4172 while (typed_name != NULL)
4174 if (i >= sizeof adpm / sizeof adpm[0])
4176 d_print_error (dpi);
4177 return;
4180 adpm[i].next = dpi->modifiers;
4181 dpi->modifiers = &adpm[i];
4182 adpm[i].mod = typed_name;
4183 adpm[i].printed = 0;
4184 adpm[i].templates = dpi->templates;
4185 ++i;
4187 if (typed_name->type != DEMANGLE_COMPONENT_RESTRICT_THIS
4188 && typed_name->type != DEMANGLE_COMPONENT_VOLATILE_THIS
4189 && typed_name->type != DEMANGLE_COMPONENT_CONST_THIS
4190 && typed_name->type != DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
4191 && typed_name->type != DEMANGLE_COMPONENT_REFERENCE_THIS)
4192 break;
4194 typed_name = d_left (typed_name);
4197 if (typed_name == NULL)
4199 d_print_error (dpi);
4200 return;
4203 /* If typed_name is a template, then it applies to the
4204 function type as well. */
4205 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
4207 dpt.next = dpi->templates;
4208 dpi->templates = &dpt;
4209 dpt.template_decl = typed_name;
4212 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
4213 there may be CV-qualifiers on its right argument which
4214 really apply here; this happens when parsing a class which
4215 is local to a function. */
4216 if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME)
4218 struct demangle_component *local_name;
4220 local_name = d_right (typed_name);
4221 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4222 local_name = local_name->u.s_unary_num.sub;
4223 while (local_name->type == DEMANGLE_COMPONENT_RESTRICT_THIS
4224 || local_name->type == DEMANGLE_COMPONENT_VOLATILE_THIS
4225 || local_name->type == DEMANGLE_COMPONENT_CONST_THIS
4226 || local_name->type == DEMANGLE_COMPONENT_REFERENCE_THIS
4227 || (local_name->type
4228 == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS))
4230 if (i >= sizeof adpm / sizeof adpm[0])
4232 d_print_error (dpi);
4233 return;
4236 adpm[i] = adpm[i - 1];
4237 adpm[i].next = &adpm[i - 1];
4238 dpi->modifiers = &adpm[i];
4240 adpm[i - 1].mod = local_name;
4241 adpm[i - 1].printed = 0;
4242 adpm[i - 1].templates = dpi->templates;
4243 ++i;
4245 local_name = d_left (local_name);
4249 d_print_comp (dpi, options, d_right (dc));
4251 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
4252 dpi->templates = dpt.next;
4254 /* If the modifiers didn't get printed by the type, print them
4255 now. */
4256 while (i > 0)
4258 --i;
4259 if (! adpm[i].printed)
4261 d_append_char (dpi, ' ');
4262 d_print_mod (dpi, options, adpm[i].mod);
4266 dpi->modifiers = hold_modifiers;
4268 return;
4271 case DEMANGLE_COMPONENT_TEMPLATE:
4273 struct d_print_mod *hold_dpm;
4274 struct demangle_component *dcl;
4275 const struct demangle_component *hold_current;
4277 /* This template may need to be referenced by a cast operator
4278 contained in its subtree. */
4279 hold_current = dpi->current_template;
4280 dpi->current_template = dc;
4282 /* Don't push modifiers into a template definition. Doing so
4283 could give the wrong definition for a template argument.
4284 Instead, treat the template essentially as a name. */
4286 hold_dpm = dpi->modifiers;
4287 dpi->modifiers = NULL;
4289 dcl = d_left (dc);
4291 if ((options & DMGL_JAVA) != 0
4292 && dcl->type == DEMANGLE_COMPONENT_NAME
4293 && dcl->u.s_name.len == 6
4294 && strncmp (dcl->u.s_name.s, "JArray", 6) == 0)
4296 /* Special-case Java arrays, so that JArray<TYPE> appears
4297 instead as TYPE[]. */
4299 d_print_comp (dpi, options, d_right (dc));
4300 d_append_string (dpi, "[]");
4302 else
4304 d_print_comp (dpi, options, dcl);
4305 if (d_last_char (dpi) == '<')
4306 d_append_char (dpi, ' ');
4307 d_append_char (dpi, '<');
4308 d_print_comp (dpi, options, d_right (dc));
4309 /* Avoid generating two consecutive '>' characters, to avoid
4310 the C++ syntactic ambiguity. */
4311 if (d_last_char (dpi) == '>')
4312 d_append_char (dpi, ' ');
4313 d_append_char (dpi, '>');
4316 dpi->modifiers = hold_dpm;
4317 dpi->current_template = hold_current;
4319 return;
4322 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4324 struct d_print_template *hold_dpt;
4325 struct demangle_component *a = d_lookup_template_argument (dpi, dc);
4327 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4328 a = d_index_template_argument (a, dpi->pack_index);
4330 if (a == NULL)
4332 d_print_error (dpi);
4333 return;
4336 /* While processing this parameter, we need to pop the list of
4337 templates. This is because the template parameter may
4338 itself be a reference to a parameter of an outer
4339 template. */
4341 hold_dpt = dpi->templates;
4342 dpi->templates = hold_dpt->next;
4344 d_print_comp (dpi, options, a);
4346 dpi->templates = hold_dpt;
4348 return;
4351 case DEMANGLE_COMPONENT_CTOR:
4352 d_print_comp (dpi, options, dc->u.s_ctor.name);
4353 return;
4355 case DEMANGLE_COMPONENT_DTOR:
4356 d_append_char (dpi, '~');
4357 d_print_comp (dpi, options, dc->u.s_dtor.name);
4358 return;
4360 case DEMANGLE_COMPONENT_VTABLE:
4361 d_append_string (dpi, "vtable for ");
4362 d_print_comp (dpi, options, d_left (dc));
4363 return;
4365 case DEMANGLE_COMPONENT_VTT:
4366 d_append_string (dpi, "VTT for ");
4367 d_print_comp (dpi, options, d_left (dc));
4368 return;
4370 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
4371 d_append_string (dpi, "construction vtable for ");
4372 d_print_comp (dpi, options, d_left (dc));
4373 d_append_string (dpi, "-in-");
4374 d_print_comp (dpi, options, d_right (dc));
4375 return;
4377 case DEMANGLE_COMPONENT_TYPEINFO:
4378 d_append_string (dpi, "typeinfo for ");
4379 d_print_comp (dpi, options, d_left (dc));
4380 return;
4382 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
4383 d_append_string (dpi, "typeinfo name for ");
4384 d_print_comp (dpi, options, d_left (dc));
4385 return;
4387 case DEMANGLE_COMPONENT_TYPEINFO_FN:
4388 d_append_string (dpi, "typeinfo fn for ");
4389 d_print_comp (dpi, options, d_left (dc));
4390 return;
4392 case DEMANGLE_COMPONENT_THUNK:
4393 d_append_string (dpi, "non-virtual thunk to ");
4394 d_print_comp (dpi, options, d_left (dc));
4395 return;
4397 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
4398 d_append_string (dpi, "virtual thunk to ");
4399 d_print_comp (dpi, options, d_left (dc));
4400 return;
4402 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
4403 d_append_string (dpi, "covariant return thunk to ");
4404 d_print_comp (dpi, options, d_left (dc));
4405 return;
4407 case DEMANGLE_COMPONENT_JAVA_CLASS:
4408 d_append_string (dpi, "java Class for ");
4409 d_print_comp (dpi, options, d_left (dc));
4410 return;
4412 case DEMANGLE_COMPONENT_GUARD:
4413 d_append_string (dpi, "guard variable for ");
4414 d_print_comp (dpi, options, d_left (dc));
4415 return;
4417 case DEMANGLE_COMPONENT_TLS_INIT:
4418 d_append_string (dpi, "TLS init function for ");
4419 d_print_comp (dpi, options, d_left (dc));
4420 return;
4422 case DEMANGLE_COMPONENT_TLS_WRAPPER:
4423 d_append_string (dpi, "TLS wrapper function for ");
4424 d_print_comp (dpi, options, d_left (dc));
4425 return;
4427 case DEMANGLE_COMPONENT_REFTEMP:
4428 d_append_string (dpi, "reference temporary #");
4429 d_print_comp (dpi, options, d_right (dc));
4430 d_append_string (dpi, " for ");
4431 d_print_comp (dpi, options, d_left (dc));
4432 return;
4434 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
4435 d_append_string (dpi, "hidden alias for ");
4436 d_print_comp (dpi, options, d_left (dc));
4437 return;
4439 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
4440 d_append_string (dpi, "transaction clone for ");
4441 d_print_comp (dpi, options, d_left (dc));
4442 return;
4444 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
4445 d_append_string (dpi, "non-transaction clone for ");
4446 d_print_comp (dpi, options, d_left (dc));
4447 return;
4449 case DEMANGLE_COMPONENT_SUB_STD:
4450 d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len);
4451 return;
4453 case DEMANGLE_COMPONENT_RESTRICT:
4454 case DEMANGLE_COMPONENT_VOLATILE:
4455 case DEMANGLE_COMPONENT_CONST:
4457 struct d_print_mod *pdpm;
4459 /* When printing arrays, it's possible to have cases where the
4460 same CV-qualifier gets pushed on the stack multiple times.
4461 We only need to print it once. */
4463 for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next)
4465 if (! pdpm->printed)
4467 if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT
4468 && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE
4469 && pdpm->mod->type != DEMANGLE_COMPONENT_CONST)
4470 break;
4471 if (pdpm->mod->type == dc->type)
4473 d_print_comp (dpi, options, d_left (dc));
4474 return;
4479 goto modifier;
4481 case DEMANGLE_COMPONENT_REFERENCE:
4482 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
4484 /* Handle reference smashing: & + && = &. */
4485 const struct demangle_component *sub = d_left (dc);
4486 if (sub->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
4488 struct demangle_component *a;
4489 struct d_saved_scope *scope = NULL, *scopes;
4490 int i;
4492 for (i = 0; i < dpi->num_saved_scopes; i++)
4493 if (dpi->saved_scopes[i].container == sub)
4494 scope = &dpi->saved_scopes[i];
4496 if (scope == NULL)
4498 size_t size;
4500 /* This is the first time SUB has been traversed.
4501 We need to capture the current templates so
4502 they can be restored if SUB is reentered as a
4503 substitution. */
4504 ++dpi->num_saved_scopes;
4505 size = sizeof (struct d_saved_scope) * dpi->num_saved_scopes;
4506 scopes = (struct d_saved_scope *) realloc (dpi->saved_scopes,
4507 size);
4508 if (scopes == NULL)
4510 d_print_error (dpi);
4511 return;
4514 dpi->saved_scopes = scopes;
4515 scope = dpi->saved_scopes + (dpi->num_saved_scopes - 1);
4517 scope->container = sub;
4518 scope->templates = d_copy_templates (dpi);
4519 if (d_print_saw_error (dpi))
4520 return;
4522 else
4524 /* This traversal is reentering SUB as a substition.
4525 Restore the original templates temporarily. */
4526 saved_templates = dpi->templates;
4527 dpi->templates = scope->templates;
4528 need_template_restore = 1;
4531 a = d_lookup_template_argument (dpi, sub);
4532 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4533 a = d_index_template_argument (a, dpi->pack_index);
4535 if (a == NULL)
4537 if (need_template_restore)
4538 dpi->templates = saved_templates;
4540 d_print_error (dpi);
4541 return;
4544 sub = a;
4547 if (sub->type == DEMANGLE_COMPONENT_REFERENCE
4548 || sub->type == dc->type)
4549 dc = sub;
4550 else if (sub->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE)
4551 mod_inner = d_left (sub);
4553 /* Fall through. */
4555 case DEMANGLE_COMPONENT_RESTRICT_THIS:
4556 case DEMANGLE_COMPONENT_VOLATILE_THIS:
4557 case DEMANGLE_COMPONENT_CONST_THIS:
4558 case DEMANGLE_COMPONENT_REFERENCE_THIS:
4559 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
4560 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
4561 case DEMANGLE_COMPONENT_POINTER:
4562 case DEMANGLE_COMPONENT_COMPLEX:
4563 case DEMANGLE_COMPONENT_IMAGINARY:
4564 modifier:
4566 /* We keep a list of modifiers on the stack. */
4567 struct d_print_mod dpm;
4569 dpm.next = dpi->modifiers;
4570 dpi->modifiers = &dpm;
4571 dpm.mod = dc;
4572 dpm.printed = 0;
4573 dpm.templates = dpi->templates;
4575 if (!mod_inner)
4576 mod_inner = d_left (dc);
4578 d_print_comp (dpi, options, mod_inner);
4580 /* If the modifier didn't get printed by the type, print it
4581 now. */
4582 if (! dpm.printed)
4583 d_print_mod (dpi, options, dc);
4585 dpi->modifiers = dpm.next;
4587 if (need_template_restore)
4588 dpi->templates = saved_templates;
4590 return;
4593 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4594 if ((options & DMGL_JAVA) == 0)
4595 d_append_buffer (dpi, dc->u.s_builtin.type->name,
4596 dc->u.s_builtin.type->len);
4597 else
4598 d_append_buffer (dpi, dc->u.s_builtin.type->java_name,
4599 dc->u.s_builtin.type->java_len);
4600 return;
4602 case DEMANGLE_COMPONENT_VENDOR_TYPE:
4603 d_print_comp (dpi, options, d_left (dc));
4604 return;
4606 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
4608 if ((options & DMGL_RET_POSTFIX) != 0)
4609 d_print_function_type (dpi,
4610 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4611 dc, dpi->modifiers);
4613 /* Print return type if present */
4614 if (d_left (dc) != NULL && (options & DMGL_RET_POSTFIX) != 0)
4615 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4616 d_left (dc));
4617 else if (d_left (dc) != NULL && (options & DMGL_RET_DROP) == 0)
4619 struct d_print_mod dpm;
4621 /* We must pass this type down as a modifier in order to
4622 print it in the right location. */
4623 dpm.next = dpi->modifiers;
4624 dpi->modifiers = &dpm;
4625 dpm.mod = dc;
4626 dpm.printed = 0;
4627 dpm.templates = dpi->templates;
4629 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4630 d_left (dc));
4632 dpi->modifiers = dpm.next;
4634 if (dpm.printed)
4635 return;
4637 /* In standard prefix notation, there is a space between the
4638 return type and the function signature. */
4639 if ((options & DMGL_RET_POSTFIX) == 0)
4640 d_append_char (dpi, ' ');
4643 if ((options & DMGL_RET_POSTFIX) == 0)
4644 d_print_function_type (dpi,
4645 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4646 dc, dpi->modifiers);
4648 return;
4651 case DEMANGLE_COMPONENT_ARRAY_TYPE:
4653 struct d_print_mod *hold_modifiers;
4654 struct d_print_mod adpm[4];
4655 unsigned int i;
4656 struct d_print_mod *pdpm;
4658 /* We must pass this type down as a modifier in order to print
4659 multi-dimensional arrays correctly. If the array itself is
4660 CV-qualified, we act as though the element type were
4661 CV-qualified. We do this by copying the modifiers down
4662 rather than fiddling pointers, so that we don't wind up
4663 with a d_print_mod higher on the stack pointing into our
4664 stack frame after we return. */
4666 hold_modifiers = dpi->modifiers;
4668 adpm[0].next = hold_modifiers;
4669 dpi->modifiers = &adpm[0];
4670 adpm[0].mod = dc;
4671 adpm[0].printed = 0;
4672 adpm[0].templates = dpi->templates;
4674 i = 1;
4675 pdpm = hold_modifiers;
4676 while (pdpm != NULL
4677 && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT
4678 || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE
4679 || pdpm->mod->type == DEMANGLE_COMPONENT_CONST))
4681 if (! pdpm->printed)
4683 if (i >= sizeof adpm / sizeof adpm[0])
4685 d_print_error (dpi);
4686 return;
4689 adpm[i] = *pdpm;
4690 adpm[i].next = dpi->modifiers;
4691 dpi->modifiers = &adpm[i];
4692 pdpm->printed = 1;
4693 ++i;
4696 pdpm = pdpm->next;
4699 d_print_comp (dpi, options, d_right (dc));
4701 dpi->modifiers = hold_modifiers;
4703 if (adpm[0].printed)
4704 return;
4706 while (i > 1)
4708 --i;
4709 d_print_mod (dpi, options, adpm[i].mod);
4712 d_print_array_type (dpi, options, dc, dpi->modifiers);
4714 return;
4717 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
4718 case DEMANGLE_COMPONENT_VECTOR_TYPE:
4720 struct d_print_mod dpm;
4722 dpm.next = dpi->modifiers;
4723 dpi->modifiers = &dpm;
4724 dpm.mod = dc;
4725 dpm.printed = 0;
4726 dpm.templates = dpi->templates;
4728 d_print_comp (dpi, options, d_right (dc));
4730 /* If the modifier didn't get printed by the type, print it
4731 now. */
4732 if (! dpm.printed)
4733 d_print_mod (dpi, options, dc);
4735 dpi->modifiers = dpm.next;
4737 return;
4740 case DEMANGLE_COMPONENT_FIXED_TYPE:
4741 if (dc->u.s_fixed.sat)
4742 d_append_string (dpi, "_Sat ");
4743 /* Don't print "int _Accum". */
4744 if (dc->u.s_fixed.length->u.s_builtin.type
4745 != &cplus_demangle_builtin_types['i'-'a'])
4747 d_print_comp (dpi, options, dc->u.s_fixed.length);
4748 d_append_char (dpi, ' ');
4750 if (dc->u.s_fixed.accum)
4751 d_append_string (dpi, "_Accum");
4752 else
4753 d_append_string (dpi, "_Fract");
4754 return;
4756 case DEMANGLE_COMPONENT_ARGLIST:
4757 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
4758 if (d_left (dc) != NULL)
4759 d_print_comp (dpi, options, d_left (dc));
4760 if (d_right (dc) != NULL)
4762 size_t len;
4763 unsigned long int flush_count;
4764 /* Make sure ", " isn't flushed by d_append_string, otherwise
4765 dpi->len -= 2 wouldn't work. */
4766 if (dpi->len >= sizeof (dpi->buf) - 2)
4767 d_print_flush (dpi);
4768 d_append_string (dpi, ", ");
4769 len = dpi->len;
4770 flush_count = dpi->flush_count;
4771 d_print_comp (dpi, options, d_right (dc));
4772 /* If that didn't print anything (which can happen with empty
4773 template argument packs), remove the comma and space. */
4774 if (dpi->flush_count == flush_count && dpi->len == len)
4775 dpi->len -= 2;
4777 return;
4779 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
4781 struct demangle_component *type = d_left (dc);
4782 struct demangle_component *list = d_right (dc);
4784 if (type)
4785 d_print_comp (dpi, options, type);
4786 d_append_char (dpi, '{');
4787 d_print_comp (dpi, options, list);
4788 d_append_char (dpi, '}');
4790 return;
4792 case DEMANGLE_COMPONENT_OPERATOR:
4794 const struct demangle_operator_info *op = dc->u.s_operator.op;
4795 int len = op->len;
4797 d_append_string (dpi, "operator");
4798 /* Add a space before new/delete. */
4799 if (IS_LOWER (op->name[0]))
4800 d_append_char (dpi, ' ');
4801 /* Omit a trailing space. */
4802 if (op->name[len-1] == ' ')
4803 --len;
4804 d_append_buffer (dpi, op->name, len);
4805 return;
4808 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4809 d_append_string (dpi, "operator ");
4810 d_print_comp (dpi, options, dc->u.s_extended_operator.name);
4811 return;
4813 case DEMANGLE_COMPONENT_CAST:
4814 d_append_string (dpi, "operator ");
4815 d_print_cast (dpi, options, dc);
4816 return;
4818 case DEMANGLE_COMPONENT_NULLARY:
4819 d_print_expr_op (dpi, options, d_left (dc));
4820 return;
4822 case DEMANGLE_COMPONENT_UNARY:
4824 struct demangle_component *op = d_left (dc);
4825 struct demangle_component *operand = d_right (dc);
4826 const char *code = NULL;
4828 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
4830 code = op->u.s_operator.op->code;
4831 if (!strcmp (code, "ad"))
4833 /* Don't print the argument list for the address of a
4834 function. */
4835 if (operand->type == DEMANGLE_COMPONENT_TYPED_NAME
4836 && d_left (operand)->type == DEMANGLE_COMPONENT_QUAL_NAME
4837 && d_right (operand)->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
4838 operand = d_left (operand);
4840 if (operand->type == DEMANGLE_COMPONENT_BINARY_ARGS)
4842 /* This indicates a suffix operator. */
4843 operand = d_left (operand);
4844 d_print_subexpr (dpi, options, operand);
4845 d_print_expr_op (dpi, options, op);
4846 return;
4850 if (op->type != DEMANGLE_COMPONENT_CAST)
4851 d_print_expr_op (dpi, options, op);
4852 else
4854 d_append_char (dpi, '(');
4855 d_print_cast (dpi, options, op);
4856 d_append_char (dpi, ')');
4858 if (code && !strcmp (code, "gs"))
4859 /* Avoid parens after '::'. */
4860 d_print_comp (dpi, options, operand);
4861 else if (code && !strcmp (code, "st"))
4862 /* Always print parens for sizeof (type). */
4864 d_append_char (dpi, '(');
4865 d_print_comp (dpi, options, operand);
4866 d_append_char (dpi, ')');
4868 else
4869 d_print_subexpr (dpi, options, operand);
4871 return;
4873 case DEMANGLE_COMPONENT_BINARY:
4874 if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS)
4876 d_print_error (dpi);
4877 return;
4880 if (op_is_new_cast (d_left (dc)))
4882 d_print_expr_op (dpi, options, d_left (dc));
4883 d_append_char (dpi, '<');
4884 d_print_comp (dpi, options, d_left (d_right (dc)));
4885 d_append_string (dpi, ">(");
4886 d_print_comp (dpi, options, d_right (d_right (dc)));
4887 d_append_char (dpi, ')');
4888 return;
4891 /* We wrap an expression which uses the greater-than operator in
4892 an extra layer of parens so that it does not get confused
4893 with the '>' which ends the template parameters. */
4894 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
4895 && d_left (dc)->u.s_operator.op->len == 1
4896 && d_left (dc)->u.s_operator.op->name[0] == '>')
4897 d_append_char (dpi, '(');
4899 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") == 0
4900 && d_left (d_right (dc))->type == DEMANGLE_COMPONENT_TYPED_NAME)
4902 /* Function call used in an expression should not have printed types
4903 of the function arguments. Values of the function arguments still
4904 get printed below. */
4906 const struct demangle_component *func = d_left (d_right (dc));
4908 if (d_right (func)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
4909 d_print_error (dpi);
4910 d_print_subexpr (dpi, options, d_left (func));
4912 else
4913 d_print_subexpr (dpi, options, d_left (d_right (dc)));
4914 if (strcmp (d_left (dc)->u.s_operator.op->code, "ix") == 0)
4916 d_append_char (dpi, '[');
4917 d_print_comp (dpi, options, d_right (d_right (dc)));
4918 d_append_char (dpi, ']');
4920 else
4922 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") != 0)
4923 d_print_expr_op (dpi, options, d_left (dc));
4924 d_print_subexpr (dpi, options, d_right (d_right (dc)));
4927 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
4928 && d_left (dc)->u.s_operator.op->len == 1
4929 && d_left (dc)->u.s_operator.op->name[0] == '>')
4930 d_append_char (dpi, ')');
4932 return;
4934 case DEMANGLE_COMPONENT_BINARY_ARGS:
4935 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
4936 d_print_error (dpi);
4937 return;
4939 case DEMANGLE_COMPONENT_TRINARY:
4940 if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1
4941 || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2)
4943 d_print_error (dpi);
4944 return;
4947 struct demangle_component *op = d_left (dc);
4948 struct demangle_component *first = d_left (d_right (dc));
4949 struct demangle_component *second = d_left (d_right (d_right (dc)));
4950 struct demangle_component *third = d_right (d_right (d_right (dc)));
4952 if (!strcmp (op->u.s_operator.op->code, "qu"))
4954 d_print_subexpr (dpi, options, first);
4955 d_print_expr_op (dpi, options, op);
4956 d_print_subexpr (dpi, options, second);
4957 d_append_string (dpi, " : ");
4958 d_print_subexpr (dpi, options, third);
4960 else
4962 d_append_string (dpi, "new ");
4963 if (d_left (first) != NULL)
4965 d_print_subexpr (dpi, options, first);
4966 d_append_char (dpi, ' ');
4968 d_print_comp (dpi, options, second);
4969 if (third)
4970 d_print_subexpr (dpi, options, third);
4973 return;
4975 case DEMANGLE_COMPONENT_TRINARY_ARG1:
4976 case DEMANGLE_COMPONENT_TRINARY_ARG2:
4977 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
4978 d_print_error (dpi);
4979 return;
4981 case DEMANGLE_COMPONENT_LITERAL:
4982 case DEMANGLE_COMPONENT_LITERAL_NEG:
4984 enum d_builtin_type_print tp;
4986 /* For some builtin types, produce simpler output. */
4987 tp = D_PRINT_DEFAULT;
4988 if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE)
4990 tp = d_left (dc)->u.s_builtin.type->print;
4991 switch (tp)
4993 case D_PRINT_INT:
4994 case D_PRINT_UNSIGNED:
4995 case D_PRINT_LONG:
4996 case D_PRINT_UNSIGNED_LONG:
4997 case D_PRINT_LONG_LONG:
4998 case D_PRINT_UNSIGNED_LONG_LONG:
4999 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME)
5001 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
5002 d_append_char (dpi, '-');
5003 d_print_comp (dpi, options, d_right (dc));
5004 switch (tp)
5006 default:
5007 break;
5008 case D_PRINT_UNSIGNED:
5009 d_append_char (dpi, 'u');
5010 break;
5011 case D_PRINT_LONG:
5012 d_append_char (dpi, 'l');
5013 break;
5014 case D_PRINT_UNSIGNED_LONG:
5015 d_append_string (dpi, "ul");
5016 break;
5017 case D_PRINT_LONG_LONG:
5018 d_append_string (dpi, "ll");
5019 break;
5020 case D_PRINT_UNSIGNED_LONG_LONG:
5021 d_append_string (dpi, "ull");
5022 break;
5024 return;
5026 break;
5028 case D_PRINT_BOOL:
5029 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME
5030 && d_right (dc)->u.s_name.len == 1
5031 && dc->type == DEMANGLE_COMPONENT_LITERAL)
5033 switch (d_right (dc)->u.s_name.s[0])
5035 case '0':
5036 d_append_string (dpi, "false");
5037 return;
5038 case '1':
5039 d_append_string (dpi, "true");
5040 return;
5041 default:
5042 break;
5045 break;
5047 default:
5048 break;
5052 d_append_char (dpi, '(');
5053 d_print_comp (dpi, options, d_left (dc));
5054 d_append_char (dpi, ')');
5055 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
5056 d_append_char (dpi, '-');
5057 if (tp == D_PRINT_FLOAT)
5058 d_append_char (dpi, '[');
5059 d_print_comp (dpi, options, d_right (dc));
5060 if (tp == D_PRINT_FLOAT)
5061 d_append_char (dpi, ']');
5063 return;
5065 case DEMANGLE_COMPONENT_NUMBER:
5066 d_append_num (dpi, dc->u.s_number.number);
5067 return;
5069 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
5070 d_append_string (dpi, "java resource ");
5071 d_print_comp (dpi, options, d_left (dc));
5072 return;
5074 case DEMANGLE_COMPONENT_COMPOUND_NAME:
5075 d_print_comp (dpi, options, d_left (dc));
5076 d_print_comp (dpi, options, d_right (dc));
5077 return;
5079 case DEMANGLE_COMPONENT_CHARACTER:
5080 d_append_char (dpi, dc->u.s_character.character);
5081 return;
5083 case DEMANGLE_COMPONENT_DECLTYPE:
5084 d_append_string (dpi, "decltype (");
5085 d_print_comp (dpi, options, d_left (dc));
5086 d_append_char (dpi, ')');
5087 return;
5089 case DEMANGLE_COMPONENT_PACK_EXPANSION:
5091 int len;
5092 int i;
5093 struct demangle_component *a = d_find_pack (dpi, d_left (dc));
5094 if (a == NULL)
5096 /* d_find_pack won't find anything if the only packs involved
5097 in this expansion are function parameter packs; in that
5098 case, just print the pattern and "...". */
5099 d_print_subexpr (dpi, options, d_left (dc));
5100 d_append_string (dpi, "...");
5101 return;
5104 len = d_pack_length (a);
5105 dc = d_left (dc);
5106 for (i = 0; i < len; ++i)
5108 dpi->pack_index = i;
5109 d_print_comp (dpi, options, dc);
5110 if (i < len-1)
5111 d_append_string (dpi, ", ");
5114 return;
5116 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
5118 long num = dc->u.s_number.number;
5119 if (num == 0)
5120 d_append_string (dpi, "this");
5121 else
5123 d_append_string (dpi, "{parm#");
5124 d_append_num (dpi, num);
5125 d_append_char (dpi, '}');
5128 return;
5130 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
5131 d_append_string (dpi, "global constructors keyed to ");
5132 d_print_comp (dpi, options, dc->u.s_binary.left);
5133 return;
5135 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
5136 d_append_string (dpi, "global destructors keyed to ");
5137 d_print_comp (dpi, options, dc->u.s_binary.left);
5138 return;
5140 case DEMANGLE_COMPONENT_LAMBDA:
5141 d_append_string (dpi, "{lambda(");
5142 d_print_comp (dpi, options, dc->u.s_unary_num.sub);
5143 d_append_string (dpi, ")#");
5144 d_append_num (dpi, dc->u.s_unary_num.num + 1);
5145 d_append_char (dpi, '}');
5146 return;
5148 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
5149 d_append_string (dpi, "{unnamed type#");
5150 d_append_num (dpi, dc->u.s_number.number + 1);
5151 d_append_char (dpi, '}');
5152 return;
5154 case DEMANGLE_COMPONENT_CLONE:
5155 d_print_comp (dpi, options, d_left (dc));
5156 d_append_string (dpi, " [clone ");
5157 d_print_comp (dpi, options, d_right (dc));
5158 d_append_char (dpi, ']');
5159 return;
5161 default:
5162 d_print_error (dpi);
5163 return;
5167 /* Print a Java dentifier. For Java we try to handle encoded extended
5168 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
5169 so we don't it for C++. Characters are encoded as
5170 __U<hex-char>+_. */
5172 static void
5173 d_print_java_identifier (struct d_print_info *dpi, const char *name, int len)
5175 const char *p;
5176 const char *end;
5178 end = name + len;
5179 for (p = name; p < end; ++p)
5181 if (end - p > 3
5182 && p[0] == '_'
5183 && p[1] == '_'
5184 && p[2] == 'U')
5186 unsigned long c;
5187 const char *q;
5189 c = 0;
5190 for (q = p + 3; q < end; ++q)
5192 int dig;
5194 if (IS_DIGIT (*q))
5195 dig = *q - '0';
5196 else if (*q >= 'A' && *q <= 'F')
5197 dig = *q - 'A' + 10;
5198 else if (*q >= 'a' && *q <= 'f')
5199 dig = *q - 'a' + 10;
5200 else
5201 break;
5203 c = c * 16 + dig;
5205 /* If the Unicode character is larger than 256, we don't try
5206 to deal with it here. FIXME. */
5207 if (q < end && *q == '_' && c < 256)
5209 d_append_char (dpi, c);
5210 p = q;
5211 continue;
5215 d_append_char (dpi, *p);
5219 /* Print a list of modifiers. SUFFIX is 1 if we are printing
5220 qualifiers on this after printing a function. */
5222 static void
5223 d_print_mod_list (struct d_print_info *dpi, int options,
5224 struct d_print_mod *mods, int suffix)
5226 struct d_print_template *hold_dpt;
5228 if (mods == NULL || d_print_saw_error (dpi))
5229 return;
5231 if (mods->printed
5232 || (! suffix
5233 && (mods->mod->type == DEMANGLE_COMPONENT_RESTRICT_THIS
5234 || mods->mod->type == DEMANGLE_COMPONENT_VOLATILE_THIS
5235 || mods->mod->type == DEMANGLE_COMPONENT_CONST_THIS
5236 || mods->mod->type == DEMANGLE_COMPONENT_REFERENCE_THIS
5237 || (mods->mod->type
5238 == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS))))
5240 d_print_mod_list (dpi, options, mods->next, suffix);
5241 return;
5244 mods->printed = 1;
5246 hold_dpt = dpi->templates;
5247 dpi->templates = mods->templates;
5249 if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
5251 d_print_function_type (dpi, options, mods->mod, mods->next);
5252 dpi->templates = hold_dpt;
5253 return;
5255 else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
5257 d_print_array_type (dpi, options, mods->mod, mods->next);
5258 dpi->templates = hold_dpt;
5259 return;
5261 else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME)
5263 struct d_print_mod *hold_modifiers;
5264 struct demangle_component *dc;
5266 /* When this is on the modifier stack, we have pulled any
5267 qualifiers off the right argument already. Otherwise, we
5268 print it as usual, but don't let the left argument see any
5269 modifiers. */
5271 hold_modifiers = dpi->modifiers;
5272 dpi->modifiers = NULL;
5273 d_print_comp (dpi, options, d_left (mods->mod));
5274 dpi->modifiers = hold_modifiers;
5276 if ((options & DMGL_JAVA) == 0)
5277 d_append_string (dpi, "::");
5278 else
5279 d_append_char (dpi, '.');
5281 dc = d_right (mods->mod);
5283 if (dc->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
5285 d_append_string (dpi, "{default arg#");
5286 d_append_num (dpi, dc->u.s_unary_num.num + 1);
5287 d_append_string (dpi, "}::");
5288 dc = dc->u.s_unary_num.sub;
5291 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
5292 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
5293 || dc->type == DEMANGLE_COMPONENT_CONST_THIS
5294 || dc->type == DEMANGLE_COMPONENT_REFERENCE_THIS
5295 || dc->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)
5296 dc = d_left (dc);
5298 d_print_comp (dpi, options, dc);
5300 dpi->templates = hold_dpt;
5301 return;
5304 d_print_mod (dpi, options, mods->mod);
5306 dpi->templates = hold_dpt;
5308 d_print_mod_list (dpi, options, mods->next, suffix);
5311 /* Print a modifier. */
5313 static void
5314 d_print_mod (struct d_print_info *dpi, int options,
5315 const struct demangle_component *mod)
5317 switch (mod->type)
5319 case DEMANGLE_COMPONENT_RESTRICT:
5320 case DEMANGLE_COMPONENT_RESTRICT_THIS:
5321 d_append_string (dpi, " restrict");
5322 return;
5323 case DEMANGLE_COMPONENT_VOLATILE:
5324 case DEMANGLE_COMPONENT_VOLATILE_THIS:
5325 d_append_string (dpi, " volatile");
5326 return;
5327 case DEMANGLE_COMPONENT_CONST:
5328 case DEMANGLE_COMPONENT_CONST_THIS:
5329 d_append_string (dpi, " const");
5330 return;
5331 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5332 d_append_char (dpi, ' ');
5333 d_print_comp (dpi, options, d_right (mod));
5334 return;
5335 case DEMANGLE_COMPONENT_POINTER:
5336 /* There is no pointer symbol in Java. */
5337 if ((options & DMGL_JAVA) == 0)
5338 d_append_char (dpi, '*');
5339 return;
5340 case DEMANGLE_COMPONENT_REFERENCE_THIS:
5341 /* For the ref-qualifier, put a space before the &. */
5342 d_append_char (dpi, ' ');
5343 case DEMANGLE_COMPONENT_REFERENCE:
5344 d_append_char (dpi, '&');
5345 return;
5346 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
5347 d_append_char (dpi, ' ');
5348 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5349 d_append_string (dpi, "&&");
5350 return;
5351 case DEMANGLE_COMPONENT_COMPLEX:
5352 d_append_string (dpi, "complex ");
5353 return;
5354 case DEMANGLE_COMPONENT_IMAGINARY:
5355 d_append_string (dpi, "imaginary ");
5356 return;
5357 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5358 if (d_last_char (dpi) != '(')
5359 d_append_char (dpi, ' ');
5360 d_print_comp (dpi, options, d_left (mod));
5361 d_append_string (dpi, "::*");
5362 return;
5363 case DEMANGLE_COMPONENT_TYPED_NAME:
5364 d_print_comp (dpi, options, d_left (mod));
5365 return;
5366 case DEMANGLE_COMPONENT_VECTOR_TYPE:
5367 d_append_string (dpi, " __vector(");
5368 d_print_comp (dpi, options, d_left (mod));
5369 d_append_char (dpi, ')');
5370 return;
5372 default:
5373 /* Otherwise, we have something that won't go back on the
5374 modifier stack, so we can just print it. */
5375 d_print_comp (dpi, options, mod);
5376 return;
5380 /* Print a function type, except for the return type. */
5382 static void
5383 d_print_function_type (struct d_print_info *dpi, int options,
5384 const struct demangle_component *dc,
5385 struct d_print_mod *mods)
5387 int need_paren;
5388 int need_space;
5389 struct d_print_mod *p;
5390 struct d_print_mod *hold_modifiers;
5392 need_paren = 0;
5393 need_space = 0;
5394 for (p = mods; p != NULL; p = p->next)
5396 if (p->printed)
5397 break;
5399 switch (p->mod->type)
5401 case DEMANGLE_COMPONENT_POINTER:
5402 case DEMANGLE_COMPONENT_REFERENCE:
5403 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5404 need_paren = 1;
5405 break;
5406 case DEMANGLE_COMPONENT_RESTRICT:
5407 case DEMANGLE_COMPONENT_VOLATILE:
5408 case DEMANGLE_COMPONENT_CONST:
5409 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5410 case DEMANGLE_COMPONENT_COMPLEX:
5411 case DEMANGLE_COMPONENT_IMAGINARY:
5412 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5413 need_space = 1;
5414 need_paren = 1;
5415 break;
5416 case DEMANGLE_COMPONENT_RESTRICT_THIS:
5417 case DEMANGLE_COMPONENT_VOLATILE_THIS:
5418 case DEMANGLE_COMPONENT_CONST_THIS:
5419 case DEMANGLE_COMPONENT_REFERENCE_THIS:
5420 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
5421 break;
5422 default:
5423 break;
5425 if (need_paren)
5426 break;
5429 if (need_paren)
5431 if (! need_space)
5433 if (d_last_char (dpi) != '('
5434 && d_last_char (dpi) != '*')
5435 need_space = 1;
5437 if (need_space && d_last_char (dpi) != ' ')
5438 d_append_char (dpi, ' ');
5439 d_append_char (dpi, '(');
5442 hold_modifiers = dpi->modifiers;
5443 dpi->modifiers = NULL;
5445 d_print_mod_list (dpi, options, mods, 0);
5447 if (need_paren)
5448 d_append_char (dpi, ')');
5450 d_append_char (dpi, '(');
5452 if (d_right (dc) != NULL)
5453 d_print_comp (dpi, options, d_right (dc));
5455 d_append_char (dpi, ')');
5457 d_print_mod_list (dpi, options, mods, 1);
5459 dpi->modifiers = hold_modifiers;
5462 /* Print an array type, except for the element type. */
5464 static void
5465 d_print_array_type (struct d_print_info *dpi, int options,
5466 const struct demangle_component *dc,
5467 struct d_print_mod *mods)
5469 int need_space;
5471 need_space = 1;
5472 if (mods != NULL)
5474 int need_paren;
5475 struct d_print_mod *p;
5477 need_paren = 0;
5478 for (p = mods; p != NULL; p = p->next)
5480 if (! p->printed)
5482 if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
5484 need_space = 0;
5485 break;
5487 else
5489 need_paren = 1;
5490 need_space = 1;
5491 break;
5496 if (need_paren)
5497 d_append_string (dpi, " (");
5499 d_print_mod_list (dpi, options, mods, 0);
5501 if (need_paren)
5502 d_append_char (dpi, ')');
5505 if (need_space)
5506 d_append_char (dpi, ' ');
5508 d_append_char (dpi, '[');
5510 if (d_left (dc) != NULL)
5511 d_print_comp (dpi, options, d_left (dc));
5513 d_append_char (dpi, ']');
5516 /* Print an operator in an expression. */
5518 static void
5519 d_print_expr_op (struct d_print_info *dpi, int options,
5520 const struct demangle_component *dc)
5522 if (dc->type == DEMANGLE_COMPONENT_OPERATOR)
5523 d_append_buffer (dpi, dc->u.s_operator.op->name,
5524 dc->u.s_operator.op->len);
5525 else
5526 d_print_comp (dpi, options, dc);
5529 /* Print a cast. */
5531 static void
5532 d_print_cast (struct d_print_info *dpi, int options,
5533 const struct demangle_component *dc)
5535 struct d_print_template dpt;
5537 /* For a cast operator, we need the template parameters from
5538 the enclosing template in scope for processing the type. */
5539 if (dpi->current_template != NULL)
5541 dpt.next = dpi->templates;
5542 dpi->templates = &dpt;
5543 dpt.template_decl = dpi->current_template;
5546 if (d_left (dc)->type != DEMANGLE_COMPONENT_TEMPLATE)
5548 d_print_comp (dpi, options, d_left (dc));
5549 if (dpi->current_template != NULL)
5550 dpi->templates = dpt.next;
5552 else
5554 d_print_comp (dpi, options, d_left (d_left (dc)));
5556 /* For a templated cast operator, we need to remove the template
5557 parameters from scope after printing the operator name,
5558 so we need to handle the template printing here. */
5559 if (dpi->current_template != NULL)
5560 dpi->templates = dpt.next;
5562 if (d_last_char (dpi) == '<')
5563 d_append_char (dpi, ' ');
5564 d_append_char (dpi, '<');
5565 d_print_comp (dpi, options, d_right (d_left (dc)));
5566 /* Avoid generating two consecutive '>' characters, to avoid
5567 the C++ syntactic ambiguity. */
5568 if (d_last_char (dpi) == '>')
5569 d_append_char (dpi, ' ');
5570 d_append_char (dpi, '>');
5574 /* Initialize the information structure we use to pass around
5575 information. */
5577 CP_STATIC_IF_GLIBCPP_V3
5578 void
5579 cplus_demangle_init_info (const char *mangled, int options, size_t len,
5580 struct d_info *di)
5582 di->s = mangled;
5583 di->send = mangled + len;
5584 di->options = options;
5586 di->n = mangled;
5588 /* We can not need more components than twice the number of chars in
5589 the mangled string. Most components correspond directly to
5590 chars, but the ARGLIST types are exceptions. */
5591 di->num_comps = 2 * len;
5592 di->next_comp = 0;
5594 /* Similarly, we can not need more substitutions than there are
5595 chars in the mangled string. */
5596 di->num_subs = len;
5597 di->next_sub = 0;
5598 di->did_subs = 0;
5600 di->last_name = NULL;
5602 di->expansion = 0;
5603 di->is_expression = 0;
5604 di->is_conversion = 0;
5607 /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
5608 mangled name, return strings in repeated callback giving the demangled
5609 name. OPTIONS is the usual libiberty demangler options. On success,
5610 this returns 1. On failure, returns 0. */
5612 static int
5613 d_demangle_callback (const char *mangled, int options,
5614 demangle_callbackref callback, void *opaque)
5616 enum
5618 DCT_TYPE,
5619 DCT_MANGLED,
5620 DCT_GLOBAL_CTORS,
5621 DCT_GLOBAL_DTORS
5623 type;
5624 struct d_info di;
5625 struct demangle_component *dc;
5626 int status;
5628 if (mangled[0] == '_' && mangled[1] == 'Z')
5629 type = DCT_MANGLED;
5630 else if (strncmp (mangled, "_GLOBAL_", 8) == 0
5631 && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
5632 && (mangled[9] == 'D' || mangled[9] == 'I')
5633 && mangled[10] == '_')
5634 type = mangled[9] == 'I' ? DCT_GLOBAL_CTORS : DCT_GLOBAL_DTORS;
5635 else
5637 if ((options & DMGL_TYPES) == 0)
5638 return 0;
5639 type = DCT_TYPE;
5642 cplus_demangle_init_info (mangled, options, strlen (mangled), &di);
5645 #ifdef CP_DYNAMIC_ARRAYS
5646 __extension__ struct demangle_component comps[di.num_comps];
5647 __extension__ struct demangle_component *subs[di.num_subs];
5649 di.comps = comps;
5650 di.subs = subs;
5651 #else
5652 di.comps = alloca (di.num_comps * sizeof (*di.comps));
5653 di.subs = alloca (di.num_subs * sizeof (*di.subs));
5654 #endif
5656 switch (type)
5658 case DCT_TYPE:
5659 dc = cplus_demangle_type (&di);
5660 break;
5661 case DCT_MANGLED:
5662 dc = cplus_demangle_mangled_name (&di, 1);
5663 break;
5664 case DCT_GLOBAL_CTORS:
5665 case DCT_GLOBAL_DTORS:
5666 d_advance (&di, 11);
5667 dc = d_make_comp (&di,
5668 (type == DCT_GLOBAL_CTORS
5669 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
5670 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS),
5671 d_make_demangle_mangled_name (&di, d_str (&di)),
5672 NULL);
5673 d_advance (&di, strlen (d_str (&di)));
5674 break;
5677 /* If DMGL_PARAMS is set, then if we didn't consume the entire
5678 mangled string, then we didn't successfully demangle it. If
5679 DMGL_PARAMS is not set, we didn't look at the trailing
5680 parameters. */
5681 if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0')
5682 dc = NULL;
5684 #ifdef CP_DEMANGLE_DEBUG
5685 d_dump (dc, 0);
5686 #endif
5688 status = (dc != NULL)
5689 ? cplus_demangle_print_callback (options, dc, callback, opaque)
5690 : 0;
5693 return status;
5696 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
5697 name, return a buffer allocated with malloc holding the demangled
5698 name. OPTIONS is the usual libiberty demangler options. On
5699 success, this sets *PALC to the allocated size of the returned
5700 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
5701 a memory allocation failure, and returns NULL. */
5703 static char *
5704 d_demangle (const char *mangled, int options, size_t *palc)
5706 struct d_growable_string dgs;
5707 int status;
5709 d_growable_string_init (&dgs, 0);
5711 status = d_demangle_callback (mangled, options,
5712 d_growable_string_callback_adapter, &dgs);
5713 if (status == 0)
5715 free (dgs.buf);
5716 *palc = 0;
5717 return NULL;
5720 *palc = dgs.allocation_failure ? 1 : dgs.alc;
5721 return dgs.buf;
5724 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
5726 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
5728 /* ia64 ABI-mandated entry point in the C++ runtime library for
5729 performing demangling. MANGLED_NAME is a NUL-terminated character
5730 string containing the name to be demangled.
5732 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
5733 *LENGTH bytes, into which the demangled name is stored. If
5734 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
5735 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
5736 is placed in a region of memory allocated with malloc.
5738 If LENGTH is non-NULL, the length of the buffer containing the
5739 demangled name, is placed in *LENGTH.
5741 The return value is a pointer to the start of the NUL-terminated
5742 demangled name, or NULL if the demangling fails. The caller is
5743 responsible for deallocating this memory using free.
5745 *STATUS is set to one of the following values:
5746 0: The demangling operation succeeded.
5747 -1: A memory allocation failure occurred.
5748 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
5749 -3: One of the arguments is invalid.
5751 The demangling is performed using the C++ ABI mangling rules, with
5752 GNU extensions. */
5754 char *
5755 __cxa_demangle (const char *mangled_name, char *output_buffer,
5756 size_t *length, int *status)
5758 char *demangled;
5759 size_t alc;
5761 if (mangled_name == NULL)
5763 if (status != NULL)
5764 *status = -3;
5765 return NULL;
5768 if (output_buffer != NULL && length == NULL)
5770 if (status != NULL)
5771 *status = -3;
5772 return NULL;
5775 demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc);
5777 if (demangled == NULL)
5779 if (status != NULL)
5781 if (alc == 1)
5782 *status = -1;
5783 else
5784 *status = -2;
5786 return NULL;
5789 if (output_buffer == NULL)
5791 if (length != NULL)
5792 *length = alc;
5794 else
5796 if (strlen (demangled) < *length)
5798 strcpy (output_buffer, demangled);
5799 free (demangled);
5800 demangled = output_buffer;
5802 else
5804 free (output_buffer);
5805 *length = alc;
5809 if (status != NULL)
5810 *status = 0;
5812 return demangled;
5815 extern int __gcclibcxx_demangle_callback (const char *,
5816 void (*)
5817 (const char *, size_t, void *),
5818 void *);
5820 /* Alternative, allocationless entry point in the C++ runtime library
5821 for performing demangling. MANGLED_NAME is a NUL-terminated character
5822 string containing the name to be demangled.
5824 CALLBACK is a callback function, called with demangled string
5825 segments as demangling progresses; it is called at least once,
5826 but may be called more than once. OPAQUE is a generalized pointer
5827 used as a callback argument.
5829 The return code is one of the following values, equivalent to
5830 the STATUS values of __cxa_demangle() (excluding -1, since this
5831 function performs no memory allocations):
5832 0: The demangling operation succeeded.
5833 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
5834 -3: One of the arguments is invalid.
5836 The demangling is performed using the C++ ABI mangling rules, with
5837 GNU extensions. */
5840 __gcclibcxx_demangle_callback (const char *mangled_name,
5841 void (*callback) (const char *, size_t, void *),
5842 void *opaque)
5844 int status;
5846 if (mangled_name == NULL || callback == NULL)
5847 return -3;
5849 status = d_demangle_callback (mangled_name, DMGL_PARAMS | DMGL_TYPES,
5850 callback, opaque);
5851 if (status == 0)
5852 return -2;
5854 return 0;
5857 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
5859 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
5860 mangled name, return a buffer allocated with malloc holding the
5861 demangled name. Otherwise, return NULL. */
5863 char *
5864 cplus_demangle_v3 (const char *mangled, int options)
5866 size_t alc;
5868 return d_demangle (mangled, options, &alc);
5872 cplus_demangle_v3_callback (const char *mangled, int options,
5873 demangle_callbackref callback, void *opaque)
5875 return d_demangle_callback (mangled, options, callback, opaque);
5878 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
5879 conventions, but the output formatting is a little different.
5880 This instructs the C++ demangler not to emit pointer characters ("*"), to
5881 use Java's namespace separator symbol ("." instead of "::"), and to output
5882 JArray<TYPE> as TYPE[]. */
5884 char *
5885 java_demangle_v3 (const char *mangled)
5887 size_t alc;
5889 return d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, &alc);
5893 java_demangle_v3_callback (const char *mangled,
5894 demangle_callbackref callback, void *opaque)
5896 return d_demangle_callback (mangled,
5897 DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX,
5898 callback, opaque);
5901 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
5903 #ifndef IN_GLIBCPP_V3
5905 /* Demangle a string in order to find out whether it is a constructor
5906 or destructor. Return non-zero on success. Set *CTOR_KIND and
5907 *DTOR_KIND appropriately. */
5909 static int
5910 is_ctor_or_dtor (const char *mangled,
5911 enum gnu_v3_ctor_kinds *ctor_kind,
5912 enum gnu_v3_dtor_kinds *dtor_kind)
5914 struct d_info di;
5915 struct demangle_component *dc;
5916 int ret;
5918 *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
5919 *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
5921 cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di);
5924 #ifdef CP_DYNAMIC_ARRAYS
5925 __extension__ struct demangle_component comps[di.num_comps];
5926 __extension__ struct demangle_component *subs[di.num_subs];
5928 di.comps = comps;
5929 di.subs = subs;
5930 #else
5931 di.comps = alloca (di.num_comps * sizeof (*di.comps));
5932 di.subs = alloca (di.num_subs * sizeof (*di.subs));
5933 #endif
5935 dc = cplus_demangle_mangled_name (&di, 1);
5937 /* Note that because we did not pass DMGL_PARAMS, we don't expect
5938 to demangle the entire string. */
5940 ret = 0;
5941 while (dc != NULL)
5943 switch (dc->type)
5945 /* These cannot appear on a constructor or destructor. */
5946 case DEMANGLE_COMPONENT_RESTRICT_THIS:
5947 case DEMANGLE_COMPONENT_VOLATILE_THIS:
5948 case DEMANGLE_COMPONENT_CONST_THIS:
5949 case DEMANGLE_COMPONENT_REFERENCE_THIS:
5950 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
5951 default:
5952 dc = NULL;
5953 break;
5954 case DEMANGLE_COMPONENT_TYPED_NAME:
5955 case DEMANGLE_COMPONENT_TEMPLATE:
5956 dc = d_left (dc);
5957 break;
5958 case DEMANGLE_COMPONENT_QUAL_NAME:
5959 case DEMANGLE_COMPONENT_LOCAL_NAME:
5960 dc = d_right (dc);
5961 break;
5962 case DEMANGLE_COMPONENT_CTOR:
5963 *ctor_kind = dc->u.s_ctor.kind;
5964 ret = 1;
5965 dc = NULL;
5966 break;
5967 case DEMANGLE_COMPONENT_DTOR:
5968 *dtor_kind = dc->u.s_dtor.kind;
5969 ret = 1;
5970 dc = NULL;
5971 break;
5976 return ret;
5979 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
5980 name. A non-zero return indicates the type of constructor. */
5982 enum gnu_v3_ctor_kinds
5983 is_gnu_v3_mangled_ctor (const char *name)
5985 enum gnu_v3_ctor_kinds ctor_kind;
5986 enum gnu_v3_dtor_kinds dtor_kind;
5988 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
5989 return (enum gnu_v3_ctor_kinds) 0;
5990 return ctor_kind;
5994 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
5995 name. A non-zero return indicates the type of destructor. */
5997 enum gnu_v3_dtor_kinds
5998 is_gnu_v3_mangled_dtor (const char *name)
6000 enum gnu_v3_ctor_kinds ctor_kind;
6001 enum gnu_v3_dtor_kinds dtor_kind;
6003 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
6004 return (enum gnu_v3_dtor_kinds) 0;
6005 return dtor_kind;
6008 #endif /* IN_GLIBCPP_V3 */
6010 #ifdef STANDALONE_DEMANGLER
6012 #include "getopt.h"
6013 #include "dyn-string.h"
6015 static void print_usage (FILE* fp, int exit_value);
6017 #define IS_ALPHA(CHAR) \
6018 (((CHAR) >= 'a' && (CHAR) <= 'z') \
6019 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
6021 /* Non-zero if CHAR is a character than can occur in a mangled name. */
6022 #define is_mangled_char(CHAR) \
6023 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
6024 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
6026 /* The name of this program, as invoked. */
6027 const char* program_name;
6029 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
6031 static void
6032 print_usage (FILE* fp, int exit_value)
6034 fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
6035 fprintf (fp, "Options:\n");
6036 fprintf (fp, " -h,--help Display this message.\n");
6037 fprintf (fp, " -p,--no-params Don't display function parameters\n");
6038 fprintf (fp, " -v,--verbose Produce verbose demanglings.\n");
6039 fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n");
6041 exit (exit_value);
6044 /* Option specification for getopt_long. */
6045 static const struct option long_options[] =
6047 { "help", no_argument, NULL, 'h' },
6048 { "no-params", no_argument, NULL, 'p' },
6049 { "verbose", no_argument, NULL, 'v' },
6050 { NULL, no_argument, NULL, 0 },
6053 /* Main entry for a demangling filter executable. It will demangle
6054 its command line arguments, if any. If none are provided, it will
6055 filter stdin to stdout, replacing any recognized mangled C++ names
6056 with their demangled equivalents. */
6059 main (int argc, char *argv[])
6061 int i;
6062 int opt_char;
6063 int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
6065 /* Use the program name of this program, as invoked. */
6066 program_name = argv[0];
6068 /* Parse options. */
6071 opt_char = getopt_long (argc, argv, "hpv", long_options, NULL);
6072 switch (opt_char)
6074 case '?': /* Unrecognized option. */
6075 print_usage (stderr, 1);
6076 break;
6078 case 'h':
6079 print_usage (stdout, 0);
6080 break;
6082 case 'p':
6083 options &= ~ DMGL_PARAMS;
6084 break;
6086 case 'v':
6087 options |= DMGL_VERBOSE;
6088 break;
6091 while (opt_char != -1);
6093 if (optind == argc)
6094 /* No command line arguments were provided. Filter stdin. */
6096 dyn_string_t mangled = dyn_string_new (3);
6097 char *s;
6099 /* Read all of input. */
6100 while (!feof (stdin))
6102 char c;
6104 /* Pile characters into mangled until we hit one that can't
6105 occur in a mangled name. */
6106 c = getchar ();
6107 while (!feof (stdin) && is_mangled_char (c))
6109 dyn_string_append_char (mangled, c);
6110 if (feof (stdin))
6111 break;
6112 c = getchar ();
6115 if (dyn_string_length (mangled) > 0)
6117 #ifdef IN_GLIBCPP_V3
6118 s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL);
6119 #else
6120 s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
6121 #endif
6123 if (s != NULL)
6125 fputs (s, stdout);
6126 free (s);
6128 else
6130 /* It might not have been a mangled name. Print the
6131 original text. */
6132 fputs (dyn_string_buf (mangled), stdout);
6135 dyn_string_clear (mangled);
6138 /* If we haven't hit EOF yet, we've read one character that
6139 can't occur in a mangled name, so print it out. */
6140 if (!feof (stdin))
6141 putchar (c);
6144 dyn_string_delete (mangled);
6146 else
6147 /* Demangle command line arguments. */
6149 /* Loop over command line arguments. */
6150 for (i = optind; i < argc; ++i)
6152 char *s;
6153 #ifdef IN_GLIBCPP_V3
6154 int status;
6155 #endif
6157 /* Attempt to demangle. */
6158 #ifdef IN_GLIBCPP_V3
6159 s = __cxa_demangle (argv[i], NULL, NULL, &status);
6160 #else
6161 s = cplus_demangle_v3 (argv[i], options);
6162 #endif
6164 /* If it worked, print the demangled name. */
6165 if (s != NULL)
6167 printf ("%s\n", s);
6168 free (s);
6170 else
6172 #ifdef IN_GLIBCPP_V3
6173 fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status);
6174 #else
6175 fprintf (stderr, "Failed: %s\n", argv[i]);
6176 #endif
6181 return 0;
6184 #endif /* STANDALONE_DEMANGLER */