duplicate_insn_chain accepts rtx_insn
[official-gcc.git] / libiberty / cp-demangle.c
blobc0d2ffee7d9d84617e2d0f63fe8fb5d48b4bb064
1 /* Demangler for g++ V3 ABI.
2 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2014
3 Free Software Foundation, Inc.
4 Written by Ian Lance Taylor <ian@wasabisystems.com>.
6 This file is part of the libiberty library, which is part of GCC.
8 This file is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 In addition to the permissions in the GNU General Public License, the
14 Free Software Foundation gives you unlimited permission to link the
15 compiled version of this file into combinations with other programs,
16 and to distribute those combinations without any restriction coming
17 from the use of this file. (The General Public License restrictions
18 do apply in other respects; for example, they cover modification of
19 the file, and distribution when not linked into a combined
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 /* Stack of components, innermost first, used to avoid loops. */
280 struct d_component_stack
282 /* This component. */
283 const struct demangle_component *dc;
284 /* This component's parent. */
285 const struct d_component_stack *parent;
288 /* A demangle component and some scope captured when it was first
289 traversed. */
291 struct d_saved_scope
293 /* The component whose scope this is. */
294 const struct demangle_component *container;
295 /* The list of templates, if any, that was current when this
296 scope was captured. */
297 struct d_print_template *templates;
300 /* Checkpoint structure to allow backtracking. This holds copies
301 of the fields of struct d_info that need to be restored
302 if a trial parse needs to be backtracked over. */
304 struct d_info_checkpoint
306 const char *n;
307 int next_comp;
308 int next_sub;
309 int did_subs;
310 int expansion;
313 enum { D_PRINT_BUFFER_LENGTH = 256 };
314 struct d_print_info
316 /* Fixed-length allocated buffer for demangled data, flushed to the
317 callback with a NUL termination once full. */
318 char buf[D_PRINT_BUFFER_LENGTH];
319 /* Current length of data in buffer. */
320 size_t len;
321 /* The last character printed, saved individually so that it survives
322 any buffer flush. */
323 char last_char;
324 /* Callback function to handle demangled buffer flush. */
325 demangle_callbackref callback;
326 /* Opaque callback argument. */
327 void *opaque;
328 /* The current list of templates, if any. */
329 struct d_print_template *templates;
330 /* The current list of modifiers (e.g., pointer, reference, etc.),
331 if any. */
332 struct d_print_mod *modifiers;
333 /* Set to 1 if we saw a demangling error. */
334 int demangle_failure;
335 /* The current index into any template argument packs we are using
336 for printing. */
337 int pack_index;
338 /* Number of d_print_flush calls so far. */
339 unsigned long int flush_count;
340 /* Stack of components, innermost first, used to avoid loops. */
341 const struct d_component_stack *component_stack;
342 /* Array of saved scopes for evaluating substitutions. */
343 struct d_saved_scope *saved_scopes;
344 /* Index of the next unused saved scope in the above array. */
345 int next_saved_scope;
346 /* Number of saved scopes in the above array. */
347 int num_saved_scopes;
348 /* Array of templates for saving into scopes. */
349 struct d_print_template *copy_templates;
350 /* Index of the next unused copy template in the above array. */
351 int next_copy_template;
352 /* Number of copy templates in the above array. */
353 int num_copy_templates;
354 /* The nearest enclosing template, if any. */
355 const struct demangle_component *current_template;
358 #ifdef CP_DEMANGLE_DEBUG
359 static void d_dump (struct demangle_component *, int);
360 #endif
362 static struct demangle_component *
363 d_make_empty (struct d_info *);
365 static struct demangle_component *
366 d_make_comp (struct d_info *, enum demangle_component_type,
367 struct demangle_component *,
368 struct demangle_component *);
370 static struct demangle_component *
371 d_make_name (struct d_info *, const char *, int);
373 static struct demangle_component *
374 d_make_demangle_mangled_name (struct d_info *, const char *);
376 static struct demangle_component *
377 d_make_builtin_type (struct d_info *,
378 const struct demangle_builtin_type_info *);
380 static struct demangle_component *
381 d_make_operator (struct d_info *,
382 const struct demangle_operator_info *);
384 static struct demangle_component *
385 d_make_extended_operator (struct d_info *, int,
386 struct demangle_component *);
388 static struct demangle_component *
389 d_make_ctor (struct d_info *, enum gnu_v3_ctor_kinds,
390 struct demangle_component *);
392 static struct demangle_component *
393 d_make_dtor (struct d_info *, enum gnu_v3_dtor_kinds,
394 struct demangle_component *);
396 static struct demangle_component *
397 d_make_template_param (struct d_info *, long);
399 static struct demangle_component *
400 d_make_sub (struct d_info *, const char *, int);
402 static int
403 has_return_type (struct demangle_component *);
405 static int
406 is_ctor_dtor_or_conversion (struct demangle_component *);
408 static struct demangle_component *d_encoding (struct d_info *, int);
410 static struct demangle_component *d_name (struct d_info *);
412 static struct demangle_component *d_nested_name (struct d_info *);
414 static struct demangle_component *d_prefix (struct d_info *);
416 static struct demangle_component *d_unqualified_name (struct d_info *);
418 static struct demangle_component *d_source_name (struct d_info *);
420 static long d_number (struct d_info *);
422 static struct demangle_component *d_identifier (struct d_info *, int);
424 static struct demangle_component *d_operator_name (struct d_info *);
426 static struct demangle_component *d_special_name (struct d_info *);
428 static int d_call_offset (struct d_info *, int);
430 static struct demangle_component *d_ctor_dtor_name (struct d_info *);
432 static struct demangle_component **
433 d_cv_qualifiers (struct d_info *, struct demangle_component **, int);
435 static struct demangle_component *
436 d_ref_qualifier (struct d_info *, struct demangle_component *);
438 static struct demangle_component *
439 d_function_type (struct d_info *);
441 static struct demangle_component *
442 d_bare_function_type (struct d_info *, int);
444 static struct demangle_component *
445 d_class_enum_type (struct d_info *);
447 static struct demangle_component *d_array_type (struct d_info *);
449 static struct demangle_component *d_vector_type (struct d_info *);
451 static struct demangle_component *
452 d_pointer_to_member_type (struct d_info *);
454 static struct demangle_component *
455 d_template_param (struct d_info *);
457 static struct demangle_component *d_template_args (struct d_info *);
459 static struct demangle_component *
460 d_template_arg (struct d_info *);
462 static struct demangle_component *d_expression (struct d_info *);
464 static struct demangle_component *d_expr_primary (struct d_info *);
466 static struct demangle_component *d_local_name (struct d_info *);
468 static int d_discriminator (struct d_info *);
470 static struct demangle_component *d_lambda (struct d_info *);
472 static struct demangle_component *d_unnamed_type (struct d_info *);
474 static struct demangle_component *
475 d_clone_suffix (struct d_info *, struct demangle_component *);
477 static int
478 d_add_substitution (struct d_info *, struct demangle_component *);
480 static struct demangle_component *d_substitution (struct d_info *, int);
482 static void d_checkpoint (struct d_info *, struct d_info_checkpoint *);
484 static void d_backtrack (struct d_info *, struct d_info_checkpoint *);
486 static void d_growable_string_init (struct d_growable_string *, size_t);
488 static inline void
489 d_growable_string_resize (struct d_growable_string *, size_t);
491 static inline void
492 d_growable_string_append_buffer (struct d_growable_string *,
493 const char *, size_t);
494 static void
495 d_growable_string_callback_adapter (const char *, size_t, void *);
497 static void
498 d_print_init (struct d_print_info *, demangle_callbackref, void *,
499 const struct demangle_component *);
501 static inline void d_print_error (struct d_print_info *);
503 static inline int d_print_saw_error (struct d_print_info *);
505 static inline void d_print_flush (struct d_print_info *);
507 static inline void d_append_char (struct d_print_info *, char);
509 static inline void d_append_buffer (struct d_print_info *,
510 const char *, size_t);
512 static inline void d_append_string (struct d_print_info *, const char *);
514 static inline char d_last_char (struct d_print_info *);
516 static void
517 d_print_comp (struct d_print_info *, int, const struct demangle_component *);
519 static void
520 d_print_java_identifier (struct d_print_info *, const char *, int);
522 static void
523 d_print_mod_list (struct d_print_info *, int, struct d_print_mod *, int);
525 static void
526 d_print_mod (struct d_print_info *, int, const struct demangle_component *);
528 static void
529 d_print_function_type (struct d_print_info *, int,
530 const struct demangle_component *,
531 struct d_print_mod *);
533 static void
534 d_print_array_type (struct d_print_info *, int,
535 const struct demangle_component *,
536 struct d_print_mod *);
538 static void
539 d_print_expr_op (struct d_print_info *, int, const struct demangle_component *);
541 static void
542 d_print_cast (struct d_print_info *, int, const struct demangle_component *);
544 static int d_demangle_callback (const char *, int,
545 demangle_callbackref, void *);
546 static char *d_demangle (const char *, int, size_t *);
548 #ifdef CP_DEMANGLE_DEBUG
550 static void
551 d_dump (struct demangle_component *dc, int indent)
553 int i;
555 if (dc == NULL)
557 if (indent == 0)
558 printf ("failed demangling\n");
559 return;
562 for (i = 0; i < indent; ++i)
563 putchar (' ');
565 switch (dc->type)
567 case DEMANGLE_COMPONENT_NAME:
568 printf ("name '%.*s'\n", dc->u.s_name.len, dc->u.s_name.s);
569 return;
570 case DEMANGLE_COMPONENT_TAGGED_NAME:
571 printf ("tagged name\n");
572 d_dump (dc->u.s_binary.left, indent + 2);
573 d_dump (dc->u.s_binary.right, indent + 2);
574 return;
575 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
576 printf ("template parameter %ld\n", dc->u.s_number.number);
577 return;
578 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
579 printf ("function parameter %ld\n", dc->u.s_number.number);
580 return;
581 case DEMANGLE_COMPONENT_CTOR:
582 printf ("constructor %d\n", (int) dc->u.s_ctor.kind);
583 d_dump (dc->u.s_ctor.name, indent + 2);
584 return;
585 case DEMANGLE_COMPONENT_DTOR:
586 printf ("destructor %d\n", (int) dc->u.s_dtor.kind);
587 d_dump (dc->u.s_dtor.name, indent + 2);
588 return;
589 case DEMANGLE_COMPONENT_SUB_STD:
590 printf ("standard substitution %s\n", dc->u.s_string.string);
591 return;
592 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
593 printf ("builtin type %s\n", dc->u.s_builtin.type->name);
594 return;
595 case DEMANGLE_COMPONENT_OPERATOR:
596 printf ("operator %s\n", dc->u.s_operator.op->name);
597 return;
598 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
599 printf ("extended operator with %d args\n",
600 dc->u.s_extended_operator.args);
601 d_dump (dc->u.s_extended_operator.name, indent + 2);
602 return;
604 case DEMANGLE_COMPONENT_QUAL_NAME:
605 printf ("qualified name\n");
606 break;
607 case DEMANGLE_COMPONENT_LOCAL_NAME:
608 printf ("local name\n");
609 break;
610 case DEMANGLE_COMPONENT_TYPED_NAME:
611 printf ("typed name\n");
612 break;
613 case DEMANGLE_COMPONENT_TEMPLATE:
614 printf ("template\n");
615 break;
616 case DEMANGLE_COMPONENT_VTABLE:
617 printf ("vtable\n");
618 break;
619 case DEMANGLE_COMPONENT_VTT:
620 printf ("VTT\n");
621 break;
622 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
623 printf ("construction vtable\n");
624 break;
625 case DEMANGLE_COMPONENT_TYPEINFO:
626 printf ("typeinfo\n");
627 break;
628 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
629 printf ("typeinfo name\n");
630 break;
631 case DEMANGLE_COMPONENT_TYPEINFO_FN:
632 printf ("typeinfo function\n");
633 break;
634 case DEMANGLE_COMPONENT_THUNK:
635 printf ("thunk\n");
636 break;
637 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
638 printf ("virtual thunk\n");
639 break;
640 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
641 printf ("covariant thunk\n");
642 break;
643 case DEMANGLE_COMPONENT_JAVA_CLASS:
644 printf ("java class\n");
645 break;
646 case DEMANGLE_COMPONENT_GUARD:
647 printf ("guard\n");
648 break;
649 case DEMANGLE_COMPONENT_REFTEMP:
650 printf ("reference temporary\n");
651 break;
652 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
653 printf ("hidden alias\n");
654 break;
655 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
656 printf ("transaction clone\n");
657 break;
658 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
659 printf ("non-transaction clone\n");
660 break;
661 case DEMANGLE_COMPONENT_RESTRICT:
662 printf ("restrict\n");
663 break;
664 case DEMANGLE_COMPONENT_VOLATILE:
665 printf ("volatile\n");
666 break;
667 case DEMANGLE_COMPONENT_CONST:
668 printf ("const\n");
669 break;
670 case DEMANGLE_COMPONENT_RESTRICT_THIS:
671 printf ("restrict this\n");
672 break;
673 case DEMANGLE_COMPONENT_VOLATILE_THIS:
674 printf ("volatile this\n");
675 break;
676 case DEMANGLE_COMPONENT_CONST_THIS:
677 printf ("const this\n");
678 break;
679 case DEMANGLE_COMPONENT_REFERENCE_THIS:
680 printf ("reference this\n");
681 break;
682 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
683 printf ("rvalue reference this\n");
684 break;
685 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
686 printf ("vendor type qualifier\n");
687 break;
688 case DEMANGLE_COMPONENT_POINTER:
689 printf ("pointer\n");
690 break;
691 case DEMANGLE_COMPONENT_REFERENCE:
692 printf ("reference\n");
693 break;
694 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
695 printf ("rvalue reference\n");
696 break;
697 case DEMANGLE_COMPONENT_COMPLEX:
698 printf ("complex\n");
699 break;
700 case DEMANGLE_COMPONENT_IMAGINARY:
701 printf ("imaginary\n");
702 break;
703 case DEMANGLE_COMPONENT_VENDOR_TYPE:
704 printf ("vendor type\n");
705 break;
706 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
707 printf ("function type\n");
708 break;
709 case DEMANGLE_COMPONENT_ARRAY_TYPE:
710 printf ("array type\n");
711 break;
712 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
713 printf ("pointer to member type\n");
714 break;
715 case DEMANGLE_COMPONENT_FIXED_TYPE:
716 printf ("fixed-point type\n");
717 break;
718 case DEMANGLE_COMPONENT_ARGLIST:
719 printf ("argument list\n");
720 break;
721 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
722 printf ("template argument list\n");
723 break;
724 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
725 printf ("initializer list\n");
726 break;
727 case DEMANGLE_COMPONENT_CAST:
728 printf ("cast\n");
729 break;
730 case DEMANGLE_COMPONENT_NULLARY:
731 printf ("nullary operator\n");
732 break;
733 case DEMANGLE_COMPONENT_UNARY:
734 printf ("unary operator\n");
735 break;
736 case DEMANGLE_COMPONENT_BINARY:
737 printf ("binary operator\n");
738 break;
739 case DEMANGLE_COMPONENT_BINARY_ARGS:
740 printf ("binary operator arguments\n");
741 break;
742 case DEMANGLE_COMPONENT_TRINARY:
743 printf ("trinary operator\n");
744 break;
745 case DEMANGLE_COMPONENT_TRINARY_ARG1:
746 printf ("trinary operator arguments 1\n");
747 break;
748 case DEMANGLE_COMPONENT_TRINARY_ARG2:
749 printf ("trinary operator arguments 1\n");
750 break;
751 case DEMANGLE_COMPONENT_LITERAL:
752 printf ("literal\n");
753 break;
754 case DEMANGLE_COMPONENT_LITERAL_NEG:
755 printf ("negative literal\n");
756 break;
757 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
758 printf ("java resource\n");
759 break;
760 case DEMANGLE_COMPONENT_COMPOUND_NAME:
761 printf ("compound name\n");
762 break;
763 case DEMANGLE_COMPONENT_CHARACTER:
764 printf ("character '%c'\n", dc->u.s_character.character);
765 return;
766 case DEMANGLE_COMPONENT_NUMBER:
767 printf ("number %ld\n", dc->u.s_number.number);
768 return;
769 case DEMANGLE_COMPONENT_DECLTYPE:
770 printf ("decltype\n");
771 break;
772 case DEMANGLE_COMPONENT_PACK_EXPANSION:
773 printf ("pack expansion\n");
774 break;
775 case DEMANGLE_COMPONENT_TLS_INIT:
776 printf ("tls init function\n");
777 break;
778 case DEMANGLE_COMPONENT_TLS_WRAPPER:
779 printf ("tls wrapper function\n");
780 break;
781 case DEMANGLE_COMPONENT_DEFAULT_ARG:
782 printf ("default argument %d\n", dc->u.s_unary_num.num);
783 d_dump (dc->u.s_unary_num.sub, indent+2);
784 return;
785 case DEMANGLE_COMPONENT_LAMBDA:
786 printf ("lambda %d\n", dc->u.s_unary_num.num);
787 d_dump (dc->u.s_unary_num.sub, indent+2);
788 return;
791 d_dump (d_left (dc), indent + 2);
792 d_dump (d_right (dc), indent + 2);
795 #endif /* CP_DEMANGLE_DEBUG */
797 /* Fill in a DEMANGLE_COMPONENT_NAME. */
799 CP_STATIC_IF_GLIBCPP_V3
801 cplus_demangle_fill_name (struct demangle_component *p, const char *s, int len)
803 if (p == NULL || s == NULL || len == 0)
804 return 0;
805 p->type = DEMANGLE_COMPONENT_NAME;
806 p->u.s_name.s = s;
807 p->u.s_name.len = len;
808 return 1;
811 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
813 CP_STATIC_IF_GLIBCPP_V3
815 cplus_demangle_fill_extended_operator (struct demangle_component *p, int args,
816 struct demangle_component *name)
818 if (p == NULL || args < 0 || name == NULL)
819 return 0;
820 p->type = DEMANGLE_COMPONENT_EXTENDED_OPERATOR;
821 p->u.s_extended_operator.args = args;
822 p->u.s_extended_operator.name = name;
823 return 1;
826 /* Fill in a DEMANGLE_COMPONENT_CTOR. */
828 CP_STATIC_IF_GLIBCPP_V3
830 cplus_demangle_fill_ctor (struct demangle_component *p,
831 enum gnu_v3_ctor_kinds kind,
832 struct demangle_component *name)
834 if (p == NULL
835 || name == NULL
836 || (int) kind < gnu_v3_complete_object_ctor
837 || (int) kind > gnu_v3_object_ctor_group)
838 return 0;
839 p->type = DEMANGLE_COMPONENT_CTOR;
840 p->u.s_ctor.kind = kind;
841 p->u.s_ctor.name = name;
842 return 1;
845 /* Fill in a DEMANGLE_COMPONENT_DTOR. */
847 CP_STATIC_IF_GLIBCPP_V3
849 cplus_demangle_fill_dtor (struct demangle_component *p,
850 enum gnu_v3_dtor_kinds kind,
851 struct demangle_component *name)
853 if (p == NULL
854 || name == NULL
855 || (int) kind < gnu_v3_deleting_dtor
856 || (int) kind > gnu_v3_object_dtor_group)
857 return 0;
858 p->type = DEMANGLE_COMPONENT_DTOR;
859 p->u.s_dtor.kind = kind;
860 p->u.s_dtor.name = name;
861 return 1;
864 /* Add a new component. */
866 static struct demangle_component *
867 d_make_empty (struct d_info *di)
869 struct demangle_component *p;
871 if (di->next_comp >= di->num_comps)
872 return NULL;
873 p = &di->comps[di->next_comp];
874 ++di->next_comp;
875 return p;
878 /* Add a new generic component. */
880 static struct demangle_component *
881 d_make_comp (struct d_info *di, enum demangle_component_type type,
882 struct demangle_component *left,
883 struct demangle_component *right)
885 struct demangle_component *p;
887 /* We check for errors here. A typical error would be a NULL return
888 from a subroutine. We catch those here, and return NULL
889 upward. */
890 switch (type)
892 /* These types require two parameters. */
893 case DEMANGLE_COMPONENT_QUAL_NAME:
894 case DEMANGLE_COMPONENT_LOCAL_NAME:
895 case DEMANGLE_COMPONENT_TYPED_NAME:
896 case DEMANGLE_COMPONENT_TAGGED_NAME:
897 case DEMANGLE_COMPONENT_TEMPLATE:
898 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
899 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
900 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
901 case DEMANGLE_COMPONENT_UNARY:
902 case DEMANGLE_COMPONENT_BINARY:
903 case DEMANGLE_COMPONENT_BINARY_ARGS:
904 case DEMANGLE_COMPONENT_TRINARY:
905 case DEMANGLE_COMPONENT_TRINARY_ARG1:
906 case DEMANGLE_COMPONENT_LITERAL:
907 case DEMANGLE_COMPONENT_LITERAL_NEG:
908 case DEMANGLE_COMPONENT_COMPOUND_NAME:
909 case DEMANGLE_COMPONENT_VECTOR_TYPE:
910 case DEMANGLE_COMPONENT_CLONE:
911 if (left == NULL || right == NULL)
912 return NULL;
913 break;
915 /* These types only require one parameter. */
916 case DEMANGLE_COMPONENT_VTABLE:
917 case DEMANGLE_COMPONENT_VTT:
918 case DEMANGLE_COMPONENT_TYPEINFO:
919 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
920 case DEMANGLE_COMPONENT_TYPEINFO_FN:
921 case DEMANGLE_COMPONENT_THUNK:
922 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
923 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
924 case DEMANGLE_COMPONENT_JAVA_CLASS:
925 case DEMANGLE_COMPONENT_GUARD:
926 case DEMANGLE_COMPONENT_TLS_INIT:
927 case DEMANGLE_COMPONENT_TLS_WRAPPER:
928 case DEMANGLE_COMPONENT_REFTEMP:
929 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
930 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
931 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
932 case DEMANGLE_COMPONENT_POINTER:
933 case DEMANGLE_COMPONENT_REFERENCE:
934 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
935 case DEMANGLE_COMPONENT_COMPLEX:
936 case DEMANGLE_COMPONENT_IMAGINARY:
937 case DEMANGLE_COMPONENT_VENDOR_TYPE:
938 case DEMANGLE_COMPONENT_CAST:
939 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
940 case DEMANGLE_COMPONENT_DECLTYPE:
941 case DEMANGLE_COMPONENT_PACK_EXPANSION:
942 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
943 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
944 case DEMANGLE_COMPONENT_NULLARY:
945 case DEMANGLE_COMPONENT_TRINARY_ARG2:
946 if (left == NULL)
947 return NULL;
948 break;
950 /* This needs a right parameter, but the left parameter can be
951 empty. */
952 case DEMANGLE_COMPONENT_ARRAY_TYPE:
953 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
954 if (right == NULL)
955 return NULL;
956 break;
958 /* These are allowed to have no parameters--in some cases they
959 will be filled in later. */
960 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
961 case DEMANGLE_COMPONENT_RESTRICT:
962 case DEMANGLE_COMPONENT_VOLATILE:
963 case DEMANGLE_COMPONENT_CONST:
964 case DEMANGLE_COMPONENT_RESTRICT_THIS:
965 case DEMANGLE_COMPONENT_VOLATILE_THIS:
966 case DEMANGLE_COMPONENT_CONST_THIS:
967 case DEMANGLE_COMPONENT_REFERENCE_THIS:
968 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
969 case DEMANGLE_COMPONENT_ARGLIST:
970 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
971 break;
973 /* Other types should not be seen here. */
974 default:
975 return NULL;
978 p = d_make_empty (di);
979 if (p != NULL)
981 p->type = type;
982 p->u.s_binary.left = left;
983 p->u.s_binary.right = right;
985 return p;
988 /* Add a new demangle mangled name component. */
990 static struct demangle_component *
991 d_make_demangle_mangled_name (struct d_info *di, const char *s)
993 if (d_peek_char (di) != '_' || d_peek_next_char (di) != 'Z')
994 return d_make_name (di, s, strlen (s));
995 d_advance (di, 2);
996 return d_encoding (di, 0);
999 /* Add a new name component. */
1001 static struct demangle_component *
1002 d_make_name (struct d_info *di, const char *s, int len)
1004 struct demangle_component *p;
1006 p = d_make_empty (di);
1007 if (! cplus_demangle_fill_name (p, s, len))
1008 return NULL;
1009 return p;
1012 /* Add a new builtin type component. */
1014 static struct demangle_component *
1015 d_make_builtin_type (struct d_info *di,
1016 const struct demangle_builtin_type_info *type)
1018 struct demangle_component *p;
1020 if (type == NULL)
1021 return NULL;
1022 p = d_make_empty (di);
1023 if (p != NULL)
1025 p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE;
1026 p->u.s_builtin.type = type;
1028 return p;
1031 /* Add a new operator component. */
1033 static struct demangle_component *
1034 d_make_operator (struct d_info *di, const struct demangle_operator_info *op)
1036 struct demangle_component *p;
1038 p = d_make_empty (di);
1039 if (p != NULL)
1041 p->type = DEMANGLE_COMPONENT_OPERATOR;
1042 p->u.s_operator.op = op;
1044 return p;
1047 /* Add a new extended operator component. */
1049 static struct demangle_component *
1050 d_make_extended_operator (struct d_info *di, int args,
1051 struct demangle_component *name)
1053 struct demangle_component *p;
1055 p = d_make_empty (di);
1056 if (! cplus_demangle_fill_extended_operator (p, args, name))
1057 return NULL;
1058 return p;
1061 static struct demangle_component *
1062 d_make_default_arg (struct d_info *di, int num,
1063 struct demangle_component *sub)
1065 struct demangle_component *p = d_make_empty (di);
1066 if (p)
1068 p->type = DEMANGLE_COMPONENT_DEFAULT_ARG;
1069 p->u.s_unary_num.num = num;
1070 p->u.s_unary_num.sub = sub;
1072 return p;
1075 /* Add a new constructor component. */
1077 static struct demangle_component *
1078 d_make_ctor (struct d_info *di, enum gnu_v3_ctor_kinds kind,
1079 struct demangle_component *name)
1081 struct demangle_component *p;
1083 p = d_make_empty (di);
1084 if (! cplus_demangle_fill_ctor (p, kind, name))
1085 return NULL;
1086 return p;
1089 /* Add a new destructor component. */
1091 static struct demangle_component *
1092 d_make_dtor (struct d_info *di, enum gnu_v3_dtor_kinds kind,
1093 struct demangle_component *name)
1095 struct demangle_component *p;
1097 p = d_make_empty (di);
1098 if (! cplus_demangle_fill_dtor (p, kind, name))
1099 return NULL;
1100 return p;
1103 /* Add a new template parameter. */
1105 static struct demangle_component *
1106 d_make_template_param (struct d_info *di, long i)
1108 struct demangle_component *p;
1110 p = d_make_empty (di);
1111 if (p != NULL)
1113 p->type = DEMANGLE_COMPONENT_TEMPLATE_PARAM;
1114 p->u.s_number.number = i;
1116 return p;
1119 /* Add a new function parameter. */
1121 static struct demangle_component *
1122 d_make_function_param (struct d_info *di, long i)
1124 struct demangle_component *p;
1126 p = d_make_empty (di);
1127 if (p != NULL)
1129 p->type = DEMANGLE_COMPONENT_FUNCTION_PARAM;
1130 p->u.s_number.number = i;
1132 return p;
1135 /* Add a new standard substitution component. */
1137 static struct demangle_component *
1138 d_make_sub (struct d_info *di, const char *name, int len)
1140 struct demangle_component *p;
1142 p = d_make_empty (di);
1143 if (p != NULL)
1145 p->type = DEMANGLE_COMPONENT_SUB_STD;
1146 p->u.s_string.string = name;
1147 p->u.s_string.len = len;
1149 return p;
1152 /* <mangled-name> ::= _Z <encoding> [<clone-suffix>]*
1154 TOP_LEVEL is non-zero when called at the top level. */
1156 CP_STATIC_IF_GLIBCPP_V3
1157 struct demangle_component *
1158 cplus_demangle_mangled_name (struct d_info *di, int top_level)
1160 struct demangle_component *p;
1162 if (! d_check_char (di, '_')
1163 /* Allow missing _ if not at toplevel to work around a
1164 bug in G++ abi-version=2 mangling; see the comment in
1165 write_template_arg. */
1166 && top_level)
1167 return NULL;
1168 if (! d_check_char (di, 'Z'))
1169 return NULL;
1170 p = d_encoding (di, top_level);
1172 /* If at top level and parsing parameters, check for a clone
1173 suffix. */
1174 if (top_level && (di->options & DMGL_PARAMS) != 0)
1175 while (d_peek_char (di) == '.'
1176 && (IS_LOWER (d_peek_next_char (di))
1177 || d_peek_next_char (di) == '_'
1178 || IS_DIGIT (d_peek_next_char (di))))
1179 p = d_clone_suffix (di, p);
1181 return p;
1184 /* Return whether a function should have a return type. The argument
1185 is the function name, which may be qualified in various ways. The
1186 rules are that template functions have return types with some
1187 exceptions, function types which are not part of a function name
1188 mangling have return types with some exceptions, and non-template
1189 function names do not have return types. The exceptions are that
1190 constructors, destructors, and conversion operators do not have
1191 return types. */
1193 static int
1194 has_return_type (struct demangle_component *dc)
1196 if (dc == NULL)
1197 return 0;
1198 switch (dc->type)
1200 default:
1201 return 0;
1202 case DEMANGLE_COMPONENT_TEMPLATE:
1203 return ! is_ctor_dtor_or_conversion (d_left (dc));
1204 case DEMANGLE_COMPONENT_RESTRICT_THIS:
1205 case DEMANGLE_COMPONENT_VOLATILE_THIS:
1206 case DEMANGLE_COMPONENT_CONST_THIS:
1207 case DEMANGLE_COMPONENT_REFERENCE_THIS:
1208 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
1209 return has_return_type (d_left (dc));
1213 /* Return whether a name is a constructor, a destructor, or a
1214 conversion operator. */
1216 static int
1217 is_ctor_dtor_or_conversion (struct demangle_component *dc)
1219 if (dc == NULL)
1220 return 0;
1221 switch (dc->type)
1223 default:
1224 return 0;
1225 case DEMANGLE_COMPONENT_QUAL_NAME:
1226 case DEMANGLE_COMPONENT_LOCAL_NAME:
1227 return is_ctor_dtor_or_conversion (d_right (dc));
1228 case DEMANGLE_COMPONENT_CTOR:
1229 case DEMANGLE_COMPONENT_DTOR:
1230 case DEMANGLE_COMPONENT_CAST:
1231 return 1;
1235 /* <encoding> ::= <(function) name> <bare-function-type>
1236 ::= <(data) name>
1237 ::= <special-name>
1239 TOP_LEVEL is non-zero when called at the top level, in which case
1240 if DMGL_PARAMS is not set we do not demangle the function
1241 parameters. We only set this at the top level, because otherwise
1242 we would not correctly demangle names in local scopes. */
1244 static struct demangle_component *
1245 d_encoding (struct d_info *di, int top_level)
1247 char peek = d_peek_char (di);
1249 if (peek == 'G' || peek == 'T')
1250 return d_special_name (di);
1251 else
1253 struct demangle_component *dc;
1255 dc = d_name (di);
1257 if (dc != NULL && top_level && (di->options & DMGL_PARAMS) == 0)
1259 /* Strip off any initial CV-qualifiers, as they really apply
1260 to the `this' parameter, and they were not output by the
1261 v2 demangler without DMGL_PARAMS. */
1262 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1263 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1264 || dc->type == DEMANGLE_COMPONENT_CONST_THIS
1265 || dc->type == DEMANGLE_COMPONENT_REFERENCE_THIS
1266 || dc->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)
1267 dc = d_left (dc);
1269 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1270 there may be CV-qualifiers on its right argument which
1271 really apply here; this happens when parsing a class
1272 which is local to a function. */
1273 if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME)
1275 struct demangle_component *dcr;
1277 dcr = d_right (dc);
1278 while (dcr->type == DEMANGLE_COMPONENT_RESTRICT_THIS
1279 || dcr->type == DEMANGLE_COMPONENT_VOLATILE_THIS
1280 || dcr->type == DEMANGLE_COMPONENT_CONST_THIS
1281 || dcr->type == DEMANGLE_COMPONENT_REFERENCE_THIS
1282 || dcr->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)
1283 dcr = d_left (dcr);
1284 dc->u.s_binary.right = dcr;
1287 return dc;
1290 peek = d_peek_char (di);
1291 if (dc == NULL || peek == '\0' || peek == 'E')
1292 return dc;
1293 return d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, dc,
1294 d_bare_function_type (di, has_return_type (dc)));
1298 /* <tagged-name> ::= <name> B <source-name> */
1300 static struct demangle_component *
1301 d_abi_tags (struct d_info *di, struct demangle_component *dc)
1303 char peek;
1304 while (peek = d_peek_char (di),
1305 peek == 'B')
1307 struct demangle_component *tag;
1308 d_advance (di, 1);
1309 tag = d_source_name (di);
1310 dc = d_make_comp (di, DEMANGLE_COMPONENT_TAGGED_NAME, dc, tag);
1312 return dc;
1315 /* <name> ::= <nested-name>
1316 ::= <unscoped-name>
1317 ::= <unscoped-template-name> <template-args>
1318 ::= <local-name>
1320 <unscoped-name> ::= <unqualified-name>
1321 ::= St <unqualified-name>
1323 <unscoped-template-name> ::= <unscoped-name>
1324 ::= <substitution>
1327 static struct demangle_component *
1328 d_name (struct d_info *di)
1330 char peek = d_peek_char (di);
1331 struct demangle_component *dc;
1333 switch (peek)
1335 case 'N':
1336 return d_nested_name (di);
1338 case 'Z':
1339 return d_local_name (di);
1341 case 'U':
1342 return d_unqualified_name (di);
1344 case 'S':
1346 int subst;
1348 if (d_peek_next_char (di) != 't')
1350 dc = d_substitution (di, 0);
1351 subst = 1;
1353 else
1355 d_advance (di, 2);
1356 dc = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME,
1357 d_make_name (di, "std", 3),
1358 d_unqualified_name (di));
1359 di->expansion += 3;
1360 subst = 0;
1363 if (d_peek_char (di) != 'I')
1365 /* The grammar does not permit this case to occur if we
1366 called d_substitution() above (i.e., subst == 1). We
1367 don't bother to check. */
1369 else
1371 /* This is <template-args>, which means that we just saw
1372 <unscoped-template-name>, which is a substitution
1373 candidate if we didn't just get it from a
1374 substitution. */
1375 if (! subst)
1377 if (! d_add_substitution (di, dc))
1378 return NULL;
1380 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1381 d_template_args (di));
1384 return dc;
1387 case 'L':
1388 default:
1389 dc = d_unqualified_name (di);
1390 if (d_peek_char (di) == 'I')
1392 /* This is <template-args>, which means that we just saw
1393 <unscoped-template-name>, which is a substitution
1394 candidate. */
1395 if (! d_add_substitution (di, dc))
1396 return NULL;
1397 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1398 d_template_args (di));
1400 return dc;
1404 /* <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
1405 ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
1408 static struct demangle_component *
1409 d_nested_name (struct d_info *di)
1411 struct demangle_component *ret;
1412 struct demangle_component **pret;
1413 struct demangle_component *rqual;
1415 if (! d_check_char (di, 'N'))
1416 return NULL;
1418 pret = d_cv_qualifiers (di, &ret, 1);
1419 if (pret == NULL)
1420 return NULL;
1422 /* Parse the ref-qualifier now and then attach it
1423 once we have something to attach it to. */
1424 rqual = d_ref_qualifier (di, NULL);
1426 *pret = d_prefix (di);
1427 if (*pret == NULL)
1428 return NULL;
1430 if (rqual)
1432 d_left (rqual) = ret;
1433 ret = rqual;
1436 if (! d_check_char (di, 'E'))
1437 return NULL;
1439 return ret;
1442 /* <prefix> ::= <prefix> <unqualified-name>
1443 ::= <template-prefix> <template-args>
1444 ::= <template-param>
1445 ::= <decltype>
1447 ::= <substitution>
1449 <template-prefix> ::= <prefix> <(template) unqualified-name>
1450 ::= <template-param>
1451 ::= <substitution>
1454 static struct demangle_component *
1455 d_prefix (struct d_info *di)
1457 struct demangle_component *ret = NULL;
1459 while (1)
1461 char peek;
1462 enum demangle_component_type comb_type;
1463 struct demangle_component *dc;
1465 peek = d_peek_char (di);
1466 if (peek == '\0')
1467 return NULL;
1469 /* The older code accepts a <local-name> here, but I don't see
1470 that in the grammar. The older code does not accept a
1471 <template-param> here. */
1473 comb_type = DEMANGLE_COMPONENT_QUAL_NAME;
1474 if (peek == 'D')
1476 char peek2 = d_peek_next_char (di);
1477 if (peek2 == 'T' || peek2 == 't')
1478 /* Decltype. */
1479 dc = cplus_demangle_type (di);
1480 else
1481 /* Destructor name. */
1482 dc = d_unqualified_name (di);
1484 else if (IS_DIGIT (peek)
1485 || IS_LOWER (peek)
1486 || peek == 'C'
1487 || peek == 'U'
1488 || peek == 'L')
1489 dc = d_unqualified_name (di);
1490 else if (peek == 'S')
1491 dc = d_substitution (di, 1);
1492 else if (peek == 'I')
1494 if (ret == NULL)
1495 return NULL;
1496 comb_type = DEMANGLE_COMPONENT_TEMPLATE;
1497 dc = d_template_args (di);
1499 else if (peek == 'T')
1500 dc = d_template_param (di);
1501 else if (peek == 'E')
1502 return ret;
1503 else if (peek == 'M')
1505 /* Initializer scope for a lambda. We don't need to represent
1506 this; the normal code will just treat the variable as a type
1507 scope, which gives appropriate output. */
1508 if (ret == NULL)
1509 return NULL;
1510 d_advance (di, 1);
1511 continue;
1513 else
1514 return NULL;
1516 if (ret == NULL)
1517 ret = dc;
1518 else
1519 ret = d_make_comp (di, comb_type, ret, dc);
1521 if (peek != 'S' && d_peek_char (di) != 'E')
1523 if (! d_add_substitution (di, ret))
1524 return NULL;
1529 /* <unqualified-name> ::= <operator-name>
1530 ::= <ctor-dtor-name>
1531 ::= <source-name>
1532 ::= <local-source-name>
1534 <local-source-name> ::= L <source-name> <discriminator>
1537 static struct demangle_component *
1538 d_unqualified_name (struct d_info *di)
1540 struct demangle_component *ret;
1541 char peek;
1543 peek = d_peek_char (di);
1544 if (IS_DIGIT (peek))
1545 ret = d_source_name (di);
1546 else if (IS_LOWER (peek))
1548 ret = d_operator_name (di);
1549 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_OPERATOR)
1551 di->expansion += sizeof "operator" + ret->u.s_operator.op->len - 2;
1552 if (!strcmp (ret->u.s_operator.op->code, "li"))
1553 ret = d_make_comp (di, DEMANGLE_COMPONENT_UNARY, ret,
1554 d_source_name (di));
1557 else if (peek == 'C' || peek == 'D')
1558 ret = d_ctor_dtor_name (di);
1559 else if (peek == 'L')
1561 d_advance (di, 1);
1563 ret = d_source_name (di);
1564 if (ret == NULL)
1565 return NULL;
1566 if (! d_discriminator (di))
1567 return NULL;
1569 else if (peek == 'U')
1571 switch (d_peek_next_char (di))
1573 case 'l':
1574 ret = d_lambda (di);
1575 break;
1576 case 't':
1577 ret = d_unnamed_type (di);
1578 break;
1579 default:
1580 return NULL;
1583 else
1584 return NULL;
1586 if (d_peek_char (di) == 'B')
1587 ret = d_abi_tags (di, ret);
1588 return ret;
1591 /* <source-name> ::= <(positive length) number> <identifier> */
1593 static struct demangle_component *
1594 d_source_name (struct d_info *di)
1596 long len;
1597 struct demangle_component *ret;
1599 len = d_number (di);
1600 if (len <= 0)
1601 return NULL;
1602 ret = d_identifier (di, len);
1603 di->last_name = ret;
1604 return ret;
1607 /* number ::= [n] <(non-negative decimal integer)> */
1609 static long
1610 d_number (struct d_info *di)
1612 int negative;
1613 char peek;
1614 long ret;
1616 negative = 0;
1617 peek = d_peek_char (di);
1618 if (peek == 'n')
1620 negative = 1;
1621 d_advance (di, 1);
1622 peek = d_peek_char (di);
1625 ret = 0;
1626 while (1)
1628 if (! IS_DIGIT (peek))
1630 if (negative)
1631 ret = - ret;
1632 return ret;
1634 ret = ret * 10 + peek - '0';
1635 d_advance (di, 1);
1636 peek = d_peek_char (di);
1640 /* Like d_number, but returns a demangle_component. */
1642 static struct demangle_component *
1643 d_number_component (struct d_info *di)
1645 struct demangle_component *ret = d_make_empty (di);
1646 if (ret)
1648 ret->type = DEMANGLE_COMPONENT_NUMBER;
1649 ret->u.s_number.number = d_number (di);
1651 return ret;
1654 /* identifier ::= <(unqualified source code identifier)> */
1656 static struct demangle_component *
1657 d_identifier (struct d_info *di, int len)
1659 const char *name;
1661 name = d_str (di);
1663 if (di->send - name < len)
1664 return NULL;
1666 d_advance (di, len);
1668 /* A Java mangled name may have a trailing '$' if it is a C++
1669 keyword. This '$' is not included in the length count. We just
1670 ignore the '$'. */
1671 if ((di->options & DMGL_JAVA) != 0
1672 && d_peek_char (di) == '$')
1673 d_advance (di, 1);
1675 /* Look for something which looks like a gcc encoding of an
1676 anonymous namespace, and replace it with a more user friendly
1677 name. */
1678 if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
1679 && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX,
1680 ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0)
1682 const char *s;
1684 s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN;
1685 if ((*s == '.' || *s == '_' || *s == '$')
1686 && s[1] == 'N')
1688 di->expansion -= len - sizeof "(anonymous namespace)";
1689 return d_make_name (di, "(anonymous namespace)",
1690 sizeof "(anonymous namespace)" - 1);
1694 return d_make_name (di, name, len);
1697 /* operator_name ::= many different two character encodings.
1698 ::= cv <type>
1699 ::= v <digit> <source-name>
1701 This list is sorted for binary search. */
1703 #define NL(s) s, (sizeof s) - 1
1705 CP_STATIC_IF_GLIBCPP_V3
1706 const struct demangle_operator_info cplus_demangle_operators[] =
1708 { "aN", NL ("&="), 2 },
1709 { "aS", NL ("="), 2 },
1710 { "aa", NL ("&&"), 2 },
1711 { "ad", NL ("&"), 1 },
1712 { "an", NL ("&"), 2 },
1713 { "at", NL ("alignof "), 1 },
1714 { "az", NL ("alignof "), 1 },
1715 { "cc", NL ("const_cast"), 2 },
1716 { "cl", NL ("()"), 2 },
1717 { "cm", NL (","), 2 },
1718 { "co", NL ("~"), 1 },
1719 { "dV", NL ("/="), 2 },
1720 { "da", NL ("delete[] "), 1 },
1721 { "dc", NL ("dynamic_cast"), 2 },
1722 { "de", NL ("*"), 1 },
1723 { "dl", NL ("delete "), 1 },
1724 { "ds", NL (".*"), 2 },
1725 { "dt", NL ("."), 2 },
1726 { "dv", NL ("/"), 2 },
1727 { "eO", NL ("^="), 2 },
1728 { "eo", NL ("^"), 2 },
1729 { "eq", NL ("=="), 2 },
1730 { "ge", NL (">="), 2 },
1731 { "gs", NL ("::"), 1 },
1732 { "gt", NL (">"), 2 },
1733 { "ix", NL ("[]"), 2 },
1734 { "lS", NL ("<<="), 2 },
1735 { "le", NL ("<="), 2 },
1736 { "li", NL ("operator\"\" "), 1 },
1737 { "ls", NL ("<<"), 2 },
1738 { "lt", NL ("<"), 2 },
1739 { "mI", NL ("-="), 2 },
1740 { "mL", NL ("*="), 2 },
1741 { "mi", NL ("-"), 2 },
1742 { "ml", NL ("*"), 2 },
1743 { "mm", NL ("--"), 1 },
1744 { "na", NL ("new[]"), 3 },
1745 { "ne", NL ("!="), 2 },
1746 { "ng", NL ("-"), 1 },
1747 { "nt", NL ("!"), 1 },
1748 { "nw", NL ("new"), 3 },
1749 { "oR", NL ("|="), 2 },
1750 { "oo", NL ("||"), 2 },
1751 { "or", NL ("|"), 2 },
1752 { "pL", NL ("+="), 2 },
1753 { "pl", NL ("+"), 2 },
1754 { "pm", NL ("->*"), 2 },
1755 { "pp", NL ("++"), 1 },
1756 { "ps", NL ("+"), 1 },
1757 { "pt", NL ("->"), 2 },
1758 { "qu", NL ("?"), 3 },
1759 { "rM", NL ("%="), 2 },
1760 { "rS", NL (">>="), 2 },
1761 { "rc", NL ("reinterpret_cast"), 2 },
1762 { "rm", NL ("%"), 2 },
1763 { "rs", NL (">>"), 2 },
1764 { "sc", NL ("static_cast"), 2 },
1765 { "st", NL ("sizeof "), 1 },
1766 { "sz", NL ("sizeof "), 1 },
1767 { "tr", NL ("throw"), 0 },
1768 { "tw", NL ("throw "), 1 },
1769 { NULL, NULL, 0, 0 }
1772 static struct demangle_component *
1773 d_operator_name (struct d_info *di)
1775 char c1;
1776 char c2;
1778 c1 = d_next_char (di);
1779 c2 = d_next_char (di);
1780 if (c1 == 'v' && IS_DIGIT (c2))
1781 return d_make_extended_operator (di, c2 - '0', d_source_name (di));
1782 else if (c1 == 'c' && c2 == 'v')
1784 struct demangle_component *type;
1785 int was_conversion = di->is_conversion;
1787 di->is_conversion = ! di->is_expression;
1788 type = cplus_demangle_type (di);
1789 di->is_conversion = was_conversion;
1790 return d_make_comp (di, DEMANGLE_COMPONENT_CAST, type, NULL);
1792 else
1794 /* LOW is the inclusive lower bound. */
1795 int low = 0;
1796 /* HIGH is the exclusive upper bound. We subtract one to ignore
1797 the sentinel at the end of the array. */
1798 int high = ((sizeof (cplus_demangle_operators)
1799 / sizeof (cplus_demangle_operators[0]))
1800 - 1);
1802 while (1)
1804 int i;
1805 const struct demangle_operator_info *p;
1807 i = low + (high - low) / 2;
1808 p = cplus_demangle_operators + i;
1810 if (c1 == p->code[0] && c2 == p->code[1])
1811 return d_make_operator (di, p);
1813 if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1]))
1814 high = i;
1815 else
1816 low = i + 1;
1817 if (low == high)
1818 return NULL;
1823 static struct demangle_component *
1824 d_make_character (struct d_info *di, int c)
1826 struct demangle_component *p;
1827 p = d_make_empty (di);
1828 if (p != NULL)
1830 p->type = DEMANGLE_COMPONENT_CHARACTER;
1831 p->u.s_character.character = c;
1833 return p;
1836 static struct demangle_component *
1837 d_java_resource (struct d_info *di)
1839 struct demangle_component *p = NULL;
1840 struct demangle_component *next = NULL;
1841 long len, i;
1842 char c;
1843 const char *str;
1845 len = d_number (di);
1846 if (len <= 1)
1847 return NULL;
1849 /* Eat the leading '_'. */
1850 if (d_next_char (di) != '_')
1851 return NULL;
1852 len--;
1854 str = d_str (di);
1855 i = 0;
1857 while (len > 0)
1859 c = str[i];
1860 if (!c)
1861 return NULL;
1863 /* Each chunk is either a '$' escape... */
1864 if (c == '$')
1866 i++;
1867 switch (str[i++])
1869 case 'S':
1870 c = '/';
1871 break;
1872 case '_':
1873 c = '.';
1874 break;
1875 case '$':
1876 c = '$';
1877 break;
1878 default:
1879 return NULL;
1881 next = d_make_character (di, c);
1882 d_advance (di, i);
1883 str = d_str (di);
1884 len -= i;
1885 i = 0;
1886 if (next == NULL)
1887 return NULL;
1889 /* ... or a sequence of characters. */
1890 else
1892 while (i < len && str[i] && str[i] != '$')
1893 i++;
1895 next = d_make_name (di, str, i);
1896 d_advance (di, i);
1897 str = d_str (di);
1898 len -= i;
1899 i = 0;
1900 if (next == NULL)
1901 return NULL;
1904 if (p == NULL)
1905 p = next;
1906 else
1908 p = d_make_comp (di, DEMANGLE_COMPONENT_COMPOUND_NAME, p, next);
1909 if (p == NULL)
1910 return NULL;
1914 p = d_make_comp (di, DEMANGLE_COMPONENT_JAVA_RESOURCE, p, NULL);
1916 return p;
1919 /* <special-name> ::= TV <type>
1920 ::= TT <type>
1921 ::= TI <type>
1922 ::= TS <type>
1923 ::= GV <(object) name>
1924 ::= T <call-offset> <(base) encoding>
1925 ::= Tc <call-offset> <call-offset> <(base) encoding>
1926 Also g++ extensions:
1927 ::= TC <type> <(offset) number> _ <(base) type>
1928 ::= TF <type>
1929 ::= TJ <type>
1930 ::= GR <name>
1931 ::= GA <encoding>
1932 ::= Gr <resource name>
1933 ::= GTt <encoding>
1934 ::= GTn <encoding>
1937 static struct demangle_component *
1938 d_special_name (struct d_info *di)
1940 di->expansion += 20;
1941 if (d_check_char (di, 'T'))
1943 switch (d_next_char (di))
1945 case 'V':
1946 di->expansion -= 5;
1947 return d_make_comp (di, DEMANGLE_COMPONENT_VTABLE,
1948 cplus_demangle_type (di), NULL);
1949 case 'T':
1950 di->expansion -= 10;
1951 return d_make_comp (di, DEMANGLE_COMPONENT_VTT,
1952 cplus_demangle_type (di), NULL);
1953 case 'I':
1954 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO,
1955 cplus_demangle_type (di), NULL);
1956 case 'S':
1957 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_NAME,
1958 cplus_demangle_type (di), NULL);
1960 case 'h':
1961 if (! d_call_offset (di, 'h'))
1962 return NULL;
1963 return d_make_comp (di, DEMANGLE_COMPONENT_THUNK,
1964 d_encoding (di, 0), NULL);
1966 case 'v':
1967 if (! d_call_offset (di, 'v'))
1968 return NULL;
1969 return d_make_comp (di, DEMANGLE_COMPONENT_VIRTUAL_THUNK,
1970 d_encoding (di, 0), NULL);
1972 case 'c':
1973 if (! d_call_offset (di, '\0'))
1974 return NULL;
1975 if (! d_call_offset (di, '\0'))
1976 return NULL;
1977 return d_make_comp (di, DEMANGLE_COMPONENT_COVARIANT_THUNK,
1978 d_encoding (di, 0), NULL);
1980 case 'C':
1982 struct demangle_component *derived_type;
1983 long offset;
1984 struct demangle_component *base_type;
1986 derived_type = cplus_demangle_type (di);
1987 offset = d_number (di);
1988 if (offset < 0)
1989 return NULL;
1990 if (! d_check_char (di, '_'))
1991 return NULL;
1992 base_type = cplus_demangle_type (di);
1993 /* We don't display the offset. FIXME: We should display
1994 it in verbose mode. */
1995 di->expansion += 5;
1996 return d_make_comp (di, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE,
1997 base_type, derived_type);
2000 case 'F':
2001 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_FN,
2002 cplus_demangle_type (di), NULL);
2003 case 'J':
2004 return d_make_comp (di, DEMANGLE_COMPONENT_JAVA_CLASS,
2005 cplus_demangle_type (di), NULL);
2007 case 'H':
2008 return d_make_comp (di, DEMANGLE_COMPONENT_TLS_INIT,
2009 d_name (di), NULL);
2011 case 'W':
2012 return d_make_comp (di, DEMANGLE_COMPONENT_TLS_WRAPPER,
2013 d_name (di), NULL);
2015 default:
2016 return NULL;
2019 else if (d_check_char (di, 'G'))
2021 switch (d_next_char (di))
2023 case 'V':
2024 return d_make_comp (di, DEMANGLE_COMPONENT_GUARD, d_name (di), NULL);
2026 case 'R':
2028 struct demangle_component *name = d_name (di);
2029 return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, name,
2030 d_number_component (di));
2033 case 'A':
2034 return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS,
2035 d_encoding (di, 0), NULL);
2037 case 'T':
2038 switch (d_next_char (di))
2040 case 'n':
2041 return d_make_comp (di, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE,
2042 d_encoding (di, 0), NULL);
2043 default:
2044 /* ??? The proposal is that other letters (such as 'h') stand
2045 for different variants of transaction cloning, such as
2046 compiling directly for hardware transaction support. But
2047 they still should all be transactional clones of some sort
2048 so go ahead and call them that. */
2049 case 't':
2050 return d_make_comp (di, DEMANGLE_COMPONENT_TRANSACTION_CLONE,
2051 d_encoding (di, 0), NULL);
2054 case 'r':
2055 return d_java_resource (di);
2057 default:
2058 return NULL;
2061 else
2062 return NULL;
2065 /* <call-offset> ::= h <nv-offset> _
2066 ::= v <v-offset> _
2068 <nv-offset> ::= <(offset) number>
2070 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
2072 The C parameter, if not '\0', is a character we just read which is
2073 the start of the <call-offset>.
2075 We don't display the offset information anywhere. FIXME: We should
2076 display it in verbose mode. */
2078 static int
2079 d_call_offset (struct d_info *di, int c)
2081 if (c == '\0')
2082 c = d_next_char (di);
2084 if (c == 'h')
2085 d_number (di);
2086 else if (c == 'v')
2088 d_number (di);
2089 if (! d_check_char (di, '_'))
2090 return 0;
2091 d_number (di);
2093 else
2094 return 0;
2096 if (! d_check_char (di, '_'))
2097 return 0;
2099 return 1;
2102 /* <ctor-dtor-name> ::= C1
2103 ::= C2
2104 ::= C3
2105 ::= D0
2106 ::= D1
2107 ::= D2
2110 static struct demangle_component *
2111 d_ctor_dtor_name (struct d_info *di)
2113 if (di->last_name != NULL)
2115 if (di->last_name->type == DEMANGLE_COMPONENT_NAME)
2116 di->expansion += di->last_name->u.s_name.len;
2117 else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD)
2118 di->expansion += di->last_name->u.s_string.len;
2120 switch (d_peek_char (di))
2122 case 'C':
2124 enum gnu_v3_ctor_kinds kind;
2126 switch (d_peek_next_char (di))
2128 case '1':
2129 kind = gnu_v3_complete_object_ctor;
2130 break;
2131 case '2':
2132 kind = gnu_v3_base_object_ctor;
2133 break;
2134 case '3':
2135 kind = gnu_v3_complete_object_allocating_ctor;
2136 break;
2137 case '4':
2138 kind = gnu_v3_unified_ctor;
2139 break;
2140 case '5':
2141 kind = gnu_v3_object_ctor_group;
2142 break;
2143 default:
2144 return NULL;
2146 d_advance (di, 2);
2147 return d_make_ctor (di, kind, di->last_name);
2150 case 'D':
2152 enum gnu_v3_dtor_kinds kind;
2154 switch (d_peek_next_char (di))
2156 case '0':
2157 kind = gnu_v3_deleting_dtor;
2158 break;
2159 case '1':
2160 kind = gnu_v3_complete_object_dtor;
2161 break;
2162 case '2':
2163 kind = gnu_v3_base_object_dtor;
2164 break;
2165 /* digit '3' is not used */
2166 case '4':
2167 kind = gnu_v3_unified_dtor;
2168 break;
2169 case '5':
2170 kind = gnu_v3_object_dtor_group;
2171 break;
2172 default:
2173 return NULL;
2175 d_advance (di, 2);
2176 return d_make_dtor (di, kind, di->last_name);
2179 default:
2180 return NULL;
2184 /* <type> ::= <builtin-type>
2185 ::= <function-type>
2186 ::= <class-enum-type>
2187 ::= <array-type>
2188 ::= <pointer-to-member-type>
2189 ::= <template-param>
2190 ::= <template-template-param> <template-args>
2191 ::= <substitution>
2192 ::= <CV-qualifiers> <type>
2193 ::= P <type>
2194 ::= R <type>
2195 ::= O <type> (C++0x)
2196 ::= C <type>
2197 ::= G <type>
2198 ::= U <source-name> <type>
2200 <builtin-type> ::= various one letter codes
2201 ::= u <source-name>
2204 CP_STATIC_IF_GLIBCPP_V3
2205 const struct demangle_builtin_type_info
2206 cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] =
2208 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT },
2209 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL },
2210 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT },
2211 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT },
2212 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT },
2213 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT },
2214 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT },
2215 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT },
2216 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT },
2217 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED },
2218 /* k */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2219 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG },
2220 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG },
2221 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT },
2222 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2223 D_PRINT_DEFAULT },
2224 /* p */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2225 /* q */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2226 /* r */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2227 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT },
2228 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
2229 /* u */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2230 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID },
2231 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT },
2232 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG },
2233 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2234 D_PRINT_UNSIGNED_LONG_LONG },
2235 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT },
2236 /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT },
2237 /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT },
2238 /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT },
2239 /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT },
2240 /* 30 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT },
2241 /* 31 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT },
2242 /* 32 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"),
2243 D_PRINT_DEFAULT },
2246 CP_STATIC_IF_GLIBCPP_V3
2247 struct demangle_component *
2248 cplus_demangle_type (struct d_info *di)
2250 char peek;
2251 struct demangle_component *ret;
2252 int can_subst;
2254 /* The ABI specifies that when CV-qualifiers are used, the base type
2255 is substitutable, and the fully qualified type is substitutable,
2256 but the base type with a strict subset of the CV-qualifiers is
2257 not substitutable. The natural recursive implementation of the
2258 CV-qualifiers would cause subsets to be substitutable, so instead
2259 we pull them all off now.
2261 FIXME: The ABI says that order-insensitive vendor qualifiers
2262 should be handled in the same way, but we have no way to tell
2263 which vendor qualifiers are order-insensitive and which are
2264 order-sensitive. So we just assume that they are all
2265 order-sensitive. g++ 3.4 supports only one vendor qualifier,
2266 __vector, and it treats it as order-sensitive when mangling
2267 names. */
2269 peek = d_peek_char (di);
2270 if (peek == 'r' || peek == 'V' || peek == 'K')
2272 struct demangle_component **pret;
2274 pret = d_cv_qualifiers (di, &ret, 0);
2275 if (pret == NULL)
2276 return NULL;
2277 if (d_peek_char (di) == 'F')
2279 /* cv-qualifiers before a function type apply to 'this',
2280 so avoid adding the unqualified function type to
2281 the substitution list. */
2282 *pret = d_function_type (di);
2284 else
2285 *pret = cplus_demangle_type (di);
2286 if (!*pret)
2287 return NULL;
2288 if ((*pret)->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
2289 || (*pret)->type == DEMANGLE_COMPONENT_REFERENCE_THIS)
2291 /* Move the ref-qualifier outside the cv-qualifiers so that
2292 they are printed in the right order. */
2293 struct demangle_component *fn = d_left (*pret);
2294 d_left (*pret) = ret;
2295 ret = *pret;
2296 *pret = fn;
2298 if (! d_add_substitution (di, ret))
2299 return NULL;
2300 return ret;
2303 can_subst = 1;
2305 switch (peek)
2307 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2308 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
2309 case 'o': case 's': case 't':
2310 case 'v': case 'w': case 'x': case 'y': case 'z':
2311 ret = d_make_builtin_type (di,
2312 &cplus_demangle_builtin_types[peek - 'a']);
2313 di->expansion += ret->u.s_builtin.type->len;
2314 can_subst = 0;
2315 d_advance (di, 1);
2316 break;
2318 case 'u':
2319 d_advance (di, 1);
2320 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE,
2321 d_source_name (di), NULL);
2322 break;
2324 case 'F':
2325 ret = d_function_type (di);
2326 break;
2328 case '0': case '1': case '2': case '3': case '4':
2329 case '5': case '6': case '7': case '8': case '9':
2330 case 'N':
2331 case 'Z':
2332 ret = d_class_enum_type (di);
2333 break;
2335 case 'A':
2336 ret = d_array_type (di);
2337 break;
2339 case 'M':
2340 ret = d_pointer_to_member_type (di);
2341 break;
2343 case 'T':
2344 ret = d_template_param (di);
2345 if (d_peek_char (di) == 'I')
2347 /* This may be <template-template-param> <template-args>.
2348 If this is the type for a conversion operator, we can
2349 have a <template-template-param> here only by following
2350 a derivation like this:
2352 <nested-name>
2353 -> <template-prefix> <template-args>
2354 -> <prefix> <template-unqualified-name> <template-args>
2355 -> <unqualified-name> <template-unqualified-name> <template-args>
2356 -> <source-name> <template-unqualified-name> <template-args>
2357 -> <source-name> <operator-name> <template-args>
2358 -> <source-name> cv <type> <template-args>
2359 -> <source-name> cv <template-template-param> <template-args> <template-args>
2361 where the <template-args> is followed by another.
2362 Otherwise, we must have a derivation like this:
2364 <nested-name>
2365 -> <template-prefix> <template-args>
2366 -> <prefix> <template-unqualified-name> <template-args>
2367 -> <unqualified-name> <template-unqualified-name> <template-args>
2368 -> <source-name> <template-unqualified-name> <template-args>
2369 -> <source-name> <operator-name> <template-args>
2370 -> <source-name> cv <type> <template-args>
2371 -> <source-name> cv <template-param> <template-args>
2373 where we need to leave the <template-args> to be processed
2374 by d_prefix (following the <template-prefix>).
2376 The <template-template-param> part is a substitution
2377 candidate. */
2378 if (! di->is_conversion)
2380 if (! d_add_substitution (di, ret))
2381 return NULL;
2382 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2383 d_template_args (di));
2385 else
2387 struct demangle_component *args;
2388 struct d_info_checkpoint checkpoint;
2390 d_checkpoint (di, &checkpoint);
2391 args = d_template_args (di);
2392 if (d_peek_char (di) == 'I')
2394 if (! d_add_substitution (di, ret))
2395 return NULL;
2396 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2397 args);
2399 else
2400 d_backtrack (di, &checkpoint);
2403 break;
2405 case 'S':
2406 /* If this is a special substitution, then it is the start of
2407 <class-enum-type>. */
2409 char peek_next;
2411 peek_next = d_peek_next_char (di);
2412 if (IS_DIGIT (peek_next)
2413 || peek_next == '_'
2414 || IS_UPPER (peek_next))
2416 ret = d_substitution (di, 0);
2417 /* The substituted name may have been a template name and
2418 may be followed by tepmlate args. */
2419 if (d_peek_char (di) == 'I')
2420 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2421 d_template_args (di));
2422 else
2423 can_subst = 0;
2425 else
2427 ret = d_class_enum_type (di);
2428 /* If the substitution was a complete type, then it is not
2429 a new substitution candidate. However, if the
2430 substitution was followed by template arguments, then
2431 the whole thing is a substitution candidate. */
2432 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD)
2433 can_subst = 0;
2436 break;
2438 case 'O':
2439 d_advance (di, 1);
2440 ret = d_make_comp (di, DEMANGLE_COMPONENT_RVALUE_REFERENCE,
2441 cplus_demangle_type (di), NULL);
2442 break;
2444 case 'P':
2445 d_advance (di, 1);
2446 ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER,
2447 cplus_demangle_type (di), NULL);
2448 break;
2450 case 'R':
2451 d_advance (di, 1);
2452 ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE,
2453 cplus_demangle_type (di), NULL);
2454 break;
2456 case 'C':
2457 d_advance (di, 1);
2458 ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX,
2459 cplus_demangle_type (di), NULL);
2460 break;
2462 case 'G':
2463 d_advance (di, 1);
2464 ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY,
2465 cplus_demangle_type (di), NULL);
2466 break;
2468 case 'U':
2469 d_advance (di, 1);
2470 ret = d_source_name (di);
2471 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL,
2472 cplus_demangle_type (di), ret);
2473 break;
2475 case 'D':
2476 can_subst = 0;
2477 d_advance (di, 1);
2478 peek = d_next_char (di);
2479 switch (peek)
2481 case 'T':
2482 case 't':
2483 /* decltype (expression) */
2484 ret = d_make_comp (di, DEMANGLE_COMPONENT_DECLTYPE,
2485 d_expression (di), NULL);
2486 if (ret && d_next_char (di) != 'E')
2487 ret = NULL;
2488 can_subst = 1;
2489 break;
2491 case 'p':
2492 /* Pack expansion. */
2493 ret = d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
2494 cplus_demangle_type (di), NULL);
2495 can_subst = 1;
2496 break;
2498 case 'a':
2499 /* auto */
2500 ret = d_make_name (di, "auto", 4);
2501 break;
2503 case 'f':
2504 /* 32-bit decimal floating point */
2505 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[26]);
2506 di->expansion += ret->u.s_builtin.type->len;
2507 break;
2508 case 'd':
2509 /* 64-bit DFP */
2510 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[27]);
2511 di->expansion += ret->u.s_builtin.type->len;
2512 break;
2513 case 'e':
2514 /* 128-bit DFP */
2515 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[28]);
2516 di->expansion += ret->u.s_builtin.type->len;
2517 break;
2518 case 'h':
2519 /* 16-bit half-precision FP */
2520 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[29]);
2521 di->expansion += ret->u.s_builtin.type->len;
2522 break;
2523 case 's':
2524 /* char16_t */
2525 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[30]);
2526 di->expansion += ret->u.s_builtin.type->len;
2527 break;
2528 case 'i':
2529 /* char32_t */
2530 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[31]);
2531 di->expansion += ret->u.s_builtin.type->len;
2532 break;
2534 case 'F':
2535 /* Fixed point types. DF<int bits><length><fract bits><sat> */
2536 ret = d_make_empty (di);
2537 ret->type = DEMANGLE_COMPONENT_FIXED_TYPE;
2538 if ((ret->u.s_fixed.accum = IS_DIGIT (d_peek_char (di))))
2539 /* For demangling we don't care about the bits. */
2540 d_number (di);
2541 ret->u.s_fixed.length = cplus_demangle_type (di);
2542 if (ret->u.s_fixed.length == NULL)
2543 return NULL;
2544 d_number (di);
2545 peek = d_next_char (di);
2546 ret->u.s_fixed.sat = (peek == 's');
2547 break;
2549 case 'v':
2550 ret = d_vector_type (di);
2551 can_subst = 1;
2552 break;
2554 case 'n':
2555 /* decltype(nullptr) */
2556 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[32]);
2557 di->expansion += ret->u.s_builtin.type->len;
2558 break;
2560 default:
2561 return NULL;
2563 break;
2565 default:
2566 return NULL;
2569 if (can_subst)
2571 if (! d_add_substitution (di, ret))
2572 return NULL;
2575 return ret;
2578 /* <CV-qualifiers> ::= [r] [V] [K] */
2580 static struct demangle_component **
2581 d_cv_qualifiers (struct d_info *di,
2582 struct demangle_component **pret, int member_fn)
2584 struct demangle_component **pstart;
2585 char peek;
2587 pstart = pret;
2588 peek = d_peek_char (di);
2589 while (peek == 'r' || peek == 'V' || peek == 'K')
2591 enum demangle_component_type t;
2593 d_advance (di, 1);
2594 if (peek == 'r')
2596 t = (member_fn
2597 ? DEMANGLE_COMPONENT_RESTRICT_THIS
2598 : DEMANGLE_COMPONENT_RESTRICT);
2599 di->expansion += sizeof "restrict";
2601 else if (peek == 'V')
2603 t = (member_fn
2604 ? DEMANGLE_COMPONENT_VOLATILE_THIS
2605 : DEMANGLE_COMPONENT_VOLATILE);
2606 di->expansion += sizeof "volatile";
2608 else
2610 t = (member_fn
2611 ? DEMANGLE_COMPONENT_CONST_THIS
2612 : DEMANGLE_COMPONENT_CONST);
2613 di->expansion += sizeof "const";
2616 *pret = d_make_comp (di, t, NULL, NULL);
2617 if (*pret == NULL)
2618 return NULL;
2619 pret = &d_left (*pret);
2621 peek = d_peek_char (di);
2624 if (!member_fn && peek == 'F')
2626 while (pstart != pret)
2628 switch ((*pstart)->type)
2630 case DEMANGLE_COMPONENT_RESTRICT:
2631 (*pstart)->type = DEMANGLE_COMPONENT_RESTRICT_THIS;
2632 break;
2633 case DEMANGLE_COMPONENT_VOLATILE:
2634 (*pstart)->type = DEMANGLE_COMPONENT_VOLATILE_THIS;
2635 break;
2636 case DEMANGLE_COMPONENT_CONST:
2637 (*pstart)->type = DEMANGLE_COMPONENT_CONST_THIS;
2638 break;
2639 default:
2640 break;
2642 pstart = &d_left (*pstart);
2646 return pret;
2649 /* <ref-qualifier> ::= R
2650 ::= O */
2652 static struct demangle_component *
2653 d_ref_qualifier (struct d_info *di, struct demangle_component *sub)
2655 struct demangle_component *ret = sub;
2656 char peek;
2658 peek = d_peek_char (di);
2659 if (peek == 'R' || peek == 'O')
2661 enum demangle_component_type t;
2662 if (peek == 'R')
2664 t = DEMANGLE_COMPONENT_REFERENCE_THIS;
2665 di->expansion += sizeof "&";
2667 else
2669 t = DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS;
2670 di->expansion += sizeof "&&";
2672 d_advance (di, 1);
2674 ret = d_make_comp (di, t, ret, NULL);
2677 return ret;
2680 /* <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] E */
2682 static struct demangle_component *
2683 d_function_type (struct d_info *di)
2685 struct demangle_component *ret;
2687 if (! d_check_char (di, 'F'))
2688 return NULL;
2689 if (d_peek_char (di) == 'Y')
2691 /* Function has C linkage. We don't print this information.
2692 FIXME: We should print it in verbose mode. */
2693 d_advance (di, 1);
2695 ret = d_bare_function_type (di, 1);
2696 ret = d_ref_qualifier (di, ret);
2698 if (! d_check_char (di, 'E'))
2699 return NULL;
2700 return ret;
2703 /* <type>+ */
2705 static struct demangle_component *
2706 d_parmlist (struct d_info *di)
2708 struct demangle_component *tl;
2709 struct demangle_component **ptl;
2711 tl = NULL;
2712 ptl = &tl;
2713 while (1)
2715 struct demangle_component *type;
2717 char peek = d_peek_char (di);
2718 if (peek == '\0' || peek == 'E' || peek == '.')
2719 break;
2720 if ((peek == 'R' || peek == 'O')
2721 && d_peek_next_char (di) == 'E')
2722 /* Function ref-qualifier, not a ref prefix for a parameter type. */
2723 break;
2724 type = cplus_demangle_type (di);
2725 if (type == NULL)
2726 return NULL;
2727 *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL);
2728 if (*ptl == NULL)
2729 return NULL;
2730 ptl = &d_right (*ptl);
2733 /* There should be at least one parameter type besides the optional
2734 return type. A function which takes no arguments will have a
2735 single parameter type void. */
2736 if (tl == NULL)
2737 return NULL;
2739 /* If we have a single parameter type void, omit it. */
2740 if (d_right (tl) == NULL
2741 && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
2742 && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
2744 di->expansion -= d_left (tl)->u.s_builtin.type->len;
2745 d_left (tl) = NULL;
2748 return tl;
2751 /* <bare-function-type> ::= [J]<type>+ */
2753 static struct demangle_component *
2754 d_bare_function_type (struct d_info *di, int has_return_type)
2756 struct demangle_component *return_type;
2757 struct demangle_component *tl;
2758 char peek;
2760 /* Detect special qualifier indicating that the first argument
2761 is the return type. */
2762 peek = d_peek_char (di);
2763 if (peek == 'J')
2765 d_advance (di, 1);
2766 has_return_type = 1;
2769 if (has_return_type)
2771 return_type = cplus_demangle_type (di);
2772 if (return_type == NULL)
2773 return NULL;
2775 else
2776 return_type = NULL;
2778 tl = d_parmlist (di);
2779 if (tl == NULL)
2780 return NULL;
2782 return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE,
2783 return_type, tl);
2786 /* <class-enum-type> ::= <name> */
2788 static struct demangle_component *
2789 d_class_enum_type (struct d_info *di)
2791 return d_name (di);
2794 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2795 ::= A [<(dimension) expression>] _ <(element) type>
2798 static struct demangle_component *
2799 d_array_type (struct d_info *di)
2801 char peek;
2802 struct demangle_component *dim;
2804 if (! d_check_char (di, 'A'))
2805 return NULL;
2807 peek = d_peek_char (di);
2808 if (peek == '_')
2809 dim = NULL;
2810 else if (IS_DIGIT (peek))
2812 const char *s;
2814 s = d_str (di);
2817 d_advance (di, 1);
2818 peek = d_peek_char (di);
2820 while (IS_DIGIT (peek));
2821 dim = d_make_name (di, s, d_str (di) - s);
2822 if (dim == NULL)
2823 return NULL;
2825 else
2827 dim = d_expression (di);
2828 if (dim == NULL)
2829 return NULL;
2832 if (! d_check_char (di, '_'))
2833 return NULL;
2835 return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim,
2836 cplus_demangle_type (di));
2839 /* <vector-type> ::= Dv <number> _ <type>
2840 ::= Dv _ <expression> _ <type> */
2842 static struct demangle_component *
2843 d_vector_type (struct d_info *di)
2845 char peek;
2846 struct demangle_component *dim;
2848 peek = d_peek_char (di);
2849 if (peek == '_')
2851 d_advance (di, 1);
2852 dim = d_expression (di);
2854 else
2855 dim = d_number_component (di);
2857 if (dim == NULL)
2858 return NULL;
2860 if (! d_check_char (di, '_'))
2861 return NULL;
2863 return d_make_comp (di, DEMANGLE_COMPONENT_VECTOR_TYPE, dim,
2864 cplus_demangle_type (di));
2867 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
2869 static struct demangle_component *
2870 d_pointer_to_member_type (struct d_info *di)
2872 struct demangle_component *cl;
2873 struct demangle_component *mem;
2875 if (! d_check_char (di, 'M'))
2876 return NULL;
2878 cl = cplus_demangle_type (di);
2879 if (cl == NULL)
2880 return NULL;
2882 /* The ABI says, "The type of a non-static member function is considered
2883 to be different, for the purposes of substitution, from the type of a
2884 namespace-scope or static member function whose type appears
2885 similar. The types of two non-static member functions are considered
2886 to be different, for the purposes of substitution, if the functions
2887 are members of different classes. In other words, for the purposes of
2888 substitution, the class of which the function is a member is
2889 considered part of the type of function."
2891 For a pointer to member function, this call to cplus_demangle_type
2892 will end up adding a (possibly qualified) non-member function type to
2893 the substitution table, which is not correct; however, the member
2894 function type will never be used in a substitution, so putting the
2895 wrong type in the substitution table is harmless. */
2897 mem = cplus_demangle_type (di);
2898 if (mem == NULL)
2899 return NULL;
2901 return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem);
2904 /* <non-negative number> _ */
2906 static long
2907 d_compact_number (struct d_info *di)
2909 long num;
2910 if (d_peek_char (di) == '_')
2911 num = 0;
2912 else if (d_peek_char (di) == 'n')
2913 return -1;
2914 else
2915 num = d_number (di) + 1;
2917 if (! d_check_char (di, '_'))
2918 return -1;
2919 return num;
2922 /* <template-param> ::= T_
2923 ::= T <(parameter-2 non-negative) number> _
2926 static struct demangle_component *
2927 d_template_param (struct d_info *di)
2929 long param;
2931 if (! d_check_char (di, 'T'))
2932 return NULL;
2934 param = d_compact_number (di);
2935 if (param < 0)
2936 return NULL;
2938 ++di->did_subs;
2940 return d_make_template_param (di, param);
2943 /* <template-args> ::= I <template-arg>+ E */
2945 static struct demangle_component *
2946 d_template_args (struct d_info *di)
2948 struct demangle_component *hold_last_name;
2949 struct demangle_component *al;
2950 struct demangle_component **pal;
2952 /* Preserve the last name we saw--don't let the template arguments
2953 clobber it, as that would give us the wrong name for a subsequent
2954 constructor or destructor. */
2955 hold_last_name = di->last_name;
2957 if (d_peek_char (di) != 'I'
2958 && d_peek_char (di) != 'J')
2959 return NULL;
2960 d_advance (di, 1);
2962 if (d_peek_char (di) == 'E')
2964 /* An argument pack can be empty. */
2965 d_advance (di, 1);
2966 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, NULL, NULL);
2969 al = NULL;
2970 pal = &al;
2971 while (1)
2973 struct demangle_component *a;
2975 a = d_template_arg (di);
2976 if (a == NULL)
2977 return NULL;
2979 *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL);
2980 if (*pal == NULL)
2981 return NULL;
2982 pal = &d_right (*pal);
2984 if (d_peek_char (di) == 'E')
2986 d_advance (di, 1);
2987 break;
2991 di->last_name = hold_last_name;
2993 return al;
2996 /* <template-arg> ::= <type>
2997 ::= X <expression> E
2998 ::= <expr-primary>
3001 static struct demangle_component *
3002 d_template_arg (struct d_info *di)
3004 struct demangle_component *ret;
3006 switch (d_peek_char (di))
3008 case 'X':
3009 d_advance (di, 1);
3010 ret = d_expression (di);
3011 if (! d_check_char (di, 'E'))
3012 return NULL;
3013 return ret;
3015 case 'L':
3016 return d_expr_primary (di);
3018 case 'I':
3019 case 'J':
3020 /* An argument pack. */
3021 return d_template_args (di);
3023 default:
3024 return cplus_demangle_type (di);
3028 /* Parse a sequence of expressions until we hit the terminator
3029 character. */
3031 static struct demangle_component *
3032 d_exprlist (struct d_info *di, char terminator)
3034 struct demangle_component *list = NULL;
3035 struct demangle_component **p = &list;
3037 if (d_peek_char (di) == terminator)
3039 d_advance (di, 1);
3040 return d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, NULL, NULL);
3043 while (1)
3045 struct demangle_component *arg = d_expression (di);
3046 if (arg == NULL)
3047 return NULL;
3049 *p = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, arg, NULL);
3050 if (*p == NULL)
3051 return NULL;
3052 p = &d_right (*p);
3054 if (d_peek_char (di) == terminator)
3056 d_advance (di, 1);
3057 break;
3061 return list;
3064 /* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
3065 dynamic_cast, static_cast or reinterpret_cast. */
3067 static int
3068 op_is_new_cast (struct demangle_component *op)
3070 const char *code = op->u.s_operator.op->code;
3071 return (code[1] == 'c'
3072 && (code[0] == 's' || code[0] == 'd'
3073 || code[0] == 'c' || code[0] == 'r'));
3076 /* <expression> ::= <(unary) operator-name> <expression>
3077 ::= <(binary) operator-name> <expression> <expression>
3078 ::= <(trinary) operator-name> <expression> <expression> <expression>
3079 ::= cl <expression>+ E
3080 ::= st <type>
3081 ::= <template-param>
3082 ::= sr <type> <unqualified-name>
3083 ::= sr <type> <unqualified-name> <template-args>
3084 ::= <expr-primary>
3087 static inline struct demangle_component *
3088 d_expression_1 (struct d_info *di)
3090 char peek;
3092 peek = d_peek_char (di);
3093 if (peek == 'L')
3094 return d_expr_primary (di);
3095 else if (peek == 'T')
3096 return d_template_param (di);
3097 else if (peek == 's' && d_peek_next_char (di) == 'r')
3099 struct demangle_component *type;
3100 struct demangle_component *name;
3102 d_advance (di, 2);
3103 type = cplus_demangle_type (di);
3104 name = d_unqualified_name (di);
3105 if (d_peek_char (di) != 'I')
3106 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name);
3107 else
3108 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type,
3109 d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3110 d_template_args (di)));
3112 else if (peek == 's' && d_peek_next_char (di) == 'p')
3114 d_advance (di, 2);
3115 return d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
3116 d_expression_1 (di), NULL);
3118 else if (peek == 'f' && d_peek_next_char (di) == 'p')
3120 /* Function parameter used in a late-specified return type. */
3121 int index;
3122 d_advance (di, 2);
3123 if (d_peek_char (di) == 'T')
3125 /* 'this' parameter. */
3126 d_advance (di, 1);
3127 index = 0;
3129 else
3131 index = d_compact_number (di) + 1;
3132 if (index == 0)
3133 return NULL;
3135 return d_make_function_param (di, index);
3137 else if (IS_DIGIT (peek)
3138 || (peek == 'o' && d_peek_next_char (di) == 'n'))
3140 /* We can get an unqualified name as an expression in the case of
3141 a dependent function call, i.e. decltype(f(t)). */
3142 struct demangle_component *name;
3144 if (peek == 'o')
3145 /* operator-function-id, i.e. operator+(t). */
3146 d_advance (di, 2);
3148 name = d_unqualified_name (di);
3149 if (name == NULL)
3150 return NULL;
3151 if (d_peek_char (di) == 'I')
3152 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3153 d_template_args (di));
3154 else
3155 return name;
3157 else if ((peek == 'i' || peek == 't')
3158 && d_peek_next_char (di) == 'l')
3160 /* Brace-enclosed initializer list, untyped or typed. */
3161 struct demangle_component *type = NULL;
3162 if (peek == 't')
3163 type = cplus_demangle_type (di);
3164 d_advance (di, 2);
3165 return d_make_comp (di, DEMANGLE_COMPONENT_INITIALIZER_LIST,
3166 type, d_exprlist (di, 'E'));
3168 else
3170 struct demangle_component *op;
3171 const char *code = NULL;
3172 int args;
3174 op = d_operator_name (di);
3175 if (op == NULL)
3176 return NULL;
3178 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
3180 code = op->u.s_operator.op->code;
3181 di->expansion += op->u.s_operator.op->len - 2;
3182 if (strcmp (code, "st") == 0)
3183 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3184 cplus_demangle_type (di));
3187 switch (op->type)
3189 default:
3190 return NULL;
3191 case DEMANGLE_COMPONENT_OPERATOR:
3192 args = op->u.s_operator.op->args;
3193 break;
3194 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
3195 args = op->u.s_extended_operator.args;
3196 break;
3197 case DEMANGLE_COMPONENT_CAST:
3198 args = 1;
3199 break;
3202 switch (args)
3204 case 0:
3205 return d_make_comp (di, DEMANGLE_COMPONENT_NULLARY, op, NULL);
3207 case 1:
3209 struct demangle_component *operand;
3210 int suffix = 0;
3212 if (code && (code[0] == 'p' || code[0] == 'm')
3213 && code[1] == code[0])
3214 /* pp_ and mm_ are the prefix variants. */
3215 suffix = !d_check_char (di, '_');
3217 if (op->type == DEMANGLE_COMPONENT_CAST
3218 && d_check_char (di, '_'))
3219 operand = d_exprlist (di, 'E');
3220 else
3221 operand = d_expression_1 (di);
3223 if (suffix)
3224 /* Indicate the suffix variant for d_print_comp. */
3225 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3226 d_make_comp (di,
3227 DEMANGLE_COMPONENT_BINARY_ARGS,
3228 operand, operand));
3229 else
3230 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3231 operand);
3233 case 2:
3235 struct demangle_component *left;
3236 struct demangle_component *right;
3238 if (op_is_new_cast (op))
3239 left = cplus_demangle_type (di);
3240 else
3241 left = d_expression_1 (di);
3242 if (!strcmp (code, "cl"))
3243 right = d_exprlist (di, 'E');
3244 else if (!strcmp (code, "dt") || !strcmp (code, "pt"))
3246 right = d_unqualified_name (di);
3247 if (d_peek_char (di) == 'I')
3248 right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE,
3249 right, d_template_args (di));
3251 else
3252 right = d_expression_1 (di);
3254 return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
3255 d_make_comp (di,
3256 DEMANGLE_COMPONENT_BINARY_ARGS,
3257 left, right));
3259 case 3:
3261 struct demangle_component *first;
3262 struct demangle_component *second;
3263 struct demangle_component *third;
3265 if (!strcmp (code, "qu"))
3267 /* ?: expression. */
3268 first = d_expression_1 (di);
3269 second = d_expression_1 (di);
3270 third = d_expression_1 (di);
3272 else if (code[0] == 'n')
3274 /* new-expression. */
3275 if (code[1] != 'w' && code[1] != 'a')
3276 return NULL;
3277 first = d_exprlist (di, '_');
3278 second = cplus_demangle_type (di);
3279 if (d_peek_char (di) == 'E')
3281 d_advance (di, 1);
3282 third = NULL;
3284 else if (d_peek_char (di) == 'p'
3285 && d_peek_next_char (di) == 'i')
3287 /* Parenthesized initializer. */
3288 d_advance (di, 2);
3289 third = d_exprlist (di, 'E');
3291 else if (d_peek_char (di) == 'i'
3292 && d_peek_next_char (di) == 'l')
3293 /* initializer-list. */
3294 third = d_expression_1 (di);
3295 else
3296 return NULL;
3298 else
3299 return NULL;
3300 return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op,
3301 d_make_comp (di,
3302 DEMANGLE_COMPONENT_TRINARY_ARG1,
3303 first,
3304 d_make_comp (di,
3305 DEMANGLE_COMPONENT_TRINARY_ARG2,
3306 second, third)));
3308 default:
3309 return NULL;
3314 static struct demangle_component *
3315 d_expression (struct d_info *di)
3317 struct demangle_component *ret;
3318 int was_expression = di->is_expression;
3320 di->is_expression = 1;
3321 ret = d_expression_1 (di);
3322 di->is_expression = was_expression;
3323 return ret;
3326 /* <expr-primary> ::= L <type> <(value) number> E
3327 ::= L <type> <(value) float> E
3328 ::= L <mangled-name> E
3331 static struct demangle_component *
3332 d_expr_primary (struct d_info *di)
3334 struct demangle_component *ret;
3336 if (! d_check_char (di, 'L'))
3337 return NULL;
3338 if (d_peek_char (di) == '_'
3339 /* Workaround for G++ bug; see comment in write_template_arg. */
3340 || d_peek_char (di) == 'Z')
3341 ret = cplus_demangle_mangled_name (di, 0);
3342 else
3344 struct demangle_component *type;
3345 enum demangle_component_type t;
3346 const char *s;
3348 type = cplus_demangle_type (di);
3349 if (type == NULL)
3350 return NULL;
3352 /* If we have a type we know how to print, we aren't going to
3353 print the type name itself. */
3354 if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
3355 && type->u.s_builtin.type->print != D_PRINT_DEFAULT)
3356 di->expansion -= type->u.s_builtin.type->len;
3358 /* Rather than try to interpret the literal value, we just
3359 collect it as a string. Note that it's possible to have a
3360 floating point literal here. The ABI specifies that the
3361 format of such literals is machine independent. That's fine,
3362 but what's not fine is that versions of g++ up to 3.2 with
3363 -fabi-version=1 used upper case letters in the hex constant,
3364 and dumped out gcc's internal representation. That makes it
3365 hard to tell where the constant ends, and hard to dump the
3366 constant in any readable form anyhow. We don't attempt to
3367 handle these cases. */
3369 t = DEMANGLE_COMPONENT_LITERAL;
3370 if (d_peek_char (di) == 'n')
3372 t = DEMANGLE_COMPONENT_LITERAL_NEG;
3373 d_advance (di, 1);
3375 s = d_str (di);
3376 while (d_peek_char (di) != 'E')
3378 if (d_peek_char (di) == '\0')
3379 return NULL;
3380 d_advance (di, 1);
3382 ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s));
3384 if (! d_check_char (di, 'E'))
3385 return NULL;
3386 return ret;
3389 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3390 ::= Z <(function) encoding> E s [<discriminator>]
3391 ::= Z <(function) encoding> E d [<parameter> number>] _ <entity name>
3394 static struct demangle_component *
3395 d_local_name (struct d_info *di)
3397 struct demangle_component *function;
3399 if (! d_check_char (di, 'Z'))
3400 return NULL;
3402 function = d_encoding (di, 0);
3404 if (! d_check_char (di, 'E'))
3405 return NULL;
3407 if (d_peek_char (di) == 's')
3409 d_advance (di, 1);
3410 if (! d_discriminator (di))
3411 return NULL;
3412 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function,
3413 d_make_name (di, "string literal",
3414 sizeof "string literal" - 1));
3416 else
3418 struct demangle_component *name;
3419 int num = -1;
3421 if (d_peek_char (di) == 'd')
3423 /* Default argument scope: d <number> _. */
3424 d_advance (di, 1);
3425 num = d_compact_number (di);
3426 if (num < 0)
3427 return NULL;
3430 name = d_name (di);
3431 if (name)
3432 switch (name->type)
3434 /* Lambdas and unnamed types have internal discriminators. */
3435 case DEMANGLE_COMPONENT_LAMBDA:
3436 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
3437 break;
3438 default:
3439 if (! d_discriminator (di))
3440 return NULL;
3442 if (num >= 0)
3443 name = d_make_default_arg (di, num, name);
3444 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
3448 /* <discriminator> ::= _ <(non-negative) number>
3450 We demangle the discriminator, but we don't print it out. FIXME:
3451 We should print it out in verbose mode. */
3453 static int
3454 d_discriminator (struct d_info *di)
3456 long discrim;
3458 if (d_peek_char (di) != '_')
3459 return 1;
3460 d_advance (di, 1);
3461 discrim = d_number (di);
3462 if (discrim < 0)
3463 return 0;
3464 return 1;
3467 /* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */
3469 static struct demangle_component *
3470 d_lambda (struct d_info *di)
3472 struct demangle_component *tl;
3473 struct demangle_component *ret;
3474 int num;
3476 if (! d_check_char (di, 'U'))
3477 return NULL;
3478 if (! d_check_char (di, 'l'))
3479 return NULL;
3481 tl = d_parmlist (di);
3482 if (tl == NULL)
3483 return NULL;
3485 if (! d_check_char (di, 'E'))
3486 return NULL;
3488 num = d_compact_number (di);
3489 if (num < 0)
3490 return NULL;
3492 ret = d_make_empty (di);
3493 if (ret)
3495 ret->type = DEMANGLE_COMPONENT_LAMBDA;
3496 ret->u.s_unary_num.sub = tl;
3497 ret->u.s_unary_num.num = num;
3500 if (! d_add_substitution (di, ret))
3501 return NULL;
3503 return ret;
3506 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
3508 static struct demangle_component *
3509 d_unnamed_type (struct d_info *di)
3511 struct demangle_component *ret;
3512 long num;
3514 if (! d_check_char (di, 'U'))
3515 return NULL;
3516 if (! d_check_char (di, 't'))
3517 return NULL;
3519 num = d_compact_number (di);
3520 if (num < 0)
3521 return NULL;
3523 ret = d_make_empty (di);
3524 if (ret)
3526 ret->type = DEMANGLE_COMPONENT_UNNAMED_TYPE;
3527 ret->u.s_number.number = num;
3530 if (! d_add_substitution (di, ret))
3531 return NULL;
3533 return ret;
3536 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
3539 static struct demangle_component *
3540 d_clone_suffix (struct d_info *di, struct demangle_component *encoding)
3542 const char *suffix = d_str (di);
3543 const char *pend = suffix;
3544 struct demangle_component *n;
3546 if (*pend == '.' && (IS_LOWER (pend[1]) || pend[1] == '_'))
3548 pend += 2;
3549 while (IS_LOWER (*pend) || *pend == '_')
3550 ++pend;
3552 while (*pend == '.' && IS_DIGIT (pend[1]))
3554 pend += 2;
3555 while (IS_DIGIT (*pend))
3556 ++pend;
3558 d_advance (di, pend - suffix);
3559 n = d_make_name (di, suffix, pend - suffix);
3560 return d_make_comp (di, DEMANGLE_COMPONENT_CLONE, encoding, n);
3563 /* Add a new substitution. */
3565 static int
3566 d_add_substitution (struct d_info *di, struct demangle_component *dc)
3568 if (dc == NULL)
3569 return 0;
3570 if (di->next_sub >= di->num_subs)
3571 return 0;
3572 di->subs[di->next_sub] = dc;
3573 ++di->next_sub;
3574 return 1;
3577 /* <substitution> ::= S <seq-id> _
3578 ::= S_
3579 ::= St
3580 ::= Sa
3581 ::= Sb
3582 ::= Ss
3583 ::= Si
3584 ::= So
3585 ::= Sd
3587 If PREFIX is non-zero, then this type is being used as a prefix in
3588 a qualified name. In this case, for the standard substitutions, we
3589 need to check whether we are being used as a prefix for a
3590 constructor or destructor, and return a full template name.
3591 Otherwise we will get something like std::iostream::~iostream()
3592 which does not correspond particularly well to any function which
3593 actually appears in the source.
3596 static const struct d_standard_sub_info standard_subs[] =
3598 { 't', NL ("std"),
3599 NL ("std"),
3600 NULL, 0 },
3601 { 'a', NL ("std::allocator"),
3602 NL ("std::allocator"),
3603 NL ("allocator") },
3604 { 'b', NL ("std::basic_string"),
3605 NL ("std::basic_string"),
3606 NL ("basic_string") },
3607 { 's', NL ("std::string"),
3608 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
3609 NL ("basic_string") },
3610 { 'i', NL ("std::istream"),
3611 NL ("std::basic_istream<char, std::char_traits<char> >"),
3612 NL ("basic_istream") },
3613 { 'o', NL ("std::ostream"),
3614 NL ("std::basic_ostream<char, std::char_traits<char> >"),
3615 NL ("basic_ostream") },
3616 { 'd', NL ("std::iostream"),
3617 NL ("std::basic_iostream<char, std::char_traits<char> >"),
3618 NL ("basic_iostream") }
3621 static struct demangle_component *
3622 d_substitution (struct d_info *di, int prefix)
3624 char c;
3626 if (! d_check_char (di, 'S'))
3627 return NULL;
3629 c = d_next_char (di);
3630 if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
3632 unsigned int id;
3634 id = 0;
3635 if (c != '_')
3639 unsigned int new_id;
3641 if (IS_DIGIT (c))
3642 new_id = id * 36 + c - '0';
3643 else if (IS_UPPER (c))
3644 new_id = id * 36 + c - 'A' + 10;
3645 else
3646 return NULL;
3647 if (new_id < id)
3648 return NULL;
3649 id = new_id;
3650 c = d_next_char (di);
3652 while (c != '_');
3654 ++id;
3657 if (id >= (unsigned int) di->next_sub)
3658 return NULL;
3660 ++di->did_subs;
3662 return di->subs[id];
3664 else
3666 int verbose;
3667 const struct d_standard_sub_info *p;
3668 const struct d_standard_sub_info *pend;
3670 verbose = (di->options & DMGL_VERBOSE) != 0;
3671 if (! verbose && prefix)
3673 char peek;
3675 peek = d_peek_char (di);
3676 if (peek == 'C' || peek == 'D')
3677 verbose = 1;
3680 pend = (&standard_subs[0]
3681 + sizeof standard_subs / sizeof standard_subs[0]);
3682 for (p = &standard_subs[0]; p < pend; ++p)
3684 if (c == p->code)
3686 const char *s;
3687 int len;
3689 if (p->set_last_name != NULL)
3690 di->last_name = d_make_sub (di, p->set_last_name,
3691 p->set_last_name_len);
3692 if (verbose)
3694 s = p->full_expansion;
3695 len = p->full_len;
3697 else
3699 s = p->simple_expansion;
3700 len = p->simple_len;
3702 di->expansion += len;
3703 return d_make_sub (di, s, len);
3707 return NULL;
3711 static void
3712 d_checkpoint (struct d_info *di, struct d_info_checkpoint *checkpoint)
3714 checkpoint->n = di->n;
3715 checkpoint->next_comp = di->next_comp;
3716 checkpoint->next_sub = di->next_sub;
3717 checkpoint->did_subs = di->did_subs;
3718 checkpoint->expansion = di->expansion;
3721 static void
3722 d_backtrack (struct d_info *di, struct d_info_checkpoint *checkpoint)
3724 di->n = checkpoint->n;
3725 di->next_comp = checkpoint->next_comp;
3726 di->next_sub = checkpoint->next_sub;
3727 di->did_subs = checkpoint->did_subs;
3728 di->expansion = checkpoint->expansion;
3731 /* Initialize a growable string. */
3733 static void
3734 d_growable_string_init (struct d_growable_string *dgs, size_t estimate)
3736 dgs->buf = NULL;
3737 dgs->len = 0;
3738 dgs->alc = 0;
3739 dgs->allocation_failure = 0;
3741 if (estimate > 0)
3742 d_growable_string_resize (dgs, estimate);
3745 /* Grow a growable string to a given size. */
3747 static inline void
3748 d_growable_string_resize (struct d_growable_string *dgs, size_t need)
3750 size_t newalc;
3751 char *newbuf;
3753 if (dgs->allocation_failure)
3754 return;
3756 /* Start allocation at two bytes to avoid any possibility of confusion
3757 with the special value of 1 used as a return in *palc to indicate
3758 allocation failures. */
3759 newalc = dgs->alc > 0 ? dgs->alc : 2;
3760 while (newalc < need)
3761 newalc <<= 1;
3763 newbuf = (char *) realloc (dgs->buf, newalc);
3764 if (newbuf == NULL)
3766 free (dgs->buf);
3767 dgs->buf = NULL;
3768 dgs->len = 0;
3769 dgs->alc = 0;
3770 dgs->allocation_failure = 1;
3771 return;
3773 dgs->buf = newbuf;
3774 dgs->alc = newalc;
3777 /* Append a buffer to a growable string. */
3779 static inline void
3780 d_growable_string_append_buffer (struct d_growable_string *dgs,
3781 const char *s, size_t l)
3783 size_t need;
3785 need = dgs->len + l + 1;
3786 if (need > dgs->alc)
3787 d_growable_string_resize (dgs, need);
3789 if (dgs->allocation_failure)
3790 return;
3792 memcpy (dgs->buf + dgs->len, s, l);
3793 dgs->buf[dgs->len + l] = '\0';
3794 dgs->len += l;
3797 /* Bridge growable strings to the callback mechanism. */
3799 static void
3800 d_growable_string_callback_adapter (const char *s, size_t l, void *opaque)
3802 struct d_growable_string *dgs = (struct d_growable_string*) opaque;
3804 d_growable_string_append_buffer (dgs, s, l);
3807 /* Walk the tree, counting the number of templates encountered, and
3808 the number of times a scope might be saved. These counts will be
3809 used to allocate data structures for d_print_comp, so the logic
3810 here must mirror the logic d_print_comp will use. It is not
3811 important that the resulting numbers are exact, so long as they
3812 are larger than the actual numbers encountered. */
3814 static void
3815 d_count_templates_scopes (int *num_templates, int *num_scopes,
3816 const struct demangle_component *dc)
3818 if (dc == NULL)
3819 return;
3821 switch (dc->type)
3823 case DEMANGLE_COMPONENT_NAME:
3824 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
3825 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
3826 case DEMANGLE_COMPONENT_SUB_STD:
3827 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
3828 case DEMANGLE_COMPONENT_OPERATOR:
3829 case DEMANGLE_COMPONENT_CHARACTER:
3830 case DEMANGLE_COMPONENT_NUMBER:
3831 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
3832 break;
3834 case DEMANGLE_COMPONENT_TEMPLATE:
3835 (*num_templates)++;
3836 goto recurse_left_right;
3838 case DEMANGLE_COMPONENT_REFERENCE:
3839 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
3840 if (d_left (dc)->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
3841 (*num_scopes)++;
3842 goto recurse_left_right;
3844 case DEMANGLE_COMPONENT_QUAL_NAME:
3845 case DEMANGLE_COMPONENT_LOCAL_NAME:
3846 case DEMANGLE_COMPONENT_TYPED_NAME:
3847 case DEMANGLE_COMPONENT_VTABLE:
3848 case DEMANGLE_COMPONENT_VTT:
3849 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
3850 case DEMANGLE_COMPONENT_TYPEINFO:
3851 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
3852 case DEMANGLE_COMPONENT_TYPEINFO_FN:
3853 case DEMANGLE_COMPONENT_THUNK:
3854 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
3855 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
3856 case DEMANGLE_COMPONENT_JAVA_CLASS:
3857 case DEMANGLE_COMPONENT_GUARD:
3858 case DEMANGLE_COMPONENT_TLS_INIT:
3859 case DEMANGLE_COMPONENT_TLS_WRAPPER:
3860 case DEMANGLE_COMPONENT_REFTEMP:
3861 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
3862 case DEMANGLE_COMPONENT_RESTRICT:
3863 case DEMANGLE_COMPONENT_VOLATILE:
3864 case DEMANGLE_COMPONENT_CONST:
3865 case DEMANGLE_COMPONENT_RESTRICT_THIS:
3866 case DEMANGLE_COMPONENT_VOLATILE_THIS:
3867 case DEMANGLE_COMPONENT_CONST_THIS:
3868 case DEMANGLE_COMPONENT_REFERENCE_THIS:
3869 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
3870 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
3871 case DEMANGLE_COMPONENT_POINTER:
3872 case DEMANGLE_COMPONENT_COMPLEX:
3873 case DEMANGLE_COMPONENT_IMAGINARY:
3874 case DEMANGLE_COMPONENT_VENDOR_TYPE:
3875 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
3876 case DEMANGLE_COMPONENT_ARRAY_TYPE:
3877 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
3878 case DEMANGLE_COMPONENT_FIXED_TYPE:
3879 case DEMANGLE_COMPONENT_VECTOR_TYPE:
3880 case DEMANGLE_COMPONENT_ARGLIST:
3881 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
3882 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
3883 case DEMANGLE_COMPONENT_CAST:
3884 case DEMANGLE_COMPONENT_NULLARY:
3885 case DEMANGLE_COMPONENT_UNARY:
3886 case DEMANGLE_COMPONENT_BINARY:
3887 case DEMANGLE_COMPONENT_BINARY_ARGS:
3888 case DEMANGLE_COMPONENT_TRINARY:
3889 case DEMANGLE_COMPONENT_TRINARY_ARG1:
3890 case DEMANGLE_COMPONENT_TRINARY_ARG2:
3891 case DEMANGLE_COMPONENT_LITERAL:
3892 case DEMANGLE_COMPONENT_LITERAL_NEG:
3893 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
3894 case DEMANGLE_COMPONENT_COMPOUND_NAME:
3895 case DEMANGLE_COMPONENT_DECLTYPE:
3896 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
3897 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
3898 case DEMANGLE_COMPONENT_PACK_EXPANSION:
3899 case DEMANGLE_COMPONENT_TAGGED_NAME:
3900 case DEMANGLE_COMPONENT_CLONE:
3901 recurse_left_right:
3902 d_count_templates_scopes (num_templates, num_scopes,
3903 d_left (dc));
3904 d_count_templates_scopes (num_templates, num_scopes,
3905 d_right (dc));
3906 break;
3908 case DEMANGLE_COMPONENT_CTOR:
3909 d_count_templates_scopes (num_templates, num_scopes,
3910 dc->u.s_ctor.name);
3911 break;
3913 case DEMANGLE_COMPONENT_DTOR:
3914 d_count_templates_scopes (num_templates, num_scopes,
3915 dc->u.s_dtor.name);
3916 break;
3918 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
3919 d_count_templates_scopes (num_templates, num_scopes,
3920 dc->u.s_extended_operator.name);
3921 break;
3923 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
3924 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
3925 d_count_templates_scopes (num_templates, num_scopes,
3926 d_left (dc));
3927 break;
3929 case DEMANGLE_COMPONENT_LAMBDA:
3930 case DEMANGLE_COMPONENT_DEFAULT_ARG:
3931 d_count_templates_scopes (num_templates, num_scopes,
3932 dc->u.s_unary_num.sub);
3933 break;
3937 /* Initialize a print information structure. */
3939 static void
3940 d_print_init (struct d_print_info *dpi, demangle_callbackref callback,
3941 void *opaque, const struct demangle_component *dc)
3943 dpi->len = 0;
3944 dpi->last_char = '\0';
3945 dpi->templates = NULL;
3946 dpi->modifiers = NULL;
3947 dpi->pack_index = 0;
3948 dpi->flush_count = 0;
3950 dpi->callback = callback;
3951 dpi->opaque = opaque;
3953 dpi->demangle_failure = 0;
3955 dpi->component_stack = NULL;
3957 dpi->saved_scopes = NULL;
3958 dpi->next_saved_scope = 0;
3959 dpi->num_saved_scopes = 0;
3961 dpi->copy_templates = NULL;
3962 dpi->next_copy_template = 0;
3963 dpi->num_copy_templates = 0;
3965 d_count_templates_scopes (&dpi->num_copy_templates,
3966 &dpi->num_saved_scopes, dc);
3967 dpi->num_copy_templates *= dpi->num_saved_scopes;
3969 dpi->current_template = NULL;
3972 /* Indicate that an error occurred during printing, and test for error. */
3974 static inline void
3975 d_print_error (struct d_print_info *dpi)
3977 dpi->demangle_failure = 1;
3980 static inline int
3981 d_print_saw_error (struct d_print_info *dpi)
3983 return dpi->demangle_failure != 0;
3986 /* Flush buffered characters to the callback. */
3988 static inline void
3989 d_print_flush (struct d_print_info *dpi)
3991 dpi->buf[dpi->len] = '\0';
3992 dpi->callback (dpi->buf, dpi->len, dpi->opaque);
3993 dpi->len = 0;
3994 dpi->flush_count++;
3997 /* Append characters and buffers for printing. */
3999 static inline void
4000 d_append_char (struct d_print_info *dpi, char c)
4002 if (dpi->len == sizeof (dpi->buf) - 1)
4003 d_print_flush (dpi);
4005 dpi->buf[dpi->len++] = c;
4006 dpi->last_char = c;
4009 static inline void
4010 d_append_buffer (struct d_print_info *dpi, const char *s, size_t l)
4012 size_t i;
4014 for (i = 0; i < l; i++)
4015 d_append_char (dpi, s[i]);
4018 static inline void
4019 d_append_string (struct d_print_info *dpi, const char *s)
4021 d_append_buffer (dpi, s, strlen (s));
4024 static inline void
4025 d_append_num (struct d_print_info *dpi, long l)
4027 char buf[25];
4028 sprintf (buf,"%ld", l);
4029 d_append_string (dpi, buf);
4032 static inline char
4033 d_last_char (struct d_print_info *dpi)
4035 return dpi->last_char;
4038 /* Turn components into a human readable string. OPTIONS is the
4039 options bits passed to the demangler. DC is the tree to print.
4040 CALLBACK is a function to call to flush demangled string segments
4041 as they fill the intermediate buffer, and OPAQUE is a generalized
4042 callback argument. On success, this returns 1. On failure,
4043 it returns 0, indicating a bad parse. It does not use heap
4044 memory to build an output string, so cannot encounter memory
4045 allocation failure. */
4047 CP_STATIC_IF_GLIBCPP_V3
4049 cplus_demangle_print_callback (int options,
4050 const struct demangle_component *dc,
4051 demangle_callbackref callback, void *opaque)
4053 struct d_print_info dpi;
4055 d_print_init (&dpi, callback, opaque, dc);
4058 #ifdef CP_DYNAMIC_ARRAYS
4059 __extension__ struct d_saved_scope scopes[dpi.num_saved_scopes];
4060 __extension__ struct d_print_template temps[dpi.num_copy_templates];
4062 dpi.saved_scopes = scopes;
4063 dpi.copy_templates = temps;
4064 #else
4065 dpi.saved_scopes = alloca (dpi.num_saved_scopes
4066 * sizeof (*dpi.saved_scopes));
4067 dpi.copy_templates = alloca (dpi.num_copy_templates
4068 * sizeof (*dpi.copy_templates));
4069 #endif
4071 d_print_comp (&dpi, options, dc);
4074 d_print_flush (&dpi);
4076 return ! d_print_saw_error (&dpi);
4079 /* Turn components into a human readable string. OPTIONS is the
4080 options bits passed to the demangler. DC is the tree to print.
4081 ESTIMATE is a guess at the length of the result. This returns a
4082 string allocated by malloc, or NULL on error. On success, this
4083 sets *PALC to the size of the allocated buffer. On failure, this
4084 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
4085 failure. */
4087 CP_STATIC_IF_GLIBCPP_V3
4088 char *
4089 cplus_demangle_print (int options, const struct demangle_component *dc,
4090 int estimate, size_t *palc)
4092 struct d_growable_string dgs;
4094 d_growable_string_init (&dgs, estimate);
4096 if (! cplus_demangle_print_callback (options, dc,
4097 d_growable_string_callback_adapter,
4098 &dgs))
4100 free (dgs.buf);
4101 *palc = 0;
4102 return NULL;
4105 *palc = dgs.allocation_failure ? 1 : dgs.alc;
4106 return dgs.buf;
4109 /* Returns the I'th element of the template arglist ARGS, or NULL on
4110 failure. */
4112 static struct demangle_component *
4113 d_index_template_argument (struct demangle_component *args, int i)
4115 struct demangle_component *a;
4117 for (a = args;
4118 a != NULL;
4119 a = d_right (a))
4121 if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4122 return NULL;
4123 if (i <= 0)
4124 break;
4125 --i;
4127 if (i != 0 || a == NULL)
4128 return NULL;
4130 return d_left (a);
4133 /* Returns the template argument from the current context indicated by DC,
4134 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
4136 static struct demangle_component *
4137 d_lookup_template_argument (struct d_print_info *dpi,
4138 const struct demangle_component *dc)
4140 if (dpi->templates == NULL)
4142 d_print_error (dpi);
4143 return NULL;
4146 return d_index_template_argument
4147 (d_right (dpi->templates->template_decl),
4148 dc->u.s_number.number);
4151 /* Returns a template argument pack used in DC (any will do), or NULL. */
4153 static struct demangle_component *
4154 d_find_pack (struct d_print_info *dpi,
4155 const struct demangle_component *dc)
4157 struct demangle_component *a;
4158 if (dc == NULL)
4159 return NULL;
4161 switch (dc->type)
4163 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4164 a = d_lookup_template_argument (dpi, dc);
4165 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4166 return a;
4167 return NULL;
4169 case DEMANGLE_COMPONENT_PACK_EXPANSION:
4170 return NULL;
4172 case DEMANGLE_COMPONENT_LAMBDA:
4173 case DEMANGLE_COMPONENT_NAME:
4174 case DEMANGLE_COMPONENT_TAGGED_NAME:
4175 case DEMANGLE_COMPONENT_OPERATOR:
4176 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4177 case DEMANGLE_COMPONENT_SUB_STD:
4178 case DEMANGLE_COMPONENT_CHARACTER:
4179 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
4180 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
4181 return NULL;
4183 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4184 return d_find_pack (dpi, dc->u.s_extended_operator.name);
4185 case DEMANGLE_COMPONENT_CTOR:
4186 return d_find_pack (dpi, dc->u.s_ctor.name);
4187 case DEMANGLE_COMPONENT_DTOR:
4188 return d_find_pack (dpi, dc->u.s_dtor.name);
4190 default:
4191 a = d_find_pack (dpi, d_left (dc));
4192 if (a)
4193 return a;
4194 return d_find_pack (dpi, d_right (dc));
4198 /* Returns the length of the template argument pack DC. */
4200 static int
4201 d_pack_length (const struct demangle_component *dc)
4203 int count = 0;
4204 while (dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
4205 && d_left (dc) != NULL)
4207 ++count;
4208 dc = d_right (dc);
4210 return count;
4213 /* DC is a component of a mangled expression. Print it, wrapped in parens
4214 if needed. */
4216 static void
4217 d_print_subexpr (struct d_print_info *dpi, int options,
4218 const struct demangle_component *dc)
4220 int simple = 0;
4221 if (dc->type == DEMANGLE_COMPONENT_NAME
4222 || dc->type == DEMANGLE_COMPONENT_QUAL_NAME
4223 || dc->type == DEMANGLE_COMPONENT_INITIALIZER_LIST
4224 || dc->type == DEMANGLE_COMPONENT_FUNCTION_PARAM)
4225 simple = 1;
4226 if (!simple)
4227 d_append_char (dpi, '(');
4228 d_print_comp (dpi, options, dc);
4229 if (!simple)
4230 d_append_char (dpi, ')');
4233 /* Save the current scope. */
4235 static void
4236 d_save_scope (struct d_print_info *dpi,
4237 const struct demangle_component *container)
4239 struct d_saved_scope *scope;
4240 struct d_print_template *src, **link;
4242 if (dpi->next_saved_scope >= dpi->num_saved_scopes)
4244 d_print_error (dpi);
4245 return;
4247 scope = &dpi->saved_scopes[dpi->next_saved_scope];
4248 dpi->next_saved_scope++;
4250 scope->container = container;
4251 link = &scope->templates;
4253 for (src = dpi->templates; src != NULL; src = src->next)
4255 struct d_print_template *dst;
4257 if (dpi->next_copy_template >= dpi->num_copy_templates)
4259 d_print_error (dpi);
4260 return;
4262 dst = &dpi->copy_templates[dpi->next_copy_template];
4263 dpi->next_copy_template++;
4265 dst->template_decl = src->template_decl;
4266 *link = dst;
4267 link = &dst->next;
4270 *link = NULL;
4273 /* Attempt to locate a previously saved scope. Returns NULL if no
4274 corresponding saved scope was found. */
4276 static struct d_saved_scope *
4277 d_get_saved_scope (struct d_print_info *dpi,
4278 const struct demangle_component *container)
4280 int i;
4282 for (i = 0; i < dpi->next_saved_scope; i++)
4283 if (dpi->saved_scopes[i].container == container)
4284 return &dpi->saved_scopes[i];
4286 return NULL;
4289 /* Subroutine to handle components. */
4291 static void
4292 d_print_comp_inner (struct d_print_info *dpi, int options,
4293 const struct demangle_component *dc)
4295 /* Magic variable to let reference smashing skip over the next modifier
4296 without needing to modify *dc. */
4297 const struct demangle_component *mod_inner = NULL;
4299 /* Variable used to store the current templates while a previously
4300 captured scope is used. */
4301 struct d_print_template *saved_templates;
4303 /* Nonzero if templates have been stored in the above variable. */
4304 int need_template_restore = 0;
4306 if (dc == NULL)
4308 d_print_error (dpi);
4309 return;
4311 if (d_print_saw_error (dpi))
4312 return;
4314 switch (dc->type)
4316 case DEMANGLE_COMPONENT_NAME:
4317 if ((options & DMGL_JAVA) == 0)
4318 d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len);
4319 else
4320 d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
4321 return;
4323 case DEMANGLE_COMPONENT_TAGGED_NAME:
4324 d_print_comp (dpi, options, d_left (dc));
4325 d_append_string (dpi, "[abi:");
4326 d_print_comp (dpi, options, d_right (dc));
4327 d_append_char (dpi, ']');
4328 return;
4330 case DEMANGLE_COMPONENT_QUAL_NAME:
4331 case DEMANGLE_COMPONENT_LOCAL_NAME:
4332 d_print_comp (dpi, options, d_left (dc));
4333 if ((options & DMGL_JAVA) == 0)
4334 d_append_string (dpi, "::");
4335 else
4336 d_append_char (dpi, '.');
4338 struct demangle_component *local_name = d_right (dc);
4339 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4341 d_append_string (dpi, "{default arg#");
4342 d_append_num (dpi, local_name->u.s_unary_num.num + 1);
4343 d_append_string (dpi, "}::");
4344 local_name = local_name->u.s_unary_num.sub;
4346 d_print_comp (dpi, options, local_name);
4348 return;
4350 case DEMANGLE_COMPONENT_TYPED_NAME:
4352 struct d_print_mod *hold_modifiers;
4353 struct demangle_component *typed_name;
4354 struct d_print_mod adpm[4];
4355 unsigned int i;
4356 struct d_print_template dpt;
4358 /* Pass the name down to the type so that it can be printed in
4359 the right place for the type. We also have to pass down
4360 any CV-qualifiers, which apply to the this parameter. */
4361 hold_modifiers = dpi->modifiers;
4362 dpi->modifiers = 0;
4363 i = 0;
4364 typed_name = d_left (dc);
4365 while (typed_name != NULL)
4367 if (i >= sizeof adpm / sizeof adpm[0])
4369 d_print_error (dpi);
4370 return;
4373 adpm[i].next = dpi->modifiers;
4374 dpi->modifiers = &adpm[i];
4375 adpm[i].mod = typed_name;
4376 adpm[i].printed = 0;
4377 adpm[i].templates = dpi->templates;
4378 ++i;
4380 if (typed_name->type != DEMANGLE_COMPONENT_RESTRICT_THIS
4381 && typed_name->type != DEMANGLE_COMPONENT_VOLATILE_THIS
4382 && typed_name->type != DEMANGLE_COMPONENT_CONST_THIS
4383 && typed_name->type != DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
4384 && typed_name->type != DEMANGLE_COMPONENT_REFERENCE_THIS)
4385 break;
4387 typed_name = d_left (typed_name);
4390 if (typed_name == NULL)
4392 d_print_error (dpi);
4393 return;
4396 /* If typed_name is a template, then it applies to the
4397 function type as well. */
4398 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
4400 dpt.next = dpi->templates;
4401 dpi->templates = &dpt;
4402 dpt.template_decl = typed_name;
4405 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
4406 there may be CV-qualifiers on its right argument which
4407 really apply here; this happens when parsing a class which
4408 is local to a function. */
4409 if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME)
4411 struct demangle_component *local_name;
4413 local_name = d_right (typed_name);
4414 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4415 local_name = local_name->u.s_unary_num.sub;
4416 while (local_name->type == DEMANGLE_COMPONENT_RESTRICT_THIS
4417 || local_name->type == DEMANGLE_COMPONENT_VOLATILE_THIS
4418 || local_name->type == DEMANGLE_COMPONENT_CONST_THIS
4419 || local_name->type == DEMANGLE_COMPONENT_REFERENCE_THIS
4420 || (local_name->type
4421 == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS))
4423 if (i >= sizeof adpm / sizeof adpm[0])
4425 d_print_error (dpi);
4426 return;
4429 adpm[i] = adpm[i - 1];
4430 adpm[i].next = &adpm[i - 1];
4431 dpi->modifiers = &adpm[i];
4433 adpm[i - 1].mod = local_name;
4434 adpm[i - 1].printed = 0;
4435 adpm[i - 1].templates = dpi->templates;
4436 ++i;
4438 local_name = d_left (local_name);
4442 d_print_comp (dpi, options, d_right (dc));
4444 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
4445 dpi->templates = dpt.next;
4447 /* If the modifiers didn't get printed by the type, print them
4448 now. */
4449 while (i > 0)
4451 --i;
4452 if (! adpm[i].printed)
4454 d_append_char (dpi, ' ');
4455 d_print_mod (dpi, options, adpm[i].mod);
4459 dpi->modifiers = hold_modifiers;
4461 return;
4464 case DEMANGLE_COMPONENT_TEMPLATE:
4466 struct d_print_mod *hold_dpm;
4467 struct demangle_component *dcl;
4468 const struct demangle_component *hold_current;
4470 /* This template may need to be referenced by a cast operator
4471 contained in its subtree. */
4472 hold_current = dpi->current_template;
4473 dpi->current_template = dc;
4475 /* Don't push modifiers into a template definition. Doing so
4476 could give the wrong definition for a template argument.
4477 Instead, treat the template essentially as a name. */
4479 hold_dpm = dpi->modifiers;
4480 dpi->modifiers = NULL;
4482 dcl = d_left (dc);
4484 if ((options & DMGL_JAVA) != 0
4485 && dcl->type == DEMANGLE_COMPONENT_NAME
4486 && dcl->u.s_name.len == 6
4487 && strncmp (dcl->u.s_name.s, "JArray", 6) == 0)
4489 /* Special-case Java arrays, so that JArray<TYPE> appears
4490 instead as TYPE[]. */
4492 d_print_comp (dpi, options, d_right (dc));
4493 d_append_string (dpi, "[]");
4495 else
4497 d_print_comp (dpi, options, dcl);
4498 if (d_last_char (dpi) == '<')
4499 d_append_char (dpi, ' ');
4500 d_append_char (dpi, '<');
4501 d_print_comp (dpi, options, d_right (dc));
4502 /* Avoid generating two consecutive '>' characters, to avoid
4503 the C++ syntactic ambiguity. */
4504 if (d_last_char (dpi) == '>')
4505 d_append_char (dpi, ' ');
4506 d_append_char (dpi, '>');
4509 dpi->modifiers = hold_dpm;
4510 dpi->current_template = hold_current;
4512 return;
4515 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4517 struct d_print_template *hold_dpt;
4518 struct demangle_component *a = d_lookup_template_argument (dpi, dc);
4520 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4521 a = d_index_template_argument (a, dpi->pack_index);
4523 if (a == NULL)
4525 d_print_error (dpi);
4526 return;
4529 /* While processing this parameter, we need to pop the list of
4530 templates. This is because the template parameter may
4531 itself be a reference to a parameter of an outer
4532 template. */
4534 hold_dpt = dpi->templates;
4535 dpi->templates = hold_dpt->next;
4537 d_print_comp (dpi, options, a);
4539 dpi->templates = hold_dpt;
4541 return;
4544 case DEMANGLE_COMPONENT_CTOR:
4545 d_print_comp (dpi, options, dc->u.s_ctor.name);
4546 return;
4548 case DEMANGLE_COMPONENT_DTOR:
4549 d_append_char (dpi, '~');
4550 d_print_comp (dpi, options, dc->u.s_dtor.name);
4551 return;
4553 case DEMANGLE_COMPONENT_VTABLE:
4554 d_append_string (dpi, "vtable for ");
4555 d_print_comp (dpi, options, d_left (dc));
4556 return;
4558 case DEMANGLE_COMPONENT_VTT:
4559 d_append_string (dpi, "VTT for ");
4560 d_print_comp (dpi, options, d_left (dc));
4561 return;
4563 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
4564 d_append_string (dpi, "construction vtable for ");
4565 d_print_comp (dpi, options, d_left (dc));
4566 d_append_string (dpi, "-in-");
4567 d_print_comp (dpi, options, d_right (dc));
4568 return;
4570 case DEMANGLE_COMPONENT_TYPEINFO:
4571 d_append_string (dpi, "typeinfo for ");
4572 d_print_comp (dpi, options, d_left (dc));
4573 return;
4575 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
4576 d_append_string (dpi, "typeinfo name for ");
4577 d_print_comp (dpi, options, d_left (dc));
4578 return;
4580 case DEMANGLE_COMPONENT_TYPEINFO_FN:
4581 d_append_string (dpi, "typeinfo fn for ");
4582 d_print_comp (dpi, options, d_left (dc));
4583 return;
4585 case DEMANGLE_COMPONENT_THUNK:
4586 d_append_string (dpi, "non-virtual thunk to ");
4587 d_print_comp (dpi, options, d_left (dc));
4588 return;
4590 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
4591 d_append_string (dpi, "virtual thunk to ");
4592 d_print_comp (dpi, options, d_left (dc));
4593 return;
4595 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
4596 d_append_string (dpi, "covariant return thunk to ");
4597 d_print_comp (dpi, options, d_left (dc));
4598 return;
4600 case DEMANGLE_COMPONENT_JAVA_CLASS:
4601 d_append_string (dpi, "java Class for ");
4602 d_print_comp (dpi, options, d_left (dc));
4603 return;
4605 case DEMANGLE_COMPONENT_GUARD:
4606 d_append_string (dpi, "guard variable for ");
4607 d_print_comp (dpi, options, d_left (dc));
4608 return;
4610 case DEMANGLE_COMPONENT_TLS_INIT:
4611 d_append_string (dpi, "TLS init function for ");
4612 d_print_comp (dpi, options, d_left (dc));
4613 return;
4615 case DEMANGLE_COMPONENT_TLS_WRAPPER:
4616 d_append_string (dpi, "TLS wrapper function for ");
4617 d_print_comp (dpi, options, d_left (dc));
4618 return;
4620 case DEMANGLE_COMPONENT_REFTEMP:
4621 d_append_string (dpi, "reference temporary #");
4622 d_print_comp (dpi, options, d_right (dc));
4623 d_append_string (dpi, " for ");
4624 d_print_comp (dpi, options, d_left (dc));
4625 return;
4627 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
4628 d_append_string (dpi, "hidden alias for ");
4629 d_print_comp (dpi, options, d_left (dc));
4630 return;
4632 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
4633 d_append_string (dpi, "transaction clone for ");
4634 d_print_comp (dpi, options, d_left (dc));
4635 return;
4637 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
4638 d_append_string (dpi, "non-transaction clone for ");
4639 d_print_comp (dpi, options, d_left (dc));
4640 return;
4642 case DEMANGLE_COMPONENT_SUB_STD:
4643 d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len);
4644 return;
4646 case DEMANGLE_COMPONENT_RESTRICT:
4647 case DEMANGLE_COMPONENT_VOLATILE:
4648 case DEMANGLE_COMPONENT_CONST:
4650 struct d_print_mod *pdpm;
4652 /* When printing arrays, it's possible to have cases where the
4653 same CV-qualifier gets pushed on the stack multiple times.
4654 We only need to print it once. */
4656 for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next)
4658 if (! pdpm->printed)
4660 if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT
4661 && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE
4662 && pdpm->mod->type != DEMANGLE_COMPONENT_CONST)
4663 break;
4664 if (pdpm->mod->type == dc->type)
4666 d_print_comp (dpi, options, d_left (dc));
4667 return;
4672 goto modifier;
4674 case DEMANGLE_COMPONENT_REFERENCE:
4675 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
4677 /* Handle reference smashing: & + && = &. */
4678 const struct demangle_component *sub = d_left (dc);
4679 if (sub->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
4681 struct d_saved_scope *scope = d_get_saved_scope (dpi, sub);
4682 struct demangle_component *a;
4684 if (scope == NULL)
4686 /* This is the first time SUB has been traversed.
4687 We need to capture the current templates so
4688 they can be restored if SUB is reentered as a
4689 substitution. */
4690 d_save_scope (dpi, sub);
4691 if (d_print_saw_error (dpi))
4692 return;
4694 else
4696 const struct d_component_stack *dcse;
4697 int found_self_or_parent = 0;
4699 /* This traversal is reentering SUB as a substition.
4700 If we are not beneath SUB or DC in the tree then we
4701 need to restore SUB's template stack temporarily. */
4702 for (dcse = dpi->component_stack; dcse != NULL;
4703 dcse = dcse->parent)
4705 if (dcse->dc == sub
4706 || (dcse->dc == dc
4707 && dcse != dpi->component_stack))
4709 found_self_or_parent = 1;
4710 break;
4714 if (!found_self_or_parent)
4716 saved_templates = dpi->templates;
4717 dpi->templates = scope->templates;
4718 need_template_restore = 1;
4722 a = d_lookup_template_argument (dpi, sub);
4723 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4724 a = d_index_template_argument (a, dpi->pack_index);
4726 if (a == NULL)
4728 if (need_template_restore)
4729 dpi->templates = saved_templates;
4731 d_print_error (dpi);
4732 return;
4735 sub = a;
4738 if (sub->type == DEMANGLE_COMPONENT_REFERENCE
4739 || sub->type == dc->type)
4740 dc = sub;
4741 else if (sub->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE)
4742 mod_inner = d_left (sub);
4744 /* Fall through. */
4746 case DEMANGLE_COMPONENT_RESTRICT_THIS:
4747 case DEMANGLE_COMPONENT_VOLATILE_THIS:
4748 case DEMANGLE_COMPONENT_CONST_THIS:
4749 case DEMANGLE_COMPONENT_REFERENCE_THIS:
4750 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
4751 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
4752 case DEMANGLE_COMPONENT_POINTER:
4753 case DEMANGLE_COMPONENT_COMPLEX:
4754 case DEMANGLE_COMPONENT_IMAGINARY:
4755 modifier:
4757 /* We keep a list of modifiers on the stack. */
4758 struct d_print_mod dpm;
4760 dpm.next = dpi->modifiers;
4761 dpi->modifiers = &dpm;
4762 dpm.mod = dc;
4763 dpm.printed = 0;
4764 dpm.templates = dpi->templates;
4766 if (!mod_inner)
4767 mod_inner = d_left (dc);
4769 d_print_comp (dpi, options, mod_inner);
4771 /* If the modifier didn't get printed by the type, print it
4772 now. */
4773 if (! dpm.printed)
4774 d_print_mod (dpi, options, dc);
4776 dpi->modifiers = dpm.next;
4778 if (need_template_restore)
4779 dpi->templates = saved_templates;
4781 return;
4784 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4785 if ((options & DMGL_JAVA) == 0)
4786 d_append_buffer (dpi, dc->u.s_builtin.type->name,
4787 dc->u.s_builtin.type->len);
4788 else
4789 d_append_buffer (dpi, dc->u.s_builtin.type->java_name,
4790 dc->u.s_builtin.type->java_len);
4791 return;
4793 case DEMANGLE_COMPONENT_VENDOR_TYPE:
4794 d_print_comp (dpi, options, d_left (dc));
4795 return;
4797 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
4799 if ((options & DMGL_RET_POSTFIX) != 0)
4800 d_print_function_type (dpi,
4801 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4802 dc, dpi->modifiers);
4804 /* Print return type if present */
4805 if (d_left (dc) != NULL && (options & DMGL_RET_POSTFIX) != 0)
4806 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4807 d_left (dc));
4808 else if (d_left (dc) != NULL && (options & DMGL_RET_DROP) == 0)
4810 struct d_print_mod dpm;
4812 /* We must pass this type down as a modifier in order to
4813 print it in the right location. */
4814 dpm.next = dpi->modifiers;
4815 dpi->modifiers = &dpm;
4816 dpm.mod = dc;
4817 dpm.printed = 0;
4818 dpm.templates = dpi->templates;
4820 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4821 d_left (dc));
4823 dpi->modifiers = dpm.next;
4825 if (dpm.printed)
4826 return;
4828 /* In standard prefix notation, there is a space between the
4829 return type and the function signature. */
4830 if ((options & DMGL_RET_POSTFIX) == 0)
4831 d_append_char (dpi, ' ');
4834 if ((options & DMGL_RET_POSTFIX) == 0)
4835 d_print_function_type (dpi,
4836 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
4837 dc, dpi->modifiers);
4839 return;
4842 case DEMANGLE_COMPONENT_ARRAY_TYPE:
4844 struct d_print_mod *hold_modifiers;
4845 struct d_print_mod adpm[4];
4846 unsigned int i;
4847 struct d_print_mod *pdpm;
4849 /* We must pass this type down as a modifier in order to print
4850 multi-dimensional arrays correctly. If the array itself is
4851 CV-qualified, we act as though the element type were
4852 CV-qualified. We do this by copying the modifiers down
4853 rather than fiddling pointers, so that we don't wind up
4854 with a d_print_mod higher on the stack pointing into our
4855 stack frame after we return. */
4857 hold_modifiers = dpi->modifiers;
4859 adpm[0].next = hold_modifiers;
4860 dpi->modifiers = &adpm[0];
4861 adpm[0].mod = dc;
4862 adpm[0].printed = 0;
4863 adpm[0].templates = dpi->templates;
4865 i = 1;
4866 pdpm = hold_modifiers;
4867 while (pdpm != NULL
4868 && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT
4869 || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE
4870 || pdpm->mod->type == DEMANGLE_COMPONENT_CONST))
4872 if (! pdpm->printed)
4874 if (i >= sizeof adpm / sizeof adpm[0])
4876 d_print_error (dpi);
4877 return;
4880 adpm[i] = *pdpm;
4881 adpm[i].next = dpi->modifiers;
4882 dpi->modifiers = &adpm[i];
4883 pdpm->printed = 1;
4884 ++i;
4887 pdpm = pdpm->next;
4890 d_print_comp (dpi, options, d_right (dc));
4892 dpi->modifiers = hold_modifiers;
4894 if (adpm[0].printed)
4895 return;
4897 while (i > 1)
4899 --i;
4900 d_print_mod (dpi, options, adpm[i].mod);
4903 d_print_array_type (dpi, options, dc, dpi->modifiers);
4905 return;
4908 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
4909 case DEMANGLE_COMPONENT_VECTOR_TYPE:
4911 struct d_print_mod dpm;
4913 dpm.next = dpi->modifiers;
4914 dpi->modifiers = &dpm;
4915 dpm.mod = dc;
4916 dpm.printed = 0;
4917 dpm.templates = dpi->templates;
4919 d_print_comp (dpi, options, d_right (dc));
4921 /* If the modifier didn't get printed by the type, print it
4922 now. */
4923 if (! dpm.printed)
4924 d_print_mod (dpi, options, dc);
4926 dpi->modifiers = dpm.next;
4928 return;
4931 case DEMANGLE_COMPONENT_FIXED_TYPE:
4932 if (dc->u.s_fixed.sat)
4933 d_append_string (dpi, "_Sat ");
4934 /* Don't print "int _Accum". */
4935 if (dc->u.s_fixed.length->u.s_builtin.type
4936 != &cplus_demangle_builtin_types['i'-'a'])
4938 d_print_comp (dpi, options, dc->u.s_fixed.length);
4939 d_append_char (dpi, ' ');
4941 if (dc->u.s_fixed.accum)
4942 d_append_string (dpi, "_Accum");
4943 else
4944 d_append_string (dpi, "_Fract");
4945 return;
4947 case DEMANGLE_COMPONENT_ARGLIST:
4948 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
4949 if (d_left (dc) != NULL)
4950 d_print_comp (dpi, options, d_left (dc));
4951 if (d_right (dc) != NULL)
4953 size_t len;
4954 unsigned long int flush_count;
4955 /* Make sure ", " isn't flushed by d_append_string, otherwise
4956 dpi->len -= 2 wouldn't work. */
4957 if (dpi->len >= sizeof (dpi->buf) - 2)
4958 d_print_flush (dpi);
4959 d_append_string (dpi, ", ");
4960 len = dpi->len;
4961 flush_count = dpi->flush_count;
4962 d_print_comp (dpi, options, d_right (dc));
4963 /* If that didn't print anything (which can happen with empty
4964 template argument packs), remove the comma and space. */
4965 if (dpi->flush_count == flush_count && dpi->len == len)
4966 dpi->len -= 2;
4968 return;
4970 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
4972 struct demangle_component *type = d_left (dc);
4973 struct demangle_component *list = d_right (dc);
4975 if (type)
4976 d_print_comp (dpi, options, type);
4977 d_append_char (dpi, '{');
4978 d_print_comp (dpi, options, list);
4979 d_append_char (dpi, '}');
4981 return;
4983 case DEMANGLE_COMPONENT_OPERATOR:
4985 const struct demangle_operator_info *op = dc->u.s_operator.op;
4986 int len = op->len;
4988 d_append_string (dpi, "operator");
4989 /* Add a space before new/delete. */
4990 if (IS_LOWER (op->name[0]))
4991 d_append_char (dpi, ' ');
4992 /* Omit a trailing space. */
4993 if (op->name[len-1] == ' ')
4994 --len;
4995 d_append_buffer (dpi, op->name, len);
4996 return;
4999 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
5000 d_append_string (dpi, "operator ");
5001 d_print_comp (dpi, options, dc->u.s_extended_operator.name);
5002 return;
5004 case DEMANGLE_COMPONENT_CAST:
5005 d_append_string (dpi, "operator ");
5006 d_print_cast (dpi, options, dc);
5007 return;
5009 case DEMANGLE_COMPONENT_NULLARY:
5010 d_print_expr_op (dpi, options, d_left (dc));
5011 return;
5013 case DEMANGLE_COMPONENT_UNARY:
5015 struct demangle_component *op = d_left (dc);
5016 struct demangle_component *operand = d_right (dc);
5017 const char *code = NULL;
5019 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
5021 code = op->u.s_operator.op->code;
5022 if (!strcmp (code, "ad"))
5024 /* Don't print the argument list for the address of a
5025 function. */
5026 if (operand->type == DEMANGLE_COMPONENT_TYPED_NAME
5027 && d_left (operand)->type == DEMANGLE_COMPONENT_QUAL_NAME
5028 && d_right (operand)->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
5029 operand = d_left (operand);
5031 if (operand->type == DEMANGLE_COMPONENT_BINARY_ARGS)
5033 /* This indicates a suffix operator. */
5034 operand = d_left (operand);
5035 d_print_subexpr (dpi, options, operand);
5036 d_print_expr_op (dpi, options, op);
5037 return;
5041 if (op->type != DEMANGLE_COMPONENT_CAST)
5042 d_print_expr_op (dpi, options, op);
5043 else
5045 d_append_char (dpi, '(');
5046 d_print_cast (dpi, options, op);
5047 d_append_char (dpi, ')');
5049 if (code && !strcmp (code, "gs"))
5050 /* Avoid parens after '::'. */
5051 d_print_comp (dpi, options, operand);
5052 else if (code && !strcmp (code, "st"))
5053 /* Always print parens for sizeof (type). */
5055 d_append_char (dpi, '(');
5056 d_print_comp (dpi, options, operand);
5057 d_append_char (dpi, ')');
5059 else
5060 d_print_subexpr (dpi, options, operand);
5062 return;
5064 case DEMANGLE_COMPONENT_BINARY:
5065 if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS)
5067 d_print_error (dpi);
5068 return;
5071 if (op_is_new_cast (d_left (dc)))
5073 d_print_expr_op (dpi, options, d_left (dc));
5074 d_append_char (dpi, '<');
5075 d_print_comp (dpi, options, d_left (d_right (dc)));
5076 d_append_string (dpi, ">(");
5077 d_print_comp (dpi, options, d_right (d_right (dc)));
5078 d_append_char (dpi, ')');
5079 return;
5082 /* We wrap an expression which uses the greater-than operator in
5083 an extra layer of parens so that it does not get confused
5084 with the '>' which ends the template parameters. */
5085 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
5086 && d_left (dc)->u.s_operator.op->len == 1
5087 && d_left (dc)->u.s_operator.op->name[0] == '>')
5088 d_append_char (dpi, '(');
5090 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") == 0
5091 && d_left (d_right (dc))->type == DEMANGLE_COMPONENT_TYPED_NAME)
5093 /* Function call used in an expression should not have printed types
5094 of the function arguments. Values of the function arguments still
5095 get printed below. */
5097 const struct demangle_component *func = d_left (d_right (dc));
5099 if (d_right (func)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
5100 d_print_error (dpi);
5101 d_print_subexpr (dpi, options, d_left (func));
5103 else
5104 d_print_subexpr (dpi, options, d_left (d_right (dc)));
5105 if (strcmp (d_left (dc)->u.s_operator.op->code, "ix") == 0)
5107 d_append_char (dpi, '[');
5108 d_print_comp (dpi, options, d_right (d_right (dc)));
5109 d_append_char (dpi, ']');
5111 else
5113 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") != 0)
5114 d_print_expr_op (dpi, options, d_left (dc));
5115 d_print_subexpr (dpi, options, d_right (d_right (dc)));
5118 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
5119 && d_left (dc)->u.s_operator.op->len == 1
5120 && d_left (dc)->u.s_operator.op->name[0] == '>')
5121 d_append_char (dpi, ')');
5123 return;
5125 case DEMANGLE_COMPONENT_BINARY_ARGS:
5126 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
5127 d_print_error (dpi);
5128 return;
5130 case DEMANGLE_COMPONENT_TRINARY:
5131 if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1
5132 || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2)
5134 d_print_error (dpi);
5135 return;
5138 struct demangle_component *op = d_left (dc);
5139 struct demangle_component *first = d_left (d_right (dc));
5140 struct demangle_component *second = d_left (d_right (d_right (dc)));
5141 struct demangle_component *third = d_right (d_right (d_right (dc)));
5143 if (!strcmp (op->u.s_operator.op->code, "qu"))
5145 d_print_subexpr (dpi, options, first);
5146 d_print_expr_op (dpi, options, op);
5147 d_print_subexpr (dpi, options, second);
5148 d_append_string (dpi, " : ");
5149 d_print_subexpr (dpi, options, third);
5151 else
5153 d_append_string (dpi, "new ");
5154 if (d_left (first) != NULL)
5156 d_print_subexpr (dpi, options, first);
5157 d_append_char (dpi, ' ');
5159 d_print_comp (dpi, options, second);
5160 if (third)
5161 d_print_subexpr (dpi, options, third);
5164 return;
5166 case DEMANGLE_COMPONENT_TRINARY_ARG1:
5167 case DEMANGLE_COMPONENT_TRINARY_ARG2:
5168 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
5169 d_print_error (dpi);
5170 return;
5172 case DEMANGLE_COMPONENT_LITERAL:
5173 case DEMANGLE_COMPONENT_LITERAL_NEG:
5175 enum d_builtin_type_print tp;
5177 /* For some builtin types, produce simpler output. */
5178 tp = D_PRINT_DEFAULT;
5179 if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE)
5181 tp = d_left (dc)->u.s_builtin.type->print;
5182 switch (tp)
5184 case D_PRINT_INT:
5185 case D_PRINT_UNSIGNED:
5186 case D_PRINT_LONG:
5187 case D_PRINT_UNSIGNED_LONG:
5188 case D_PRINT_LONG_LONG:
5189 case D_PRINT_UNSIGNED_LONG_LONG:
5190 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME)
5192 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
5193 d_append_char (dpi, '-');
5194 d_print_comp (dpi, options, d_right (dc));
5195 switch (tp)
5197 default:
5198 break;
5199 case D_PRINT_UNSIGNED:
5200 d_append_char (dpi, 'u');
5201 break;
5202 case D_PRINT_LONG:
5203 d_append_char (dpi, 'l');
5204 break;
5205 case D_PRINT_UNSIGNED_LONG:
5206 d_append_string (dpi, "ul");
5207 break;
5208 case D_PRINT_LONG_LONG:
5209 d_append_string (dpi, "ll");
5210 break;
5211 case D_PRINT_UNSIGNED_LONG_LONG:
5212 d_append_string (dpi, "ull");
5213 break;
5215 return;
5217 break;
5219 case D_PRINT_BOOL:
5220 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME
5221 && d_right (dc)->u.s_name.len == 1
5222 && dc->type == DEMANGLE_COMPONENT_LITERAL)
5224 switch (d_right (dc)->u.s_name.s[0])
5226 case '0':
5227 d_append_string (dpi, "false");
5228 return;
5229 case '1':
5230 d_append_string (dpi, "true");
5231 return;
5232 default:
5233 break;
5236 break;
5238 default:
5239 break;
5243 d_append_char (dpi, '(');
5244 d_print_comp (dpi, options, d_left (dc));
5245 d_append_char (dpi, ')');
5246 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
5247 d_append_char (dpi, '-');
5248 if (tp == D_PRINT_FLOAT)
5249 d_append_char (dpi, '[');
5250 d_print_comp (dpi, options, d_right (dc));
5251 if (tp == D_PRINT_FLOAT)
5252 d_append_char (dpi, ']');
5254 return;
5256 case DEMANGLE_COMPONENT_NUMBER:
5257 d_append_num (dpi, dc->u.s_number.number);
5258 return;
5260 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
5261 d_append_string (dpi, "java resource ");
5262 d_print_comp (dpi, options, d_left (dc));
5263 return;
5265 case DEMANGLE_COMPONENT_COMPOUND_NAME:
5266 d_print_comp (dpi, options, d_left (dc));
5267 d_print_comp (dpi, options, d_right (dc));
5268 return;
5270 case DEMANGLE_COMPONENT_CHARACTER:
5271 d_append_char (dpi, dc->u.s_character.character);
5272 return;
5274 case DEMANGLE_COMPONENT_DECLTYPE:
5275 d_append_string (dpi, "decltype (");
5276 d_print_comp (dpi, options, d_left (dc));
5277 d_append_char (dpi, ')');
5278 return;
5280 case DEMANGLE_COMPONENT_PACK_EXPANSION:
5282 int len;
5283 int i;
5284 struct demangle_component *a = d_find_pack (dpi, d_left (dc));
5285 if (a == NULL)
5287 /* d_find_pack won't find anything if the only packs involved
5288 in this expansion are function parameter packs; in that
5289 case, just print the pattern and "...". */
5290 d_print_subexpr (dpi, options, d_left (dc));
5291 d_append_string (dpi, "...");
5292 return;
5295 len = d_pack_length (a);
5296 dc = d_left (dc);
5297 for (i = 0; i < len; ++i)
5299 dpi->pack_index = i;
5300 d_print_comp (dpi, options, dc);
5301 if (i < len-1)
5302 d_append_string (dpi, ", ");
5305 return;
5307 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
5309 long num = dc->u.s_number.number;
5310 if (num == 0)
5311 d_append_string (dpi, "this");
5312 else
5314 d_append_string (dpi, "{parm#");
5315 d_append_num (dpi, num);
5316 d_append_char (dpi, '}');
5319 return;
5321 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
5322 d_append_string (dpi, "global constructors keyed to ");
5323 d_print_comp (dpi, options, dc->u.s_binary.left);
5324 return;
5326 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
5327 d_append_string (dpi, "global destructors keyed to ");
5328 d_print_comp (dpi, options, dc->u.s_binary.left);
5329 return;
5331 case DEMANGLE_COMPONENT_LAMBDA:
5332 d_append_string (dpi, "{lambda(");
5333 d_print_comp (dpi, options, dc->u.s_unary_num.sub);
5334 d_append_string (dpi, ")#");
5335 d_append_num (dpi, dc->u.s_unary_num.num + 1);
5336 d_append_char (dpi, '}');
5337 return;
5339 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
5340 d_append_string (dpi, "{unnamed type#");
5341 d_append_num (dpi, dc->u.s_number.number + 1);
5342 d_append_char (dpi, '}');
5343 return;
5345 case DEMANGLE_COMPONENT_CLONE:
5346 d_print_comp (dpi, options, d_left (dc));
5347 d_append_string (dpi, " [clone ");
5348 d_print_comp (dpi, options, d_right (dc));
5349 d_append_char (dpi, ']');
5350 return;
5352 default:
5353 d_print_error (dpi);
5354 return;
5358 static void
5359 d_print_comp (struct d_print_info *dpi, int options,
5360 const struct demangle_component *dc)
5362 struct d_component_stack self;
5364 self.dc = dc;
5365 self.parent = dpi->component_stack;
5366 dpi->component_stack = &self;
5368 d_print_comp_inner (dpi, options, dc);
5370 dpi->component_stack = self.parent;
5373 /* Print a Java dentifier. For Java we try to handle encoded extended
5374 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
5375 so we don't it for C++. Characters are encoded as
5376 __U<hex-char>+_. */
5378 static void
5379 d_print_java_identifier (struct d_print_info *dpi, const char *name, int len)
5381 const char *p;
5382 const char *end;
5384 end = name + len;
5385 for (p = name; p < end; ++p)
5387 if (end - p > 3
5388 && p[0] == '_'
5389 && p[1] == '_'
5390 && p[2] == 'U')
5392 unsigned long c;
5393 const char *q;
5395 c = 0;
5396 for (q = p + 3; q < end; ++q)
5398 int dig;
5400 if (IS_DIGIT (*q))
5401 dig = *q - '0';
5402 else if (*q >= 'A' && *q <= 'F')
5403 dig = *q - 'A' + 10;
5404 else if (*q >= 'a' && *q <= 'f')
5405 dig = *q - 'a' + 10;
5406 else
5407 break;
5409 c = c * 16 + dig;
5411 /* If the Unicode character is larger than 256, we don't try
5412 to deal with it here. FIXME. */
5413 if (q < end && *q == '_' && c < 256)
5415 d_append_char (dpi, c);
5416 p = q;
5417 continue;
5421 d_append_char (dpi, *p);
5425 /* Print a list of modifiers. SUFFIX is 1 if we are printing
5426 qualifiers on this after printing a function. */
5428 static void
5429 d_print_mod_list (struct d_print_info *dpi, int options,
5430 struct d_print_mod *mods, int suffix)
5432 struct d_print_template *hold_dpt;
5434 if (mods == NULL || d_print_saw_error (dpi))
5435 return;
5437 if (mods->printed
5438 || (! suffix
5439 && (mods->mod->type == DEMANGLE_COMPONENT_RESTRICT_THIS
5440 || mods->mod->type == DEMANGLE_COMPONENT_VOLATILE_THIS
5441 || mods->mod->type == DEMANGLE_COMPONENT_CONST_THIS
5442 || mods->mod->type == DEMANGLE_COMPONENT_REFERENCE_THIS
5443 || (mods->mod->type
5444 == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS))))
5446 d_print_mod_list (dpi, options, mods->next, suffix);
5447 return;
5450 mods->printed = 1;
5452 hold_dpt = dpi->templates;
5453 dpi->templates = mods->templates;
5455 if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
5457 d_print_function_type (dpi, options, mods->mod, mods->next);
5458 dpi->templates = hold_dpt;
5459 return;
5461 else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
5463 d_print_array_type (dpi, options, mods->mod, mods->next);
5464 dpi->templates = hold_dpt;
5465 return;
5467 else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME)
5469 struct d_print_mod *hold_modifiers;
5470 struct demangle_component *dc;
5472 /* When this is on the modifier stack, we have pulled any
5473 qualifiers off the right argument already. Otherwise, we
5474 print it as usual, but don't let the left argument see any
5475 modifiers. */
5477 hold_modifiers = dpi->modifiers;
5478 dpi->modifiers = NULL;
5479 d_print_comp (dpi, options, d_left (mods->mod));
5480 dpi->modifiers = hold_modifiers;
5482 if ((options & DMGL_JAVA) == 0)
5483 d_append_string (dpi, "::");
5484 else
5485 d_append_char (dpi, '.');
5487 dc = d_right (mods->mod);
5489 if (dc->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
5491 d_append_string (dpi, "{default arg#");
5492 d_append_num (dpi, dc->u.s_unary_num.num + 1);
5493 d_append_string (dpi, "}::");
5494 dc = dc->u.s_unary_num.sub;
5497 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS
5498 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS
5499 || dc->type == DEMANGLE_COMPONENT_CONST_THIS
5500 || dc->type == DEMANGLE_COMPONENT_REFERENCE_THIS
5501 || dc->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)
5502 dc = d_left (dc);
5504 d_print_comp (dpi, options, dc);
5506 dpi->templates = hold_dpt;
5507 return;
5510 d_print_mod (dpi, options, mods->mod);
5512 dpi->templates = hold_dpt;
5514 d_print_mod_list (dpi, options, mods->next, suffix);
5517 /* Print a modifier. */
5519 static void
5520 d_print_mod (struct d_print_info *dpi, int options,
5521 const struct demangle_component *mod)
5523 switch (mod->type)
5525 case DEMANGLE_COMPONENT_RESTRICT:
5526 case DEMANGLE_COMPONENT_RESTRICT_THIS:
5527 d_append_string (dpi, " restrict");
5528 return;
5529 case DEMANGLE_COMPONENT_VOLATILE:
5530 case DEMANGLE_COMPONENT_VOLATILE_THIS:
5531 d_append_string (dpi, " volatile");
5532 return;
5533 case DEMANGLE_COMPONENT_CONST:
5534 case DEMANGLE_COMPONENT_CONST_THIS:
5535 d_append_string (dpi, " const");
5536 return;
5537 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5538 d_append_char (dpi, ' ');
5539 d_print_comp (dpi, options, d_right (mod));
5540 return;
5541 case DEMANGLE_COMPONENT_POINTER:
5542 /* There is no pointer symbol in Java. */
5543 if ((options & DMGL_JAVA) == 0)
5544 d_append_char (dpi, '*');
5545 return;
5546 case DEMANGLE_COMPONENT_REFERENCE_THIS:
5547 /* For the ref-qualifier, put a space before the &. */
5548 d_append_char (dpi, ' ');
5549 case DEMANGLE_COMPONENT_REFERENCE:
5550 d_append_char (dpi, '&');
5551 return;
5552 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
5553 d_append_char (dpi, ' ');
5554 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5555 d_append_string (dpi, "&&");
5556 return;
5557 case DEMANGLE_COMPONENT_COMPLEX:
5558 d_append_string (dpi, "complex ");
5559 return;
5560 case DEMANGLE_COMPONENT_IMAGINARY:
5561 d_append_string (dpi, "imaginary ");
5562 return;
5563 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5564 if (d_last_char (dpi) != '(')
5565 d_append_char (dpi, ' ');
5566 d_print_comp (dpi, options, d_left (mod));
5567 d_append_string (dpi, "::*");
5568 return;
5569 case DEMANGLE_COMPONENT_TYPED_NAME:
5570 d_print_comp (dpi, options, d_left (mod));
5571 return;
5572 case DEMANGLE_COMPONENT_VECTOR_TYPE:
5573 d_append_string (dpi, " __vector(");
5574 d_print_comp (dpi, options, d_left (mod));
5575 d_append_char (dpi, ')');
5576 return;
5578 default:
5579 /* Otherwise, we have something that won't go back on the
5580 modifier stack, so we can just print it. */
5581 d_print_comp (dpi, options, mod);
5582 return;
5586 /* Print a function type, except for the return type. */
5588 static void
5589 d_print_function_type (struct d_print_info *dpi, int options,
5590 const struct demangle_component *dc,
5591 struct d_print_mod *mods)
5593 int need_paren;
5594 int need_space;
5595 struct d_print_mod *p;
5596 struct d_print_mod *hold_modifiers;
5598 need_paren = 0;
5599 need_space = 0;
5600 for (p = mods; p != NULL; p = p->next)
5602 if (p->printed)
5603 break;
5605 switch (p->mod->type)
5607 case DEMANGLE_COMPONENT_POINTER:
5608 case DEMANGLE_COMPONENT_REFERENCE:
5609 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5610 need_paren = 1;
5611 break;
5612 case DEMANGLE_COMPONENT_RESTRICT:
5613 case DEMANGLE_COMPONENT_VOLATILE:
5614 case DEMANGLE_COMPONENT_CONST:
5615 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5616 case DEMANGLE_COMPONENT_COMPLEX:
5617 case DEMANGLE_COMPONENT_IMAGINARY:
5618 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5619 need_space = 1;
5620 need_paren = 1;
5621 break;
5622 case DEMANGLE_COMPONENT_RESTRICT_THIS:
5623 case DEMANGLE_COMPONENT_VOLATILE_THIS:
5624 case DEMANGLE_COMPONENT_CONST_THIS:
5625 case DEMANGLE_COMPONENT_REFERENCE_THIS:
5626 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
5627 break;
5628 default:
5629 break;
5631 if (need_paren)
5632 break;
5635 if (need_paren)
5637 if (! need_space)
5639 if (d_last_char (dpi) != '('
5640 && d_last_char (dpi) != '*')
5641 need_space = 1;
5643 if (need_space && d_last_char (dpi) != ' ')
5644 d_append_char (dpi, ' ');
5645 d_append_char (dpi, '(');
5648 hold_modifiers = dpi->modifiers;
5649 dpi->modifiers = NULL;
5651 d_print_mod_list (dpi, options, mods, 0);
5653 if (need_paren)
5654 d_append_char (dpi, ')');
5656 d_append_char (dpi, '(');
5658 if (d_right (dc) != NULL)
5659 d_print_comp (dpi, options, d_right (dc));
5661 d_append_char (dpi, ')');
5663 d_print_mod_list (dpi, options, mods, 1);
5665 dpi->modifiers = hold_modifiers;
5668 /* Print an array type, except for the element type. */
5670 static void
5671 d_print_array_type (struct d_print_info *dpi, int options,
5672 const struct demangle_component *dc,
5673 struct d_print_mod *mods)
5675 int need_space;
5677 need_space = 1;
5678 if (mods != NULL)
5680 int need_paren;
5681 struct d_print_mod *p;
5683 need_paren = 0;
5684 for (p = mods; p != NULL; p = p->next)
5686 if (! p->printed)
5688 if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
5690 need_space = 0;
5691 break;
5693 else
5695 need_paren = 1;
5696 need_space = 1;
5697 break;
5702 if (need_paren)
5703 d_append_string (dpi, " (");
5705 d_print_mod_list (dpi, options, mods, 0);
5707 if (need_paren)
5708 d_append_char (dpi, ')');
5711 if (need_space)
5712 d_append_char (dpi, ' ');
5714 d_append_char (dpi, '[');
5716 if (d_left (dc) != NULL)
5717 d_print_comp (dpi, options, d_left (dc));
5719 d_append_char (dpi, ']');
5722 /* Print an operator in an expression. */
5724 static void
5725 d_print_expr_op (struct d_print_info *dpi, int options,
5726 const struct demangle_component *dc)
5728 if (dc->type == DEMANGLE_COMPONENT_OPERATOR)
5729 d_append_buffer (dpi, dc->u.s_operator.op->name,
5730 dc->u.s_operator.op->len);
5731 else
5732 d_print_comp (dpi, options, dc);
5735 /* Print a cast. */
5737 static void
5738 d_print_cast (struct d_print_info *dpi, int options,
5739 const struct demangle_component *dc)
5741 struct d_print_template dpt;
5743 /* For a cast operator, we need the template parameters from
5744 the enclosing template in scope for processing the type. */
5745 if (dpi->current_template != NULL)
5747 dpt.next = dpi->templates;
5748 dpi->templates = &dpt;
5749 dpt.template_decl = dpi->current_template;
5752 if (d_left (dc)->type != DEMANGLE_COMPONENT_TEMPLATE)
5754 d_print_comp (dpi, options, d_left (dc));
5755 if (dpi->current_template != NULL)
5756 dpi->templates = dpt.next;
5758 else
5760 d_print_comp (dpi, options, d_left (d_left (dc)));
5762 /* For a templated cast operator, we need to remove the template
5763 parameters from scope after printing the operator name,
5764 so we need to handle the template printing here. */
5765 if (dpi->current_template != NULL)
5766 dpi->templates = dpt.next;
5768 if (d_last_char (dpi) == '<')
5769 d_append_char (dpi, ' ');
5770 d_append_char (dpi, '<');
5771 d_print_comp (dpi, options, d_right (d_left (dc)));
5772 /* Avoid generating two consecutive '>' characters, to avoid
5773 the C++ syntactic ambiguity. */
5774 if (d_last_char (dpi) == '>')
5775 d_append_char (dpi, ' ');
5776 d_append_char (dpi, '>');
5780 /* Initialize the information structure we use to pass around
5781 information. */
5783 CP_STATIC_IF_GLIBCPP_V3
5784 void
5785 cplus_demangle_init_info (const char *mangled, int options, size_t len,
5786 struct d_info *di)
5788 di->s = mangled;
5789 di->send = mangled + len;
5790 di->options = options;
5792 di->n = mangled;
5794 /* We can not need more components than twice the number of chars in
5795 the mangled string. Most components correspond directly to
5796 chars, but the ARGLIST types are exceptions. */
5797 di->num_comps = 2 * len;
5798 di->next_comp = 0;
5800 /* Similarly, we can not need more substitutions than there are
5801 chars in the mangled string. */
5802 di->num_subs = len;
5803 di->next_sub = 0;
5804 di->did_subs = 0;
5806 di->last_name = NULL;
5808 di->expansion = 0;
5809 di->is_expression = 0;
5810 di->is_conversion = 0;
5813 /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
5814 mangled name, return strings in repeated callback giving the demangled
5815 name. OPTIONS is the usual libiberty demangler options. On success,
5816 this returns 1. On failure, returns 0. */
5818 static int
5819 d_demangle_callback (const char *mangled, int options,
5820 demangle_callbackref callback, void *opaque)
5822 enum
5824 DCT_TYPE,
5825 DCT_MANGLED,
5826 DCT_GLOBAL_CTORS,
5827 DCT_GLOBAL_DTORS
5829 type;
5830 struct d_info di;
5831 struct demangle_component *dc;
5832 int status;
5834 if (mangled[0] == '_' && mangled[1] == 'Z')
5835 type = DCT_MANGLED;
5836 else if (strncmp (mangled, "_GLOBAL_", 8) == 0
5837 && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
5838 && (mangled[9] == 'D' || mangled[9] == 'I')
5839 && mangled[10] == '_')
5840 type = mangled[9] == 'I' ? DCT_GLOBAL_CTORS : DCT_GLOBAL_DTORS;
5841 else
5843 if ((options & DMGL_TYPES) == 0)
5844 return 0;
5845 type = DCT_TYPE;
5848 cplus_demangle_init_info (mangled, options, strlen (mangled), &di);
5851 #ifdef CP_DYNAMIC_ARRAYS
5852 __extension__ struct demangle_component comps[di.num_comps];
5853 __extension__ struct demangle_component *subs[di.num_subs];
5855 di.comps = comps;
5856 di.subs = subs;
5857 #else
5858 di.comps = alloca (di.num_comps * sizeof (*di.comps));
5859 di.subs = alloca (di.num_subs * sizeof (*di.subs));
5860 #endif
5862 switch (type)
5864 case DCT_TYPE:
5865 dc = cplus_demangle_type (&di);
5866 break;
5867 case DCT_MANGLED:
5868 dc = cplus_demangle_mangled_name (&di, 1);
5869 break;
5870 case DCT_GLOBAL_CTORS:
5871 case DCT_GLOBAL_DTORS:
5872 d_advance (&di, 11);
5873 dc = d_make_comp (&di,
5874 (type == DCT_GLOBAL_CTORS
5875 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
5876 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS),
5877 d_make_demangle_mangled_name (&di, d_str (&di)),
5878 NULL);
5879 d_advance (&di, strlen (d_str (&di)));
5880 break;
5881 default:
5882 abort (); /* We have listed all the cases. */
5885 /* If DMGL_PARAMS is set, then if we didn't consume the entire
5886 mangled string, then we didn't successfully demangle it. If
5887 DMGL_PARAMS is not set, we didn't look at the trailing
5888 parameters. */
5889 if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0')
5890 dc = NULL;
5892 #ifdef CP_DEMANGLE_DEBUG
5893 d_dump (dc, 0);
5894 #endif
5896 status = (dc != NULL)
5897 ? cplus_demangle_print_callback (options, dc, callback, opaque)
5898 : 0;
5901 return status;
5904 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
5905 name, return a buffer allocated with malloc holding the demangled
5906 name. OPTIONS is the usual libiberty demangler options. On
5907 success, this sets *PALC to the allocated size of the returned
5908 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
5909 a memory allocation failure, and returns NULL. */
5911 static char *
5912 d_demangle (const char *mangled, int options, size_t *palc)
5914 struct d_growable_string dgs;
5915 int status;
5917 d_growable_string_init (&dgs, 0);
5919 status = d_demangle_callback (mangled, options,
5920 d_growable_string_callback_adapter, &dgs);
5921 if (status == 0)
5923 free (dgs.buf);
5924 *palc = 0;
5925 return NULL;
5928 *palc = dgs.allocation_failure ? 1 : dgs.alc;
5929 return dgs.buf;
5932 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
5934 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
5936 /* ia64 ABI-mandated entry point in the C++ runtime library for
5937 performing demangling. MANGLED_NAME is a NUL-terminated character
5938 string containing the name to be demangled.
5940 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
5941 *LENGTH bytes, into which the demangled name is stored. If
5942 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
5943 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
5944 is placed in a region of memory allocated with malloc.
5946 If LENGTH is non-NULL, the length of the buffer containing the
5947 demangled name, is placed in *LENGTH.
5949 The return value is a pointer to the start of the NUL-terminated
5950 demangled name, or NULL if the demangling fails. The caller is
5951 responsible for deallocating this memory using free.
5953 *STATUS is set to one of the following values:
5954 0: The demangling operation succeeded.
5955 -1: A memory allocation failure occurred.
5956 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
5957 -3: One of the arguments is invalid.
5959 The demangling is performed using the C++ ABI mangling rules, with
5960 GNU extensions. */
5962 char *
5963 __cxa_demangle (const char *mangled_name, char *output_buffer,
5964 size_t *length, int *status)
5966 char *demangled;
5967 size_t alc;
5969 if (mangled_name == NULL)
5971 if (status != NULL)
5972 *status = -3;
5973 return NULL;
5976 if (output_buffer != NULL && length == NULL)
5978 if (status != NULL)
5979 *status = -3;
5980 return NULL;
5983 demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc);
5985 if (demangled == NULL)
5987 if (status != NULL)
5989 if (alc == 1)
5990 *status = -1;
5991 else
5992 *status = -2;
5994 return NULL;
5997 if (output_buffer == NULL)
5999 if (length != NULL)
6000 *length = alc;
6002 else
6004 if (strlen (demangled) < *length)
6006 strcpy (output_buffer, demangled);
6007 free (demangled);
6008 demangled = output_buffer;
6010 else
6012 free (output_buffer);
6013 *length = alc;
6017 if (status != NULL)
6018 *status = 0;
6020 return demangled;
6023 extern int __gcclibcxx_demangle_callback (const char *,
6024 void (*)
6025 (const char *, size_t, void *),
6026 void *);
6028 /* Alternative, allocationless entry point in the C++ runtime library
6029 for performing demangling. MANGLED_NAME is a NUL-terminated character
6030 string containing the name to be demangled.
6032 CALLBACK is a callback function, called with demangled string
6033 segments as demangling progresses; it is called at least once,
6034 but may be called more than once. OPAQUE is a generalized pointer
6035 used as a callback argument.
6037 The return code is one of the following values, equivalent to
6038 the STATUS values of __cxa_demangle() (excluding -1, since this
6039 function performs no memory allocations):
6040 0: The demangling operation succeeded.
6041 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6042 -3: One of the arguments is invalid.
6044 The demangling is performed using the C++ ABI mangling rules, with
6045 GNU extensions. */
6048 __gcclibcxx_demangle_callback (const char *mangled_name,
6049 void (*callback) (const char *, size_t, void *),
6050 void *opaque)
6052 int status;
6054 if (mangled_name == NULL || callback == NULL)
6055 return -3;
6057 status = d_demangle_callback (mangled_name, DMGL_PARAMS | DMGL_TYPES,
6058 callback, opaque);
6059 if (status == 0)
6060 return -2;
6062 return 0;
6065 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
6067 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
6068 mangled name, return a buffer allocated with malloc holding the
6069 demangled name. Otherwise, return NULL. */
6071 char *
6072 cplus_demangle_v3 (const char *mangled, int options)
6074 size_t alc;
6076 return d_demangle (mangled, options, &alc);
6080 cplus_demangle_v3_callback (const char *mangled, int options,
6081 demangle_callbackref callback, void *opaque)
6083 return d_demangle_callback (mangled, options, callback, opaque);
6086 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
6087 conventions, but the output formatting is a little different.
6088 This instructs the C++ demangler not to emit pointer characters ("*"), to
6089 use Java's namespace separator symbol ("." instead of "::"), and to output
6090 JArray<TYPE> as TYPE[]. */
6092 char *
6093 java_demangle_v3 (const char *mangled)
6095 size_t alc;
6097 return d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, &alc);
6101 java_demangle_v3_callback (const char *mangled,
6102 demangle_callbackref callback, void *opaque)
6104 return d_demangle_callback (mangled,
6105 DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX,
6106 callback, opaque);
6109 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
6111 #ifndef IN_GLIBCPP_V3
6113 /* Demangle a string in order to find out whether it is a constructor
6114 or destructor. Return non-zero on success. Set *CTOR_KIND and
6115 *DTOR_KIND appropriately. */
6117 static int
6118 is_ctor_or_dtor (const char *mangled,
6119 enum gnu_v3_ctor_kinds *ctor_kind,
6120 enum gnu_v3_dtor_kinds *dtor_kind)
6122 struct d_info di;
6123 struct demangle_component *dc;
6124 int ret;
6126 *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
6127 *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
6129 cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di);
6132 #ifdef CP_DYNAMIC_ARRAYS
6133 __extension__ struct demangle_component comps[di.num_comps];
6134 __extension__ struct demangle_component *subs[di.num_subs];
6136 di.comps = comps;
6137 di.subs = subs;
6138 #else
6139 di.comps = alloca (di.num_comps * sizeof (*di.comps));
6140 di.subs = alloca (di.num_subs * sizeof (*di.subs));
6141 #endif
6143 dc = cplus_demangle_mangled_name (&di, 1);
6145 /* Note that because we did not pass DMGL_PARAMS, we don't expect
6146 to demangle the entire string. */
6148 ret = 0;
6149 while (dc != NULL)
6151 switch (dc->type)
6153 /* These cannot appear on a constructor or destructor. */
6154 case DEMANGLE_COMPONENT_RESTRICT_THIS:
6155 case DEMANGLE_COMPONENT_VOLATILE_THIS:
6156 case DEMANGLE_COMPONENT_CONST_THIS:
6157 case DEMANGLE_COMPONENT_REFERENCE_THIS:
6158 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
6159 default:
6160 dc = NULL;
6161 break;
6162 case DEMANGLE_COMPONENT_TYPED_NAME:
6163 case DEMANGLE_COMPONENT_TEMPLATE:
6164 dc = d_left (dc);
6165 break;
6166 case DEMANGLE_COMPONENT_QUAL_NAME:
6167 case DEMANGLE_COMPONENT_LOCAL_NAME:
6168 dc = d_right (dc);
6169 break;
6170 case DEMANGLE_COMPONENT_CTOR:
6171 *ctor_kind = dc->u.s_ctor.kind;
6172 ret = 1;
6173 dc = NULL;
6174 break;
6175 case DEMANGLE_COMPONENT_DTOR:
6176 *dtor_kind = dc->u.s_dtor.kind;
6177 ret = 1;
6178 dc = NULL;
6179 break;
6184 return ret;
6187 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
6188 name. A non-zero return indicates the type of constructor. */
6190 enum gnu_v3_ctor_kinds
6191 is_gnu_v3_mangled_ctor (const char *name)
6193 enum gnu_v3_ctor_kinds ctor_kind;
6194 enum gnu_v3_dtor_kinds dtor_kind;
6196 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
6197 return (enum gnu_v3_ctor_kinds) 0;
6198 return ctor_kind;
6202 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
6203 name. A non-zero return indicates the type of destructor. */
6205 enum gnu_v3_dtor_kinds
6206 is_gnu_v3_mangled_dtor (const char *name)
6208 enum gnu_v3_ctor_kinds ctor_kind;
6209 enum gnu_v3_dtor_kinds dtor_kind;
6211 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
6212 return (enum gnu_v3_dtor_kinds) 0;
6213 return dtor_kind;
6216 #endif /* IN_GLIBCPP_V3 */
6218 #ifdef STANDALONE_DEMANGLER
6220 #include "getopt.h"
6221 #include "dyn-string.h"
6223 static void print_usage (FILE* fp, int exit_value);
6225 #define IS_ALPHA(CHAR) \
6226 (((CHAR) >= 'a' && (CHAR) <= 'z') \
6227 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
6229 /* Non-zero if CHAR is a character than can occur in a mangled name. */
6230 #define is_mangled_char(CHAR) \
6231 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
6232 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
6234 /* The name of this program, as invoked. */
6235 const char* program_name;
6237 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
6239 static void
6240 print_usage (FILE* fp, int exit_value)
6242 fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
6243 fprintf (fp, "Options:\n");
6244 fprintf (fp, " -h,--help Display this message.\n");
6245 fprintf (fp, " -p,--no-params Don't display function parameters\n");
6246 fprintf (fp, " -v,--verbose Produce verbose demanglings.\n");
6247 fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n");
6249 exit (exit_value);
6252 /* Option specification for getopt_long. */
6253 static const struct option long_options[] =
6255 { "help", no_argument, NULL, 'h' },
6256 { "no-params", no_argument, NULL, 'p' },
6257 { "verbose", no_argument, NULL, 'v' },
6258 { NULL, no_argument, NULL, 0 },
6261 /* Main entry for a demangling filter executable. It will demangle
6262 its command line arguments, if any. If none are provided, it will
6263 filter stdin to stdout, replacing any recognized mangled C++ names
6264 with their demangled equivalents. */
6267 main (int argc, char *argv[])
6269 int i;
6270 int opt_char;
6271 int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
6273 /* Use the program name of this program, as invoked. */
6274 program_name = argv[0];
6276 /* Parse options. */
6279 opt_char = getopt_long (argc, argv, "hpv", long_options, NULL);
6280 switch (opt_char)
6282 case '?': /* Unrecognized option. */
6283 print_usage (stderr, 1);
6284 break;
6286 case 'h':
6287 print_usage (stdout, 0);
6288 break;
6290 case 'p':
6291 options &= ~ DMGL_PARAMS;
6292 break;
6294 case 'v':
6295 options |= DMGL_VERBOSE;
6296 break;
6299 while (opt_char != -1);
6301 if (optind == argc)
6302 /* No command line arguments were provided. Filter stdin. */
6304 dyn_string_t mangled = dyn_string_new (3);
6305 char *s;
6307 /* Read all of input. */
6308 while (!feof (stdin))
6310 char c;
6312 /* Pile characters into mangled until we hit one that can't
6313 occur in a mangled name. */
6314 c = getchar ();
6315 while (!feof (stdin) && is_mangled_char (c))
6317 dyn_string_append_char (mangled, c);
6318 if (feof (stdin))
6319 break;
6320 c = getchar ();
6323 if (dyn_string_length (mangled) > 0)
6325 #ifdef IN_GLIBCPP_V3
6326 s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL);
6327 #else
6328 s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
6329 #endif
6331 if (s != NULL)
6333 fputs (s, stdout);
6334 free (s);
6336 else
6338 /* It might not have been a mangled name. Print the
6339 original text. */
6340 fputs (dyn_string_buf (mangled), stdout);
6343 dyn_string_clear (mangled);
6346 /* If we haven't hit EOF yet, we've read one character that
6347 can't occur in a mangled name, so print it out. */
6348 if (!feof (stdin))
6349 putchar (c);
6352 dyn_string_delete (mangled);
6354 else
6355 /* Demangle command line arguments. */
6357 /* Loop over command line arguments. */
6358 for (i = optind; i < argc; ++i)
6360 char *s;
6361 #ifdef IN_GLIBCPP_V3
6362 int status;
6363 #endif
6365 /* Attempt to demangle. */
6366 #ifdef IN_GLIBCPP_V3
6367 s = __cxa_demangle (argv[i], NULL, NULL, &status);
6368 #else
6369 s = cplus_demangle_v3 (argv[i], options);
6370 #endif
6372 /* If it worked, print the demangled name. */
6373 if (s != NULL)
6375 printf ("%s\n", s);
6376 free (s);
6378 else
6380 #ifdef IN_GLIBCPP_V3
6381 fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status);
6382 #else
6383 fprintf (stderr, "Failed: %s\n", argv[i]);
6384 #endif
6389 return 0;
6392 #endif /* STANDALONE_DEMANGLER */