re PR target/90096 (Misleading option hint for AVX intrinsics)
[official-gcc.git] / libiberty / cp-demangle.c
blob779b4e763a05f8328c40fe3775753af9947001d6
1 /* Demangler for g++ V3 ABI.
2 Copyright (C) 2003-2019 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor <ian@wasabisystems.com>.
5 This file is part of the libiberty library, which is part of GCC.
7 This file is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 In addition to the permissions in the GNU General Public License, the
13 Free Software Foundation gives you unlimited permission to link the
14 compiled version of this file into combinations with other programs,
15 and to distribute those combinations without any restriction coming
16 from the use of this file. (The General Public License restrictions
17 do apply in other respects; for example, they cover modification of
18 the file, and distribution when not linked into a combined
19 executable.)
21 This program is distributed in the hope that it will be useful,
22 but WITHOUT ANY WARRANTY; without even the implied warranty of
23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 GNU General Public License for more details.
26 You should have received a copy of the GNU General Public License
27 along with this program; if not, write to the Free Software
28 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
31 /* This code implements a demangler for the g++ V3 ABI. The ABI is
32 described on this web page:
33 https://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling
35 This code was written while looking at the demangler written by
36 Alex Samuel <samuel@codesourcery.com>.
38 This code first pulls the mangled name apart into a list of
39 components, and then walks the list generating the demangled
40 name.
42 This file will normally define the following functions, q.v.:
43 char *cplus_demangle_v3(const char *mangled, int options)
44 char *java_demangle_v3(const char *mangled)
45 int cplus_demangle_v3_callback(const char *mangled, int options,
46 demangle_callbackref callback)
47 int java_demangle_v3_callback(const char *mangled,
48 demangle_callbackref callback)
49 enum gnu_v3_ctor_kinds is_gnu_v3_mangled_ctor (const char *name)
50 enum gnu_v3_dtor_kinds is_gnu_v3_mangled_dtor (const char *name)
52 Also, the interface to the component list is public, and defined in
53 demangle.h. The interface consists of these types, which are
54 defined in demangle.h:
55 enum demangle_component_type
56 struct demangle_component
57 demangle_callbackref
58 and these functions defined in this file:
59 cplus_demangle_fill_name
60 cplus_demangle_fill_extended_operator
61 cplus_demangle_fill_ctor
62 cplus_demangle_fill_dtor
63 cplus_demangle_print
64 cplus_demangle_print_callback
65 and other functions defined in the file cp-demint.c.
67 This file also defines some other functions and variables which are
68 only to be used by the file cp-demint.c.
70 Preprocessor macros you can define while compiling this file:
72 IN_LIBGCC2
73 If defined, this file defines the following functions, q.v.:
74 char *__cxa_demangle (const char *mangled, char *buf, size_t *len,
75 int *status)
76 int __gcclibcxx_demangle_callback (const char *,
77 void (*)
78 (const char *, size_t, void *),
79 void *)
80 instead of cplus_demangle_v3[_callback]() and
81 java_demangle_v3[_callback]().
83 IN_GLIBCPP_V3
84 If defined, this file defines only __cxa_demangle() and
85 __gcclibcxx_demangle_callback(), and no other publically visible
86 functions or variables.
88 STANDALONE_DEMANGLER
89 If defined, this file defines a main() function which demangles
90 any arguments, or, if none, demangles stdin.
92 CP_DEMANGLE_DEBUG
93 If defined, turns on debugging mode, which prints information on
94 stdout about the mangled string. This is not generally useful.
96 CHECK_DEMANGLER
97 If defined, additional sanity checks will be performed. It will
98 cause some slowdown, but will allow to catch out-of-bound access
99 errors earlier. This macro is intended for testing and debugging. */
101 #if defined (_AIX) && !defined (__GNUC__)
102 #pragma alloca
103 #endif
105 #ifdef HAVE_CONFIG_H
106 #include "config.h"
107 #endif
109 #include <stdio.h>
111 #ifdef HAVE_STDLIB_H
112 #include <stdlib.h>
113 #endif
114 #ifdef HAVE_STRING_H
115 #include <string.h>
116 #endif
118 #ifdef HAVE_ALLOCA_H
119 # include <alloca.h>
120 #else
121 # ifndef alloca
122 # ifdef __GNUC__
123 # define alloca __builtin_alloca
124 # else
125 extern char *alloca ();
126 # endif /* __GNUC__ */
127 # endif /* alloca */
128 #endif /* HAVE_ALLOCA_H */
130 #ifdef HAVE_LIMITS_H
131 #include <limits.h>
132 #endif
133 #ifndef INT_MAX
134 # define INT_MAX (int)(((unsigned int) ~0) >> 1) /* 0x7FFFFFFF */
135 #endif
137 #include "ansidecl.h"
138 #include "libiberty.h"
139 #include "demangle.h"
140 #include "cp-demangle.h"
142 /* If IN_GLIBCPP_V3 is defined, some functions are made static. We
143 also rename them via #define to avoid compiler errors when the
144 static definition conflicts with the extern declaration in a header
145 file. */
146 #ifdef IN_GLIBCPP_V3
148 #define CP_STATIC_IF_GLIBCPP_V3 static
150 #define cplus_demangle_fill_name d_fill_name
151 static int d_fill_name (struct demangle_component *, const char *, int);
153 #define cplus_demangle_fill_extended_operator d_fill_extended_operator
154 static int
155 d_fill_extended_operator (struct demangle_component *, int,
156 struct demangle_component *);
158 #define cplus_demangle_fill_ctor d_fill_ctor
159 static int
160 d_fill_ctor (struct demangle_component *, enum gnu_v3_ctor_kinds,
161 struct demangle_component *);
163 #define cplus_demangle_fill_dtor d_fill_dtor
164 static int
165 d_fill_dtor (struct demangle_component *, enum gnu_v3_dtor_kinds,
166 struct demangle_component *);
168 #define cplus_demangle_mangled_name d_mangled_name
169 static struct demangle_component *d_mangled_name (struct d_info *, int);
171 #define cplus_demangle_type d_type
172 static struct demangle_component *d_type (struct d_info *);
174 #define cplus_demangle_print d_print
175 static char *d_print (int, struct demangle_component *, int, size_t *);
177 #define cplus_demangle_print_callback d_print_callback
178 static int d_print_callback (int, struct demangle_component *,
179 demangle_callbackref, void *);
181 #define cplus_demangle_init_info d_init_info
182 static void d_init_info (const char *, int, size_t, struct d_info *);
184 #else /* ! defined(IN_GLIBCPP_V3) */
185 #define CP_STATIC_IF_GLIBCPP_V3
186 #endif /* ! defined(IN_GLIBCPP_V3) */
188 /* See if the compiler supports dynamic arrays. */
190 #ifdef __GNUC__
191 #define CP_DYNAMIC_ARRAYS
192 #else
193 #ifdef __STDC__
194 #ifdef __STDC_VERSION__
195 #if __STDC_VERSION__ >= 199901L
196 #define CP_DYNAMIC_ARRAYS
197 #endif /* __STDC__VERSION >= 199901L */
198 #endif /* defined (__STDC_VERSION__) */
199 #endif /* defined (__STDC__) */
200 #endif /* ! defined (__GNUC__) */
202 /* We avoid pulling in the ctype tables, to prevent pulling in
203 additional unresolved symbols when this code is used in a library.
204 FIXME: Is this really a valid reason? This comes from the original
205 V3 demangler code.
207 As of this writing this file has the following undefined references
208 when compiled with -DIN_GLIBCPP_V3: realloc, free, memcpy, strcpy,
209 strcat, strlen. */
211 #define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
212 #define IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z')
213 #define IS_LOWER(c) ((c) >= 'a' && (c) <= 'z')
215 /* The prefix prepended by GCC to an identifier represnting the
216 anonymous namespace. */
217 #define ANONYMOUS_NAMESPACE_PREFIX "_GLOBAL_"
218 #define ANONYMOUS_NAMESPACE_PREFIX_LEN \
219 (sizeof (ANONYMOUS_NAMESPACE_PREFIX) - 1)
221 /* Information we keep for the standard substitutions. */
223 struct d_standard_sub_info
225 /* The code for this substitution. */
226 char code;
227 /* The simple string it expands to. */
228 const char *simple_expansion;
229 /* The length of the simple expansion. */
230 int simple_len;
231 /* The results of a full, verbose, expansion. This is used when
232 qualifying a constructor/destructor, or when in verbose mode. */
233 const char *full_expansion;
234 /* The length of the full expansion. */
235 int full_len;
236 /* What to set the last_name field of d_info to; NULL if we should
237 not set it. This is only relevant when qualifying a
238 constructor/destructor. */
239 const char *set_last_name;
240 /* The length of set_last_name. */
241 int set_last_name_len;
244 /* Accessors for subtrees of struct demangle_component. */
246 #define d_left(dc) ((dc)->u.s_binary.left)
247 #define d_right(dc) ((dc)->u.s_binary.right)
249 /* A list of templates. This is used while printing. */
251 struct d_print_template
253 /* Next template on the list. */
254 struct d_print_template *next;
255 /* This template. */
256 const struct demangle_component *template_decl;
259 /* A list of type modifiers. This is used while printing. */
261 struct d_print_mod
263 /* Next modifier on the list. These are in the reverse of the order
264 in which they appeared in the mangled string. */
265 struct d_print_mod *next;
266 /* The modifier. */
267 struct demangle_component *mod;
268 /* Whether this modifier was printed. */
269 int printed;
270 /* The list of templates which applies to this modifier. */
271 struct d_print_template *templates;
274 /* We use these structures to hold information during printing. */
276 struct d_growable_string
278 /* Buffer holding the result. */
279 char *buf;
280 /* Current length of data in buffer. */
281 size_t len;
282 /* Allocated size of buffer. */
283 size_t alc;
284 /* Set to 1 if we had a memory allocation failure. */
285 int allocation_failure;
288 /* Stack of components, innermost first, used to avoid loops. */
290 struct d_component_stack
292 /* This component. */
293 const struct demangle_component *dc;
294 /* This component's parent. */
295 const struct d_component_stack *parent;
298 /* A demangle component and some scope captured when it was first
299 traversed. */
301 struct d_saved_scope
303 /* The component whose scope this is. */
304 const struct demangle_component *container;
305 /* The list of templates, if any, that was current when this
306 scope was captured. */
307 struct d_print_template *templates;
310 /* Checkpoint structure to allow backtracking. This holds copies
311 of the fields of struct d_info that need to be restored
312 if a trial parse needs to be backtracked over. */
314 struct d_info_checkpoint
316 const char *n;
317 int next_comp;
318 int next_sub;
319 int expansion;
322 /* Maximum number of times d_print_comp may be called recursively. */
323 #define MAX_RECURSION_COUNT 1024
325 enum { D_PRINT_BUFFER_LENGTH = 256 };
326 struct d_print_info
328 /* Fixed-length allocated buffer for demangled data, flushed to the
329 callback with a NUL termination once full. */
330 char buf[D_PRINT_BUFFER_LENGTH];
331 /* Current length of data in buffer. */
332 size_t len;
333 /* The last character printed, saved individually so that it survives
334 any buffer flush. */
335 char last_char;
336 /* Callback function to handle demangled buffer flush. */
337 demangle_callbackref callback;
338 /* Opaque callback argument. */
339 void *opaque;
340 /* The current list of templates, if any. */
341 struct d_print_template *templates;
342 /* The current list of modifiers (e.g., pointer, reference, etc.),
343 if any. */
344 struct d_print_mod *modifiers;
345 /* Set to 1 if we saw a demangling error. */
346 int demangle_failure;
347 /* Number of times d_print_comp was recursively called. Should not
348 be bigger than MAX_RECURSION_COUNT. */
349 int recursion;
350 /* Non-zero if we're printing a lambda argument. A template
351 parameter reference actually means 'auto'. */
352 int is_lambda_arg;
353 /* The current index into any template argument packs we are using
354 for printing, or -1 to print the whole pack. */
355 int pack_index;
356 /* Number of d_print_flush calls so far. */
357 unsigned long int flush_count;
358 /* Stack of components, innermost first, used to avoid loops. */
359 const struct d_component_stack *component_stack;
360 /* Array of saved scopes for evaluating substitutions. */
361 struct d_saved_scope *saved_scopes;
362 /* Index of the next unused saved scope in the above array. */
363 int next_saved_scope;
364 /* Number of saved scopes in the above array. */
365 int num_saved_scopes;
366 /* Array of templates for saving into scopes. */
367 struct d_print_template *copy_templates;
368 /* Index of the next unused copy template in the above array. */
369 int next_copy_template;
370 /* Number of copy templates in the above array. */
371 int num_copy_templates;
372 /* The nearest enclosing template, if any. */
373 const struct demangle_component *current_template;
376 #ifdef CP_DEMANGLE_DEBUG
377 static void d_dump (struct demangle_component *, int);
378 #endif
380 static struct demangle_component *
381 d_make_empty (struct d_info *);
383 static struct demangle_component *
384 d_make_comp (struct d_info *, enum demangle_component_type,
385 struct demangle_component *,
386 struct demangle_component *);
388 static struct demangle_component *
389 d_make_name (struct d_info *, const char *, int);
391 static struct demangle_component *
392 d_make_demangle_mangled_name (struct d_info *, const char *);
394 static struct demangle_component *
395 d_make_builtin_type (struct d_info *,
396 const struct demangle_builtin_type_info *);
398 static struct demangle_component *
399 d_make_operator (struct d_info *,
400 const struct demangle_operator_info *);
402 static struct demangle_component *
403 d_make_extended_operator (struct d_info *, int,
404 struct demangle_component *);
406 static struct demangle_component *
407 d_make_ctor (struct d_info *, enum gnu_v3_ctor_kinds,
408 struct demangle_component *);
410 static struct demangle_component *
411 d_make_dtor (struct d_info *, enum gnu_v3_dtor_kinds,
412 struct demangle_component *);
414 static struct demangle_component *
415 d_make_template_param (struct d_info *, int);
417 static struct demangle_component *
418 d_make_sub (struct d_info *, const char *, int);
420 static int
421 has_return_type (struct demangle_component *);
423 static int
424 is_ctor_dtor_or_conversion (struct demangle_component *);
426 static struct demangle_component *d_encoding (struct d_info *, int);
428 static struct demangle_component *d_name (struct d_info *);
430 static struct demangle_component *d_nested_name (struct d_info *);
432 static struct demangle_component *d_prefix (struct d_info *);
434 static struct demangle_component *d_unqualified_name (struct d_info *);
436 static struct demangle_component *d_source_name (struct d_info *);
438 static int d_number (struct d_info *);
440 static struct demangle_component *d_identifier (struct d_info *, int);
442 static struct demangle_component *d_operator_name (struct d_info *);
444 static struct demangle_component *d_special_name (struct d_info *);
446 static struct demangle_component *d_parmlist (struct d_info *);
448 static int d_call_offset (struct d_info *, int);
450 static struct demangle_component *d_ctor_dtor_name (struct d_info *);
452 static struct demangle_component **
453 d_cv_qualifiers (struct d_info *, struct demangle_component **, int);
455 static struct demangle_component *
456 d_ref_qualifier (struct d_info *, struct demangle_component *);
458 static struct demangle_component *
459 d_function_type (struct d_info *);
461 static struct demangle_component *
462 d_bare_function_type (struct d_info *, int);
464 static struct demangle_component *
465 d_class_enum_type (struct d_info *);
467 static struct demangle_component *d_array_type (struct d_info *);
469 static struct demangle_component *d_vector_type (struct d_info *);
471 static struct demangle_component *
472 d_pointer_to_member_type (struct d_info *);
474 static struct demangle_component *
475 d_template_param (struct d_info *);
477 static struct demangle_component *d_template_args (struct d_info *);
478 static struct demangle_component *d_template_args_1 (struct d_info *);
480 static struct demangle_component *
481 d_template_arg (struct d_info *);
483 static struct demangle_component *d_expression (struct d_info *);
485 static struct demangle_component *d_expr_primary (struct d_info *);
487 static struct demangle_component *d_local_name (struct d_info *);
489 static int d_discriminator (struct d_info *);
491 static struct demangle_component *d_lambda (struct d_info *);
493 static struct demangle_component *d_unnamed_type (struct d_info *);
495 static struct demangle_component *
496 d_clone_suffix (struct d_info *, struct demangle_component *);
498 static int
499 d_add_substitution (struct d_info *, struct demangle_component *);
501 static struct demangle_component *d_substitution (struct d_info *, int);
503 static void d_checkpoint (struct d_info *, struct d_info_checkpoint *);
505 static void d_backtrack (struct d_info *, struct d_info_checkpoint *);
507 static void d_growable_string_init (struct d_growable_string *, size_t);
509 static inline void
510 d_growable_string_resize (struct d_growable_string *, size_t);
512 static inline void
513 d_growable_string_append_buffer (struct d_growable_string *,
514 const char *, size_t);
515 static void
516 d_growable_string_callback_adapter (const char *, size_t, void *);
518 static void
519 d_print_init (struct d_print_info *, demangle_callbackref, void *,
520 const struct demangle_component *);
522 static inline void d_print_error (struct d_print_info *);
524 static inline int d_print_saw_error (struct d_print_info *);
526 static inline void d_print_flush (struct d_print_info *);
528 static inline void d_append_char (struct d_print_info *, char);
530 static inline void d_append_buffer (struct d_print_info *,
531 const char *, size_t);
533 static inline void d_append_string (struct d_print_info *, const char *);
535 static inline char d_last_char (struct d_print_info *);
537 static void
538 d_print_comp (struct d_print_info *, int, struct demangle_component *);
540 static void
541 d_print_java_identifier (struct d_print_info *, const char *, int);
543 static void
544 d_print_mod_list (struct d_print_info *, int, struct d_print_mod *, int);
546 static void
547 d_print_mod (struct d_print_info *, int, struct demangle_component *);
549 static void
550 d_print_function_type (struct d_print_info *, int,
551 struct demangle_component *,
552 struct d_print_mod *);
554 static void
555 d_print_array_type (struct d_print_info *, int,
556 struct demangle_component *,
557 struct d_print_mod *);
559 static void
560 d_print_expr_op (struct d_print_info *, int, struct demangle_component *);
562 static void d_print_cast (struct d_print_info *, int,
563 struct demangle_component *);
564 static void d_print_conversion (struct d_print_info *, int,
565 struct demangle_component *);
567 static int d_demangle_callback (const char *, int,
568 demangle_callbackref, void *);
569 static char *d_demangle (const char *, int, size_t *);
571 #define FNQUAL_COMPONENT_CASE \
572 case DEMANGLE_COMPONENT_RESTRICT_THIS: \
573 case DEMANGLE_COMPONENT_VOLATILE_THIS: \
574 case DEMANGLE_COMPONENT_CONST_THIS: \
575 case DEMANGLE_COMPONENT_REFERENCE_THIS: \
576 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS: \
577 case DEMANGLE_COMPONENT_TRANSACTION_SAFE: \
578 case DEMANGLE_COMPONENT_NOEXCEPT: \
579 case DEMANGLE_COMPONENT_THROW_SPEC
581 /* True iff TYPE is a demangling component representing a
582 function-type-qualifier. */
584 static int
585 is_fnqual_component_type (enum demangle_component_type type)
587 switch (type)
589 FNQUAL_COMPONENT_CASE:
590 return 1;
591 default:
592 break;
594 return 0;
598 #ifdef CP_DEMANGLE_DEBUG
600 static void
601 d_dump (struct demangle_component *dc, int indent)
603 int i;
605 if (dc == NULL)
607 if (indent == 0)
608 printf ("failed demangling\n");
609 return;
612 for (i = 0; i < indent; ++i)
613 putchar (' ');
615 switch (dc->type)
617 case DEMANGLE_COMPONENT_NAME:
618 printf ("name '%.*s'\n", dc->u.s_name.len, dc->u.s_name.s);
619 return;
620 case DEMANGLE_COMPONENT_TAGGED_NAME:
621 printf ("tagged name\n");
622 d_dump (dc->u.s_binary.left, indent + 2);
623 d_dump (dc->u.s_binary.right, indent + 2);
624 return;
625 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
626 printf ("template parameter %ld\n", dc->u.s_number.number);
627 return;
628 case DEMANGLE_COMPONENT_TPARM_OBJ:
629 printf ("template parameter object\n");
630 break;
631 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
632 printf ("function parameter %ld\n", dc->u.s_number.number);
633 return;
634 case DEMANGLE_COMPONENT_CTOR:
635 printf ("constructor %d\n", (int) dc->u.s_ctor.kind);
636 d_dump (dc->u.s_ctor.name, indent + 2);
637 return;
638 case DEMANGLE_COMPONENT_DTOR:
639 printf ("destructor %d\n", (int) dc->u.s_dtor.kind);
640 d_dump (dc->u.s_dtor.name, indent + 2);
641 return;
642 case DEMANGLE_COMPONENT_SUB_STD:
643 printf ("standard substitution %s\n", dc->u.s_string.string);
644 return;
645 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
646 printf ("builtin type %s\n", dc->u.s_builtin.type->name);
647 return;
648 case DEMANGLE_COMPONENT_OPERATOR:
649 printf ("operator %s\n", dc->u.s_operator.op->name);
650 return;
651 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
652 printf ("extended operator with %d args\n",
653 dc->u.s_extended_operator.args);
654 d_dump (dc->u.s_extended_operator.name, indent + 2);
655 return;
657 case DEMANGLE_COMPONENT_QUAL_NAME:
658 printf ("qualified name\n");
659 break;
660 case DEMANGLE_COMPONENT_LOCAL_NAME:
661 printf ("local name\n");
662 break;
663 case DEMANGLE_COMPONENT_TYPED_NAME:
664 printf ("typed name\n");
665 break;
666 case DEMANGLE_COMPONENT_TEMPLATE:
667 printf ("template\n");
668 break;
669 case DEMANGLE_COMPONENT_VTABLE:
670 printf ("vtable\n");
671 break;
672 case DEMANGLE_COMPONENT_VTT:
673 printf ("VTT\n");
674 break;
675 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
676 printf ("construction vtable\n");
677 break;
678 case DEMANGLE_COMPONENT_TYPEINFO:
679 printf ("typeinfo\n");
680 break;
681 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
682 printf ("typeinfo name\n");
683 break;
684 case DEMANGLE_COMPONENT_TYPEINFO_FN:
685 printf ("typeinfo function\n");
686 break;
687 case DEMANGLE_COMPONENT_THUNK:
688 printf ("thunk\n");
689 break;
690 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
691 printf ("virtual thunk\n");
692 break;
693 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
694 printf ("covariant thunk\n");
695 break;
696 case DEMANGLE_COMPONENT_JAVA_CLASS:
697 printf ("java class\n");
698 break;
699 case DEMANGLE_COMPONENT_GUARD:
700 printf ("guard\n");
701 break;
702 case DEMANGLE_COMPONENT_REFTEMP:
703 printf ("reference temporary\n");
704 break;
705 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
706 printf ("hidden alias\n");
707 break;
708 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
709 printf ("transaction clone\n");
710 break;
711 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
712 printf ("non-transaction clone\n");
713 break;
714 case DEMANGLE_COMPONENT_RESTRICT:
715 printf ("restrict\n");
716 break;
717 case DEMANGLE_COMPONENT_VOLATILE:
718 printf ("volatile\n");
719 break;
720 case DEMANGLE_COMPONENT_CONST:
721 printf ("const\n");
722 break;
723 case DEMANGLE_COMPONENT_RESTRICT_THIS:
724 printf ("restrict this\n");
725 break;
726 case DEMANGLE_COMPONENT_VOLATILE_THIS:
727 printf ("volatile this\n");
728 break;
729 case DEMANGLE_COMPONENT_CONST_THIS:
730 printf ("const this\n");
731 break;
732 case DEMANGLE_COMPONENT_REFERENCE_THIS:
733 printf ("reference this\n");
734 break;
735 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
736 printf ("rvalue reference this\n");
737 break;
738 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
739 printf ("transaction_safe this\n");
740 break;
741 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
742 printf ("vendor type qualifier\n");
743 break;
744 case DEMANGLE_COMPONENT_POINTER:
745 printf ("pointer\n");
746 break;
747 case DEMANGLE_COMPONENT_REFERENCE:
748 printf ("reference\n");
749 break;
750 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
751 printf ("rvalue reference\n");
752 break;
753 case DEMANGLE_COMPONENT_COMPLEX:
754 printf ("complex\n");
755 break;
756 case DEMANGLE_COMPONENT_IMAGINARY:
757 printf ("imaginary\n");
758 break;
759 case DEMANGLE_COMPONENT_VENDOR_TYPE:
760 printf ("vendor type\n");
761 break;
762 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
763 printf ("function type\n");
764 break;
765 case DEMANGLE_COMPONENT_ARRAY_TYPE:
766 printf ("array type\n");
767 break;
768 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
769 printf ("pointer to member type\n");
770 break;
771 case DEMANGLE_COMPONENT_FIXED_TYPE:
772 printf ("fixed-point type, accum? %d, sat? %d\n",
773 dc->u.s_fixed.accum, dc->u.s_fixed.sat);
774 d_dump (dc->u.s_fixed.length, indent + 2);
775 break;
776 case DEMANGLE_COMPONENT_ARGLIST:
777 printf ("argument list\n");
778 break;
779 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
780 printf ("template argument list\n");
781 break;
782 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
783 printf ("initializer list\n");
784 break;
785 case DEMANGLE_COMPONENT_CAST:
786 printf ("cast\n");
787 break;
788 case DEMANGLE_COMPONENT_CONVERSION:
789 printf ("conversion operator\n");
790 break;
791 case DEMANGLE_COMPONENT_NULLARY:
792 printf ("nullary operator\n");
793 break;
794 case DEMANGLE_COMPONENT_UNARY:
795 printf ("unary operator\n");
796 break;
797 case DEMANGLE_COMPONENT_BINARY:
798 printf ("binary operator\n");
799 break;
800 case DEMANGLE_COMPONENT_BINARY_ARGS:
801 printf ("binary operator arguments\n");
802 break;
803 case DEMANGLE_COMPONENT_TRINARY:
804 printf ("trinary operator\n");
805 break;
806 case DEMANGLE_COMPONENT_TRINARY_ARG1:
807 printf ("trinary operator arguments 1\n");
808 break;
809 case DEMANGLE_COMPONENT_TRINARY_ARG2:
810 printf ("trinary operator arguments 1\n");
811 break;
812 case DEMANGLE_COMPONENT_LITERAL:
813 printf ("literal\n");
814 break;
815 case DEMANGLE_COMPONENT_LITERAL_NEG:
816 printf ("negative literal\n");
817 break;
818 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
819 printf ("java resource\n");
820 break;
821 case DEMANGLE_COMPONENT_COMPOUND_NAME:
822 printf ("compound name\n");
823 break;
824 case DEMANGLE_COMPONENT_CHARACTER:
825 printf ("character '%c'\n", dc->u.s_character.character);
826 return;
827 case DEMANGLE_COMPONENT_NUMBER:
828 printf ("number %ld\n", dc->u.s_number.number);
829 return;
830 case DEMANGLE_COMPONENT_DECLTYPE:
831 printf ("decltype\n");
832 break;
833 case DEMANGLE_COMPONENT_PACK_EXPANSION:
834 printf ("pack expansion\n");
835 break;
836 case DEMANGLE_COMPONENT_TLS_INIT:
837 printf ("tls init function\n");
838 break;
839 case DEMANGLE_COMPONENT_TLS_WRAPPER:
840 printf ("tls wrapper function\n");
841 break;
842 case DEMANGLE_COMPONENT_DEFAULT_ARG:
843 printf ("default argument %d\n", dc->u.s_unary_num.num);
844 d_dump (dc->u.s_unary_num.sub, indent+2);
845 return;
846 case DEMANGLE_COMPONENT_LAMBDA:
847 printf ("lambda %d\n", dc->u.s_unary_num.num);
848 d_dump (dc->u.s_unary_num.sub, indent+2);
849 return;
852 d_dump (d_left (dc), indent + 2);
853 d_dump (d_right (dc), indent + 2);
856 #endif /* CP_DEMANGLE_DEBUG */
858 /* Fill in a DEMANGLE_COMPONENT_NAME. */
860 CP_STATIC_IF_GLIBCPP_V3
862 cplus_demangle_fill_name (struct demangle_component *p, const char *s, int len)
864 if (p == NULL || s == NULL || len <= 0)
865 return 0;
866 p->d_printing = 0;
867 p->type = DEMANGLE_COMPONENT_NAME;
868 p->u.s_name.s = s;
869 p->u.s_name.len = len;
870 return 1;
873 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */
875 CP_STATIC_IF_GLIBCPP_V3
877 cplus_demangle_fill_extended_operator (struct demangle_component *p, int args,
878 struct demangle_component *name)
880 if (p == NULL || args < 0 || name == NULL)
881 return 0;
882 p->d_printing = 0;
883 p->type = DEMANGLE_COMPONENT_EXTENDED_OPERATOR;
884 p->u.s_extended_operator.args = args;
885 p->u.s_extended_operator.name = name;
886 return 1;
889 /* Fill in a DEMANGLE_COMPONENT_CTOR. */
891 CP_STATIC_IF_GLIBCPP_V3
893 cplus_demangle_fill_ctor (struct demangle_component *p,
894 enum gnu_v3_ctor_kinds kind,
895 struct demangle_component *name)
897 if (p == NULL
898 || name == NULL
899 || (int) kind < gnu_v3_complete_object_ctor
900 || (int) kind > gnu_v3_object_ctor_group)
901 return 0;
902 p->d_printing = 0;
903 p->type = DEMANGLE_COMPONENT_CTOR;
904 p->u.s_ctor.kind = kind;
905 p->u.s_ctor.name = name;
906 return 1;
909 /* Fill in a DEMANGLE_COMPONENT_DTOR. */
911 CP_STATIC_IF_GLIBCPP_V3
913 cplus_demangle_fill_dtor (struct demangle_component *p,
914 enum gnu_v3_dtor_kinds kind,
915 struct demangle_component *name)
917 if (p == NULL
918 || name == NULL
919 || (int) kind < gnu_v3_deleting_dtor
920 || (int) kind > gnu_v3_object_dtor_group)
921 return 0;
922 p->d_printing = 0;
923 p->type = DEMANGLE_COMPONENT_DTOR;
924 p->u.s_dtor.kind = kind;
925 p->u.s_dtor.name = name;
926 return 1;
929 /* Add a new component. */
931 static struct demangle_component *
932 d_make_empty (struct d_info *di)
934 struct demangle_component *p;
936 if (di->next_comp >= di->num_comps)
937 return NULL;
938 p = &di->comps[di->next_comp];
939 p->d_printing = 0;
940 ++di->next_comp;
941 return p;
944 /* Add a new generic component. */
946 static struct demangle_component *
947 d_make_comp (struct d_info *di, enum demangle_component_type type,
948 struct demangle_component *left,
949 struct demangle_component *right)
951 struct demangle_component *p;
953 /* We check for errors here. A typical error would be a NULL return
954 from a subroutine. We catch those here, and return NULL
955 upward. */
956 switch (type)
958 /* These types require two parameters. */
959 case DEMANGLE_COMPONENT_QUAL_NAME:
960 case DEMANGLE_COMPONENT_LOCAL_NAME:
961 case DEMANGLE_COMPONENT_TYPED_NAME:
962 case DEMANGLE_COMPONENT_TAGGED_NAME:
963 case DEMANGLE_COMPONENT_TEMPLATE:
964 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
965 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
966 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
967 case DEMANGLE_COMPONENT_UNARY:
968 case DEMANGLE_COMPONENT_BINARY:
969 case DEMANGLE_COMPONENT_BINARY_ARGS:
970 case DEMANGLE_COMPONENT_TRINARY:
971 case DEMANGLE_COMPONENT_TRINARY_ARG1:
972 case DEMANGLE_COMPONENT_LITERAL:
973 case DEMANGLE_COMPONENT_LITERAL_NEG:
974 case DEMANGLE_COMPONENT_COMPOUND_NAME:
975 case DEMANGLE_COMPONENT_VECTOR_TYPE:
976 case DEMANGLE_COMPONENT_CLONE:
977 if (left == NULL || right == NULL)
978 return NULL;
979 break;
981 /* These types only require one parameter. */
982 case DEMANGLE_COMPONENT_VTABLE:
983 case DEMANGLE_COMPONENT_VTT:
984 case DEMANGLE_COMPONENT_TYPEINFO:
985 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
986 case DEMANGLE_COMPONENT_TYPEINFO_FN:
987 case DEMANGLE_COMPONENT_THUNK:
988 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
989 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
990 case DEMANGLE_COMPONENT_JAVA_CLASS:
991 case DEMANGLE_COMPONENT_GUARD:
992 case DEMANGLE_COMPONENT_TLS_INIT:
993 case DEMANGLE_COMPONENT_TLS_WRAPPER:
994 case DEMANGLE_COMPONENT_REFTEMP:
995 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
996 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
997 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
998 case DEMANGLE_COMPONENT_POINTER:
999 case DEMANGLE_COMPONENT_REFERENCE:
1000 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
1001 case DEMANGLE_COMPONENT_COMPLEX:
1002 case DEMANGLE_COMPONENT_IMAGINARY:
1003 case DEMANGLE_COMPONENT_VENDOR_TYPE:
1004 case DEMANGLE_COMPONENT_CAST:
1005 case DEMANGLE_COMPONENT_CONVERSION:
1006 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
1007 case DEMANGLE_COMPONENT_DECLTYPE:
1008 case DEMANGLE_COMPONENT_PACK_EXPANSION:
1009 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
1010 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
1011 case DEMANGLE_COMPONENT_NULLARY:
1012 case DEMANGLE_COMPONENT_TRINARY_ARG2:
1013 case DEMANGLE_COMPONENT_TPARM_OBJ:
1014 if (left == NULL)
1015 return NULL;
1016 break;
1018 /* This needs a right parameter, but the left parameter can be
1019 empty. */
1020 case DEMANGLE_COMPONENT_ARRAY_TYPE:
1021 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
1022 if (right == NULL)
1023 return NULL;
1024 break;
1026 /* These are allowed to have no parameters--in some cases they
1027 will be filled in later. */
1028 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
1029 case DEMANGLE_COMPONENT_RESTRICT:
1030 case DEMANGLE_COMPONENT_VOLATILE:
1031 case DEMANGLE_COMPONENT_CONST:
1032 case DEMANGLE_COMPONENT_ARGLIST:
1033 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
1034 FNQUAL_COMPONENT_CASE:
1035 break;
1037 /* Other types should not be seen here. */
1038 default:
1039 return NULL;
1042 p = d_make_empty (di);
1043 if (p != NULL)
1045 p->type = type;
1046 p->u.s_binary.left = left;
1047 p->u.s_binary.right = right;
1049 return p;
1052 /* Add a new demangle mangled name component. */
1054 static struct demangle_component *
1055 d_make_demangle_mangled_name (struct d_info *di, const char *s)
1057 if (d_peek_char (di) != '_' || d_peek_next_char (di) != 'Z')
1058 return d_make_name (di, s, strlen (s));
1059 d_advance (di, 2);
1060 return d_encoding (di, 0);
1063 /* Add a new name component. */
1065 static struct demangle_component *
1066 d_make_name (struct d_info *di, const char *s, int len)
1068 struct demangle_component *p;
1070 p = d_make_empty (di);
1071 if (! cplus_demangle_fill_name (p, s, len))
1072 return NULL;
1073 return p;
1076 /* Add a new builtin type component. */
1078 static struct demangle_component *
1079 d_make_builtin_type (struct d_info *di,
1080 const struct demangle_builtin_type_info *type)
1082 struct demangle_component *p;
1084 if (type == NULL)
1085 return NULL;
1086 p = d_make_empty (di);
1087 if (p != NULL)
1089 p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE;
1090 p->u.s_builtin.type = type;
1092 return p;
1095 /* Add a new operator component. */
1097 static struct demangle_component *
1098 d_make_operator (struct d_info *di, const struct demangle_operator_info *op)
1100 struct demangle_component *p;
1102 p = d_make_empty (di);
1103 if (p != NULL)
1105 p->type = DEMANGLE_COMPONENT_OPERATOR;
1106 p->u.s_operator.op = op;
1108 return p;
1111 /* Add a new extended operator component. */
1113 static struct demangle_component *
1114 d_make_extended_operator (struct d_info *di, int args,
1115 struct demangle_component *name)
1117 struct demangle_component *p;
1119 p = d_make_empty (di);
1120 if (! cplus_demangle_fill_extended_operator (p, args, name))
1121 return NULL;
1122 return p;
1125 static struct demangle_component *
1126 d_make_default_arg (struct d_info *di, int num,
1127 struct demangle_component *sub)
1129 struct demangle_component *p = d_make_empty (di);
1130 if (p)
1132 p->type = DEMANGLE_COMPONENT_DEFAULT_ARG;
1133 p->u.s_unary_num.num = num;
1134 p->u.s_unary_num.sub = sub;
1136 return p;
1139 /* Add a new constructor component. */
1141 static struct demangle_component *
1142 d_make_ctor (struct d_info *di, enum gnu_v3_ctor_kinds kind,
1143 struct demangle_component *name)
1145 struct demangle_component *p;
1147 p = d_make_empty (di);
1148 if (! cplus_demangle_fill_ctor (p, kind, name))
1149 return NULL;
1150 return p;
1153 /* Add a new destructor component. */
1155 static struct demangle_component *
1156 d_make_dtor (struct d_info *di, enum gnu_v3_dtor_kinds kind,
1157 struct demangle_component *name)
1159 struct demangle_component *p;
1161 p = d_make_empty (di);
1162 if (! cplus_demangle_fill_dtor (p, kind, name))
1163 return NULL;
1164 return p;
1167 /* Add a new template parameter. */
1169 static struct demangle_component *
1170 d_make_template_param (struct d_info *di, int i)
1172 struct demangle_component *p;
1174 p = d_make_empty (di);
1175 if (p != NULL)
1177 p->type = DEMANGLE_COMPONENT_TEMPLATE_PARAM;
1178 p->u.s_number.number = i;
1180 return p;
1183 /* Add a new function parameter. */
1185 static struct demangle_component *
1186 d_make_function_param (struct d_info *di, int i)
1188 struct demangle_component *p;
1190 p = d_make_empty (di);
1191 if (p != NULL)
1193 p->type = DEMANGLE_COMPONENT_FUNCTION_PARAM;
1194 p->u.s_number.number = i;
1196 return p;
1199 /* Add a new standard substitution component. */
1201 static struct demangle_component *
1202 d_make_sub (struct d_info *di, const char *name, int len)
1204 struct demangle_component *p;
1206 p = d_make_empty (di);
1207 if (p != NULL)
1209 p->type = DEMANGLE_COMPONENT_SUB_STD;
1210 p->u.s_string.string = name;
1211 p->u.s_string.len = len;
1213 return p;
1216 /* <mangled-name> ::= _Z <encoding> [<clone-suffix>]*
1218 TOP_LEVEL is non-zero when called at the top level. */
1220 CP_STATIC_IF_GLIBCPP_V3
1221 struct demangle_component *
1222 cplus_demangle_mangled_name (struct d_info *di, int top_level)
1224 struct demangle_component *p;
1226 if (! d_check_char (di, '_')
1227 /* Allow missing _ if not at toplevel to work around a
1228 bug in G++ abi-version=2 mangling; see the comment in
1229 write_template_arg. */
1230 && top_level)
1231 return NULL;
1232 if (! d_check_char (di, 'Z'))
1233 return NULL;
1234 p = d_encoding (di, top_level);
1236 /* If at top level and parsing parameters, check for a clone
1237 suffix. */
1238 if (top_level && (di->options & DMGL_PARAMS) != 0)
1239 while (d_peek_char (di) == '.'
1240 && (IS_LOWER (d_peek_next_char (di))
1241 || d_peek_next_char (di) == '_'
1242 || IS_DIGIT (d_peek_next_char (di))))
1243 p = d_clone_suffix (di, p);
1245 return p;
1248 /* Return whether a function should have a return type. The argument
1249 is the function name, which may be qualified in various ways. The
1250 rules are that template functions have return types with some
1251 exceptions, function types which are not part of a function name
1252 mangling have return types with some exceptions, and non-template
1253 function names do not have return types. The exceptions are that
1254 constructors, destructors, and conversion operators do not have
1255 return types. */
1257 static int
1258 has_return_type (struct demangle_component *dc)
1260 if (dc == NULL)
1261 return 0;
1262 switch (dc->type)
1264 default:
1265 return 0;
1266 case DEMANGLE_COMPONENT_LOCAL_NAME:
1267 return has_return_type (d_right (dc));
1268 case DEMANGLE_COMPONENT_TEMPLATE:
1269 return ! is_ctor_dtor_or_conversion (d_left (dc));
1270 FNQUAL_COMPONENT_CASE:
1271 return has_return_type (d_left (dc));
1275 /* Return whether a name is a constructor, a destructor, or a
1276 conversion operator. */
1278 static int
1279 is_ctor_dtor_or_conversion (struct demangle_component *dc)
1281 if (dc == NULL)
1282 return 0;
1283 switch (dc->type)
1285 default:
1286 return 0;
1287 case DEMANGLE_COMPONENT_QUAL_NAME:
1288 case DEMANGLE_COMPONENT_LOCAL_NAME:
1289 return is_ctor_dtor_or_conversion (d_right (dc));
1290 case DEMANGLE_COMPONENT_CTOR:
1291 case DEMANGLE_COMPONENT_DTOR:
1292 case DEMANGLE_COMPONENT_CONVERSION:
1293 return 1;
1297 /* <encoding> ::= <(function) name> <bare-function-type>
1298 ::= <(data) name>
1299 ::= <special-name>
1301 TOP_LEVEL is non-zero when called at the top level, in which case
1302 if DMGL_PARAMS is not set we do not demangle the function
1303 parameters. We only set this at the top level, because otherwise
1304 we would not correctly demangle names in local scopes. */
1306 static struct demangle_component *
1307 d_encoding (struct d_info *di, int top_level)
1309 char peek = d_peek_char (di);
1310 struct demangle_component *dc;
1312 if (peek == 'G' || peek == 'T')
1313 dc = d_special_name (di);
1314 else
1316 dc = d_name (di);
1318 if (!dc)
1319 /* Failed already. */;
1320 else if (top_level && (di->options & DMGL_PARAMS) == 0)
1322 /* Strip off any initial CV-qualifiers, as they really apply
1323 to the `this' parameter, and they were not output by the
1324 v2 demangler without DMGL_PARAMS. */
1325 while (is_fnqual_component_type (dc->type))
1326 dc = d_left (dc);
1328 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
1329 there may be function-qualifiers on its right argument which
1330 really apply here; this happens when parsing a class
1331 which is local to a function. */
1332 if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME)
1333 while (is_fnqual_component_type (d_right (dc)->type))
1334 d_right (dc) = d_left (d_right (dc));
1336 else
1338 peek = d_peek_char (di);
1339 if (peek != '\0' && peek != 'E')
1341 struct demangle_component *ftype;
1343 ftype = d_bare_function_type (di, has_return_type (dc));
1344 if (ftype)
1346 /* If this is a non-top-level local-name, clear the
1347 return type, so it doesn't confuse the user by
1348 being confused with the return type of whaever
1349 this is nested within. */
1350 if (!top_level && dc->type == DEMANGLE_COMPONENT_LOCAL_NAME
1351 && ftype->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
1352 d_left (ftype) = NULL;
1354 dc = d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME,
1355 dc, ftype);
1357 else
1358 dc = NULL;
1363 return dc;
1366 /* <tagged-name> ::= <name> B <source-name> */
1368 static struct demangle_component *
1369 d_abi_tags (struct d_info *di, struct demangle_component *dc)
1371 struct demangle_component *hold_last_name;
1372 char peek;
1374 /* Preserve the last name, so the ABI tag doesn't clobber it. */
1375 hold_last_name = di->last_name;
1377 while (peek = d_peek_char (di),
1378 peek == 'B')
1380 struct demangle_component *tag;
1381 d_advance (di, 1);
1382 tag = d_source_name (di);
1383 dc = d_make_comp (di, DEMANGLE_COMPONENT_TAGGED_NAME, dc, tag);
1386 di->last_name = hold_last_name;
1388 return dc;
1391 /* <name> ::= <nested-name>
1392 ::= <unscoped-name>
1393 ::= <unscoped-template-name> <template-args>
1394 ::= <local-name>
1396 <unscoped-name> ::= <unqualified-name>
1397 ::= St <unqualified-name>
1399 <unscoped-template-name> ::= <unscoped-name>
1400 ::= <substitution>
1403 static struct demangle_component *
1404 d_name (struct d_info *di)
1406 char peek = d_peek_char (di);
1407 struct demangle_component *dc;
1409 switch (peek)
1411 case 'N':
1412 return d_nested_name (di);
1414 case 'Z':
1415 return d_local_name (di);
1417 case 'U':
1418 return d_unqualified_name (di);
1420 case 'S':
1422 int subst;
1424 if (d_peek_next_char (di) != 't')
1426 dc = d_substitution (di, 0);
1427 subst = 1;
1429 else
1431 d_advance (di, 2);
1432 dc = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME,
1433 d_make_name (di, "std", 3),
1434 d_unqualified_name (di));
1435 di->expansion += 3;
1436 subst = 0;
1439 if (d_peek_char (di) != 'I')
1441 /* The grammar does not permit this case to occur if we
1442 called d_substitution() above (i.e., subst == 1). We
1443 don't bother to check. */
1445 else
1447 /* This is <template-args>, which means that we just saw
1448 <unscoped-template-name>, which is a substitution
1449 candidate if we didn't just get it from a
1450 substitution. */
1451 if (! subst)
1453 if (! d_add_substitution (di, dc))
1454 return NULL;
1456 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1457 d_template_args (di));
1460 return dc;
1463 case 'L':
1464 default:
1465 dc = d_unqualified_name (di);
1466 if (d_peek_char (di) == 'I')
1468 /* This is <template-args>, which means that we just saw
1469 <unscoped-template-name>, which is a substitution
1470 candidate. */
1471 if (! d_add_substitution (di, dc))
1472 return NULL;
1473 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
1474 d_template_args (di));
1476 return dc;
1480 /* <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
1481 ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
1484 static struct demangle_component *
1485 d_nested_name (struct d_info *di)
1487 struct demangle_component *ret;
1488 struct demangle_component **pret;
1489 struct demangle_component *rqual;
1491 if (! d_check_char (di, 'N'))
1492 return NULL;
1494 pret = d_cv_qualifiers (di, &ret, 1);
1495 if (pret == NULL)
1496 return NULL;
1498 /* Parse the ref-qualifier now and then attach it
1499 once we have something to attach it to. */
1500 rqual = d_ref_qualifier (di, NULL);
1502 *pret = d_prefix (di);
1503 if (*pret == NULL)
1504 return NULL;
1506 if (rqual)
1508 d_left (rqual) = ret;
1509 ret = rqual;
1512 if (! d_check_char (di, 'E'))
1513 return NULL;
1515 return ret;
1518 /* <prefix> ::= <prefix> <unqualified-name>
1519 ::= <template-prefix> <template-args>
1520 ::= <template-param>
1521 ::= <decltype>
1523 ::= <substitution>
1525 <template-prefix> ::= <prefix> <(template) unqualified-name>
1526 ::= <template-param>
1527 ::= <substitution>
1530 static struct demangle_component *
1531 d_prefix (struct d_info *di)
1533 struct demangle_component *ret = NULL;
1535 while (1)
1537 char peek;
1538 enum demangle_component_type comb_type;
1539 struct demangle_component *dc;
1541 peek = d_peek_char (di);
1542 if (peek == '\0')
1543 return NULL;
1545 /* The older code accepts a <local-name> here, but I don't see
1546 that in the grammar. The older code does not accept a
1547 <template-param> here. */
1549 comb_type = DEMANGLE_COMPONENT_QUAL_NAME;
1550 if (peek == 'D')
1552 char peek2 = d_peek_next_char (di);
1553 if (peek2 == 'T' || peek2 == 't')
1554 /* Decltype. */
1555 dc = cplus_demangle_type (di);
1556 else
1557 /* Destructor name. */
1558 dc = d_unqualified_name (di);
1560 else if (IS_DIGIT (peek)
1561 || IS_LOWER (peek)
1562 || peek == 'C'
1563 || peek == 'U'
1564 || peek == 'L')
1565 dc = d_unqualified_name (di);
1566 else if (peek == 'S')
1567 dc = d_substitution (di, 1);
1568 else if (peek == 'I')
1570 if (ret == NULL)
1571 return NULL;
1572 comb_type = DEMANGLE_COMPONENT_TEMPLATE;
1573 dc = d_template_args (di);
1575 else if (peek == 'T')
1576 dc = d_template_param (di);
1577 else if (peek == 'E')
1578 return ret;
1579 else if (peek == 'M')
1581 /* Initializer scope for a lambda. We don't need to represent
1582 this; the normal code will just treat the variable as a type
1583 scope, which gives appropriate output. */
1584 if (ret == NULL)
1585 return NULL;
1586 d_advance (di, 1);
1587 continue;
1589 else
1590 return NULL;
1592 if (ret == NULL)
1593 ret = dc;
1594 else
1595 ret = d_make_comp (di, comb_type, ret, dc);
1597 if (peek != 'S' && d_peek_char (di) != 'E')
1599 if (! d_add_substitution (di, ret))
1600 return NULL;
1605 /* <unqualified-name> ::= <operator-name>
1606 ::= <ctor-dtor-name>
1607 ::= <source-name>
1608 ::= <local-source-name>
1610 <local-source-name> ::= L <source-name> <discriminator>
1613 static struct demangle_component *
1614 d_unqualified_name (struct d_info *di)
1616 struct demangle_component *ret;
1617 char peek;
1619 peek = d_peek_char (di);
1620 if (IS_DIGIT (peek))
1621 ret = d_source_name (di);
1622 else if (IS_LOWER (peek))
1624 if (peek == 'o' && d_peek_next_char (di) == 'n')
1625 d_advance (di, 2);
1626 ret = d_operator_name (di);
1627 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_OPERATOR)
1629 di->expansion += sizeof "operator" + ret->u.s_operator.op->len - 2;
1630 if (!strcmp (ret->u.s_operator.op->code, "li"))
1631 ret = d_make_comp (di, DEMANGLE_COMPONENT_UNARY, ret,
1632 d_source_name (di));
1635 else if (peek == 'C' || peek == 'D')
1636 ret = d_ctor_dtor_name (di);
1637 else if (peek == 'L')
1639 d_advance (di, 1);
1641 ret = d_source_name (di);
1642 if (ret == NULL)
1643 return NULL;
1644 if (! d_discriminator (di))
1645 return NULL;
1647 else if (peek == 'U')
1649 switch (d_peek_next_char (di))
1651 case 'l':
1652 ret = d_lambda (di);
1653 break;
1654 case 't':
1655 ret = d_unnamed_type (di);
1656 break;
1657 default:
1658 return NULL;
1661 else
1662 return NULL;
1664 if (d_peek_char (di) == 'B')
1665 ret = d_abi_tags (di, ret);
1666 return ret;
1669 /* <source-name> ::= <(positive length) number> <identifier> */
1671 static struct demangle_component *
1672 d_source_name (struct d_info *di)
1674 int len;
1675 struct demangle_component *ret;
1677 len = d_number (di);
1678 if (len <= 0)
1679 return NULL;
1680 ret = d_identifier (di, len);
1681 di->last_name = ret;
1682 return ret;
1685 /* number ::= [n] <(non-negative decimal integer)> */
1687 static int
1688 d_number (struct d_info *di)
1690 int negative;
1691 char peek;
1692 int ret;
1694 negative = 0;
1695 peek = d_peek_char (di);
1696 if (peek == 'n')
1698 negative = 1;
1699 d_advance (di, 1);
1700 peek = d_peek_char (di);
1703 ret = 0;
1704 while (1)
1706 if (! IS_DIGIT (peek))
1708 if (negative)
1709 ret = - ret;
1710 return ret;
1712 if (ret > ((INT_MAX - (peek - '0')) / 10))
1713 return -1;
1714 ret = ret * 10 + peek - '0';
1715 d_advance (di, 1);
1716 peek = d_peek_char (di);
1720 /* Like d_number, but returns a demangle_component. */
1722 static struct demangle_component *
1723 d_number_component (struct d_info *di)
1725 struct demangle_component *ret = d_make_empty (di);
1726 if (ret)
1728 ret->type = DEMANGLE_COMPONENT_NUMBER;
1729 ret->u.s_number.number = d_number (di);
1731 return ret;
1734 /* identifier ::= <(unqualified source code identifier)> */
1736 static struct demangle_component *
1737 d_identifier (struct d_info *di, int len)
1739 const char *name;
1741 name = d_str (di);
1743 if (di->send - name < len)
1744 return NULL;
1746 d_advance (di, len);
1748 /* A Java mangled name may have a trailing '$' if it is a C++
1749 keyword. This '$' is not included in the length count. We just
1750 ignore the '$'. */
1751 if ((di->options & DMGL_JAVA) != 0
1752 && d_peek_char (di) == '$')
1753 d_advance (di, 1);
1755 /* Look for something which looks like a gcc encoding of an
1756 anonymous namespace, and replace it with a more user friendly
1757 name. */
1758 if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
1759 && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX,
1760 ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0)
1762 const char *s;
1764 s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN;
1765 if ((*s == '.' || *s == '_' || *s == '$')
1766 && s[1] == 'N')
1768 di->expansion -= len - sizeof "(anonymous namespace)";
1769 return d_make_name (di, "(anonymous namespace)",
1770 sizeof "(anonymous namespace)" - 1);
1774 return d_make_name (di, name, len);
1777 /* operator_name ::= many different two character encodings.
1778 ::= cv <type>
1779 ::= v <digit> <source-name>
1781 This list is sorted for binary search. */
1783 #define NL(s) s, (sizeof s) - 1
1785 CP_STATIC_IF_GLIBCPP_V3
1786 const struct demangle_operator_info cplus_demangle_operators[] =
1788 { "aN", NL ("&="), 2 },
1789 { "aS", NL ("="), 2 },
1790 { "aa", NL ("&&"), 2 },
1791 { "ad", NL ("&"), 1 },
1792 { "an", NL ("&"), 2 },
1793 { "at", NL ("alignof "), 1 },
1794 { "az", NL ("alignof "), 1 },
1795 { "cc", NL ("const_cast"), 2 },
1796 { "cl", NL ("()"), 2 },
1797 { "cm", NL (","), 2 },
1798 { "co", NL ("~"), 1 },
1799 { "dV", NL ("/="), 2 },
1800 { "da", NL ("delete[] "), 1 },
1801 { "dc", NL ("dynamic_cast"), 2 },
1802 { "de", NL ("*"), 1 },
1803 { "dl", NL ("delete "), 1 },
1804 { "ds", NL (".*"), 2 },
1805 { "dt", NL ("."), 2 },
1806 { "dv", NL ("/"), 2 },
1807 { "eO", NL ("^="), 2 },
1808 { "eo", NL ("^"), 2 },
1809 { "eq", NL ("=="), 2 },
1810 { "fL", NL ("..."), 3 },
1811 { "fR", NL ("..."), 3 },
1812 { "fl", NL ("..."), 2 },
1813 { "fr", NL ("..."), 2 },
1814 { "ge", NL (">="), 2 },
1815 { "gs", NL ("::"), 1 },
1816 { "gt", NL (">"), 2 },
1817 { "ix", NL ("[]"), 2 },
1818 { "lS", NL ("<<="), 2 },
1819 { "le", NL ("<="), 2 },
1820 { "li", NL ("operator\"\" "), 1 },
1821 { "ls", NL ("<<"), 2 },
1822 { "lt", NL ("<"), 2 },
1823 { "mI", NL ("-="), 2 },
1824 { "mL", NL ("*="), 2 },
1825 { "mi", NL ("-"), 2 },
1826 { "ml", NL ("*"), 2 },
1827 { "mm", NL ("--"), 1 },
1828 { "na", NL ("new[]"), 3 },
1829 { "ne", NL ("!="), 2 },
1830 { "ng", NL ("-"), 1 },
1831 { "nt", NL ("!"), 1 },
1832 { "nw", NL ("new"), 3 },
1833 { "oR", NL ("|="), 2 },
1834 { "oo", NL ("||"), 2 },
1835 { "or", NL ("|"), 2 },
1836 { "pL", NL ("+="), 2 },
1837 { "pl", NL ("+"), 2 },
1838 { "pm", NL ("->*"), 2 },
1839 { "pp", NL ("++"), 1 },
1840 { "ps", NL ("+"), 1 },
1841 { "pt", NL ("->"), 2 },
1842 { "qu", NL ("?"), 3 },
1843 { "rM", NL ("%="), 2 },
1844 { "rS", NL (">>="), 2 },
1845 { "rc", NL ("reinterpret_cast"), 2 },
1846 { "rm", NL ("%"), 2 },
1847 { "rs", NL (">>"), 2 },
1848 { "sP", NL ("sizeof..."), 1 },
1849 { "sZ", NL ("sizeof..."), 1 },
1850 { "sc", NL ("static_cast"), 2 },
1851 { "st", NL ("sizeof "), 1 },
1852 { "sz", NL ("sizeof "), 1 },
1853 { "tr", NL ("throw"), 0 },
1854 { "tw", NL ("throw "), 1 },
1855 { NULL, NULL, 0, 0 }
1858 static struct demangle_component *
1859 d_operator_name (struct d_info *di)
1861 char c1;
1862 char c2;
1864 c1 = d_next_char (di);
1865 c2 = d_next_char (di);
1866 if (c1 == 'v' && IS_DIGIT (c2))
1867 return d_make_extended_operator (di, c2 - '0', d_source_name (di));
1868 else if (c1 == 'c' && c2 == 'v')
1870 struct demangle_component *type;
1871 int was_conversion = di->is_conversion;
1872 struct demangle_component *res;
1874 di->is_conversion = ! di->is_expression;
1875 type = cplus_demangle_type (di);
1876 if (di->is_conversion)
1877 res = d_make_comp (di, DEMANGLE_COMPONENT_CONVERSION, type, NULL);
1878 else
1879 res = d_make_comp (di, DEMANGLE_COMPONENT_CAST, type, NULL);
1880 di->is_conversion = was_conversion;
1881 return res;
1883 else
1885 /* LOW is the inclusive lower bound. */
1886 int low = 0;
1887 /* HIGH is the exclusive upper bound. We subtract one to ignore
1888 the sentinel at the end of the array. */
1889 int high = ((sizeof (cplus_demangle_operators)
1890 / sizeof (cplus_demangle_operators[0]))
1891 - 1);
1893 while (1)
1895 int i;
1896 const struct demangle_operator_info *p;
1898 i = low + (high - low) / 2;
1899 p = cplus_demangle_operators + i;
1901 if (c1 == p->code[0] && c2 == p->code[1])
1902 return d_make_operator (di, p);
1904 if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1]))
1905 high = i;
1906 else
1907 low = i + 1;
1908 if (low == high)
1909 return NULL;
1914 static struct demangle_component *
1915 d_make_character (struct d_info *di, int c)
1917 struct demangle_component *p;
1918 p = d_make_empty (di);
1919 if (p != NULL)
1921 p->type = DEMANGLE_COMPONENT_CHARACTER;
1922 p->u.s_character.character = c;
1924 return p;
1927 static struct demangle_component *
1928 d_java_resource (struct d_info *di)
1930 struct demangle_component *p = NULL;
1931 struct demangle_component *next = NULL;
1932 int len, i;
1933 char c;
1934 const char *str;
1936 len = d_number (di);
1937 if (len <= 1)
1938 return NULL;
1940 /* Eat the leading '_'. */
1941 if (d_next_char (di) != '_')
1942 return NULL;
1943 len--;
1945 str = d_str (di);
1946 i = 0;
1948 while (len > 0)
1950 c = str[i];
1951 if (!c)
1952 return NULL;
1954 /* Each chunk is either a '$' escape... */
1955 if (c == '$')
1957 i++;
1958 switch (str[i++])
1960 case 'S':
1961 c = '/';
1962 break;
1963 case '_':
1964 c = '.';
1965 break;
1966 case '$':
1967 c = '$';
1968 break;
1969 default:
1970 return NULL;
1972 next = d_make_character (di, c);
1973 d_advance (di, i);
1974 str = d_str (di);
1975 len -= i;
1976 i = 0;
1977 if (next == NULL)
1978 return NULL;
1980 /* ... or a sequence of characters. */
1981 else
1983 while (i < len && str[i] && str[i] != '$')
1984 i++;
1986 next = d_make_name (di, str, i);
1987 d_advance (di, i);
1988 str = d_str (di);
1989 len -= i;
1990 i = 0;
1991 if (next == NULL)
1992 return NULL;
1995 if (p == NULL)
1996 p = next;
1997 else
1999 p = d_make_comp (di, DEMANGLE_COMPONENT_COMPOUND_NAME, p, next);
2000 if (p == NULL)
2001 return NULL;
2005 p = d_make_comp (di, DEMANGLE_COMPONENT_JAVA_RESOURCE, p, NULL);
2007 return p;
2010 /* <special-name> ::= TV <type>
2011 ::= TT <type>
2012 ::= TI <type>
2013 ::= TS <type>
2014 ::= TA <template-arg>
2015 ::= GV <(object) name>
2016 ::= T <call-offset> <(base) encoding>
2017 ::= Tc <call-offset> <call-offset> <(base) encoding>
2018 Also g++ extensions:
2019 ::= TC <type> <(offset) number> _ <(base) type>
2020 ::= TF <type>
2021 ::= TJ <type>
2022 ::= GR <name>
2023 ::= GA <encoding>
2024 ::= Gr <resource name>
2025 ::= GTt <encoding>
2026 ::= GTn <encoding>
2029 static struct demangle_component *
2030 d_special_name (struct d_info *di)
2032 di->expansion += 20;
2033 if (d_check_char (di, 'T'))
2035 switch (d_next_char (di))
2037 case 'V':
2038 di->expansion -= 5;
2039 return d_make_comp (di, DEMANGLE_COMPONENT_VTABLE,
2040 cplus_demangle_type (di), NULL);
2041 case 'T':
2042 di->expansion -= 10;
2043 return d_make_comp (di, DEMANGLE_COMPONENT_VTT,
2044 cplus_demangle_type (di), NULL);
2045 case 'I':
2046 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO,
2047 cplus_demangle_type (di), NULL);
2048 case 'S':
2049 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_NAME,
2050 cplus_demangle_type (di), NULL);
2052 case 'h':
2053 if (! d_call_offset (di, 'h'))
2054 return NULL;
2055 return d_make_comp (di, DEMANGLE_COMPONENT_THUNK,
2056 d_encoding (di, 0), NULL);
2058 case 'v':
2059 if (! d_call_offset (di, 'v'))
2060 return NULL;
2061 return d_make_comp (di, DEMANGLE_COMPONENT_VIRTUAL_THUNK,
2062 d_encoding (di, 0), NULL);
2064 case 'c':
2065 if (! d_call_offset (di, '\0'))
2066 return NULL;
2067 if (! d_call_offset (di, '\0'))
2068 return NULL;
2069 return d_make_comp (di, DEMANGLE_COMPONENT_COVARIANT_THUNK,
2070 d_encoding (di, 0), NULL);
2072 case 'C':
2074 struct demangle_component *derived_type;
2075 int offset;
2076 struct demangle_component *base_type;
2078 derived_type = cplus_demangle_type (di);
2079 offset = d_number (di);
2080 if (offset < 0)
2081 return NULL;
2082 if (! d_check_char (di, '_'))
2083 return NULL;
2084 base_type = cplus_demangle_type (di);
2085 /* We don't display the offset. FIXME: We should display
2086 it in verbose mode. */
2087 di->expansion += 5;
2088 return d_make_comp (di, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE,
2089 base_type, derived_type);
2092 case 'F':
2093 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_FN,
2094 cplus_demangle_type (di), NULL);
2095 case 'J':
2096 return d_make_comp (di, DEMANGLE_COMPONENT_JAVA_CLASS,
2097 cplus_demangle_type (di), NULL);
2099 case 'H':
2100 return d_make_comp (di, DEMANGLE_COMPONENT_TLS_INIT,
2101 d_name (di), NULL);
2103 case 'W':
2104 return d_make_comp (di, DEMANGLE_COMPONENT_TLS_WRAPPER,
2105 d_name (di), NULL);
2107 case 'A':
2108 return d_make_comp (di, DEMANGLE_COMPONENT_TPARM_OBJ,
2109 d_template_arg (di), NULL);
2111 default:
2112 return NULL;
2115 else if (d_check_char (di, 'G'))
2117 switch (d_next_char (di))
2119 case 'V':
2120 return d_make_comp (di, DEMANGLE_COMPONENT_GUARD,
2121 d_name (di), NULL);
2123 case 'R':
2125 struct demangle_component *name = d_name (di);
2126 return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, name,
2127 d_number_component (di));
2130 case 'A':
2131 return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS,
2132 d_encoding (di, 0), NULL);
2134 case 'T':
2135 switch (d_next_char (di))
2137 case 'n':
2138 return d_make_comp (di, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE,
2139 d_encoding (di, 0), NULL);
2140 default:
2141 /* ??? The proposal is that other letters (such as 'h') stand
2142 for different variants of transaction cloning, such as
2143 compiling directly for hardware transaction support. But
2144 they still should all be transactional clones of some sort
2145 so go ahead and call them that. */
2146 case 't':
2147 return d_make_comp (di, DEMANGLE_COMPONENT_TRANSACTION_CLONE,
2148 d_encoding (di, 0), NULL);
2151 case 'r':
2152 return d_java_resource (di);
2154 default:
2155 return NULL;
2158 else
2159 return NULL;
2162 /* <call-offset> ::= h <nv-offset> _
2163 ::= v <v-offset> _
2165 <nv-offset> ::= <(offset) number>
2167 <v-offset> ::= <(offset) number> _ <(virtual offset) number>
2169 The C parameter, if not '\0', is a character we just read which is
2170 the start of the <call-offset>.
2172 We don't display the offset information anywhere. FIXME: We should
2173 display it in verbose mode. */
2175 static int
2176 d_call_offset (struct d_info *di, int c)
2178 if (c == '\0')
2179 c = d_next_char (di);
2181 if (c == 'h')
2182 d_number (di);
2183 else if (c == 'v')
2185 d_number (di);
2186 if (! d_check_char (di, '_'))
2187 return 0;
2188 d_number (di);
2190 else
2191 return 0;
2193 if (! d_check_char (di, '_'))
2194 return 0;
2196 return 1;
2199 /* <ctor-dtor-name> ::= C1
2200 ::= C2
2201 ::= C3
2202 ::= D0
2203 ::= D1
2204 ::= D2
2207 static struct demangle_component *
2208 d_ctor_dtor_name (struct d_info *di)
2210 if (di->last_name != NULL)
2212 if (di->last_name->type == DEMANGLE_COMPONENT_NAME)
2213 di->expansion += di->last_name->u.s_name.len;
2214 else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD)
2215 di->expansion += di->last_name->u.s_string.len;
2217 switch (d_peek_char (di))
2219 case 'C':
2221 enum gnu_v3_ctor_kinds kind;
2222 int inheriting = 0;
2224 if (d_peek_next_char (di) == 'I')
2226 inheriting = 1;
2227 d_advance (di, 1);
2230 switch (d_peek_next_char (di))
2232 case '1':
2233 kind = gnu_v3_complete_object_ctor;
2234 break;
2235 case '2':
2236 kind = gnu_v3_base_object_ctor;
2237 break;
2238 case '3':
2239 kind = gnu_v3_complete_object_allocating_ctor;
2240 break;
2241 case '4':
2242 kind = gnu_v3_unified_ctor;
2243 break;
2244 case '5':
2245 kind = gnu_v3_object_ctor_group;
2246 break;
2247 default:
2248 return NULL;
2251 d_advance (di, 2);
2253 if (inheriting)
2254 cplus_demangle_type (di);
2256 return d_make_ctor (di, kind, di->last_name);
2259 case 'D':
2261 enum gnu_v3_dtor_kinds kind;
2263 switch (d_peek_next_char (di))
2265 case '0':
2266 kind = gnu_v3_deleting_dtor;
2267 break;
2268 case '1':
2269 kind = gnu_v3_complete_object_dtor;
2270 break;
2271 case '2':
2272 kind = gnu_v3_base_object_dtor;
2273 break;
2274 /* digit '3' is not used */
2275 case '4':
2276 kind = gnu_v3_unified_dtor;
2277 break;
2278 case '5':
2279 kind = gnu_v3_object_dtor_group;
2280 break;
2281 default:
2282 return NULL;
2284 d_advance (di, 2);
2285 return d_make_dtor (di, kind, di->last_name);
2288 default:
2289 return NULL;
2293 /* True iff we're looking at an order-insensitive type-qualifier, including
2294 function-type-qualifiers. */
2296 static int
2297 next_is_type_qual (struct d_info *di)
2299 char peek = d_peek_char (di);
2300 if (peek == 'r' || peek == 'V' || peek == 'K')
2301 return 1;
2302 if (peek == 'D')
2304 peek = d_peek_next_char (di);
2305 if (peek == 'x' || peek == 'o' || peek == 'O' || peek == 'w')
2306 return 1;
2308 return 0;
2311 /* <type> ::= <builtin-type>
2312 ::= <function-type>
2313 ::= <class-enum-type>
2314 ::= <array-type>
2315 ::= <pointer-to-member-type>
2316 ::= <template-param>
2317 ::= <template-template-param> <template-args>
2318 ::= <substitution>
2319 ::= <CV-qualifiers> <type>
2320 ::= P <type>
2321 ::= R <type>
2322 ::= O <type> (C++0x)
2323 ::= C <type>
2324 ::= G <type>
2325 ::= U <source-name> <type>
2327 <builtin-type> ::= various one letter codes
2328 ::= u <source-name>
2331 CP_STATIC_IF_GLIBCPP_V3
2332 const struct demangle_builtin_type_info
2333 cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] =
2335 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT },
2336 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL },
2337 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT },
2338 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT },
2339 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT },
2340 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT },
2341 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT },
2342 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT },
2343 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT },
2344 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED },
2345 /* k */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2346 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG },
2347 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG },
2348 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT },
2349 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
2350 D_PRINT_DEFAULT },
2351 /* p */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2352 /* q */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2353 /* r */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2354 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT },
2355 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
2356 /* u */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT },
2357 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID },
2358 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT },
2359 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG },
2360 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
2361 D_PRINT_UNSIGNED_LONG_LONG },
2362 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT },
2363 /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT },
2364 /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT },
2365 /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT },
2366 /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT },
2367 /* 30 */ { NL ("char8_t"), NL ("char8_t"), D_PRINT_DEFAULT },
2368 /* 31 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT },
2369 /* 32 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT },
2370 /* 33 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"),
2371 D_PRINT_DEFAULT },
2374 CP_STATIC_IF_GLIBCPP_V3
2375 struct demangle_component *
2376 cplus_demangle_type (struct d_info *di)
2378 char peek;
2379 struct demangle_component *ret;
2380 int can_subst;
2382 /* The ABI specifies that when CV-qualifiers are used, the base type
2383 is substitutable, and the fully qualified type is substitutable,
2384 but the base type with a strict subset of the CV-qualifiers is
2385 not substitutable. The natural recursive implementation of the
2386 CV-qualifiers would cause subsets to be substitutable, so instead
2387 we pull them all off now.
2389 FIXME: The ABI says that order-insensitive vendor qualifiers
2390 should be handled in the same way, but we have no way to tell
2391 which vendor qualifiers are order-insensitive and which are
2392 order-sensitive. So we just assume that they are all
2393 order-sensitive. g++ 3.4 supports only one vendor qualifier,
2394 __vector, and it treats it as order-sensitive when mangling
2395 names. */
2397 if (next_is_type_qual (di))
2399 struct demangle_component **pret;
2401 pret = d_cv_qualifiers (di, &ret, 0);
2402 if (pret == NULL)
2403 return NULL;
2404 if (d_peek_char (di) == 'F')
2406 /* cv-qualifiers before a function type apply to 'this',
2407 so avoid adding the unqualified function type to
2408 the substitution list. */
2409 *pret = d_function_type (di);
2411 else
2412 *pret = cplus_demangle_type (di);
2413 if (!*pret)
2414 return NULL;
2415 if ((*pret)->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
2416 || (*pret)->type == DEMANGLE_COMPONENT_REFERENCE_THIS)
2418 /* Move the ref-qualifier outside the cv-qualifiers so that
2419 they are printed in the right order. */
2420 struct demangle_component *fn = d_left (*pret);
2421 d_left (*pret) = ret;
2422 ret = *pret;
2423 *pret = fn;
2425 if (! d_add_substitution (di, ret))
2426 return NULL;
2427 return ret;
2430 can_subst = 1;
2432 peek = d_peek_char (di);
2433 switch (peek)
2435 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
2436 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n':
2437 case 'o': case 's': case 't':
2438 case 'v': case 'w': case 'x': case 'y': case 'z':
2439 ret = d_make_builtin_type (di,
2440 &cplus_demangle_builtin_types[peek - 'a']);
2441 di->expansion += ret->u.s_builtin.type->len;
2442 can_subst = 0;
2443 d_advance (di, 1);
2444 break;
2446 case 'u':
2447 d_advance (di, 1);
2448 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE,
2449 d_source_name (di), NULL);
2450 break;
2452 case 'F':
2453 ret = d_function_type (di);
2454 break;
2456 case '0': case '1': case '2': case '3': case '4':
2457 case '5': case '6': case '7': case '8': case '9':
2458 case 'N':
2459 case 'Z':
2460 ret = d_class_enum_type (di);
2461 break;
2463 case 'A':
2464 ret = d_array_type (di);
2465 break;
2467 case 'M':
2468 ret = d_pointer_to_member_type (di);
2469 break;
2471 case 'T':
2472 ret = d_template_param (di);
2473 if (d_peek_char (di) == 'I')
2475 /* This may be <template-template-param> <template-args>.
2476 If this is the type for a conversion operator, we can
2477 have a <template-template-param> here only by following
2478 a derivation like this:
2480 <nested-name>
2481 -> <template-prefix> <template-args>
2482 -> <prefix> <template-unqualified-name> <template-args>
2483 -> <unqualified-name> <template-unqualified-name> <template-args>
2484 -> <source-name> <template-unqualified-name> <template-args>
2485 -> <source-name> <operator-name> <template-args>
2486 -> <source-name> cv <type> <template-args>
2487 -> <source-name> cv <template-template-param> <template-args> <template-args>
2489 where the <template-args> is followed by another.
2490 Otherwise, we must have a derivation like this:
2492 <nested-name>
2493 -> <template-prefix> <template-args>
2494 -> <prefix> <template-unqualified-name> <template-args>
2495 -> <unqualified-name> <template-unqualified-name> <template-args>
2496 -> <source-name> <template-unqualified-name> <template-args>
2497 -> <source-name> <operator-name> <template-args>
2498 -> <source-name> cv <type> <template-args>
2499 -> <source-name> cv <template-param> <template-args>
2501 where we need to leave the <template-args> to be processed
2502 by d_prefix (following the <template-prefix>).
2504 The <template-template-param> part is a substitution
2505 candidate. */
2506 if (! di->is_conversion)
2508 if (! d_add_substitution (di, ret))
2509 return NULL;
2510 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2511 d_template_args (di));
2513 else
2515 struct demangle_component *args;
2516 struct d_info_checkpoint checkpoint;
2518 d_checkpoint (di, &checkpoint);
2519 args = d_template_args (di);
2520 if (d_peek_char (di) == 'I')
2522 if (! d_add_substitution (di, ret))
2523 return NULL;
2524 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2525 args);
2527 else
2528 d_backtrack (di, &checkpoint);
2531 break;
2533 case 'S':
2534 /* If this is a special substitution, then it is the start of
2535 <class-enum-type>. */
2537 char peek_next;
2539 peek_next = d_peek_next_char (di);
2540 if (IS_DIGIT (peek_next)
2541 || peek_next == '_'
2542 || IS_UPPER (peek_next))
2544 ret = d_substitution (di, 0);
2545 /* The substituted name may have been a template name and
2546 may be followed by tepmlate args. */
2547 if (d_peek_char (di) == 'I')
2548 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2549 d_template_args (di));
2550 else
2551 can_subst = 0;
2553 else
2555 ret = d_class_enum_type (di);
2556 /* If the substitution was a complete type, then it is not
2557 a new substitution candidate. However, if the
2558 substitution was followed by template arguments, then
2559 the whole thing is a substitution candidate. */
2560 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD)
2561 can_subst = 0;
2564 break;
2566 case 'O':
2567 d_advance (di, 1);
2568 ret = d_make_comp (di, DEMANGLE_COMPONENT_RVALUE_REFERENCE,
2569 cplus_demangle_type (di), NULL);
2570 break;
2572 case 'P':
2573 d_advance (di, 1);
2574 ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER,
2575 cplus_demangle_type (di), NULL);
2576 break;
2578 case 'R':
2579 d_advance (di, 1);
2580 ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE,
2581 cplus_demangle_type (di), NULL);
2582 break;
2584 case 'C':
2585 d_advance (di, 1);
2586 ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX,
2587 cplus_demangle_type (di), NULL);
2588 break;
2590 case 'G':
2591 d_advance (di, 1);
2592 ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY,
2593 cplus_demangle_type (di), NULL);
2594 break;
2596 case 'U':
2597 d_advance (di, 1);
2598 ret = d_source_name (di);
2599 if (d_peek_char (di) == 'I')
2600 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
2601 d_template_args (di));
2602 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL,
2603 cplus_demangle_type (di), ret);
2604 break;
2606 case 'D':
2607 can_subst = 0;
2608 d_advance (di, 1);
2609 peek = d_next_char (di);
2610 switch (peek)
2612 case 'T':
2613 case 't':
2614 /* decltype (expression) */
2615 ret = d_make_comp (di, DEMANGLE_COMPONENT_DECLTYPE,
2616 d_expression (di), NULL);
2617 if (ret && d_next_char (di) != 'E')
2618 ret = NULL;
2619 can_subst = 1;
2620 break;
2622 case 'p':
2623 /* Pack expansion. */
2624 ret = d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
2625 cplus_demangle_type (di), NULL);
2626 can_subst = 1;
2627 break;
2629 case 'a':
2630 /* auto */
2631 ret = d_make_name (di, "auto", 4);
2632 break;
2633 case 'c':
2634 /* decltype(auto) */
2635 ret = d_make_name (di, "decltype(auto)", 14);
2636 break;
2638 case 'f':
2639 /* 32-bit decimal floating point */
2640 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[26]);
2641 di->expansion += ret->u.s_builtin.type->len;
2642 break;
2643 case 'd':
2644 /* 64-bit DFP */
2645 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[27]);
2646 di->expansion += ret->u.s_builtin.type->len;
2647 break;
2648 case 'e':
2649 /* 128-bit DFP */
2650 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[28]);
2651 di->expansion += ret->u.s_builtin.type->len;
2652 break;
2653 case 'h':
2654 /* 16-bit half-precision FP */
2655 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[29]);
2656 di->expansion += ret->u.s_builtin.type->len;
2657 break;
2658 case 'u':
2659 /* char8_t */
2660 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[30]);
2661 di->expansion += ret->u.s_builtin.type->len;
2662 break;
2663 case 's':
2664 /* char16_t */
2665 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[31]);
2666 di->expansion += ret->u.s_builtin.type->len;
2667 break;
2668 case 'i':
2669 /* char32_t */
2670 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[32]);
2671 di->expansion += ret->u.s_builtin.type->len;
2672 break;
2674 case 'F':
2675 /* Fixed point types. DF<int bits><length><fract bits><sat> */
2676 ret = d_make_empty (di);
2677 ret->type = DEMANGLE_COMPONENT_FIXED_TYPE;
2678 if ((ret->u.s_fixed.accum = IS_DIGIT (d_peek_char (di))))
2679 /* For demangling we don't care about the bits. */
2680 d_number (di);
2681 ret->u.s_fixed.length = cplus_demangle_type (di);
2682 if (ret->u.s_fixed.length == NULL)
2683 return NULL;
2684 d_number (di);
2685 peek = d_next_char (di);
2686 ret->u.s_fixed.sat = (peek == 's');
2687 break;
2689 case 'v':
2690 ret = d_vector_type (di);
2691 can_subst = 1;
2692 break;
2694 case 'n':
2695 /* decltype(nullptr) */
2696 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[33]);
2697 di->expansion += ret->u.s_builtin.type->len;
2698 break;
2700 default:
2701 return NULL;
2703 break;
2705 default:
2706 return NULL;
2709 if (can_subst)
2711 if (! d_add_substitution (di, ret))
2712 return NULL;
2715 return ret;
2718 /* <CV-qualifiers> ::= [r] [V] [K] [Dx] */
2720 static struct demangle_component **
2721 d_cv_qualifiers (struct d_info *di,
2722 struct demangle_component **pret, int member_fn)
2724 struct demangle_component **pstart;
2725 char peek;
2727 pstart = pret;
2728 peek = d_peek_char (di);
2729 while (next_is_type_qual (di))
2731 enum demangle_component_type t;
2732 struct demangle_component *right = NULL;
2734 d_advance (di, 1);
2735 if (peek == 'r')
2737 t = (member_fn
2738 ? DEMANGLE_COMPONENT_RESTRICT_THIS
2739 : DEMANGLE_COMPONENT_RESTRICT);
2740 di->expansion += sizeof "restrict";
2742 else if (peek == 'V')
2744 t = (member_fn
2745 ? DEMANGLE_COMPONENT_VOLATILE_THIS
2746 : DEMANGLE_COMPONENT_VOLATILE);
2747 di->expansion += sizeof "volatile";
2749 else if (peek == 'K')
2751 t = (member_fn
2752 ? DEMANGLE_COMPONENT_CONST_THIS
2753 : DEMANGLE_COMPONENT_CONST);
2754 di->expansion += sizeof "const";
2756 else
2758 peek = d_next_char (di);
2759 if (peek == 'x')
2761 t = DEMANGLE_COMPONENT_TRANSACTION_SAFE;
2762 di->expansion += sizeof "transaction_safe";
2764 else if (peek == 'o'
2765 || peek == 'O')
2767 t = DEMANGLE_COMPONENT_NOEXCEPT;
2768 di->expansion += sizeof "noexcept";
2769 if (peek == 'O')
2771 right = d_expression (di);
2772 if (right == NULL)
2773 return NULL;
2774 if (! d_check_char (di, 'E'))
2775 return NULL;
2778 else if (peek == 'w')
2780 t = DEMANGLE_COMPONENT_THROW_SPEC;
2781 di->expansion += sizeof "throw";
2782 right = d_parmlist (di);
2783 if (right == NULL)
2784 return NULL;
2785 if (! d_check_char (di, 'E'))
2786 return NULL;
2788 else
2789 return NULL;
2792 *pret = d_make_comp (di, t, NULL, right);
2793 if (*pret == NULL)
2794 return NULL;
2795 pret = &d_left (*pret);
2797 peek = d_peek_char (di);
2800 if (!member_fn && peek == 'F')
2802 while (pstart != pret)
2804 switch ((*pstart)->type)
2806 case DEMANGLE_COMPONENT_RESTRICT:
2807 (*pstart)->type = DEMANGLE_COMPONENT_RESTRICT_THIS;
2808 break;
2809 case DEMANGLE_COMPONENT_VOLATILE:
2810 (*pstart)->type = DEMANGLE_COMPONENT_VOLATILE_THIS;
2811 break;
2812 case DEMANGLE_COMPONENT_CONST:
2813 (*pstart)->type = DEMANGLE_COMPONENT_CONST_THIS;
2814 break;
2815 default:
2816 break;
2818 pstart = &d_left (*pstart);
2822 return pret;
2825 /* <ref-qualifier> ::= R
2826 ::= O */
2828 static struct demangle_component *
2829 d_ref_qualifier (struct d_info *di, struct demangle_component *sub)
2831 struct demangle_component *ret = sub;
2832 char peek;
2834 peek = d_peek_char (di);
2835 if (peek == 'R' || peek == 'O')
2837 enum demangle_component_type t;
2838 if (peek == 'R')
2840 t = DEMANGLE_COMPONENT_REFERENCE_THIS;
2841 di->expansion += sizeof "&";
2843 else
2845 t = DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS;
2846 di->expansion += sizeof "&&";
2848 d_advance (di, 1);
2850 ret = d_make_comp (di, t, ret, NULL);
2853 return ret;
2856 /* <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] [T] E */
2858 static struct demangle_component *
2859 d_function_type (struct d_info *di)
2861 struct demangle_component *ret = NULL;
2863 if ((di->options & DMGL_NO_RECURSE_LIMIT) == 0)
2865 if (di->recursion_level > DEMANGLE_RECURSION_LIMIT)
2866 /* FIXME: There ought to be a way to report
2867 that the recursion limit has been reached. */
2868 return NULL;
2870 di->recursion_level ++;
2873 if (d_check_char (di, 'F'))
2875 if (d_peek_char (di) == 'Y')
2877 /* Function has C linkage. We don't print this information.
2878 FIXME: We should print it in verbose mode. */
2879 d_advance (di, 1);
2881 ret = d_bare_function_type (di, 1);
2882 ret = d_ref_qualifier (di, ret);
2884 if (! d_check_char (di, 'E'))
2885 ret = NULL;
2888 if ((di->options & DMGL_NO_RECURSE_LIMIT) == 0)
2889 di->recursion_level --;
2890 return ret;
2893 /* <type>+ */
2895 static struct demangle_component *
2896 d_parmlist (struct d_info *di)
2898 struct demangle_component *tl;
2899 struct demangle_component **ptl;
2901 tl = NULL;
2902 ptl = &tl;
2903 while (1)
2905 struct demangle_component *type;
2907 char peek = d_peek_char (di);
2908 if (peek == '\0' || peek == 'E' || peek == '.')
2909 break;
2910 if ((peek == 'R' || peek == 'O')
2911 && d_peek_next_char (di) == 'E')
2912 /* Function ref-qualifier, not a ref prefix for a parameter type. */
2913 break;
2914 type = cplus_demangle_type (di);
2915 if (type == NULL)
2916 return NULL;
2917 *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL);
2918 if (*ptl == NULL)
2919 return NULL;
2920 ptl = &d_right (*ptl);
2923 /* There should be at least one parameter type besides the optional
2924 return type. A function which takes no arguments will have a
2925 single parameter type void. */
2926 if (tl == NULL)
2927 return NULL;
2929 /* If we have a single parameter type void, omit it. */
2930 if (d_right (tl) == NULL
2931 && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
2932 && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
2934 di->expansion -= d_left (tl)->u.s_builtin.type->len;
2935 d_left (tl) = NULL;
2938 return tl;
2941 /* <bare-function-type> ::= [J]<type>+ */
2943 static struct demangle_component *
2944 d_bare_function_type (struct d_info *di, int has_return_type)
2946 struct demangle_component *return_type;
2947 struct demangle_component *tl;
2948 char peek;
2950 /* Detect special qualifier indicating that the first argument
2951 is the return type. */
2952 peek = d_peek_char (di);
2953 if (peek == 'J')
2955 d_advance (di, 1);
2956 has_return_type = 1;
2959 if (has_return_type)
2961 return_type = cplus_demangle_type (di);
2962 if (return_type == NULL)
2963 return NULL;
2965 else
2966 return_type = NULL;
2968 tl = d_parmlist (di);
2969 if (tl == NULL)
2970 return NULL;
2972 return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE,
2973 return_type, tl);
2976 /* <class-enum-type> ::= <name> */
2978 static struct demangle_component *
2979 d_class_enum_type (struct d_info *di)
2981 return d_name (di);
2984 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
2985 ::= A [<(dimension) expression>] _ <(element) type>
2988 static struct demangle_component *
2989 d_array_type (struct d_info *di)
2991 char peek;
2992 struct demangle_component *dim;
2994 if (! d_check_char (di, 'A'))
2995 return NULL;
2997 peek = d_peek_char (di);
2998 if (peek == '_')
2999 dim = NULL;
3000 else if (IS_DIGIT (peek))
3002 const char *s;
3004 s = d_str (di);
3007 d_advance (di, 1);
3008 peek = d_peek_char (di);
3010 while (IS_DIGIT (peek));
3011 dim = d_make_name (di, s, d_str (di) - s);
3012 if (dim == NULL)
3013 return NULL;
3015 else
3017 dim = d_expression (di);
3018 if (dim == NULL)
3019 return NULL;
3022 if (! d_check_char (di, '_'))
3023 return NULL;
3025 return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim,
3026 cplus_demangle_type (di));
3029 /* <vector-type> ::= Dv <number> _ <type>
3030 ::= Dv _ <expression> _ <type> */
3032 static struct demangle_component *
3033 d_vector_type (struct d_info *di)
3035 char peek;
3036 struct demangle_component *dim;
3038 peek = d_peek_char (di);
3039 if (peek == '_')
3041 d_advance (di, 1);
3042 dim = d_expression (di);
3044 else
3045 dim = d_number_component (di);
3047 if (dim == NULL)
3048 return NULL;
3050 if (! d_check_char (di, '_'))
3051 return NULL;
3053 return d_make_comp (di, DEMANGLE_COMPONENT_VECTOR_TYPE, dim,
3054 cplus_demangle_type (di));
3057 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */
3059 static struct demangle_component *
3060 d_pointer_to_member_type (struct d_info *di)
3062 struct demangle_component *cl;
3063 struct demangle_component *mem;
3065 if (! d_check_char (di, 'M'))
3066 return NULL;
3068 cl = cplus_demangle_type (di);
3069 if (cl == NULL)
3070 return NULL;
3072 /* The ABI says, "The type of a non-static member function is considered
3073 to be different, for the purposes of substitution, from the type of a
3074 namespace-scope or static member function whose type appears
3075 similar. The types of two non-static member functions are considered
3076 to be different, for the purposes of substitution, if the functions
3077 are members of different classes. In other words, for the purposes of
3078 substitution, the class of which the function is a member is
3079 considered part of the type of function."
3081 For a pointer to member function, this call to cplus_demangle_type
3082 will end up adding a (possibly qualified) non-member function type to
3083 the substitution table, which is not correct; however, the member
3084 function type will never be used in a substitution, so putting the
3085 wrong type in the substitution table is harmless. */
3087 mem = cplus_demangle_type (di);
3088 if (mem == NULL)
3089 return NULL;
3091 return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem);
3094 /* <non-negative number> _ */
3096 static int
3097 d_compact_number (struct d_info *di)
3099 int num;
3100 if (d_peek_char (di) == '_')
3101 num = 0;
3102 else if (d_peek_char (di) == 'n')
3103 return -1;
3104 else
3105 num = d_number (di) + 1;
3107 if (num < 0 || ! d_check_char (di, '_'))
3108 return -1;
3109 return num;
3112 /* <template-param> ::= T_
3113 ::= T <(parameter-2 non-negative) number> _
3116 static struct demangle_component *
3117 d_template_param (struct d_info *di)
3119 int param;
3121 if (! d_check_char (di, 'T'))
3122 return NULL;
3124 param = d_compact_number (di);
3125 if (param < 0)
3126 return NULL;
3128 return d_make_template_param (di, param);
3131 /* <template-args> ::= I <template-arg>+ E */
3133 static struct demangle_component *
3134 d_template_args (struct d_info *di)
3136 if (d_peek_char (di) != 'I'
3137 && d_peek_char (di) != 'J')
3138 return NULL;
3139 d_advance (di, 1);
3141 return d_template_args_1 (di);
3144 /* <template-arg>* E */
3146 static struct demangle_component *
3147 d_template_args_1 (struct d_info *di)
3149 struct demangle_component *hold_last_name;
3150 struct demangle_component *al;
3151 struct demangle_component **pal;
3153 /* Preserve the last name we saw--don't let the template arguments
3154 clobber it, as that would give us the wrong name for a subsequent
3155 constructor or destructor. */
3156 hold_last_name = di->last_name;
3158 if (d_peek_char (di) == 'E')
3160 /* An argument pack can be empty. */
3161 d_advance (di, 1);
3162 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, NULL, NULL);
3165 al = NULL;
3166 pal = &al;
3167 while (1)
3169 struct demangle_component *a;
3171 a = d_template_arg (di);
3172 if (a == NULL)
3173 return NULL;
3175 *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL);
3176 if (*pal == NULL)
3177 return NULL;
3178 pal = &d_right (*pal);
3180 if (d_peek_char (di) == 'E')
3182 d_advance (di, 1);
3183 break;
3187 di->last_name = hold_last_name;
3189 return al;
3192 /* <template-arg> ::= <type>
3193 ::= X <expression> E
3194 ::= <expr-primary>
3197 static struct demangle_component *
3198 d_template_arg (struct d_info *di)
3200 struct demangle_component *ret;
3202 switch (d_peek_char (di))
3204 case 'X':
3205 d_advance (di, 1);
3206 ret = d_expression (di);
3207 if (! d_check_char (di, 'E'))
3208 return NULL;
3209 return ret;
3211 case 'L':
3212 return d_expr_primary (di);
3214 case 'I':
3215 case 'J':
3216 /* An argument pack. */
3217 return d_template_args (di);
3219 default:
3220 return cplus_demangle_type (di);
3224 /* Parse a sequence of expressions until we hit the terminator
3225 character. */
3227 static struct demangle_component *
3228 d_exprlist (struct d_info *di, char terminator)
3230 struct demangle_component *list = NULL;
3231 struct demangle_component **p = &list;
3233 if (d_peek_char (di) == terminator)
3235 d_advance (di, 1);
3236 return d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, NULL, NULL);
3239 while (1)
3241 struct demangle_component *arg = d_expression (di);
3242 if (arg == NULL)
3243 return NULL;
3245 *p = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, arg, NULL);
3246 if (*p == NULL)
3247 return NULL;
3248 p = &d_right (*p);
3250 if (d_peek_char (di) == terminator)
3252 d_advance (di, 1);
3253 break;
3257 return list;
3260 /* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
3261 dynamic_cast, static_cast or reinterpret_cast. */
3263 static int
3264 op_is_new_cast (struct demangle_component *op)
3266 const char *code = op->u.s_operator.op->code;
3267 return (code[1] == 'c'
3268 && (code[0] == 's' || code[0] == 'd'
3269 || code[0] == 'c' || code[0] == 'r'));
3272 /* <expression> ::= <(unary) operator-name> <expression>
3273 ::= <(binary) operator-name> <expression> <expression>
3274 ::= <(trinary) operator-name> <expression> <expression> <expression>
3275 ::= cl <expression>+ E
3276 ::= st <type>
3277 ::= <template-param>
3278 ::= sr <type> <unqualified-name>
3279 ::= sr <type> <unqualified-name> <template-args>
3280 ::= <expr-primary>
3283 static inline struct demangle_component *
3284 d_expression_1 (struct d_info *di)
3286 char peek;
3288 peek = d_peek_char (di);
3289 if (peek == 'L')
3290 return d_expr_primary (di);
3291 else if (peek == 'T')
3292 return d_template_param (di);
3293 else if (peek == 's' && d_peek_next_char (di) == 'r')
3295 struct demangle_component *type;
3296 struct demangle_component *name;
3298 d_advance (di, 2);
3299 type = cplus_demangle_type (di);
3300 name = d_unqualified_name (di);
3301 if (d_peek_char (di) != 'I')
3302 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name);
3303 else
3304 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type,
3305 d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3306 d_template_args (di)));
3308 else if (peek == 's' && d_peek_next_char (di) == 'p')
3310 d_advance (di, 2);
3311 return d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
3312 d_expression_1 (di), NULL);
3314 else if (peek == 'f' && d_peek_next_char (di) == 'p')
3316 /* Function parameter used in a late-specified return type. */
3317 int index;
3318 d_advance (di, 2);
3319 if (d_peek_char (di) == 'T')
3321 /* 'this' parameter. */
3322 d_advance (di, 1);
3323 index = 0;
3325 else
3327 index = d_compact_number (di);
3328 if (index == INT_MAX || index == -1)
3329 return NULL;
3330 index++;
3332 return d_make_function_param (di, index);
3334 else if (IS_DIGIT (peek)
3335 || (peek == 'o' && d_peek_next_char (di) == 'n'))
3337 /* We can get an unqualified name as an expression in the case of
3338 a dependent function call, i.e. decltype(f(t)). */
3339 struct demangle_component *name;
3341 if (peek == 'o')
3342 /* operator-function-id, i.e. operator+(t). */
3343 d_advance (di, 2);
3345 name = d_unqualified_name (di);
3346 if (name == NULL)
3347 return NULL;
3348 if (d_peek_char (di) == 'I')
3349 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3350 d_template_args (di));
3351 else
3352 return name;
3354 else if ((peek == 'i' || peek == 't')
3355 && d_peek_next_char (di) == 'l')
3357 /* Brace-enclosed initializer list, untyped or typed. */
3358 struct demangle_component *type = NULL;
3359 d_advance (di, 2);
3360 if (peek == 't')
3361 type = cplus_demangle_type (di);
3362 if (!d_peek_next_char (di))
3363 return NULL;
3364 return d_make_comp (di, DEMANGLE_COMPONENT_INITIALIZER_LIST,
3365 type, d_exprlist (di, 'E'));
3367 else
3369 struct demangle_component *op;
3370 const char *code = NULL;
3371 int args;
3373 op = d_operator_name (di);
3374 if (op == NULL)
3375 return NULL;
3377 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
3379 code = op->u.s_operator.op->code;
3380 di->expansion += op->u.s_operator.op->len - 2;
3381 if (strcmp (code, "st") == 0)
3382 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
3383 cplus_demangle_type (di));
3386 switch (op->type)
3388 default:
3389 return NULL;
3390 case DEMANGLE_COMPONENT_OPERATOR:
3391 args = op->u.s_operator.op->args;
3392 break;
3393 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
3394 args = op->u.s_extended_operator.args;
3395 break;
3396 case DEMANGLE_COMPONENT_CAST:
3397 args = 1;
3398 break;
3401 switch (args)
3403 case 0:
3404 return d_make_comp (di, DEMANGLE_COMPONENT_NULLARY, op, NULL);
3406 case 1:
3408 struct demangle_component *operand;
3409 int suffix = 0;
3411 if (code && (code[0] == 'p' || code[0] == 'm')
3412 && code[1] == code[0])
3413 /* pp_ and mm_ are the prefix variants. */
3414 suffix = !d_check_char (di, '_');
3416 if (op->type == DEMANGLE_COMPONENT_CAST
3417 && d_check_char (di, '_'))
3418 operand = d_exprlist (di, 'E');
3419 else if (code && !strcmp (code, "sP"))
3420 operand = d_template_args_1 (di);
3421 else
3422 operand = d_expression_1 (di);
3424 if (suffix)
3425 /* Indicate the suffix variant for d_print_comp. */
3426 operand = d_make_comp (di, DEMANGLE_COMPONENT_BINARY_ARGS,
3427 operand, operand);
3429 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op, operand);
3431 case 2:
3433 struct demangle_component *left;
3434 struct demangle_component *right;
3436 if (code == NULL)
3437 return NULL;
3438 if (op_is_new_cast (op))
3439 left = cplus_demangle_type (di);
3440 else if (code[0] == 'f')
3441 /* fold-expression. */
3442 left = d_operator_name (di);
3443 else
3444 left = d_expression_1 (di);
3445 if (!strcmp (code, "cl"))
3446 right = d_exprlist (di, 'E');
3447 else if (!strcmp (code, "dt") || !strcmp (code, "pt"))
3449 right = d_unqualified_name (di);
3450 if (d_peek_char (di) == 'I')
3451 right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE,
3452 right, d_template_args (di));
3454 else
3455 right = d_expression_1 (di);
3457 return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
3458 d_make_comp (di,
3459 DEMANGLE_COMPONENT_BINARY_ARGS,
3460 left, right));
3462 case 3:
3464 struct demangle_component *first;
3465 struct demangle_component *second;
3466 struct demangle_component *third;
3468 if (code == NULL)
3469 return NULL;
3470 else if (!strcmp (code, "qu"))
3472 /* ?: expression. */
3473 first = d_expression_1 (di);
3474 second = d_expression_1 (di);
3475 third = d_expression_1 (di);
3476 if (third == NULL)
3477 return NULL;
3479 else if (code[0] == 'f')
3481 /* fold-expression. */
3482 first = d_operator_name (di);
3483 second = d_expression_1 (di);
3484 third = d_expression_1 (di);
3485 if (third == NULL)
3486 return NULL;
3488 else if (code[0] == 'n')
3490 /* new-expression. */
3491 if (code[1] != 'w' && code[1] != 'a')
3492 return NULL;
3493 first = d_exprlist (di, '_');
3494 second = cplus_demangle_type (di);
3495 if (d_peek_char (di) == 'E')
3497 d_advance (di, 1);
3498 third = NULL;
3500 else if (d_peek_char (di) == 'p'
3501 && d_peek_next_char (di) == 'i')
3503 /* Parenthesized initializer. */
3504 d_advance (di, 2);
3505 third = d_exprlist (di, 'E');
3507 else if (d_peek_char (di) == 'i'
3508 && d_peek_next_char (di) == 'l')
3509 /* initializer-list. */
3510 third = d_expression_1 (di);
3511 else
3512 return NULL;
3514 else
3515 return NULL;
3516 return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op,
3517 d_make_comp (di,
3518 DEMANGLE_COMPONENT_TRINARY_ARG1,
3519 first,
3520 d_make_comp (di,
3521 DEMANGLE_COMPONENT_TRINARY_ARG2,
3522 second, third)));
3524 default:
3525 return NULL;
3530 static struct demangle_component *
3531 d_expression (struct d_info *di)
3533 struct demangle_component *ret;
3534 int was_expression = di->is_expression;
3536 di->is_expression = 1;
3537 ret = d_expression_1 (di);
3538 di->is_expression = was_expression;
3539 return ret;
3542 /* <expr-primary> ::= L <type> <(value) number> E
3543 ::= L <type> <(value) float> E
3544 ::= L <mangled-name> E
3547 static struct demangle_component *
3548 d_expr_primary (struct d_info *di)
3550 struct demangle_component *ret;
3552 if (! d_check_char (di, 'L'))
3553 return NULL;
3554 if (d_peek_char (di) == '_'
3555 /* Workaround for G++ bug; see comment in write_template_arg. */
3556 || d_peek_char (di) == 'Z')
3557 ret = cplus_demangle_mangled_name (di, 0);
3558 else
3560 struct demangle_component *type;
3561 enum demangle_component_type t;
3562 const char *s;
3564 type = cplus_demangle_type (di);
3565 if (type == NULL)
3566 return NULL;
3568 /* If we have a type we know how to print, we aren't going to
3569 print the type name itself. */
3570 if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
3571 && type->u.s_builtin.type->print != D_PRINT_DEFAULT)
3572 di->expansion -= type->u.s_builtin.type->len;
3574 /* Rather than try to interpret the literal value, we just
3575 collect it as a string. Note that it's possible to have a
3576 floating point literal here. The ABI specifies that the
3577 format of such literals is machine independent. That's fine,
3578 but what's not fine is that versions of g++ up to 3.2 with
3579 -fabi-version=1 used upper case letters in the hex constant,
3580 and dumped out gcc's internal representation. That makes it
3581 hard to tell where the constant ends, and hard to dump the
3582 constant in any readable form anyhow. We don't attempt to
3583 handle these cases. */
3585 t = DEMANGLE_COMPONENT_LITERAL;
3586 if (d_peek_char (di) == 'n')
3588 t = DEMANGLE_COMPONENT_LITERAL_NEG;
3589 d_advance (di, 1);
3591 s = d_str (di);
3592 while (d_peek_char (di) != 'E')
3594 if (d_peek_char (di) == '\0')
3595 return NULL;
3596 d_advance (di, 1);
3598 ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s));
3600 if (! d_check_char (di, 'E'))
3601 return NULL;
3602 return ret;
3605 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
3606 ::= Z <(function) encoding> E s [<discriminator>]
3607 ::= Z <(function) encoding> E d [<parameter> number>] _ <entity name>
3610 static struct demangle_component *
3611 d_local_name (struct d_info *di)
3613 struct demangle_component *function;
3614 struct demangle_component *name;
3616 if (! d_check_char (di, 'Z'))
3617 return NULL;
3619 function = d_encoding (di, 0);
3620 if (!function)
3621 return NULL;
3623 if (! d_check_char (di, 'E'))
3624 return NULL;
3626 if (d_peek_char (di) == 's')
3628 d_advance (di, 1);
3629 if (! d_discriminator (di))
3630 return NULL;
3631 name = d_make_name (di, "string literal", sizeof "string literal" - 1);
3633 else
3635 int num = -1;
3637 if (d_peek_char (di) == 'd')
3639 /* Default argument scope: d <number> _. */
3640 d_advance (di, 1);
3641 num = d_compact_number (di);
3642 if (num < 0)
3643 return NULL;
3646 name = d_name (di);
3648 if (name
3649 /* Lambdas and unnamed types have internal discriminators
3650 and are not functions. */
3651 && name->type != DEMANGLE_COMPONENT_LAMBDA
3652 && name->type != DEMANGLE_COMPONENT_UNNAMED_TYPE)
3654 /* Read and ignore an optional discriminator. */
3655 if (! d_discriminator (di))
3656 return NULL;
3659 if (num >= 0)
3660 name = d_make_default_arg (di, num, name);
3663 /* Elide the return type of the containing function so as to not
3664 confuse the user thinking it is the return type of whatever local
3665 function we might be containing. */
3666 if (function->type == DEMANGLE_COMPONENT_TYPED_NAME
3667 && d_right (function)->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
3668 d_left (d_right (function)) = NULL;
3670 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
3673 /* <discriminator> ::= _ <number> # when number < 10
3674 ::= __ <number> _ # when number >= 10
3676 <discriminator> ::= _ <number> # when number >=10
3677 is also accepted to support gcc versions that wrongly mangled that way.
3679 We demangle the discriminator, but we don't print it out. FIXME:
3680 We should print it out in verbose mode. */
3682 static int
3683 d_discriminator (struct d_info *di)
3685 int discrim, num_underscores = 1;
3687 if (d_peek_char (di) != '_')
3688 return 1;
3689 d_advance (di, 1);
3690 if (d_peek_char (di) == '_')
3692 ++num_underscores;
3693 d_advance (di, 1);
3696 discrim = d_number (di);
3697 if (discrim < 0)
3698 return 0;
3699 if (num_underscores > 1 && discrim >= 10)
3701 if (d_peek_char (di) == '_')
3702 d_advance (di, 1);
3703 else
3704 return 0;
3707 return 1;
3710 /* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */
3712 static struct demangle_component *
3713 d_lambda (struct d_info *di)
3715 struct demangle_component *tl;
3716 struct demangle_component *ret;
3717 int num;
3719 if (! d_check_char (di, 'U'))
3720 return NULL;
3721 if (! d_check_char (di, 'l'))
3722 return NULL;
3724 tl = d_parmlist (di);
3725 if (tl == NULL)
3726 return NULL;
3728 if (! d_check_char (di, 'E'))
3729 return NULL;
3731 num = d_compact_number (di);
3732 if (num < 0)
3733 return NULL;
3735 ret = d_make_empty (di);
3736 if (ret)
3738 ret->type = DEMANGLE_COMPONENT_LAMBDA;
3739 ret->u.s_unary_num.sub = tl;
3740 ret->u.s_unary_num.num = num;
3743 if (! d_add_substitution (di, ret))
3744 return NULL;
3746 return ret;
3749 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
3751 static struct demangle_component *
3752 d_unnamed_type (struct d_info *di)
3754 struct demangle_component *ret;
3755 int num;
3757 if (! d_check_char (di, 'U'))
3758 return NULL;
3759 if (! d_check_char (di, 't'))
3760 return NULL;
3762 num = d_compact_number (di);
3763 if (num < 0)
3764 return NULL;
3766 ret = d_make_empty (di);
3767 if (ret)
3769 ret->type = DEMANGLE_COMPONENT_UNNAMED_TYPE;
3770 ret->u.s_number.number = num;
3773 if (! d_add_substitution (di, ret))
3774 return NULL;
3776 return ret;
3779 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
3782 static struct demangle_component *
3783 d_clone_suffix (struct d_info *di, struct demangle_component *encoding)
3785 const char *suffix = d_str (di);
3786 const char *pend = suffix;
3787 struct demangle_component *n;
3789 if (*pend == '.' && (IS_LOWER (pend[1]) || pend[1] == '_'))
3791 pend += 2;
3792 while (IS_LOWER (*pend) || *pend == '_')
3793 ++pend;
3795 while (*pend == '.' && IS_DIGIT (pend[1]))
3797 pend += 2;
3798 while (IS_DIGIT (*pend))
3799 ++pend;
3801 d_advance (di, pend - suffix);
3802 n = d_make_name (di, suffix, pend - suffix);
3803 return d_make_comp (di, DEMANGLE_COMPONENT_CLONE, encoding, n);
3806 /* Add a new substitution. */
3808 static int
3809 d_add_substitution (struct d_info *di, struct demangle_component *dc)
3811 if (dc == NULL)
3812 return 0;
3813 if (di->next_sub >= di->num_subs)
3814 return 0;
3815 di->subs[di->next_sub] = dc;
3816 ++di->next_sub;
3817 return 1;
3820 /* <substitution> ::= S <seq-id> _
3821 ::= S_
3822 ::= St
3823 ::= Sa
3824 ::= Sb
3825 ::= Ss
3826 ::= Si
3827 ::= So
3828 ::= Sd
3830 If PREFIX is non-zero, then this type is being used as a prefix in
3831 a qualified name. In this case, for the standard substitutions, we
3832 need to check whether we are being used as a prefix for a
3833 constructor or destructor, and return a full template name.
3834 Otherwise we will get something like std::iostream::~iostream()
3835 which does not correspond particularly well to any function which
3836 actually appears in the source.
3839 static const struct d_standard_sub_info standard_subs[] =
3841 { 't', NL ("std"),
3842 NL ("std"),
3843 NULL, 0 },
3844 { 'a', NL ("std::allocator"),
3845 NL ("std::allocator"),
3846 NL ("allocator") },
3847 { 'b', NL ("std::basic_string"),
3848 NL ("std::basic_string"),
3849 NL ("basic_string") },
3850 { 's', NL ("std::string"),
3851 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
3852 NL ("basic_string") },
3853 { 'i', NL ("std::istream"),
3854 NL ("std::basic_istream<char, std::char_traits<char> >"),
3855 NL ("basic_istream") },
3856 { 'o', NL ("std::ostream"),
3857 NL ("std::basic_ostream<char, std::char_traits<char> >"),
3858 NL ("basic_ostream") },
3859 { 'd', NL ("std::iostream"),
3860 NL ("std::basic_iostream<char, std::char_traits<char> >"),
3861 NL ("basic_iostream") }
3864 static struct demangle_component *
3865 d_substitution (struct d_info *di, int prefix)
3867 char c;
3869 if (! d_check_char (di, 'S'))
3870 return NULL;
3872 c = d_next_char (di);
3873 if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
3875 unsigned int id;
3877 id = 0;
3878 if (c != '_')
3882 unsigned int new_id;
3884 if (IS_DIGIT (c))
3885 new_id = id * 36 + c - '0';
3886 else if (IS_UPPER (c))
3887 new_id = id * 36 + c - 'A' + 10;
3888 else
3889 return NULL;
3890 if (new_id < id)
3891 return NULL;
3892 id = new_id;
3893 c = d_next_char (di);
3895 while (c != '_');
3897 ++id;
3900 if (id >= (unsigned int) di->next_sub)
3901 return NULL;
3903 return di->subs[id];
3905 else
3907 int verbose;
3908 const struct d_standard_sub_info *p;
3909 const struct d_standard_sub_info *pend;
3911 verbose = (di->options & DMGL_VERBOSE) != 0;
3912 if (! verbose && prefix)
3914 char peek;
3916 peek = d_peek_char (di);
3917 if (peek == 'C' || peek == 'D')
3918 verbose = 1;
3921 pend = (&standard_subs[0]
3922 + sizeof standard_subs / sizeof standard_subs[0]);
3923 for (p = &standard_subs[0]; p < pend; ++p)
3925 if (c == p->code)
3927 const char *s;
3928 int len;
3929 struct demangle_component *dc;
3931 if (p->set_last_name != NULL)
3932 di->last_name = d_make_sub (di, p->set_last_name,
3933 p->set_last_name_len);
3934 if (verbose)
3936 s = p->full_expansion;
3937 len = p->full_len;
3939 else
3941 s = p->simple_expansion;
3942 len = p->simple_len;
3944 di->expansion += len;
3945 dc = d_make_sub (di, s, len);
3946 if (d_peek_char (di) == 'B')
3948 /* If there are ABI tags on the abbreviation, it becomes
3949 a substitution candidate. */
3950 dc = d_abi_tags (di, dc);
3951 if (! d_add_substitution (di, dc))
3952 return NULL;
3954 return dc;
3958 return NULL;
3962 static void
3963 d_checkpoint (struct d_info *di, struct d_info_checkpoint *checkpoint)
3965 checkpoint->n = di->n;
3966 checkpoint->next_comp = di->next_comp;
3967 checkpoint->next_sub = di->next_sub;
3968 checkpoint->expansion = di->expansion;
3971 static void
3972 d_backtrack (struct d_info *di, struct d_info_checkpoint *checkpoint)
3974 di->n = checkpoint->n;
3975 di->next_comp = checkpoint->next_comp;
3976 di->next_sub = checkpoint->next_sub;
3977 di->expansion = checkpoint->expansion;
3980 /* Initialize a growable string. */
3982 static void
3983 d_growable_string_init (struct d_growable_string *dgs, size_t estimate)
3985 dgs->buf = NULL;
3986 dgs->len = 0;
3987 dgs->alc = 0;
3988 dgs->allocation_failure = 0;
3990 if (estimate > 0)
3991 d_growable_string_resize (dgs, estimate);
3994 /* Grow a growable string to a given size. */
3996 static inline void
3997 d_growable_string_resize (struct d_growable_string *dgs, size_t need)
3999 size_t newalc;
4000 char *newbuf;
4002 if (dgs->allocation_failure)
4003 return;
4005 /* Start allocation at two bytes to avoid any possibility of confusion
4006 with the special value of 1 used as a return in *palc to indicate
4007 allocation failures. */
4008 newalc = dgs->alc > 0 ? dgs->alc : 2;
4009 while (newalc < need)
4010 newalc <<= 1;
4012 newbuf = (char *) realloc (dgs->buf, newalc);
4013 if (newbuf == NULL)
4015 free (dgs->buf);
4016 dgs->buf = NULL;
4017 dgs->len = 0;
4018 dgs->alc = 0;
4019 dgs->allocation_failure = 1;
4020 return;
4022 dgs->buf = newbuf;
4023 dgs->alc = newalc;
4026 /* Append a buffer to a growable string. */
4028 static inline void
4029 d_growable_string_append_buffer (struct d_growable_string *dgs,
4030 const char *s, size_t l)
4032 size_t need;
4034 need = dgs->len + l + 1;
4035 if (need > dgs->alc)
4036 d_growable_string_resize (dgs, need);
4038 if (dgs->allocation_failure)
4039 return;
4041 memcpy (dgs->buf + dgs->len, s, l);
4042 dgs->buf[dgs->len + l] = '\0';
4043 dgs->len += l;
4046 /* Bridge growable strings to the callback mechanism. */
4048 static void
4049 d_growable_string_callback_adapter (const char *s, size_t l, void *opaque)
4051 struct d_growable_string *dgs = (struct d_growable_string*) opaque;
4053 d_growable_string_append_buffer (dgs, s, l);
4056 /* Walk the tree, counting the number of templates encountered, and
4057 the number of times a scope might be saved. These counts will be
4058 used to allocate data structures for d_print_comp, so the logic
4059 here must mirror the logic d_print_comp will use. It is not
4060 important that the resulting numbers are exact, so long as they
4061 are larger than the actual numbers encountered. */
4063 static void
4064 d_count_templates_scopes (struct d_print_info *dpi,
4065 const struct demangle_component *dc)
4067 if (dc == NULL)
4068 return;
4070 switch (dc->type)
4072 case DEMANGLE_COMPONENT_NAME:
4073 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4074 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
4075 case DEMANGLE_COMPONENT_SUB_STD:
4076 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4077 case DEMANGLE_COMPONENT_OPERATOR:
4078 case DEMANGLE_COMPONENT_CHARACTER:
4079 case DEMANGLE_COMPONENT_NUMBER:
4080 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
4081 break;
4083 case DEMANGLE_COMPONENT_TEMPLATE:
4084 dpi->num_copy_templates++;
4085 goto recurse_left_right;
4087 case DEMANGLE_COMPONENT_REFERENCE:
4088 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
4089 if (d_left (dc)->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
4090 dpi->num_saved_scopes++;
4091 goto recurse_left_right;
4093 case DEMANGLE_COMPONENT_QUAL_NAME:
4094 case DEMANGLE_COMPONENT_LOCAL_NAME:
4095 case DEMANGLE_COMPONENT_TYPED_NAME:
4096 case DEMANGLE_COMPONENT_VTABLE:
4097 case DEMANGLE_COMPONENT_VTT:
4098 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
4099 case DEMANGLE_COMPONENT_TYPEINFO:
4100 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
4101 case DEMANGLE_COMPONENT_TYPEINFO_FN:
4102 case DEMANGLE_COMPONENT_THUNK:
4103 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
4104 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
4105 case DEMANGLE_COMPONENT_JAVA_CLASS:
4106 case DEMANGLE_COMPONENT_GUARD:
4107 case DEMANGLE_COMPONENT_TLS_INIT:
4108 case DEMANGLE_COMPONENT_TLS_WRAPPER:
4109 case DEMANGLE_COMPONENT_REFTEMP:
4110 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
4111 case DEMANGLE_COMPONENT_RESTRICT:
4112 case DEMANGLE_COMPONENT_VOLATILE:
4113 case DEMANGLE_COMPONENT_CONST:
4114 case DEMANGLE_COMPONENT_RESTRICT_THIS:
4115 case DEMANGLE_COMPONENT_VOLATILE_THIS:
4116 case DEMANGLE_COMPONENT_CONST_THIS:
4117 case DEMANGLE_COMPONENT_REFERENCE_THIS:
4118 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
4119 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
4120 case DEMANGLE_COMPONENT_NOEXCEPT:
4121 case DEMANGLE_COMPONENT_THROW_SPEC:
4122 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
4123 case DEMANGLE_COMPONENT_POINTER:
4124 case DEMANGLE_COMPONENT_COMPLEX:
4125 case DEMANGLE_COMPONENT_IMAGINARY:
4126 case DEMANGLE_COMPONENT_VENDOR_TYPE:
4127 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
4128 case DEMANGLE_COMPONENT_ARRAY_TYPE:
4129 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
4130 case DEMANGLE_COMPONENT_VECTOR_TYPE:
4131 case DEMANGLE_COMPONENT_ARGLIST:
4132 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
4133 case DEMANGLE_COMPONENT_TPARM_OBJ:
4134 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
4135 case DEMANGLE_COMPONENT_CAST:
4136 case DEMANGLE_COMPONENT_CONVERSION:
4137 case DEMANGLE_COMPONENT_NULLARY:
4138 case DEMANGLE_COMPONENT_UNARY:
4139 case DEMANGLE_COMPONENT_BINARY:
4140 case DEMANGLE_COMPONENT_BINARY_ARGS:
4141 case DEMANGLE_COMPONENT_TRINARY:
4142 case DEMANGLE_COMPONENT_TRINARY_ARG1:
4143 case DEMANGLE_COMPONENT_TRINARY_ARG2:
4144 case DEMANGLE_COMPONENT_LITERAL:
4145 case DEMANGLE_COMPONENT_LITERAL_NEG:
4146 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
4147 case DEMANGLE_COMPONENT_COMPOUND_NAME:
4148 case DEMANGLE_COMPONENT_DECLTYPE:
4149 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
4150 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
4151 case DEMANGLE_COMPONENT_PACK_EXPANSION:
4152 case DEMANGLE_COMPONENT_TAGGED_NAME:
4153 case DEMANGLE_COMPONENT_CLONE:
4154 recurse_left_right:
4155 /* PR 89394 - Check for too much recursion. */
4156 if (dpi->recursion > DEMANGLE_RECURSION_LIMIT)
4157 /* FIXME: There ought to be a way to report to the
4158 user that the recursion limit has been reached. */
4159 return;
4161 ++ dpi->recursion;
4162 d_count_templates_scopes (dpi, d_left (dc));
4163 d_count_templates_scopes (dpi, d_right (dc));
4164 -- dpi->recursion;
4165 break;
4167 case DEMANGLE_COMPONENT_CTOR:
4168 d_count_templates_scopes (dpi, dc->u.s_ctor.name);
4169 break;
4171 case DEMANGLE_COMPONENT_DTOR:
4172 d_count_templates_scopes (dpi, dc->u.s_dtor.name);
4173 break;
4175 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4176 d_count_templates_scopes (dpi, dc->u.s_extended_operator.name);
4177 break;
4179 case DEMANGLE_COMPONENT_FIXED_TYPE:
4180 d_count_templates_scopes (dpi, dc->u.s_fixed.length);
4181 break;
4183 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
4184 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
4185 d_count_templates_scopes (dpi, d_left (dc));
4186 break;
4188 case DEMANGLE_COMPONENT_LAMBDA:
4189 case DEMANGLE_COMPONENT_DEFAULT_ARG:
4190 d_count_templates_scopes (dpi, dc->u.s_unary_num.sub);
4191 break;
4195 /* Initialize a print information structure. */
4197 static void
4198 d_print_init (struct d_print_info *dpi, demangle_callbackref callback,
4199 void *opaque, const struct demangle_component *dc)
4201 dpi->len = 0;
4202 dpi->last_char = '\0';
4203 dpi->templates = NULL;
4204 dpi->modifiers = NULL;
4205 dpi->pack_index = 0;
4206 dpi->flush_count = 0;
4208 dpi->callback = callback;
4209 dpi->opaque = opaque;
4211 dpi->demangle_failure = 0;
4212 dpi->recursion = 0;
4213 dpi->is_lambda_arg = 0;
4215 dpi->component_stack = NULL;
4217 dpi->saved_scopes = NULL;
4218 dpi->next_saved_scope = 0;
4219 dpi->num_saved_scopes = 0;
4221 dpi->copy_templates = NULL;
4222 dpi->next_copy_template = 0;
4223 dpi->num_copy_templates = 0;
4225 d_count_templates_scopes (dpi, dc);
4226 /* If we did not reach the recursion limit, then reset the
4227 current recursion value back to 0, so that we can print
4228 the templates. */
4229 if (dpi->recursion < DEMANGLE_RECURSION_LIMIT)
4230 dpi->recursion = 0;
4231 dpi->num_copy_templates *= dpi->num_saved_scopes;
4233 dpi->current_template = NULL;
4236 /* Indicate that an error occurred during printing, and test for error. */
4238 static inline void
4239 d_print_error (struct d_print_info *dpi)
4241 dpi->demangle_failure = 1;
4244 static inline int
4245 d_print_saw_error (struct d_print_info *dpi)
4247 return dpi->demangle_failure != 0;
4250 /* Flush buffered characters to the callback. */
4252 static inline void
4253 d_print_flush (struct d_print_info *dpi)
4255 dpi->buf[dpi->len] = '\0';
4256 dpi->callback (dpi->buf, dpi->len, dpi->opaque);
4257 dpi->len = 0;
4258 dpi->flush_count++;
4261 /* Append characters and buffers for printing. */
4263 static inline void
4264 d_append_char (struct d_print_info *dpi, char c)
4266 if (dpi->len == sizeof (dpi->buf) - 1)
4267 d_print_flush (dpi);
4269 dpi->buf[dpi->len++] = c;
4270 dpi->last_char = c;
4273 static inline void
4274 d_append_buffer (struct d_print_info *dpi, const char *s, size_t l)
4276 size_t i;
4278 for (i = 0; i < l; i++)
4279 d_append_char (dpi, s[i]);
4282 static inline void
4283 d_append_string (struct d_print_info *dpi, const char *s)
4285 d_append_buffer (dpi, s, strlen (s));
4288 static inline void
4289 d_append_num (struct d_print_info *dpi, int l)
4291 char buf[25];
4292 sprintf (buf,"%d", l);
4293 d_append_string (dpi, buf);
4296 static inline char
4297 d_last_char (struct d_print_info *dpi)
4299 return dpi->last_char;
4302 /* Turn components into a human readable string. OPTIONS is the
4303 options bits passed to the demangler. DC is the tree to print.
4304 CALLBACK is a function to call to flush demangled string segments
4305 as they fill the intermediate buffer, and OPAQUE is a generalized
4306 callback argument. On success, this returns 1. On failure,
4307 it returns 0, indicating a bad parse. It does not use heap
4308 memory to build an output string, so cannot encounter memory
4309 allocation failure. */
4311 CP_STATIC_IF_GLIBCPP_V3
4313 cplus_demangle_print_callback (int options,
4314 struct demangle_component *dc,
4315 demangle_callbackref callback, void *opaque)
4317 struct d_print_info dpi;
4319 d_print_init (&dpi, callback, opaque, dc);
4322 #ifdef CP_DYNAMIC_ARRAYS
4323 /* Avoid zero-length VLAs, which are prohibited by the C99 standard
4324 and flagged as errors by Address Sanitizer. */
4325 __extension__ struct d_saved_scope scopes[(dpi.num_saved_scopes > 0)
4326 ? dpi.num_saved_scopes : 1];
4327 __extension__ struct d_print_template temps[(dpi.num_copy_templates > 0)
4328 ? dpi.num_copy_templates : 1];
4330 dpi.saved_scopes = scopes;
4331 dpi.copy_templates = temps;
4332 #else
4333 dpi.saved_scopes = alloca (dpi.num_saved_scopes
4334 * sizeof (*dpi.saved_scopes));
4335 dpi.copy_templates = alloca (dpi.num_copy_templates
4336 * sizeof (*dpi.copy_templates));
4337 #endif
4339 d_print_comp (&dpi, options, dc);
4342 d_print_flush (&dpi);
4344 return ! d_print_saw_error (&dpi);
4347 /* Turn components into a human readable string. OPTIONS is the
4348 options bits passed to the demangler. DC is the tree to print.
4349 ESTIMATE is a guess at the length of the result. This returns a
4350 string allocated by malloc, or NULL on error. On success, this
4351 sets *PALC to the size of the allocated buffer. On failure, this
4352 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
4353 failure. */
4355 CP_STATIC_IF_GLIBCPP_V3
4356 char *
4357 cplus_demangle_print (int options, struct demangle_component *dc,
4358 int estimate, size_t *palc)
4360 struct d_growable_string dgs;
4362 d_growable_string_init (&dgs, estimate);
4364 if (! cplus_demangle_print_callback (options, dc,
4365 d_growable_string_callback_adapter,
4366 &dgs))
4368 free (dgs.buf);
4369 *palc = 0;
4370 return NULL;
4373 *palc = dgs.allocation_failure ? 1 : dgs.alc;
4374 return dgs.buf;
4377 /* Returns the I'th element of the template arglist ARGS, or NULL on
4378 failure. If I is negative, return the entire arglist. */
4380 static struct demangle_component *
4381 d_index_template_argument (struct demangle_component *args, int i)
4383 struct demangle_component *a;
4385 if (i < 0)
4386 /* Print the whole argument pack. */
4387 return args;
4389 for (a = args;
4390 a != NULL;
4391 a = d_right (a))
4393 if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4394 return NULL;
4395 if (i <= 0)
4396 break;
4397 --i;
4399 if (i != 0 || a == NULL)
4400 return NULL;
4402 return d_left (a);
4405 /* Returns the template argument from the current context indicated by DC,
4406 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */
4408 static struct demangle_component *
4409 d_lookup_template_argument (struct d_print_info *dpi,
4410 const struct demangle_component *dc)
4412 if (dpi->templates == NULL)
4414 d_print_error (dpi);
4415 return NULL;
4418 return d_index_template_argument
4419 (d_right (dpi->templates->template_decl),
4420 dc->u.s_number.number);
4423 /* Returns a template argument pack used in DC (any will do), or NULL. */
4425 static struct demangle_component *
4426 d_find_pack (struct d_print_info *dpi,
4427 const struct demangle_component *dc)
4429 struct demangle_component *a;
4430 if (dc == NULL)
4431 return NULL;
4433 switch (dc->type)
4435 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4436 a = d_lookup_template_argument (dpi, dc);
4437 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4438 return a;
4439 return NULL;
4441 case DEMANGLE_COMPONENT_PACK_EXPANSION:
4442 return NULL;
4444 case DEMANGLE_COMPONENT_LAMBDA:
4445 case DEMANGLE_COMPONENT_NAME:
4446 case DEMANGLE_COMPONENT_TAGGED_NAME:
4447 case DEMANGLE_COMPONENT_OPERATOR:
4448 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
4449 case DEMANGLE_COMPONENT_SUB_STD:
4450 case DEMANGLE_COMPONENT_CHARACTER:
4451 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
4452 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
4453 case DEMANGLE_COMPONENT_FIXED_TYPE:
4454 case DEMANGLE_COMPONENT_DEFAULT_ARG:
4455 case DEMANGLE_COMPONENT_NUMBER:
4456 return NULL;
4458 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
4459 return d_find_pack (dpi, dc->u.s_extended_operator.name);
4460 case DEMANGLE_COMPONENT_CTOR:
4461 return d_find_pack (dpi, dc->u.s_ctor.name);
4462 case DEMANGLE_COMPONENT_DTOR:
4463 return d_find_pack (dpi, dc->u.s_dtor.name);
4465 default:
4466 a = d_find_pack (dpi, d_left (dc));
4467 if (a)
4468 return a;
4469 return d_find_pack (dpi, d_right (dc));
4473 /* Returns the length of the template argument pack DC. */
4475 static int
4476 d_pack_length (const struct demangle_component *dc)
4478 int count = 0;
4479 while (dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
4480 && d_left (dc) != NULL)
4482 ++count;
4483 dc = d_right (dc);
4485 return count;
4488 /* Returns the number of template args in DC, expanding any pack expansions
4489 found there. */
4491 static int
4492 d_args_length (struct d_print_info *dpi, const struct demangle_component *dc)
4494 int count = 0;
4495 for (; dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST;
4496 dc = d_right (dc))
4498 struct demangle_component *elt = d_left (dc);
4499 if (elt == NULL)
4500 break;
4501 if (elt->type == DEMANGLE_COMPONENT_PACK_EXPANSION)
4503 struct demangle_component *a = d_find_pack (dpi, d_left (elt));
4504 count += d_pack_length (a);
4506 else
4507 ++count;
4509 return count;
4512 /* DC is a component of a mangled expression. Print it, wrapped in parens
4513 if needed. */
4515 static void
4516 d_print_subexpr (struct d_print_info *dpi, int options,
4517 struct demangle_component *dc)
4519 int simple = 0;
4520 if (dc->type == DEMANGLE_COMPONENT_NAME
4521 || dc->type == DEMANGLE_COMPONENT_QUAL_NAME
4522 || dc->type == DEMANGLE_COMPONENT_INITIALIZER_LIST
4523 || dc->type == DEMANGLE_COMPONENT_FUNCTION_PARAM)
4524 simple = 1;
4525 if (!simple)
4526 d_append_char (dpi, '(');
4527 d_print_comp (dpi, options, dc);
4528 if (!simple)
4529 d_append_char (dpi, ')');
4532 /* Save the current scope. */
4534 static void
4535 d_save_scope (struct d_print_info *dpi,
4536 const struct demangle_component *container)
4538 struct d_saved_scope *scope;
4539 struct d_print_template *src, **link;
4541 if (dpi->next_saved_scope >= dpi->num_saved_scopes)
4543 d_print_error (dpi);
4544 return;
4546 scope = &dpi->saved_scopes[dpi->next_saved_scope];
4547 dpi->next_saved_scope++;
4549 scope->container = container;
4550 link = &scope->templates;
4552 for (src = dpi->templates; src != NULL; src = src->next)
4554 struct d_print_template *dst;
4556 if (dpi->next_copy_template >= dpi->num_copy_templates)
4558 d_print_error (dpi);
4559 return;
4561 dst = &dpi->copy_templates[dpi->next_copy_template];
4562 dpi->next_copy_template++;
4564 dst->template_decl = src->template_decl;
4565 *link = dst;
4566 link = &dst->next;
4569 *link = NULL;
4572 /* Attempt to locate a previously saved scope. Returns NULL if no
4573 corresponding saved scope was found. */
4575 static struct d_saved_scope *
4576 d_get_saved_scope (struct d_print_info *dpi,
4577 const struct demangle_component *container)
4579 int i;
4581 for (i = 0; i < dpi->next_saved_scope; i++)
4582 if (dpi->saved_scopes[i].container == container)
4583 return &dpi->saved_scopes[i];
4585 return NULL;
4588 /* If DC is a C++17 fold-expression, print it and return true; otherwise
4589 return false. */
4591 static int
4592 d_maybe_print_fold_expression (struct d_print_info *dpi, int options,
4593 struct demangle_component *dc)
4595 struct demangle_component *ops, *operator_, *op1, *op2;
4596 int save_idx;
4598 const char *fold_code = d_left (dc)->u.s_operator.op->code;
4599 if (fold_code[0] != 'f')
4600 return 0;
4602 ops = d_right (dc);
4603 operator_ = d_left (ops);
4604 op1 = d_right (ops);
4605 op2 = 0;
4606 if (op1->type == DEMANGLE_COMPONENT_TRINARY_ARG2)
4608 op2 = d_right (op1);
4609 op1 = d_left (op1);
4612 /* Print the whole pack. */
4613 save_idx = dpi->pack_index;
4614 dpi->pack_index = -1;
4616 switch (fold_code[1])
4618 /* Unary left fold, (... + X). */
4619 case 'l':
4620 d_append_string (dpi, "(...");
4621 d_print_expr_op (dpi, options, operator_);
4622 d_print_subexpr (dpi, options, op1);
4623 d_append_char (dpi, ')');
4624 break;
4626 /* Unary right fold, (X + ...). */
4627 case 'r':
4628 d_append_char (dpi, '(');
4629 d_print_subexpr (dpi, options, op1);
4630 d_print_expr_op (dpi, options, operator_);
4631 d_append_string (dpi, "...)");
4632 break;
4634 /* Binary left fold, (42 + ... + X). */
4635 case 'L':
4636 /* Binary right fold, (X + ... + 42). */
4637 case 'R':
4638 d_append_char (dpi, '(');
4639 d_print_subexpr (dpi, options, op1);
4640 d_print_expr_op (dpi, options, operator_);
4641 d_append_string (dpi, "...");
4642 d_print_expr_op (dpi, options, operator_);
4643 d_print_subexpr (dpi, options, op2);
4644 d_append_char (dpi, ')');
4645 break;
4648 dpi->pack_index = save_idx;
4649 return 1;
4652 /* Subroutine to handle components. */
4654 static void
4655 d_print_comp_inner (struct d_print_info *dpi, int options,
4656 struct demangle_component *dc)
4658 /* Magic variable to let reference smashing skip over the next modifier
4659 without needing to modify *dc. */
4660 struct demangle_component *mod_inner = NULL;
4662 /* Variable used to store the current templates while a previously
4663 captured scope is used. */
4664 struct d_print_template *saved_templates;
4666 /* Nonzero if templates have been stored in the above variable. */
4667 int need_template_restore = 0;
4669 if (dc == NULL)
4671 d_print_error (dpi);
4672 return;
4674 if (d_print_saw_error (dpi))
4675 return;
4677 switch (dc->type)
4679 case DEMANGLE_COMPONENT_NAME:
4680 if ((options & DMGL_JAVA) == 0)
4681 d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len);
4682 else
4683 d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
4684 return;
4686 case DEMANGLE_COMPONENT_TAGGED_NAME:
4687 d_print_comp (dpi, options, d_left (dc));
4688 d_append_string (dpi, "[abi:");
4689 d_print_comp (dpi, options, d_right (dc));
4690 d_append_char (dpi, ']');
4691 return;
4693 case DEMANGLE_COMPONENT_QUAL_NAME:
4694 case DEMANGLE_COMPONENT_LOCAL_NAME:
4695 d_print_comp (dpi, options, d_left (dc));
4696 if ((options & DMGL_JAVA) == 0)
4697 d_append_string (dpi, "::");
4698 else
4699 d_append_char (dpi, '.');
4701 struct demangle_component *local_name = d_right (dc);
4702 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4704 d_append_string (dpi, "{default arg#");
4705 d_append_num (dpi, local_name->u.s_unary_num.num + 1);
4706 d_append_string (dpi, "}::");
4707 local_name = local_name->u.s_unary_num.sub;
4709 d_print_comp (dpi, options, local_name);
4711 return;
4713 case DEMANGLE_COMPONENT_TYPED_NAME:
4715 struct d_print_mod *hold_modifiers;
4716 struct demangle_component *typed_name;
4717 struct d_print_mod adpm[4];
4718 unsigned int i;
4719 struct d_print_template dpt;
4721 /* Pass the name down to the type so that it can be printed in
4722 the right place for the type. We also have to pass down
4723 any CV-qualifiers, which apply to the this parameter. */
4724 hold_modifiers = dpi->modifiers;
4725 dpi->modifiers = 0;
4726 i = 0;
4727 typed_name = d_left (dc);
4728 while (typed_name != NULL)
4730 if (i >= sizeof adpm / sizeof adpm[0])
4732 d_print_error (dpi);
4733 return;
4736 adpm[i].next = dpi->modifiers;
4737 dpi->modifiers = &adpm[i];
4738 adpm[i].mod = typed_name;
4739 adpm[i].printed = 0;
4740 adpm[i].templates = dpi->templates;
4741 ++i;
4743 if (!is_fnqual_component_type (typed_name->type))
4744 break;
4746 typed_name = d_left (typed_name);
4749 if (typed_name == NULL)
4751 d_print_error (dpi);
4752 return;
4755 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
4756 there may be CV-qualifiers on its right argument which
4757 really apply here; this happens when parsing a class that
4758 is local to a function. */
4759 if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME)
4761 typed_name = d_right (typed_name);
4762 if (typed_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
4763 typed_name = typed_name->u.s_unary_num.sub;
4764 if (typed_name == NULL)
4766 d_print_error (dpi);
4767 return;
4769 while (is_fnqual_component_type (typed_name->type))
4771 if (i >= sizeof adpm / sizeof adpm[0])
4773 d_print_error (dpi);
4774 return;
4777 adpm[i] = adpm[i - 1];
4778 adpm[i].next = &adpm[i - 1];
4779 dpi->modifiers = &adpm[i];
4781 adpm[i - 1].mod = typed_name;
4782 adpm[i - 1].printed = 0;
4783 adpm[i - 1].templates = dpi->templates;
4784 ++i;
4786 typed_name = d_left (typed_name);
4790 /* If typed_name is a template, then it applies to the
4791 function type as well. */
4792 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
4794 dpt.next = dpi->templates;
4795 dpi->templates = &dpt;
4796 dpt.template_decl = typed_name;
4799 d_print_comp (dpi, options, d_right (dc));
4801 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
4802 dpi->templates = dpt.next;
4804 /* If the modifiers didn't get printed by the type, print them
4805 now. */
4806 while (i > 0)
4808 --i;
4809 if (! adpm[i].printed)
4811 d_append_char (dpi, ' ');
4812 d_print_mod (dpi, options, adpm[i].mod);
4816 dpi->modifiers = hold_modifiers;
4818 return;
4821 case DEMANGLE_COMPONENT_TEMPLATE:
4823 struct d_print_mod *hold_dpm;
4824 struct demangle_component *dcl;
4825 const struct demangle_component *hold_current;
4827 /* This template may need to be referenced by a cast operator
4828 contained in its subtree. */
4829 hold_current = dpi->current_template;
4830 dpi->current_template = dc;
4832 /* Don't push modifiers into a template definition. Doing so
4833 could give the wrong definition for a template argument.
4834 Instead, treat the template essentially as a name. */
4836 hold_dpm = dpi->modifiers;
4837 dpi->modifiers = NULL;
4839 dcl = d_left (dc);
4841 if ((options & DMGL_JAVA) != 0
4842 && dcl->type == DEMANGLE_COMPONENT_NAME
4843 && dcl->u.s_name.len == 6
4844 && strncmp (dcl->u.s_name.s, "JArray", 6) == 0)
4846 /* Special-case Java arrays, so that JArray<TYPE> appears
4847 instead as TYPE[]. */
4849 d_print_comp (dpi, options, d_right (dc));
4850 d_append_string (dpi, "[]");
4852 else
4854 d_print_comp (dpi, options, dcl);
4855 if (d_last_char (dpi) == '<')
4856 d_append_char (dpi, ' ');
4857 d_append_char (dpi, '<');
4858 d_print_comp (dpi, options, d_right (dc));
4859 /* Avoid generating two consecutive '>' characters, to avoid
4860 the C++ syntactic ambiguity. */
4861 if (d_last_char (dpi) == '>')
4862 d_append_char (dpi, ' ');
4863 d_append_char (dpi, '>');
4866 dpi->modifiers = hold_dpm;
4867 dpi->current_template = hold_current;
4869 return;
4872 case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
4873 if (dpi->is_lambda_arg)
4875 /* Show the template parm index, as that's how g++ displays
4876 these, and future proofs us against potential
4877 '[]<typename T> (T *a, T *b) {...}'. */
4878 d_append_buffer (dpi, "auto:", 5);
4879 d_append_num (dpi, dc->u.s_number.number + 1);
4881 else
4883 struct d_print_template *hold_dpt;
4884 struct demangle_component *a = d_lookup_template_argument (dpi, dc);
4886 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
4887 a = d_index_template_argument (a, dpi->pack_index);
4889 if (a == NULL)
4891 d_print_error (dpi);
4892 return;
4895 /* While processing this parameter, we need to pop the list
4896 of templates. This is because the template parameter may
4897 itself be a reference to a parameter of an outer
4898 template. */
4900 hold_dpt = dpi->templates;
4901 dpi->templates = hold_dpt->next;
4903 d_print_comp (dpi, options, a);
4905 dpi->templates = hold_dpt;
4907 return;
4909 case DEMANGLE_COMPONENT_TPARM_OBJ:
4910 d_append_string (dpi, "template parameter object for ");
4911 d_print_comp (dpi, options, d_left (dc));
4912 return;
4914 case DEMANGLE_COMPONENT_CTOR:
4915 d_print_comp (dpi, options, dc->u.s_ctor.name);
4916 return;
4918 case DEMANGLE_COMPONENT_DTOR:
4919 d_append_char (dpi, '~');
4920 d_print_comp (dpi, options, dc->u.s_dtor.name);
4921 return;
4923 case DEMANGLE_COMPONENT_VTABLE:
4924 d_append_string (dpi, "vtable for ");
4925 d_print_comp (dpi, options, d_left (dc));
4926 return;
4928 case DEMANGLE_COMPONENT_VTT:
4929 d_append_string (dpi, "VTT for ");
4930 d_print_comp (dpi, options, d_left (dc));
4931 return;
4933 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
4934 d_append_string (dpi, "construction vtable for ");
4935 d_print_comp (dpi, options, d_left (dc));
4936 d_append_string (dpi, "-in-");
4937 d_print_comp (dpi, options, d_right (dc));
4938 return;
4940 case DEMANGLE_COMPONENT_TYPEINFO:
4941 d_append_string (dpi, "typeinfo for ");
4942 d_print_comp (dpi, options, d_left (dc));
4943 return;
4945 case DEMANGLE_COMPONENT_TYPEINFO_NAME:
4946 d_append_string (dpi, "typeinfo name for ");
4947 d_print_comp (dpi, options, d_left (dc));
4948 return;
4950 case DEMANGLE_COMPONENT_TYPEINFO_FN:
4951 d_append_string (dpi, "typeinfo fn for ");
4952 d_print_comp (dpi, options, d_left (dc));
4953 return;
4955 case DEMANGLE_COMPONENT_THUNK:
4956 d_append_string (dpi, "non-virtual thunk to ");
4957 d_print_comp (dpi, options, d_left (dc));
4958 return;
4960 case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
4961 d_append_string (dpi, "virtual thunk to ");
4962 d_print_comp (dpi, options, d_left (dc));
4963 return;
4965 case DEMANGLE_COMPONENT_COVARIANT_THUNK:
4966 d_append_string (dpi, "covariant return thunk to ");
4967 d_print_comp (dpi, options, d_left (dc));
4968 return;
4970 case DEMANGLE_COMPONENT_JAVA_CLASS:
4971 d_append_string (dpi, "java Class for ");
4972 d_print_comp (dpi, options, d_left (dc));
4973 return;
4975 case DEMANGLE_COMPONENT_GUARD:
4976 d_append_string (dpi, "guard variable for ");
4977 d_print_comp (dpi, options, d_left (dc));
4978 return;
4980 case DEMANGLE_COMPONENT_TLS_INIT:
4981 d_append_string (dpi, "TLS init function for ");
4982 d_print_comp (dpi, options, d_left (dc));
4983 return;
4985 case DEMANGLE_COMPONENT_TLS_WRAPPER:
4986 d_append_string (dpi, "TLS wrapper function for ");
4987 d_print_comp (dpi, options, d_left (dc));
4988 return;
4990 case DEMANGLE_COMPONENT_REFTEMP:
4991 d_append_string (dpi, "reference temporary #");
4992 d_print_comp (dpi, options, d_right (dc));
4993 d_append_string (dpi, " for ");
4994 d_print_comp (dpi, options, d_left (dc));
4995 return;
4997 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
4998 d_append_string (dpi, "hidden alias for ");
4999 d_print_comp (dpi, options, d_left (dc));
5000 return;
5002 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
5003 d_append_string (dpi, "transaction clone for ");
5004 d_print_comp (dpi, options, d_left (dc));
5005 return;
5007 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
5008 d_append_string (dpi, "non-transaction clone for ");
5009 d_print_comp (dpi, options, d_left (dc));
5010 return;
5012 case DEMANGLE_COMPONENT_SUB_STD:
5013 d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len);
5014 return;
5016 case DEMANGLE_COMPONENT_RESTRICT:
5017 case DEMANGLE_COMPONENT_VOLATILE:
5018 case DEMANGLE_COMPONENT_CONST:
5020 struct d_print_mod *pdpm;
5022 /* When printing arrays, it's possible to have cases where the
5023 same CV-qualifier gets pushed on the stack multiple times.
5024 We only need to print it once. */
5026 for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next)
5028 if (! pdpm->printed)
5030 if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT
5031 && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE
5032 && pdpm->mod->type != DEMANGLE_COMPONENT_CONST)
5033 break;
5034 if (pdpm->mod->type == dc->type)
5036 d_print_comp (dpi, options, d_left (dc));
5037 return;
5042 goto modifier;
5044 case DEMANGLE_COMPONENT_REFERENCE:
5045 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5047 /* Handle reference smashing: & + && = &. */
5048 struct demangle_component *sub = d_left (dc);
5049 if (!dpi->is_lambda_arg
5050 && sub->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
5052 struct d_saved_scope *scope = d_get_saved_scope (dpi, sub);
5053 struct demangle_component *a;
5055 if (scope == NULL)
5057 /* This is the first time SUB has been traversed.
5058 We need to capture the current templates so
5059 they can be restored if SUB is reentered as a
5060 substitution. */
5061 d_save_scope (dpi, sub);
5062 if (d_print_saw_error (dpi))
5063 return;
5065 else
5067 const struct d_component_stack *dcse;
5068 int found_self_or_parent = 0;
5070 /* This traversal is reentering SUB as a substition.
5071 If we are not beneath SUB or DC in the tree then we
5072 need to restore SUB's template stack temporarily. */
5073 for (dcse = dpi->component_stack; dcse != NULL;
5074 dcse = dcse->parent)
5076 if (dcse->dc == sub
5077 || (dcse->dc == dc
5078 && dcse != dpi->component_stack))
5080 found_self_or_parent = 1;
5081 break;
5085 if (!found_self_or_parent)
5087 saved_templates = dpi->templates;
5088 dpi->templates = scope->templates;
5089 need_template_restore = 1;
5093 a = d_lookup_template_argument (dpi, sub);
5094 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
5095 a = d_index_template_argument (a, dpi->pack_index);
5097 if (a == NULL)
5099 if (need_template_restore)
5100 dpi->templates = saved_templates;
5102 d_print_error (dpi);
5103 return;
5106 sub = a;
5109 if (sub->type == DEMANGLE_COMPONENT_REFERENCE
5110 || sub->type == dc->type)
5111 dc = sub;
5112 else if (sub->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE)
5113 mod_inner = d_left (sub);
5115 /* Fall through. */
5117 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5118 case DEMANGLE_COMPONENT_POINTER:
5119 case DEMANGLE_COMPONENT_COMPLEX:
5120 case DEMANGLE_COMPONENT_IMAGINARY:
5121 FNQUAL_COMPONENT_CASE:
5122 modifier:
5124 /* We keep a list of modifiers on the stack. */
5125 struct d_print_mod dpm;
5127 dpm.next = dpi->modifiers;
5128 dpi->modifiers = &dpm;
5129 dpm.mod = dc;
5130 dpm.printed = 0;
5131 dpm.templates = dpi->templates;
5133 if (!mod_inner)
5134 mod_inner = d_left (dc);
5136 d_print_comp (dpi, options, mod_inner);
5138 /* If the modifier didn't get printed by the type, print it
5139 now. */
5140 if (! dpm.printed)
5141 d_print_mod (dpi, options, dc);
5143 dpi->modifiers = dpm.next;
5145 if (need_template_restore)
5146 dpi->templates = saved_templates;
5148 return;
5151 case DEMANGLE_COMPONENT_BUILTIN_TYPE:
5152 if ((options & DMGL_JAVA) == 0)
5153 d_append_buffer (dpi, dc->u.s_builtin.type->name,
5154 dc->u.s_builtin.type->len);
5155 else
5156 d_append_buffer (dpi, dc->u.s_builtin.type->java_name,
5157 dc->u.s_builtin.type->java_len);
5158 return;
5160 case DEMANGLE_COMPONENT_VENDOR_TYPE:
5161 d_print_comp (dpi, options, d_left (dc));
5162 return;
5164 case DEMANGLE_COMPONENT_FUNCTION_TYPE:
5166 if ((options & DMGL_RET_POSTFIX) != 0)
5167 d_print_function_type (dpi,
5168 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5169 dc, dpi->modifiers);
5171 /* Print return type if present */
5172 if (d_left (dc) != NULL && (options & DMGL_RET_POSTFIX) != 0)
5173 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5174 d_left (dc));
5175 else if (d_left (dc) != NULL && (options & DMGL_RET_DROP) == 0)
5177 struct d_print_mod dpm;
5179 /* We must pass this type down as a modifier in order to
5180 print it in the right location. */
5181 dpm.next = dpi->modifiers;
5182 dpi->modifiers = &dpm;
5183 dpm.mod = dc;
5184 dpm.printed = 0;
5185 dpm.templates = dpi->templates;
5187 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5188 d_left (dc));
5190 dpi->modifiers = dpm.next;
5192 if (dpm.printed)
5193 return;
5195 /* In standard prefix notation, there is a space between the
5196 return type and the function signature. */
5197 if ((options & DMGL_RET_POSTFIX) == 0)
5198 d_append_char (dpi, ' ');
5201 if ((options & DMGL_RET_POSTFIX) == 0)
5202 d_print_function_type (dpi,
5203 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
5204 dc, dpi->modifiers);
5206 return;
5209 case DEMANGLE_COMPONENT_ARRAY_TYPE:
5211 struct d_print_mod *hold_modifiers;
5212 struct d_print_mod adpm[4];
5213 unsigned int i;
5214 struct d_print_mod *pdpm;
5216 /* We must pass this type down as a modifier in order to print
5217 multi-dimensional arrays correctly. If the array itself is
5218 CV-qualified, we act as though the element type were
5219 CV-qualified. We do this by copying the modifiers down
5220 rather than fiddling pointers, so that we don't wind up
5221 with a d_print_mod higher on the stack pointing into our
5222 stack frame after we return. */
5224 hold_modifiers = dpi->modifiers;
5226 adpm[0].next = hold_modifiers;
5227 dpi->modifiers = &adpm[0];
5228 adpm[0].mod = dc;
5229 adpm[0].printed = 0;
5230 adpm[0].templates = dpi->templates;
5232 i = 1;
5233 pdpm = hold_modifiers;
5234 while (pdpm != NULL
5235 && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT
5236 || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE
5237 || pdpm->mod->type == DEMANGLE_COMPONENT_CONST))
5239 if (! pdpm->printed)
5241 if (i >= sizeof adpm / sizeof adpm[0])
5243 d_print_error (dpi);
5244 return;
5247 adpm[i] = *pdpm;
5248 adpm[i].next = dpi->modifiers;
5249 dpi->modifiers = &adpm[i];
5250 pdpm->printed = 1;
5251 ++i;
5254 pdpm = pdpm->next;
5257 d_print_comp (dpi, options, d_right (dc));
5259 dpi->modifiers = hold_modifiers;
5261 if (adpm[0].printed)
5262 return;
5264 while (i > 1)
5266 --i;
5267 d_print_mod (dpi, options, adpm[i].mod);
5270 d_print_array_type (dpi, options, dc, dpi->modifiers);
5272 return;
5275 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5276 case DEMANGLE_COMPONENT_VECTOR_TYPE:
5278 struct d_print_mod dpm;
5280 dpm.next = dpi->modifiers;
5281 dpi->modifiers = &dpm;
5282 dpm.mod = dc;
5283 dpm.printed = 0;
5284 dpm.templates = dpi->templates;
5286 d_print_comp (dpi, options, d_right (dc));
5288 /* If the modifier didn't get printed by the type, print it
5289 now. */
5290 if (! dpm.printed)
5291 d_print_mod (dpi, options, dc);
5293 dpi->modifiers = dpm.next;
5295 return;
5298 case DEMANGLE_COMPONENT_FIXED_TYPE:
5299 if (dc->u.s_fixed.sat)
5300 d_append_string (dpi, "_Sat ");
5301 /* Don't print "int _Accum". */
5302 if (dc->u.s_fixed.length->u.s_builtin.type
5303 != &cplus_demangle_builtin_types['i'-'a'])
5305 d_print_comp (dpi, options, dc->u.s_fixed.length);
5306 d_append_char (dpi, ' ');
5308 if (dc->u.s_fixed.accum)
5309 d_append_string (dpi, "_Accum");
5310 else
5311 d_append_string (dpi, "_Fract");
5312 return;
5314 case DEMANGLE_COMPONENT_ARGLIST:
5315 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
5316 if (d_left (dc) != NULL)
5317 d_print_comp (dpi, options, d_left (dc));
5318 if (d_right (dc) != NULL)
5320 size_t len;
5321 unsigned long int flush_count;
5322 /* Make sure ", " isn't flushed by d_append_string, otherwise
5323 dpi->len -= 2 wouldn't work. */
5324 if (dpi->len >= sizeof (dpi->buf) - 2)
5325 d_print_flush (dpi);
5326 d_append_string (dpi, ", ");
5327 len = dpi->len;
5328 flush_count = dpi->flush_count;
5329 d_print_comp (dpi, options, d_right (dc));
5330 /* If that didn't print anything (which can happen with empty
5331 template argument packs), remove the comma and space. */
5332 if (dpi->flush_count == flush_count && dpi->len == len)
5333 dpi->len -= 2;
5335 return;
5337 case DEMANGLE_COMPONENT_INITIALIZER_LIST:
5339 struct demangle_component *type = d_left (dc);
5340 struct demangle_component *list = d_right (dc);
5342 if (type)
5343 d_print_comp (dpi, options, type);
5344 d_append_char (dpi, '{');
5345 d_print_comp (dpi, options, list);
5346 d_append_char (dpi, '}');
5348 return;
5350 case DEMANGLE_COMPONENT_OPERATOR:
5352 const struct demangle_operator_info *op = dc->u.s_operator.op;
5353 int len = op->len;
5355 d_append_string (dpi, "operator");
5356 /* Add a space before new/delete. */
5357 if (IS_LOWER (op->name[0]))
5358 d_append_char (dpi, ' ');
5359 /* Omit a trailing space. */
5360 if (op->name[len-1] == ' ')
5361 --len;
5362 d_append_buffer (dpi, op->name, len);
5363 return;
5366 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
5367 d_append_string (dpi, "operator ");
5368 d_print_comp (dpi, options, dc->u.s_extended_operator.name);
5369 return;
5371 case DEMANGLE_COMPONENT_CONVERSION:
5372 d_append_string (dpi, "operator ");
5373 d_print_conversion (dpi, options, dc);
5374 return;
5376 case DEMANGLE_COMPONENT_NULLARY:
5377 d_print_expr_op (dpi, options, d_left (dc));
5378 return;
5380 case DEMANGLE_COMPONENT_UNARY:
5382 struct demangle_component *op = d_left (dc);
5383 struct demangle_component *operand = d_right (dc);
5384 const char *code = NULL;
5386 if (op->type == DEMANGLE_COMPONENT_OPERATOR)
5388 code = op->u.s_operator.op->code;
5389 if (!strcmp (code, "ad"))
5391 /* Don't print the argument list for the address of a
5392 function. */
5393 if (operand->type == DEMANGLE_COMPONENT_TYPED_NAME
5394 && d_left (operand)->type == DEMANGLE_COMPONENT_QUAL_NAME
5395 && d_right (operand)->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
5396 operand = d_left (operand);
5398 if (operand->type == DEMANGLE_COMPONENT_BINARY_ARGS)
5400 /* This indicates a suffix operator. */
5401 operand = d_left (operand);
5402 d_print_subexpr (dpi, options, operand);
5403 d_print_expr_op (dpi, options, op);
5404 return;
5408 /* For sizeof..., just print the pack length. */
5409 if (code && !strcmp (code, "sZ"))
5411 struct demangle_component *a = d_find_pack (dpi, operand);
5412 int len = d_pack_length (a);
5413 d_append_num (dpi, len);
5414 return;
5416 else if (code && !strcmp (code, "sP"))
5418 int len = d_args_length (dpi, operand);
5419 d_append_num (dpi, len);
5420 return;
5423 if (op->type != DEMANGLE_COMPONENT_CAST)
5424 d_print_expr_op (dpi, options, op);
5425 else
5427 d_append_char (dpi, '(');
5428 d_print_cast (dpi, options, op);
5429 d_append_char (dpi, ')');
5431 if (code && !strcmp (code, "gs"))
5432 /* Avoid parens after '::'. */
5433 d_print_comp (dpi, options, operand);
5434 else if (code && !strcmp (code, "st"))
5435 /* Always print parens for sizeof (type). */
5437 d_append_char (dpi, '(');
5438 d_print_comp (dpi, options, operand);
5439 d_append_char (dpi, ')');
5441 else
5442 d_print_subexpr (dpi, options, operand);
5444 return;
5446 case DEMANGLE_COMPONENT_BINARY:
5447 if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS)
5449 d_print_error (dpi);
5450 return;
5453 if (op_is_new_cast (d_left (dc)))
5455 d_print_expr_op (dpi, options, d_left (dc));
5456 d_append_char (dpi, '<');
5457 d_print_comp (dpi, options, d_left (d_right (dc)));
5458 d_append_string (dpi, ">(");
5459 d_print_comp (dpi, options, d_right (d_right (dc)));
5460 d_append_char (dpi, ')');
5461 return;
5464 if (d_maybe_print_fold_expression (dpi, options, dc))
5465 return;
5467 /* We wrap an expression which uses the greater-than operator in
5468 an extra layer of parens so that it does not get confused
5469 with the '>' which ends the template parameters. */
5470 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
5471 && d_left (dc)->u.s_operator.op->len == 1
5472 && d_left (dc)->u.s_operator.op->name[0] == '>')
5473 d_append_char (dpi, '(');
5475 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") == 0
5476 && d_left (d_right (dc))->type == DEMANGLE_COMPONENT_TYPED_NAME)
5478 /* Function call used in an expression should not have printed types
5479 of the function arguments. Values of the function arguments still
5480 get printed below. */
5482 const struct demangle_component *func = d_left (d_right (dc));
5484 if (d_right (func)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
5485 d_print_error (dpi);
5486 d_print_subexpr (dpi, options, d_left (func));
5488 else
5489 d_print_subexpr (dpi, options, d_left (d_right (dc)));
5490 if (strcmp (d_left (dc)->u.s_operator.op->code, "ix") == 0)
5492 d_append_char (dpi, '[');
5493 d_print_comp (dpi, options, d_right (d_right (dc)));
5494 d_append_char (dpi, ']');
5496 else
5498 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") != 0)
5499 d_print_expr_op (dpi, options, d_left (dc));
5500 d_print_subexpr (dpi, options, d_right (d_right (dc)));
5503 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
5504 && d_left (dc)->u.s_operator.op->len == 1
5505 && d_left (dc)->u.s_operator.op->name[0] == '>')
5506 d_append_char (dpi, ')');
5508 return;
5510 case DEMANGLE_COMPONENT_BINARY_ARGS:
5511 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */
5512 d_print_error (dpi);
5513 return;
5515 case DEMANGLE_COMPONENT_TRINARY:
5516 if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1
5517 || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2)
5519 d_print_error (dpi);
5520 return;
5522 if (d_maybe_print_fold_expression (dpi, options, dc))
5523 return;
5525 struct demangle_component *op = d_left (dc);
5526 struct demangle_component *first = d_left (d_right (dc));
5527 struct demangle_component *second = d_left (d_right (d_right (dc)));
5528 struct demangle_component *third = d_right (d_right (d_right (dc)));
5530 if (!strcmp (op->u.s_operator.op->code, "qu"))
5532 d_print_subexpr (dpi, options, first);
5533 d_print_expr_op (dpi, options, op);
5534 d_print_subexpr (dpi, options, second);
5535 d_append_string (dpi, " : ");
5536 d_print_subexpr (dpi, options, third);
5538 else
5540 d_append_string (dpi, "new ");
5541 if (d_left (first) != NULL)
5543 d_print_subexpr (dpi, options, first);
5544 d_append_char (dpi, ' ');
5546 d_print_comp (dpi, options, second);
5547 if (third)
5548 d_print_subexpr (dpi, options, third);
5551 return;
5553 case DEMANGLE_COMPONENT_TRINARY_ARG1:
5554 case DEMANGLE_COMPONENT_TRINARY_ARG2:
5555 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */
5556 d_print_error (dpi);
5557 return;
5559 case DEMANGLE_COMPONENT_LITERAL:
5560 case DEMANGLE_COMPONENT_LITERAL_NEG:
5562 enum d_builtin_type_print tp;
5564 /* For some builtin types, produce simpler output. */
5565 tp = D_PRINT_DEFAULT;
5566 if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE)
5568 tp = d_left (dc)->u.s_builtin.type->print;
5569 switch (tp)
5571 case D_PRINT_INT:
5572 case D_PRINT_UNSIGNED:
5573 case D_PRINT_LONG:
5574 case D_PRINT_UNSIGNED_LONG:
5575 case D_PRINT_LONG_LONG:
5576 case D_PRINT_UNSIGNED_LONG_LONG:
5577 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME)
5579 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
5580 d_append_char (dpi, '-');
5581 d_print_comp (dpi, options, d_right (dc));
5582 switch (tp)
5584 default:
5585 break;
5586 case D_PRINT_UNSIGNED:
5587 d_append_char (dpi, 'u');
5588 break;
5589 case D_PRINT_LONG:
5590 d_append_char (dpi, 'l');
5591 break;
5592 case D_PRINT_UNSIGNED_LONG:
5593 d_append_string (dpi, "ul");
5594 break;
5595 case D_PRINT_LONG_LONG:
5596 d_append_string (dpi, "ll");
5597 break;
5598 case D_PRINT_UNSIGNED_LONG_LONG:
5599 d_append_string (dpi, "ull");
5600 break;
5602 return;
5604 break;
5606 case D_PRINT_BOOL:
5607 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME
5608 && d_right (dc)->u.s_name.len == 1
5609 && dc->type == DEMANGLE_COMPONENT_LITERAL)
5611 switch (d_right (dc)->u.s_name.s[0])
5613 case '0':
5614 d_append_string (dpi, "false");
5615 return;
5616 case '1':
5617 d_append_string (dpi, "true");
5618 return;
5619 default:
5620 break;
5623 break;
5625 default:
5626 break;
5630 d_append_char (dpi, '(');
5631 d_print_comp (dpi, options, d_left (dc));
5632 d_append_char (dpi, ')');
5633 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
5634 d_append_char (dpi, '-');
5635 if (tp == D_PRINT_FLOAT)
5636 d_append_char (dpi, '[');
5637 d_print_comp (dpi, options, d_right (dc));
5638 if (tp == D_PRINT_FLOAT)
5639 d_append_char (dpi, ']');
5641 return;
5643 case DEMANGLE_COMPONENT_NUMBER:
5644 d_append_num (dpi, dc->u.s_number.number);
5645 return;
5647 case DEMANGLE_COMPONENT_JAVA_RESOURCE:
5648 d_append_string (dpi, "java resource ");
5649 d_print_comp (dpi, options, d_left (dc));
5650 return;
5652 case DEMANGLE_COMPONENT_COMPOUND_NAME:
5653 d_print_comp (dpi, options, d_left (dc));
5654 d_print_comp (dpi, options, d_right (dc));
5655 return;
5657 case DEMANGLE_COMPONENT_CHARACTER:
5658 d_append_char (dpi, dc->u.s_character.character);
5659 return;
5661 case DEMANGLE_COMPONENT_DECLTYPE:
5662 d_append_string (dpi, "decltype (");
5663 d_print_comp (dpi, options, d_left (dc));
5664 d_append_char (dpi, ')');
5665 return;
5667 case DEMANGLE_COMPONENT_PACK_EXPANSION:
5669 int len;
5670 int i;
5671 struct demangle_component *a = d_find_pack (dpi, d_left (dc));
5672 if (a == NULL)
5674 /* d_find_pack won't find anything if the only packs involved
5675 in this expansion are function parameter packs; in that
5676 case, just print the pattern and "...". */
5677 d_print_subexpr (dpi, options, d_left (dc));
5678 d_append_string (dpi, "...");
5679 return;
5682 len = d_pack_length (a);
5683 dc = d_left (dc);
5684 for (i = 0; i < len; ++i)
5686 dpi->pack_index = i;
5687 d_print_comp (dpi, options, dc);
5688 if (i < len-1)
5689 d_append_string (dpi, ", ");
5692 return;
5694 case DEMANGLE_COMPONENT_FUNCTION_PARAM:
5696 long num = dc->u.s_number.number;
5697 if (num == 0)
5698 d_append_string (dpi, "this");
5699 else
5701 d_append_string (dpi, "{parm#");
5702 d_append_num (dpi, num);
5703 d_append_char (dpi, '}');
5706 return;
5708 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
5709 d_append_string (dpi, "global constructors keyed to ");
5710 d_print_comp (dpi, options, dc->u.s_binary.left);
5711 return;
5713 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
5714 d_append_string (dpi, "global destructors keyed to ");
5715 d_print_comp (dpi, options, dc->u.s_binary.left);
5716 return;
5718 case DEMANGLE_COMPONENT_LAMBDA:
5719 d_append_string (dpi, "{lambda(");
5720 /* Generic lambda auto parms are mangled as the template type
5721 parm they are. */
5722 dpi->is_lambda_arg++;
5723 d_print_comp (dpi, options, dc->u.s_unary_num.sub);
5724 dpi->is_lambda_arg--;
5725 d_append_string (dpi, ")#");
5726 d_append_num (dpi, dc->u.s_unary_num.num + 1);
5727 d_append_char (dpi, '}');
5728 return;
5730 case DEMANGLE_COMPONENT_UNNAMED_TYPE:
5731 d_append_string (dpi, "{unnamed type#");
5732 d_append_num (dpi, dc->u.s_number.number + 1);
5733 d_append_char (dpi, '}');
5734 return;
5736 case DEMANGLE_COMPONENT_CLONE:
5737 d_print_comp (dpi, options, d_left (dc));
5738 d_append_string (dpi, " [clone ");
5739 d_print_comp (dpi, options, d_right (dc));
5740 d_append_char (dpi, ']');
5741 return;
5743 default:
5744 d_print_error (dpi);
5745 return;
5749 static void
5750 d_print_comp (struct d_print_info *dpi, int options,
5751 struct demangle_component *dc)
5753 struct d_component_stack self;
5754 if (dc == NULL || dc->d_printing > 1 || dpi->recursion > MAX_RECURSION_COUNT)
5756 d_print_error (dpi);
5757 return;
5760 dc->d_printing++;
5761 dpi->recursion++;
5763 self.dc = dc;
5764 self.parent = dpi->component_stack;
5765 dpi->component_stack = &self;
5767 d_print_comp_inner (dpi, options, dc);
5769 dpi->component_stack = self.parent;
5770 dc->d_printing--;
5771 dpi->recursion--;
5774 /* Print a Java dentifier. For Java we try to handle encoded extended
5775 Unicode characters. The C++ ABI doesn't mention Unicode encoding,
5776 so we don't it for C++. Characters are encoded as
5777 __U<hex-char>+_. */
5779 static void
5780 d_print_java_identifier (struct d_print_info *dpi, const char *name, int len)
5782 const char *p;
5783 const char *end;
5785 end = name + len;
5786 for (p = name; p < end; ++p)
5788 if (end - p > 3
5789 && p[0] == '_'
5790 && p[1] == '_'
5791 && p[2] == 'U')
5793 unsigned long c;
5794 const char *q;
5796 c = 0;
5797 for (q = p + 3; q < end; ++q)
5799 int dig;
5801 if (IS_DIGIT (*q))
5802 dig = *q - '0';
5803 else if (*q >= 'A' && *q <= 'F')
5804 dig = *q - 'A' + 10;
5805 else if (*q >= 'a' && *q <= 'f')
5806 dig = *q - 'a' + 10;
5807 else
5808 break;
5810 c = c * 16 + dig;
5812 /* If the Unicode character is larger than 256, we don't try
5813 to deal with it here. FIXME. */
5814 if (q < end && *q == '_' && c < 256)
5816 d_append_char (dpi, c);
5817 p = q;
5818 continue;
5822 d_append_char (dpi, *p);
5826 /* Print a list of modifiers. SUFFIX is 1 if we are printing
5827 qualifiers on this after printing a function. */
5829 static void
5830 d_print_mod_list (struct d_print_info *dpi, int options,
5831 struct d_print_mod *mods, int suffix)
5833 struct d_print_template *hold_dpt;
5835 if (mods == NULL || d_print_saw_error (dpi))
5836 return;
5838 if (mods->printed
5839 || (! suffix
5840 && (is_fnqual_component_type (mods->mod->type))))
5842 d_print_mod_list (dpi, options, mods->next, suffix);
5843 return;
5846 mods->printed = 1;
5848 hold_dpt = dpi->templates;
5849 dpi->templates = mods->templates;
5851 if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
5853 d_print_function_type (dpi, options, mods->mod, mods->next);
5854 dpi->templates = hold_dpt;
5855 return;
5857 else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
5859 d_print_array_type (dpi, options, mods->mod, mods->next);
5860 dpi->templates = hold_dpt;
5861 return;
5863 else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME)
5865 struct d_print_mod *hold_modifiers;
5866 struct demangle_component *dc;
5868 /* When this is on the modifier stack, we have pulled any
5869 qualifiers off the right argument already. Otherwise, we
5870 print it as usual, but don't let the left argument see any
5871 modifiers. */
5873 hold_modifiers = dpi->modifiers;
5874 dpi->modifiers = NULL;
5875 d_print_comp (dpi, options, d_left (mods->mod));
5876 dpi->modifiers = hold_modifiers;
5878 if ((options & DMGL_JAVA) == 0)
5879 d_append_string (dpi, "::");
5880 else
5881 d_append_char (dpi, '.');
5883 dc = d_right (mods->mod);
5885 if (dc->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
5887 d_append_string (dpi, "{default arg#");
5888 d_append_num (dpi, dc->u.s_unary_num.num + 1);
5889 d_append_string (dpi, "}::");
5890 dc = dc->u.s_unary_num.sub;
5893 while (is_fnqual_component_type (dc->type))
5894 dc = d_left (dc);
5896 d_print_comp (dpi, options, dc);
5898 dpi->templates = hold_dpt;
5899 return;
5902 d_print_mod (dpi, options, mods->mod);
5904 dpi->templates = hold_dpt;
5906 d_print_mod_list (dpi, options, mods->next, suffix);
5909 /* Print a modifier. */
5911 static void
5912 d_print_mod (struct d_print_info *dpi, int options,
5913 struct demangle_component *mod)
5915 switch (mod->type)
5917 case DEMANGLE_COMPONENT_RESTRICT:
5918 case DEMANGLE_COMPONENT_RESTRICT_THIS:
5919 d_append_string (dpi, " restrict");
5920 return;
5921 case DEMANGLE_COMPONENT_VOLATILE:
5922 case DEMANGLE_COMPONENT_VOLATILE_THIS:
5923 d_append_string (dpi, " volatile");
5924 return;
5925 case DEMANGLE_COMPONENT_CONST:
5926 case DEMANGLE_COMPONENT_CONST_THIS:
5927 d_append_string (dpi, " const");
5928 return;
5929 case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
5930 d_append_string (dpi, " transaction_safe");
5931 return;
5932 case DEMANGLE_COMPONENT_NOEXCEPT:
5933 d_append_string (dpi, " noexcept");
5934 if (d_right (mod))
5936 d_append_char (dpi, '(');
5937 d_print_comp (dpi, options, d_right (mod));
5938 d_append_char (dpi, ')');
5940 return;
5941 case DEMANGLE_COMPONENT_THROW_SPEC:
5942 d_append_string (dpi, " throw");
5943 if (d_right (mod))
5945 d_append_char (dpi, '(');
5946 d_print_comp (dpi, options, d_right (mod));
5947 d_append_char (dpi, ')');
5949 return;
5950 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5951 d_append_char (dpi, ' ');
5952 d_print_comp (dpi, options, d_right (mod));
5953 return;
5954 case DEMANGLE_COMPONENT_POINTER:
5955 /* There is no pointer symbol in Java. */
5956 if ((options & DMGL_JAVA) == 0)
5957 d_append_char (dpi, '*');
5958 return;
5959 case DEMANGLE_COMPONENT_REFERENCE_THIS:
5960 /* For the ref-qualifier, put a space before the &. */
5961 d_append_char (dpi, ' ');
5962 /* FALLTHRU */
5963 case DEMANGLE_COMPONENT_REFERENCE:
5964 d_append_char (dpi, '&');
5965 return;
5966 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
5967 d_append_char (dpi, ' ');
5968 /* FALLTHRU */
5969 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
5970 d_append_string (dpi, "&&");
5971 return;
5972 case DEMANGLE_COMPONENT_COMPLEX:
5973 d_append_string (dpi, "complex ");
5974 return;
5975 case DEMANGLE_COMPONENT_IMAGINARY:
5976 d_append_string (dpi, "imaginary ");
5977 return;
5978 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5979 if (d_last_char (dpi) != '(')
5980 d_append_char (dpi, ' ');
5981 d_print_comp (dpi, options, d_left (mod));
5982 d_append_string (dpi, "::*");
5983 return;
5984 case DEMANGLE_COMPONENT_TYPED_NAME:
5985 d_print_comp (dpi, options, d_left (mod));
5986 return;
5987 case DEMANGLE_COMPONENT_VECTOR_TYPE:
5988 d_append_string (dpi, " __vector(");
5989 d_print_comp (dpi, options, d_left (mod));
5990 d_append_char (dpi, ')');
5991 return;
5993 default:
5994 /* Otherwise, we have something that won't go back on the
5995 modifier stack, so we can just print it. */
5996 d_print_comp (dpi, options, mod);
5997 return;
6001 /* Print a function type, except for the return type. */
6003 static void
6004 d_print_function_type (struct d_print_info *dpi, int options,
6005 struct demangle_component *dc,
6006 struct d_print_mod *mods)
6008 int need_paren;
6009 int need_space;
6010 struct d_print_mod *p;
6011 struct d_print_mod *hold_modifiers;
6013 need_paren = 0;
6014 need_space = 0;
6015 for (p = mods; p != NULL; p = p->next)
6017 if (p->printed)
6018 break;
6020 switch (p->mod->type)
6022 case DEMANGLE_COMPONENT_POINTER:
6023 case DEMANGLE_COMPONENT_REFERENCE:
6024 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
6025 need_paren = 1;
6026 break;
6027 case DEMANGLE_COMPONENT_RESTRICT:
6028 case DEMANGLE_COMPONENT_VOLATILE:
6029 case DEMANGLE_COMPONENT_CONST:
6030 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
6031 case DEMANGLE_COMPONENT_COMPLEX:
6032 case DEMANGLE_COMPONENT_IMAGINARY:
6033 case DEMANGLE_COMPONENT_PTRMEM_TYPE:
6034 need_space = 1;
6035 need_paren = 1;
6036 break;
6037 FNQUAL_COMPONENT_CASE:
6038 break;
6039 default:
6040 break;
6042 if (need_paren)
6043 break;
6046 if (need_paren)
6048 if (! need_space)
6050 if (d_last_char (dpi) != '('
6051 && d_last_char (dpi) != '*')
6052 need_space = 1;
6054 if (need_space && d_last_char (dpi) != ' ')
6055 d_append_char (dpi, ' ');
6056 d_append_char (dpi, '(');
6059 hold_modifiers = dpi->modifiers;
6060 dpi->modifiers = NULL;
6062 d_print_mod_list (dpi, options, mods, 0);
6064 if (need_paren)
6065 d_append_char (dpi, ')');
6067 d_append_char (dpi, '(');
6069 if (d_right (dc) != NULL)
6070 d_print_comp (dpi, options, d_right (dc));
6072 d_append_char (dpi, ')');
6074 d_print_mod_list (dpi, options, mods, 1);
6076 dpi->modifiers = hold_modifiers;
6079 /* Print an array type, except for the element type. */
6081 static void
6082 d_print_array_type (struct d_print_info *dpi, int options,
6083 struct demangle_component *dc,
6084 struct d_print_mod *mods)
6086 int need_space;
6088 need_space = 1;
6089 if (mods != NULL)
6091 int need_paren;
6092 struct d_print_mod *p;
6094 need_paren = 0;
6095 for (p = mods; p != NULL; p = p->next)
6097 if (! p->printed)
6099 if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
6101 need_space = 0;
6102 break;
6104 else
6106 need_paren = 1;
6107 need_space = 1;
6108 break;
6113 if (need_paren)
6114 d_append_string (dpi, " (");
6116 d_print_mod_list (dpi, options, mods, 0);
6118 if (need_paren)
6119 d_append_char (dpi, ')');
6122 if (need_space)
6123 d_append_char (dpi, ' ');
6125 d_append_char (dpi, '[');
6127 if (d_left (dc) != NULL)
6128 d_print_comp (dpi, options, d_left (dc));
6130 d_append_char (dpi, ']');
6133 /* Print an operator in an expression. */
6135 static void
6136 d_print_expr_op (struct d_print_info *dpi, int options,
6137 struct demangle_component *dc)
6139 if (dc->type == DEMANGLE_COMPONENT_OPERATOR)
6140 d_append_buffer (dpi, dc->u.s_operator.op->name,
6141 dc->u.s_operator.op->len);
6142 else
6143 d_print_comp (dpi, options, dc);
6146 /* Print a cast. */
6148 static void
6149 d_print_cast (struct d_print_info *dpi, int options,
6150 struct demangle_component *dc)
6152 d_print_comp (dpi, options, d_left (dc));
6155 /* Print a conversion operator. */
6157 static void
6158 d_print_conversion (struct d_print_info *dpi, int options,
6159 struct demangle_component *dc)
6161 struct d_print_template dpt;
6163 /* For a conversion operator, we need the template parameters from
6164 the enclosing template in scope for processing the type. */
6165 if (dpi->current_template != NULL)
6167 dpt.next = dpi->templates;
6168 dpi->templates = &dpt;
6169 dpt.template_decl = dpi->current_template;
6172 if (d_left (dc)->type != DEMANGLE_COMPONENT_TEMPLATE)
6174 d_print_comp (dpi, options, d_left (dc));
6175 if (dpi->current_template != NULL)
6176 dpi->templates = dpt.next;
6178 else
6180 d_print_comp (dpi, options, d_left (d_left (dc)));
6182 /* For a templated cast operator, we need to remove the template
6183 parameters from scope after printing the operator name,
6184 so we need to handle the template printing here. */
6185 if (dpi->current_template != NULL)
6186 dpi->templates = dpt.next;
6188 if (d_last_char (dpi) == '<')
6189 d_append_char (dpi, ' ');
6190 d_append_char (dpi, '<');
6191 d_print_comp (dpi, options, d_right (d_left (dc)));
6192 /* Avoid generating two consecutive '>' characters, to avoid
6193 the C++ syntactic ambiguity. */
6194 if (d_last_char (dpi) == '>')
6195 d_append_char (dpi, ' ');
6196 d_append_char (dpi, '>');
6200 /* Initialize the information structure we use to pass around
6201 information. */
6203 CP_STATIC_IF_GLIBCPP_V3
6204 void
6205 cplus_demangle_init_info (const char *mangled, int options, size_t len,
6206 struct d_info *di)
6208 di->s = mangled;
6209 di->send = mangled + len;
6210 di->options = options;
6212 di->n = mangled;
6214 /* We cannot need more components than twice the number of chars in
6215 the mangled string. Most components correspond directly to
6216 chars, but the ARGLIST types are exceptions. */
6217 di->num_comps = 2 * len;
6218 di->next_comp = 0;
6220 /* Similarly, we cannot need more substitutions than there are
6221 chars in the mangled string. */
6222 di->num_subs = len;
6223 di->next_sub = 0;
6225 di->last_name = NULL;
6227 di->expansion = 0;
6228 di->is_expression = 0;
6229 di->is_conversion = 0;
6230 di->recursion_level = 0;
6233 /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
6234 mangled name, return strings in repeated callback giving the demangled
6235 name. OPTIONS is the usual libiberty demangler options. On success,
6236 this returns 1. On failure, returns 0. */
6238 static int
6239 d_demangle_callback (const char *mangled, int options,
6240 demangle_callbackref callback, void *opaque)
6242 enum
6244 DCT_TYPE,
6245 DCT_MANGLED,
6246 DCT_GLOBAL_CTORS,
6247 DCT_GLOBAL_DTORS
6249 type;
6250 struct d_info di;
6251 struct demangle_component *dc;
6252 int status;
6254 if (mangled[0] == '_' && mangled[1] == 'Z')
6255 type = DCT_MANGLED;
6256 else if (strncmp (mangled, "_GLOBAL_", 8) == 0
6257 && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
6258 && (mangled[9] == 'D' || mangled[9] == 'I')
6259 && mangled[10] == '_')
6260 type = mangled[9] == 'I' ? DCT_GLOBAL_CTORS : DCT_GLOBAL_DTORS;
6261 else
6263 if ((options & DMGL_TYPES) == 0)
6264 return 0;
6265 type = DCT_TYPE;
6268 cplus_demangle_init_info (mangled, options, strlen (mangled), &di);
6270 /* PR 87675 - Check for a mangled string that is so long
6271 that we do not have enough stack space to demangle it. */
6272 if (((options & DMGL_NO_RECURSE_LIMIT) == 0)
6273 /* This check is a bit arbitrary, since what we really want to do is to
6274 compare the sizes of the di.comps and di.subs arrays against the
6275 amount of stack space remaining. But there is no portable way to do
6276 this, so instead we use the recursion limit as a guide to the maximum
6277 size of the arrays. */
6278 && (unsigned long) di.num_comps > DEMANGLE_RECURSION_LIMIT)
6280 /* FIXME: We need a way to indicate that a stack limit has been reached. */
6281 return 0;
6285 #ifdef CP_DYNAMIC_ARRAYS
6286 __extension__ struct demangle_component comps[di.num_comps];
6287 __extension__ struct demangle_component *subs[di.num_subs];
6289 di.comps = comps;
6290 di.subs = subs;
6291 #else
6292 di.comps = alloca (di.num_comps * sizeof (*di.comps));
6293 di.subs = alloca (di.num_subs * sizeof (*di.subs));
6294 #endif
6296 switch (type)
6298 case DCT_TYPE:
6299 dc = cplus_demangle_type (&di);
6300 break;
6301 case DCT_MANGLED:
6302 dc = cplus_demangle_mangled_name (&di, 1);
6303 break;
6304 case DCT_GLOBAL_CTORS:
6305 case DCT_GLOBAL_DTORS:
6306 d_advance (&di, 11);
6307 dc = d_make_comp (&di,
6308 (type == DCT_GLOBAL_CTORS
6309 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
6310 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS),
6311 d_make_demangle_mangled_name (&di, d_str (&di)),
6312 NULL);
6313 d_advance (&di, strlen (d_str (&di)));
6314 break;
6315 default:
6316 abort (); /* We have listed all the cases. */
6319 /* If DMGL_PARAMS is set, then if we didn't consume the entire
6320 mangled string, then we didn't successfully demangle it. If
6321 DMGL_PARAMS is not set, we didn't look at the trailing
6322 parameters. */
6323 if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0')
6324 dc = NULL;
6326 #ifdef CP_DEMANGLE_DEBUG
6327 d_dump (dc, 0);
6328 #endif
6330 status = (dc != NULL)
6331 ? cplus_demangle_print_callback (options, dc, callback, opaque)
6332 : 0;
6335 return status;
6338 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled
6339 name, return a buffer allocated with malloc holding the demangled
6340 name. OPTIONS is the usual libiberty demangler options. On
6341 success, this sets *PALC to the allocated size of the returned
6342 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for
6343 a memory allocation failure, and returns NULL. */
6345 static char *
6346 d_demangle (const char *mangled, int options, size_t *palc)
6348 struct d_growable_string dgs;
6349 int status;
6351 d_growable_string_init (&dgs, 0);
6353 status = d_demangle_callback (mangled, options,
6354 d_growable_string_callback_adapter, &dgs);
6355 if (status == 0)
6357 free (dgs.buf);
6358 *palc = 0;
6359 return NULL;
6362 *palc = dgs.allocation_failure ? 1 : dgs.alc;
6363 return dgs.buf;
6366 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
6368 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
6370 /* ia64 ABI-mandated entry point in the C++ runtime library for
6371 performing demangling. MANGLED_NAME is a NUL-terminated character
6372 string containing the name to be demangled.
6374 OUTPUT_BUFFER is a region of memory, allocated with malloc, of
6375 *LENGTH bytes, into which the demangled name is stored. If
6376 OUTPUT_BUFFER is not long enough, it is expanded using realloc.
6377 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
6378 is placed in a region of memory allocated with malloc.
6380 If LENGTH is non-NULL, the length of the buffer containing the
6381 demangled name, is placed in *LENGTH.
6383 The return value is a pointer to the start of the NUL-terminated
6384 demangled name, or NULL if the demangling fails. The caller is
6385 responsible for deallocating this memory using free.
6387 *STATUS is set to one of the following values:
6388 0: The demangling operation succeeded.
6389 -1: A memory allocation failure occurred.
6390 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6391 -3: One of the arguments is invalid.
6393 The demangling is performed using the C++ ABI mangling rules, with
6394 GNU extensions. */
6396 char *
6397 __cxa_demangle (const char *mangled_name, char *output_buffer,
6398 size_t *length, int *status)
6400 char *demangled;
6401 size_t alc;
6403 if (mangled_name == NULL)
6405 if (status != NULL)
6406 *status = -3;
6407 return NULL;
6410 if (output_buffer != NULL && length == NULL)
6412 if (status != NULL)
6413 *status = -3;
6414 return NULL;
6417 demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc);
6419 if (demangled == NULL)
6421 if (status != NULL)
6423 if (alc == 1)
6424 *status = -1;
6425 else
6426 *status = -2;
6428 return NULL;
6431 if (output_buffer == NULL)
6433 if (length != NULL)
6434 *length = alc;
6436 else
6438 if (strlen (demangled) < *length)
6440 strcpy (output_buffer, demangled);
6441 free (demangled);
6442 demangled = output_buffer;
6444 else
6446 free (output_buffer);
6447 *length = alc;
6451 if (status != NULL)
6452 *status = 0;
6454 return demangled;
6457 extern int __gcclibcxx_demangle_callback (const char *,
6458 void (*)
6459 (const char *, size_t, void *),
6460 void *);
6462 /* Alternative, allocationless entry point in the C++ runtime library
6463 for performing demangling. MANGLED_NAME is a NUL-terminated character
6464 string containing the name to be demangled.
6466 CALLBACK is a callback function, called with demangled string
6467 segments as demangling progresses; it is called at least once,
6468 but may be called more than once. OPAQUE is a generalized pointer
6469 used as a callback argument.
6471 The return code is one of the following values, equivalent to
6472 the STATUS values of __cxa_demangle() (excluding -1, since this
6473 function performs no memory allocations):
6474 0: The demangling operation succeeded.
6475 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
6476 -3: One of the arguments is invalid.
6478 The demangling is performed using the C++ ABI mangling rules, with
6479 GNU extensions. */
6482 __gcclibcxx_demangle_callback (const char *mangled_name,
6483 void (*callback) (const char *, size_t, void *),
6484 void *opaque)
6486 int status;
6488 if (mangled_name == NULL || callback == NULL)
6489 return -3;
6491 status = d_demangle_callback (mangled_name, DMGL_PARAMS | DMGL_TYPES,
6492 callback, opaque);
6493 if (status == 0)
6494 return -2;
6496 return 0;
6499 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
6501 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI
6502 mangled name, return a buffer allocated with malloc holding the
6503 demangled name. Otherwise, return NULL. */
6505 char *
6506 cplus_demangle_v3 (const char *mangled, int options)
6508 size_t alc;
6510 return d_demangle (mangled, options, &alc);
6514 cplus_demangle_v3_callback (const char *mangled, int options,
6515 demangle_callbackref callback, void *opaque)
6517 return d_demangle_callback (mangled, options, callback, opaque);
6520 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
6521 conventions, but the output formatting is a little different.
6522 This instructs the C++ demangler not to emit pointer characters ("*"), to
6523 use Java's namespace separator symbol ("." instead of "::"), and to output
6524 JArray<TYPE> as TYPE[]. */
6526 char *
6527 java_demangle_v3 (const char *mangled)
6529 size_t alc;
6531 return d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, &alc);
6535 java_demangle_v3_callback (const char *mangled,
6536 demangle_callbackref callback, void *opaque)
6538 return d_demangle_callback (mangled,
6539 DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX,
6540 callback, opaque);
6543 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
6545 #ifndef IN_GLIBCPP_V3
6547 /* Demangle a string in order to find out whether it is a constructor
6548 or destructor. Return non-zero on success. Set *CTOR_KIND and
6549 *DTOR_KIND appropriately. */
6551 static int
6552 is_ctor_or_dtor (const char *mangled,
6553 enum gnu_v3_ctor_kinds *ctor_kind,
6554 enum gnu_v3_dtor_kinds *dtor_kind)
6556 struct d_info di;
6557 struct demangle_component *dc;
6558 int ret;
6560 *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
6561 *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
6563 cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di);
6566 #ifdef CP_DYNAMIC_ARRAYS
6567 __extension__ struct demangle_component comps[di.num_comps];
6568 __extension__ struct demangle_component *subs[di.num_subs];
6570 di.comps = comps;
6571 di.subs = subs;
6572 #else
6573 di.comps = alloca (di.num_comps * sizeof (*di.comps));
6574 di.subs = alloca (di.num_subs * sizeof (*di.subs));
6575 #endif
6577 dc = cplus_demangle_mangled_name (&di, 1);
6579 /* Note that because we did not pass DMGL_PARAMS, we don't expect
6580 to demangle the entire string. */
6582 ret = 0;
6583 while (dc != NULL)
6585 switch (dc->type)
6587 /* These cannot appear on a constructor or destructor. */
6588 case DEMANGLE_COMPONENT_RESTRICT_THIS:
6589 case DEMANGLE_COMPONENT_VOLATILE_THIS:
6590 case DEMANGLE_COMPONENT_CONST_THIS:
6591 case DEMANGLE_COMPONENT_REFERENCE_THIS:
6592 case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
6593 default:
6594 dc = NULL;
6595 break;
6596 case DEMANGLE_COMPONENT_TYPED_NAME:
6597 case DEMANGLE_COMPONENT_TEMPLATE:
6598 dc = d_left (dc);
6599 break;
6600 case DEMANGLE_COMPONENT_QUAL_NAME:
6601 case DEMANGLE_COMPONENT_LOCAL_NAME:
6602 dc = d_right (dc);
6603 break;
6604 case DEMANGLE_COMPONENT_CTOR:
6605 *ctor_kind = dc->u.s_ctor.kind;
6606 ret = 1;
6607 dc = NULL;
6608 break;
6609 case DEMANGLE_COMPONENT_DTOR:
6610 *dtor_kind = dc->u.s_dtor.kind;
6611 ret = 1;
6612 dc = NULL;
6613 break;
6618 return ret;
6621 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
6622 name. A non-zero return indicates the type of constructor. */
6624 enum gnu_v3_ctor_kinds
6625 is_gnu_v3_mangled_ctor (const char *name)
6627 enum gnu_v3_ctor_kinds ctor_kind;
6628 enum gnu_v3_dtor_kinds dtor_kind;
6630 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
6631 return (enum gnu_v3_ctor_kinds) 0;
6632 return ctor_kind;
6636 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
6637 name. A non-zero return indicates the type of destructor. */
6639 enum gnu_v3_dtor_kinds
6640 is_gnu_v3_mangled_dtor (const char *name)
6642 enum gnu_v3_ctor_kinds ctor_kind;
6643 enum gnu_v3_dtor_kinds dtor_kind;
6645 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
6646 return (enum gnu_v3_dtor_kinds) 0;
6647 return dtor_kind;
6650 #endif /* IN_GLIBCPP_V3 */
6652 #ifdef STANDALONE_DEMANGLER
6654 #include "getopt.h"
6655 #include "dyn-string.h"
6657 static void print_usage (FILE* fp, int exit_value);
6659 #define IS_ALPHA(CHAR) \
6660 (((CHAR) >= 'a' && (CHAR) <= 'z') \
6661 || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
6663 /* Non-zero if CHAR is a character than can occur in a mangled name. */
6664 #define is_mangled_char(CHAR) \
6665 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
6666 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
6668 /* The name of this program, as invoked. */
6669 const char* program_name;
6671 /* Prints usage summary to FP and then exits with EXIT_VALUE. */
6673 static void
6674 print_usage (FILE* fp, int exit_value)
6676 fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
6677 fprintf (fp, "Options:\n");
6678 fprintf (fp, " -h,--help Display this message.\n");
6679 fprintf (fp, " -p,--no-params Don't display function parameters\n");
6680 fprintf (fp, " -v,--verbose Produce verbose demanglings.\n");
6681 fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n");
6683 exit (exit_value);
6686 /* Option specification for getopt_long. */
6687 static const struct option long_options[] =
6689 { "help", no_argument, NULL, 'h' },
6690 { "no-params", no_argument, NULL, 'p' },
6691 { "verbose", no_argument, NULL, 'v' },
6692 { NULL, no_argument, NULL, 0 },
6695 /* Main entry for a demangling filter executable. It will demangle
6696 its command line arguments, if any. If none are provided, it will
6697 filter stdin to stdout, replacing any recognized mangled C++ names
6698 with their demangled equivalents. */
6701 main (int argc, char *argv[])
6703 int i;
6704 int opt_char;
6705 int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
6707 /* Use the program name of this program, as invoked. */
6708 program_name = argv[0];
6710 /* Parse options. */
6713 opt_char = getopt_long (argc, argv, "hpv", long_options, NULL);
6714 switch (opt_char)
6716 case '?': /* Unrecognized option. */
6717 print_usage (stderr, 1);
6718 break;
6720 case 'h':
6721 print_usage (stdout, 0);
6722 break;
6724 case 'p':
6725 options &= ~ DMGL_PARAMS;
6726 break;
6728 case 'v':
6729 options |= DMGL_VERBOSE;
6730 break;
6733 while (opt_char != -1);
6735 if (optind == argc)
6736 /* No command line arguments were provided. Filter stdin. */
6738 dyn_string_t mangled = dyn_string_new (3);
6739 char *s;
6741 /* Read all of input. */
6742 while (!feof (stdin))
6744 char c;
6746 /* Pile characters into mangled until we hit one that can't
6747 occur in a mangled name. */
6748 c = getchar ();
6749 while (!feof (stdin) && is_mangled_char (c))
6751 dyn_string_append_char (mangled, c);
6752 if (feof (stdin))
6753 break;
6754 c = getchar ();
6757 if (dyn_string_length (mangled) > 0)
6759 #ifdef IN_GLIBCPP_V3
6760 s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL);
6761 #else
6762 s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
6763 #endif
6765 if (s != NULL)
6767 fputs (s, stdout);
6768 free (s);
6770 else
6772 /* It might not have been a mangled name. Print the
6773 original text. */
6774 fputs (dyn_string_buf (mangled), stdout);
6777 dyn_string_clear (mangled);
6780 /* If we haven't hit EOF yet, we've read one character that
6781 can't occur in a mangled name, so print it out. */
6782 if (!feof (stdin))
6783 putchar (c);
6786 dyn_string_delete (mangled);
6788 else
6789 /* Demangle command line arguments. */
6791 /* Loop over command line arguments. */
6792 for (i = optind; i < argc; ++i)
6794 char *s;
6795 #ifdef IN_GLIBCPP_V3
6796 int status;
6797 #endif
6799 /* Attempt to demangle. */
6800 #ifdef IN_GLIBCPP_V3
6801 s = __cxa_demangle (argv[i], NULL, NULL, &status);
6802 #else
6803 s = cplus_demangle_v3 (argv[i], options);
6804 #endif
6806 /* If it worked, print the demangled name. */
6807 if (s != NULL)
6809 printf ("%s\n", s);
6810 free (s);
6812 else
6814 #ifdef IN_GLIBCPP_V3
6815 fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status);
6816 #else
6817 fprintf (stderr, "Failed: %s\n", argv[i]);
6818 #endif
6823 return 0;
6826 #endif /* STANDALONE_DEMANGLER */